diff --git a/__test__/Booloperate/__snapshots__/bool.test.ts.snap b/__test__/Booloperate/__snapshots__/bool.test.ts.snap index 101c6eb7a..e67461b63 100644 --- a/__test__/Booloperate/__snapshots__/bool.test.ts.snap +++ b/__test__/Booloperate/__snapshots__/bool.test.ts.snap @@ -1,3 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`因为判断同向错误导致的布尔运算错误 1`] = `"2"`; + +exports[`因为判断同向错误导致的布尔运算错误 2`] = `"730.55880"`; + exports[`简单差集 1`] = `377232.7083535502`; diff --git a/__test__/Booloperate/bool.test.ts b/__test__/Booloperate/bool.test.ts index 0c3e62a53..1d6168abd 100644 --- a/__test__/Booloperate/bool.test.ts +++ b/__test__/Booloperate/bool.test.ts @@ -2,6 +2,7 @@ import { arraySum } from "../../src/Common/ArrayExt"; import { Region } from "../../src/DatabaseServices/Entity/Region"; import { BoolOpeartionType } from "../../src/GraphicsSystem/BoolOperateUtils"; import { LoadRegionsFromFileData } from "../Utils/LoadEntity.util"; +import "../Utils/jest.util"; //没有洞 test('2没有洞的面域,相交', () => @@ -234,3 +235,15 @@ function testRegionsBool(regs: Region[], uShapeCount: number, uHoleCount: number expect(shapeCount3).toBe(sShapeCount); expect(holeCount3).toBe(sHoleCount); } + +test('因为判断同向错误导致的布尔运算错误', () => +{ + let d = + { "file": [2, "Region", 10, 2, 113, 0, 1, 1, 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, 1, 1, 1, 1, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 1.8369701987210297e-16, 0, 0, -1.8369701987210297e-16, 1, 0, 0, 0, 0, 1, 0, 84.0663826298624, 29.997890625008143, 0, 1], 0, 0, 1, [1, 1.8369701987210297e-16, 0, 0, -1.8369701987210297e-16, 1, 0, 0, 0, 0, 1, 0, 84.0663826298624, 29.997890625008143, 0, 1], 0, 0, 1, 2, 6, [51.327397755710166, 8.9999999999999], 0, [76.44091661722764, 52.49789062498048], 0, [51.327397755698925, 95.99578124997062], 0, [1.09445458902535, 95.99578124997072], 0, [-22.143756126866503, 55.746019613071404], 0.02750377742868334, [4.842938509491432, 9.000000000000057], 0, true, 0, "Region", 10, 2, 114, 0, 1, 2, 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, 1, 1, 1, 1, "Polyline", 10, 2, 0, 0, 0, 7, 71, [1, 1.8369701987210297e-16, 1.8369701987210297e-16, 0, -1.8369701987210297e-16, 1, -3.374459510989179e-32, 0, -1.8369701987210297e-16, 0, 1, 0, 66.97552158763568, 82.49578124998891, 0, 1], 0, 0, 1, [1, 1.8369701987210297e-16, 1.8369701987210297e-16, 0, -1.8369701987210297e-16, 1, -3.374459510989179e-32, 0, -1.8369701987210297e-16, 0, 1, 0, 66.97552158763568, 82.49578124998891, 0, 1], 0, 0, 1, 2, 6, [19.91736643882509, -40.4978906249944], 0, [66.68620799036073, -40.49789062499439], 0, [90.06767604432, -3.986144747614162e-12], 0, [66.68620799036296, 40.49789062500167], 0, [19.917366438823027, 40.49789062500167], 0, [-3.4641016151380235, -2.1316282072803006e-13], 0, true, 0], "basePt": { "x": 61.922626502995854, "y": 38.997890625008054, "z": -6.363451432349935e-16 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 298.994974874372, 121.44053601340033, 0, 1] }; + let regs = LoadRegionsFromFileData(d.file); + + regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract); + + expect(regs[0].ShapeManager.ShapeCount).toMatchNumberSnapshot(0); + expect(regs[0].Area).toMatchNumberSnapshot(); +}); diff --git a/src/DatabaseServices/Contour.ts b/src/DatabaseServices/Contour.ts index f32d4d3d4..c5710f290 100644 --- a/src/DatabaseServices/Contour.ts +++ b/src/DatabaseServices/Contour.ts @@ -476,17 +476,20 @@ export class Contour for (let sourceSplitcu of sourceSplitCurves) { - let sourceDir = sourceSplitcu.GetFirstDeriv(sourceSplitcu.MidParam).normalize(); - let index = targetSplitCurves.findIndex(cu => fastEqualCurve(cu, sourceSplitcu, 0.05)); if (index !== -1) { let targetSplitcu = targetSplitCurves[index]; let isEqualNormal = equalv3(sourceOutline.Normal, targetSplitCurve_CurvesMap.get(targetSplitcu).Normal, 1e-3); - let targetDir = targetSplitcu.GetFirstDeriv(targetSplitcu.MidParam).normalize(); - if (isEqualNormal === !equalv3(targetDir, sourceDir, 1e-3))//不同向 + if (isEqualNormal === !equalv3(sourceSplitcu.StartPoint, targetSplitcu.StartPoint, 0.05))//不同向 + { subtractList.push(sourceSplitcu); + // TestDraw(sourceSplitcu.Clone(), 1); + // TestDraw(targetSplitcu.Clone(), 1); + } + // else + // TestDraw(sourceSplitcu.Clone(), 2); targetSplitCurves.splice(index, 1); diff --git a/src/GraphicsSystem/ToolPath/FeedingToolPath.ts b/src/GraphicsSystem/ToolPath/FeedingToolPath.ts index 45c5d83fc..4938ceadb 100644 --- a/src/GraphicsSystem/ToolPath/FeedingToolPath.ts +++ b/src/GraphicsSystem/ToolPath/FeedingToolPath.ts @@ -135,7 +135,18 @@ export class FeedingToolPath extends Singleton let shapeMg = new ShapeManager(); let cons = this.GetContours(retCus as Polyline[], offsetCus); shapeMg.AppendShapeList(cons.map(c => new Shape(c))); + + //testcode + // let reg = new Region(shapeMg).Clone(); + // let reg2 = new Region(holesMg).Clone(); + // TestDraw(reg, 1); + // TestDraw(reg2, 2); + shapeMg.BoolOper(holesMg, BoolOpeartionType.Subtract); + + // let reg3 = new Region(shapeMg).Clone(); + // TestDraw(reg3, 3); + for (let s of shapeMg.ShapeList) { if (isOut && tempOffsetCus.length > 1)