!1348 优化:封边轮廓

pull/1348/MERGE
ZoeLeeFZ 4 years ago committed by ChenX
parent e976cce626
commit 4351d6c77d

@ -174,9 +174,50 @@ test("切割残留一个封边厚度的凸角的板件封边", () =>
let con = GetSealedBoardContour(brs[0], false);
expect(con.IsClose).toBeTruthy();
expect(con.Area).toMatchSnapshot();
expect(con.Length).toMatchSnapshot();
con = GetSealedBoardContour(brs[1], false);
expect(con.IsClose).toBeTruthy();
expect(con.Area).toMatchSnapshot();
expect(con.Length).toMatchSnapshot();
});
test("切割残留2个封边厚度的凸角的板件封边", () =>
{
let data = { "file": [1, "Board", 8, 2, 194, false, 1, 3, 0, [0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, 1, 0, 0, 0, -1942.5790708477725, -1015.708335469244, 53.500000000000114, 1], 0, 0, true, [1, 0, 0, 0, 0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, -1942.5790708477725, -1015.708335469244, 54.000000000000114, 1], 0, 3, 623, 53.5, 18, false, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, true, [0, 0, 1, 0, -1.8369701987210297e-16, 1, 0, 0, -1, -1.8369701987210297e-16, 0, 0, -653.1428571428573, 743.924437164159, 0, 1], 0, 2, 8, [53.5, 605], 0, [53.49999999999999, 18], 0, [1.4999999999996518, 18], 0, [1.499999999999659, 0], 0, [0, 0], 0, [0, 623], 0, [1.5, 623], 0, [1.5, 605], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 1, "右收口条", "1", "主卧飘窗柜", "", "流金岁月零度实木多层板", "", 0, 0, "不排", 2, 0, "1", "1", "1", "1", "", "", "", 8, "不排", "不排", "不排", "不排", "不排", "不排", "不排", "不排", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true], "basePt": { "x": -1942.5790708477725, "y": -1015.708335469244, "z": 0 }, "ucs": [0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, 1, 0, 0, 0, 0, 0, 0, 1] };
let brs = LoadBoardsFromFileData(data);
for (let b of brs)
{
let con = GetSealedBoardContour(b, false);
expect(con.IsClose).toBeTruthy();
expect(con.Area).toMatchSnapshot();
expect(con.Length).toMatchSnapshot();
}
});
test("切割残留一个小于封边厚度的凸角的板件封边", () =>
{
let data = { "file": [2, "Board", 8, 2, 194, false, 1, 3, 0, [0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, 1, 0, 0, 0, -1942.5790708477725, -1015.708335469244, 53.500000000000114, 1], 0, 0, true, [1, 0, 0, 0, 0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, -1942.5790708477725, -1015.708335469244, 54.000000000000114, 1], 0, 3, 605, 53.5, 18, false, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, true, [0, 0, 1, 0, -1.8369701987210297e-16, 1, 0, 0, -1, -1.8369701987210297e-16, 0, 0, -298.0228087167077, 1161.398383895394, 0, 1], 0, 2, 6, [53.5, 605], 0, [53.49999999999999, 18], 0, [1.4999999999996518, 18], 0, [1.499999999999659, 0], 0, [0, 0], 0, [0, 605], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 1, "右收口条", "1", "主卧飘窗柜", "", "流金岁月零度实木多层板", "", 0, 0, "不排", 2, 0, "1", "1", "1", "1", "", "", "", 6, "不排", "不排", "不排", "不排", "不排", "不排", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, "Board", 8, 2, 187, false, 1, 3, 0, [0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, 1, 0, 0, 0, -2346.852039258465, -1029.4798626194247, 53.50000000000023, 1], 0, 0, true, [1, 0, 0, 0, 0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, -2346.852039258465, -1029.4798626194247, 54.00000000000023, 1], 0, 3, 605, 53.5, 18, false, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.5, 605, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -0.5, 1.3642420526593924e-12, 0, 1], 0, 2, 6, [1.999999999999659, -605], 0, [0.5, -605], 0, [0.5, 0], 0, [54, 0], 0, [54, -587], 0, [1.999999999999659, -587], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 1, "右收口条", "1", "主卧飘窗柜", "", "流金岁月零度实木多层板", "", 0, 0, "不排", 2, 0, "1", "1", "1", "1", "", "", "", 6, "不排", "不排", "不排", "不排", "不排", "不排", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true], "basePt": { "x": -2346.852039258465, "y": -1029.4798626194247, "z": 0 }, "ucs": [0, -1.8369701987210297e-16, -1, 0, 0, 1, -1.8369701987210297e-16, 0, 1, 0, 0, 0, 0, 0, 0, 1] };
let brs = LoadBoardsFromFileData(data);
for (let b of brs)
{
let con = GetSealedBoardContour(b, false);
expect(con.IsClose).toBeTruthy();
expect(con.Area).toMatchSnapshot();
expect(con.Length).toMatchSnapshot();
}
});
test("获取封边错误案例", () =>
{
let data = { "file": [3, "Board", 8, 2, 100, false, 1, 2, 0, [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 158.18450775789097, -88.04258177080192, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -20.81549224210903, 150.95741822919808, 0, 1], 0, 3, 426, 520, 18, false, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 426, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 8, [221, -426], 0, [221, -247], 0, [230, -247], 0, [230, -246], 0, [520, -162.60897861073317], 0, [520, 0], 0, [0, 0], 0, [0, -426], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 0, "底板", "厨房", "地柜3", "暖白", "18多层板", "暖白", 0, 1, "三合一", 2, 0, "1", "1", "1", "1", "", "", "", 8, "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, "Board", 8, 2, 116, false, 1, 2, 0, [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, -582.4375243070995, -82.23281127955624, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -761.4375243070995, 156.76718872044376, 0, 1], 0, 3, 426, 520, 18, false, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 426, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 2, 8, [221, -426], 0, [221, -247], 0, [230, -247], 0, [230, -246], 0, [520, -246.00000000000003], 0, [520, 0], 0, [0, 0], 0, [0, -426], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 0, "底板", "厨房", "地柜3", "暖白", "18多层板", "暖白", 0, 1, "三合一", 2, 8, 2, 2, 2, 2, 2, 2, 2, 2, "1", "1", "1", "1", "", "", "", 8, "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true, "Board", 8, 2, 125, false, 1, 2, 0, [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, -2044.8775109710668, -161.86694795795037, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -2223.877510971067, 77.13305204204963, 0, 1], 0, 3, 426, 520, 18, false, "Polyline", 8, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 426, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, -4.547473508864641e-13, 0, 1], 0, 2, 8, [221, -426], 0, [0, -426], 0, [0, 0], 0, [520, 0], 0, [520, -246.00000000000003], 0, [230, -246], 0, [230, -247], 0, [221, -247], 0, true, 0, 3, 0, 0, 0, 0, 0, 9, 0, "底板", "厨房", "地柜3", "暖白", "18多层板", "暖白", 0, 1, "三合一", 2, 8, 1, 1, 1, 1, 1, 1, 1, 1, "1", "1", "1", "1", "", "", "", 8, "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", "三合一", true, true, 0, 0, 0, 0, 0, 0, 0, 0, true], "basePt": { "x": -2470.877510971067, "y": -161.86694795795037, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] };
let brs = LoadBoardsFromFileData(data);
for (let b of brs)
{
let con = GetSealedBoardContour(b, false);
expect(con.IsClose).toBeTruthy();
expect(con.Area).toMatchSnapshot();
expect(con.Length).toMatchSnapshot();
}
});

