You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
WebCAD/__test__/Booloperate/ArcBoardCutting.test.ts

121 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { LinearCuttingForSweep, ViewManager, ViewType } from "../../src/Add-on/BoardCutting/LinearCuttingForSweep";
import { Polyline } from "../../src/DatabaseServices/Entity/Polyline";
import { LoadBoardsFromFileData, LoadEntityFromFileData } from "../Utils/LoadEntity.util";
import "../Utils/jest.util";
// 测试命令(用于复制)npm run test -- ArcBoardCutting.test.ts
/** 批量测试 */
function TestAll()
{
/** 测试集 */
const testSet = new Set([
{
question: {
brData: { "file": [1, "Board", 10, 2, 101, 0, 1, 2, 71, [-1, 6.123233995736766e-17, 0, 0, -6.123233995736766e-17, -1, 2.4492935982947064e-16, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, [6.123233995736766e-17, 1, -2.4492935982947064e-16, 0, -1, 6.123233995736766e-17, 0, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, 3, 600, 1400, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [1400, 0], 0, [1400, 600], 0, [0, 600], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 8, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1829.130340136119, -3186.5844897958577, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [600.0000000000002, 0], -0.9999999999999999, [600.0000000000002, -400], 0, [484.8671984825753, -400], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 628.31853, 6, 6, 2, 0, 0, 0, 3, 0], "basePt": { "x": 2313.3906173705936, "y": 938.6530296283928, "z": -1418 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
plData: { "file": [1, "Polyline", 10, 2, 273, 0, 1, 1, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 2, [2008.0513946721885, 1238.653029628393], 0, [3469.88022397831, 1238.653029628393], 0, false], "basePt": { "x": 2008.0513946721885, "y": 1238.653029628393, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
viewStr: ViewType.Down
},
answer: {
count: 2,
areas: [420000, 420000],
lengths: [1343.4513322353837, 1343.4513322353837]
}
},
{
question: {
brData: { "file": [1, "Board", 10, 2, 101, 0, 1, 2, 71, [-1, 6.123233995736766e-17, 0, 0, -6.123233995736766e-17, -1, 2.4492935982947064e-16, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, [6.123233995736766e-17, 1, -2.4492935982947064e-16, 0, -1, 6.123233995736766e-17, 0, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, 3, 600, 1400, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [1400, 0], 0, [1400, 600], 0, [0, 600], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 8, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1829.130340136119, -3186.5844897958577, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [600.0000000000002, 0], -0.9999999999999999, [600.0000000000002, -400], 0, [484.8671984825753, -400], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 628.31853, 6, 6, 2, 0, 0, 0, 3, 0], "basePt": { "x": 2313.3906173705936, "y": 938.6530296283928, "z": -1418 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
plData: { "file": [1, "Polyline", 10, 2, 226, 0, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 2, [2980.2949542257415, 1785.8711020734017], 0, [2779.229252050603, 693.9296733376492], 0, false], "basePt": { "x": 2779.229252050603, "y": 693.9296733376492, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
viewStr: ViewType.Down
},
answer: {
count: 2,
areas: [151114.91863862606, 688885.0813613739],
lengths: [307.09899093217655, 1146.8339277054733]
}
},
{
question: {
brData: { "file": [1, "Board", 10, 2, 101, 0, 1, 2, 71, [-1, 6.123233995736766e-17, 0, 0, -6.123233995736766e-17, -1, 2.4492935982947064e-16, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, [6.123233995736766e-17, 1, -2.4492935982947064e-16, 0, -1, 6.123233995736766e-17, 0, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, 3, 600, 1400, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [1400, 0], 0, [1400, 600], 0, [0, 600], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 8, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1829.130340136119, -3186.5844897958577, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [600.0000000000002, 0], -0.9999999999999999, [600.0000000000002, -400], 0, [484.8671984825753, -400], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 628.31853, 6, 6, 2, 0, 0, 0, 3, 0], "basePt": { "x": 2313.3906173705936, "y": 938.6530296283928, "z": -1418 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
plData: { "file": [1, "Polyline", 10, 2, 229, 0, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 2, [2423.497625125358, 1699.2581842133418], 0, [2494.643950510407, 734.1428137726766], 0, false], "basePt": { "x": 2423.497625125358, "y": 734.1428137726766, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
viewStr: ViewType.Down
},
answer: {
count: 3,
areas: [405352.90503024973, 320214.5090290456, 114432.58594070456],
lengths: [691.2561564438456, 532.3117909155627, 206.38895796127028]
}
},
{
question: {
brData: { "file": [1, "Board", 10, 2, 101, 0, 1, 2, 71, [-1, 6.123233995736766e-17, 0, 0, -6.123233995736766e-17, -1, 2.4492935982947064e-16, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, [6.123233995736766e-17, 1, -2.4492935982947064e-16, 0, -1, 6.123233995736766e-17, 0, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, 3, 600, 1400, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [1400, 0], 0, [1400, 600], 0, [0, 600], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 8, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1829.130340136119, -3186.5844897958577, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [600.0000000000002, 0], -0.9999999999999999, [600.0000000000002, -400], 0, [484.8671984825753, -400], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 628.31853, 6, 6, 2, 0, 0, 0, 3, 0], "basePt": { "x": 2313.3906173705936, "y": 938.6530296283928, "z": -1418 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
plData: { "file": [1, "Polyline", 10, 2, 232, 0, 1, 7, 71, [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 2, [-1287.5623052437588, -738.1797530758489], 0, [-1129.9916386341743, -1642.7520984271673], 0, false], "basePt": { "x": 0, "y": 1129.9916386341743, "z": -1642.7520984271673 }, "ucs": [0, -1, 0, 0, 0, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 1] },
viewStr: ViewType.Left
},
answer: {
count: 2,
areas: [440498.50473467575, 399501.49526532437],
lengths: [1343.4513322353837, 1343.4513322353837]
}
},
{
question: {
brData: { "file": [1, "Board", 10, 2, 101, 0, 1, 2, 71, [-1, 6.123233995736766e-17, 0, 0, -6.123233995736766e-17, -1, 2.4492935982947064e-16, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, [6.123233995736766e-17, 1, -2.4492935982947064e-16, 0, -1, 6.123233995736766e-17, 0, 0, 1.4997597826618576e-32, 2.4492935982947064e-16, 1, 0, 3131.3906173705936, 1538.653029628393, -1000, 1], 0, 0, 1, 3, 600, 1400, 18, true, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [1400, 0], 0, [1400, 600], 0, [0, 600], 0, true, 0, 3, 0, 0, 0, 0, 0, 19, 0, "层板", "", "", "", "", "", 0, 0, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 4, "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, 0, 0, null, 0, 0, "", "", "", "", 0, false, 0, "Polyline", 10, 2, 0, 0, 0, 8, 71, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -1829.130340136119, -3186.5844897958577, 0, 1], 0, 0, 1, 2, 4, [0, 0], 0, [600.0000000000002, 0], -0.9999999999999999, [600.0000000000002, -400], 0, [484.8671984825753, -400], 0, false, 0, 0, true, 2, -1, 0, 6, 6, 2, 0, 0, 0, 3, 0, 1, 628.31853, 6, 6, 2, 0, 0, 0, 3, 0], "basePt": { "x": 2313.3906173705936, "y": 938.6530296283928, "z": -1418 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] },
plData: { "file": [1, "Polyline", 10, 2, 262, 0, 1, 7, 0, [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1], 0, 0, 1, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 1, 2, 2, [2431.3906173705936, -832.5194311579985], 0, [2431.3906173705936, -1547.4552636415062], 0, false], "basePt": { "x": 2431.3906173705936, "y": 0, "z": -1547.4552636415062 }, "ucs": [1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1] },
viewStr: ViewType.Front
},
answer: {
count: 3,
areas: [422332.63627688476, 286255.04653577565, 131412.31718733965],
lengths: [695.3098414019644, 437.6988479140293, 210.44264291938927]
}
}
]);
// 遍历测试集
testSet.forEach(e =>
{
TestOne(e.question.brData, e.question.plData, e.question.viewStr, e.answer.count, e.answer.areas, e.answer.lengths);
});
}
TestAll();
/** 测试单个案例
* @param brData 板数据
* @param plData 刀数据
* @param viewStr 视图类型
* @param count 切割后的数量
* @param areas 板轮廓面积
* @param lengths 放样路径长度
*/
function TestOne(brData: Record<string, any>, plData: Record<string, any>, viewType: ViewType, count: number, areas: number[], lengths: number[])
{
/** 视图 */
const viewMatrix = ViewManager.GetViewMatrix(viewType);
/** 肉 */
const br = LoadBoardsFromFileData(brData)[0];
br.ArcBuild.ParseSweepCurves();
/** 刀 */
const splitPl = LoadEntityFromFileData(plData)[0] as Polyline;
/** 切割器 */
const linearCuttingForSweep = new LinearCuttingForSweep(br, splitPl);
// 单元测试
test(`切割圆弧板-${viewType}`, () =>
{
const [cus, sweepPaths] = linearCuttingForSweep.Split(viewMatrix);
// 板轮廓
expect(cus.length).toBe(count);
for (let i = 0; i < cus.length; i++)
{
const cu = cus[i];
expect(cu.Area).toBeCloseTo(areas[i], 0.1);
}
// 放样路径
expect(sweepPaths.length).toBe(count);
for (let i = 0; i < sweepPaths.length; i++)
{
const sweepPath = sweepPaths[i];
expect(sweepPath.Length).toBeCloseTo(lengths[i], 0.1);
}
});
}