From 4351d6c77dbf7fb4a7e709e68cfbe6309213919a Mon Sep 17 00:00:00 2001 From: ZoeLeeFZ Date: Wed, 9 Dec 2020 17:25:38 +0800 Subject: [PATCH] =?UTF-8?q?!1348=20=E4=BC=98=E5=8C=96:=E5=B0=81=E8=BE=B9?= =?UTF-8?q?=E8=BD=AE=E5=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __test__/EdgeSealing/EdgeSealing.test.ts | 41 ++++++++++++++++++ .../__snapshots__/EdgeSealing.test.ts.snap | 32 +++++++++++++- src/Add-on/DrawDrilling/CheckHasHole.ts | 2 + src/GraphicsSystem/CalcEdgeSealing.ts | 43 ++++++++++++------- 4 files changed, 100 insertions(+), 18 deletions(-) diff --git a/__test__/EdgeSealing/EdgeSealing.test.ts b/__test__/EdgeSealing/EdgeSealing.test.ts index f484290fb..68754c069 100644 --- a/__test__/EdgeSealing/EdgeSealing.test.ts +++ b/__test__/EdgeSealing/EdgeSealing.test.ts @@ -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(); + } +}); diff --git a/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap b/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap index 548275281..07cd41ab7 100644 --- a/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap +++ b/__test__/EdgeSealing/__snapshots__/EdgeSealing.test.ts.snap @@ -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`; diff --git a/src/Add-on/DrawDrilling/CheckHasHole.ts b/src/Add-on/DrawDrilling/CheckHasHole.ts index 58f8c38e1..c6d0fceee 100644 --- a/src/Add-on/DrawDrilling/CheckHasHole.ts +++ b/src/Add-on/DrawDrilling/CheckHasHole.ts @@ -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) diff --git a/src/GraphicsSystem/CalcEdgeSealing.ts b/src/GraphicsSystem/CalcEdgeSealing.ts index fc7003006..282a63169 100644 --- a/src/GraphicsSystem/CalcEdgeSealing.ts +++ b/src/GraphicsSystem/CalcEdgeSealing.ts @@ -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);