@ -4,9 +4,25 @@ exports[`丢失线段板件 1`] = `554052.5007766777`;
exports[`丢失线段板件 2`] = `398758.8789695821`;
exports[`切割残留2个封边厚度的凸角的板件封边 1`] = `30420`;
exports[`切割残留2个封边厚度的凸角的板件封边 2`] = `1274`;
exports[`切割残留一个封边厚度的凸角的板件封边 1`] = `30420`;
exports[`切割残留一个封边厚度的凸角的板件封边 2`] = `30420`;
exports[`切割残留一个封边厚度的凸角的板件封边 2`] = `1274`;
exports[`切割残留一个封边厚度的凸角的板件封边 3`] = `30420`;
exports[`切割残留一个封边厚度的凸角的板件封边 4`] = `1274`;
exports[`切割残留一个小于封边厚度的凸角的板件封边 1`] = `30127.5`;
exports[`切割残留一个小于封边厚度的凸角的板件封边 2`] = `1273`;
exports[`切割残留一个小于封边厚度的凸角的板件封边 3`] = `30127.5`;
exports[`切割残留一个小于封边厚度的凸角的板件封边 4`] = `1273`;
exports[`封边错误板件 1`] = `130118.40946854133`;
@ -14,7 +30,7 @@ exports[`封边错误板件2 1`] = `779770.9650700318`;
exports[`封边错误板件3 1`] = `359947.9362569036`;
exports[`封边错误板件4 1`] = `30748.998596293524`;
exports[`封边错误板件4 1`] = `30748.998495139338`;
exports[`常规板件,常规坐标系 1`] = `716404`;
@ -43,3 +59,15 @@ exports[`异型板件,非相切圆弧 1`] = `635612.2751433642`;
exports[`异型板件,非相切圆弧 2`] = `626242.2196800549`;
exports[`椭圆弧封边 1`] = `23816.280001593965`;
exports[`获取封边错误案例 1`] = `153800.9412630349`;
exports[`获取封边错误案例 2`] = `1812.3606355214206`;
exports[`获取封边错误案例 3`] = `163941`;
exports[`获取封边错误案例 4`] = `1876`;
exports[`获取封边错误案例 5`] = `165821`;
exports[`获取封边错误案例 6`] = `1884`;

@ -26,7 +26,9 @@ export class CheckHasHoleBoard implements Command
for (let br of brs)
{
let sealedContour = GetSealedBoardContour(br, true);
if (!sealedContour) continue;
let outline = GetSealedBoardContour(br, false);
if (!outline) continue;
let offsetTanslation = outline.BoundingBox.min;
let info = Production.GetBoardHolesData(br, offsetTanslation, sealedContour);
if (info.frontBackHoles.length === 0 && info.sideHoles.length === 0)

@ -138,14 +138,15 @@ export function CalcEdgeSealing(cus: Curve[])
return;
let oldLine: Curve;
let firstLine = cus[0].Clone();
let oldLen = cus.length;
for (let i = 0; i < cus.length; i++)
{
let frontLine = cus[i];
let laterIndex = FixIndex(i + 1, cus);
let laterLine = cus[laterIndex];
if (!frontLine || !laterLine)
if (!frontLine || !laterLine || cus.length < 2)
{
alert("获取封边错误,请提供图纸给相关人员");
return false;
}
@ -180,14 +181,23 @@ export function CalcEdgeSealing(cus: Curve[])
&& refLine2.PtOnCurve(p)
);
let iPt = SelectNearP(tPts.length > 0 ? tPts : iPts, frontLine.EndPoint);
let iPt = SelectNearP(tPts.length > 0 ? tPts : iPts, refLine.EndPoint);
if (!iPt)
{
alert("获取封边错误,请提供图纸给相关人员");
return false;
//没交点,如果删过线,则尝试继续连接
if (cus.length !== oldLen && cus.length > 2)
{
cus.splice(i, 1);
i -= 2;
if (i < -1)
i = -1;
continue;
}
else
return false;
}
let par = frontLine.GetParamAtPoint(iPt);
let par = refLine.GetParamAtPoint(iPt);
//前面线的点无效直接删除
if (par < 1e-6)
{
cus.splice(i, 1);
@ -197,30 +207,31 @@ export function CalcEdgeSealing(cus: Curve[])
}
else
frontLine.EndPoint = iPt;
oldLine = null;
par = laterLine.GetParamAtPoint(iPt);
//后面线点无效,如果是起始线,则删除,否则缓存原始线,继续尝试连接
if (par > 1 - 1e-6)
{
cus.splice(laterIndex, 1);
if (laterIndex === 0)
{
cus.shift();
firstLine = cus[0].Clone();
i -= 2;
continue;
}
else
i--;
if (i < -1)
i = -1;
oldLine = laterLine.Clone();
}
else
laterLine.StartPoint = iPt;
laterLine.StartPoint = iPt;
}
return true;
}
export function GetBoardHighSeal(br: Board, sealcus: Curve[])
{
let highSeals = br.BoardProcessOption.highSealed.slice();
let highSeals = br.BoardProcessOption.highSealed.slice().filter(d => d.size !== null && d.size !== undefined);
let sealDown = parseFloat(br.BoardProcessOption[EBoardKeyList.DownSealed]);
let sealUp = parseFloat(br.BoardProcessOption[EBoardKeyList.UpSealed]);
let sealLeft = parseFloat(br.BoardProcessOption[EBoardKeyList.LeftSealed]);
@ -336,7 +347,7 @@ export function GetSealedBoardContour(br: Board, hasSealing: boolean): Polyline
for (let i = 0; i < cus.length; i++)
{
let cs: Curve[];
if (highSeals[i].size === 0)
if (!highSeals[i].size)
cs = [cus[i].Clone()];
else
cs = cus[i].GetOffsetCurves(-highSeals[i].size * dir);

Loading…
Cancel
Save