diff --git a/__test__/Room/RoomParse.test.ts b/__test__/Room/RoomParse.test.ts index 0b758e94a..21b1e3c20 100644 --- a/__test__/Room/RoomParse.test.ts +++ b/__test__/Room/RoomParse.test.ts @@ -260,3 +260,24 @@ test('z不为0时分析错误', () => for (let c of walls[0].LidCurves) expect(c.Length).toMatchNumberSnapshot(); }); + + +test('直线与圆弧正确的删除盖子线', () => +{ + let d = + { "file": [2, "RoomWallLine", 1, 3, 8, 2, 321, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5814.300457333236, -2014.354128653851, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 5814.300457333236, -2014.354128653851, 0, 1], 0, 120, 0, 2700, 4062.232098765433, -1342.7555592592594, 0, 4062.232098765433, -564.4939173809105, 0, "RoomWallArc", 3, 8, 2, 329, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 10274.71129794628, -2578.8480460347614, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 79.4, 0, 2700, 2, 398.1787418476097, 3.141592653589793, 0, true], "basePt": { "x": 9816.53255609867, "y": -3357.10968791311, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; + + let walls = LoadEntityFromFileData(d); + + TestWallCurveParse(walls); +}); + +test("直线与圆弧正确的删除盖子线(盒子问题导致点不在线内)", () => +{ + let d = + { "file": [2, "RoomWallLine", 1, 3, 8, 2, 100, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -4002.9032397050305, 1355.3730089236885, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -4002.9032397050305, 1355.3730089236885, 0, 1], 0, 120, 0, 2700, 4062.232098765433, -1342.7555592592594, 0, 4062.232098765433, -564.4939173809105, 0, "RoomWallArc", 3, 8, 2, 101, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 457.50760090801305, 790.879091542778, 0, 1], 0, 0, true, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, -9817.203697038267, 3369.7271375775395, 0, 1], 0, 79.4, 0, 2700, 2, 398.1787418476097, 3.141592653589793, 0, true], "basePt": { "x": -0.6711409395975352, "y": 12.61744966442916, "z": 0 }, "ucs": [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] }; + + let walls = LoadEntityFromFileData(d); + + TestWallCurveParse(walls); +}); diff --git a/__test__/Room/__snapshots__/RoomParse.test.ts.snap b/__test__/Room/__snapshots__/RoomParse.test.ts.snap index 3772dd7ea..0e18687f0 100644 --- a/__test__/Room/__snapshots__/RoomParse.test.ts.snap +++ b/__test__/Room/__snapshots__/RoomParse.test.ts.snap @@ -1342,6 +1342,134 @@ Array [ ] `; +exports[`直线与圆弧正确的删除盖子线 1`] = ` +Array [ + 0, + 778.2616418783487, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线 2`] = ` +Array [ + 0, + 778.2616418783487, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线 3`] = ` +Array [ + 120, + 0, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线 4`] = ` +Array [ + -20.299999999999272, + 0, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线 5`] = ` +Array [ + -20.30000000000109, + 0, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线 6`] = ` +Array [ + 2.6812339980917268e-14, + 437.87874184760966, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线 7`] = ` +Array [ + 2.1950492188302275e-14, + 358.4787418476097, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线 8`] = ` +Array [ + 79.39999999999964, + 0, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 1`] = ` +Array [ + 0, + 778.2616418783487, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 2`] = ` +Array [ + 0, + 778.2616418783487, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 3`] = ` +Array [ + 120, + 0, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 4`] = ` +Array [ + -20.299999999999102, + 0, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 5`] = ` +Array [ + -20.30000000000092, + 0, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 6`] = ` +Array [ + 2.6812339980917268e-14, + 437.87874184760966, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 7`] = ` +Array [ + 2.1950492188302275e-14, + 358.4787418476097, + 0, +] +`; + +exports[`直线与圆弧正确的删除盖子线(盒子问题导致点不在线内) 8`] = ` +Array [ + 79.40000000000009, + 0, + 0, +] +`; + exports[`直线圆弧2 1`] = ` Array [ 1487.019691385767, diff --git a/src/DatabaseServices/Room/ParseService/CurveTrim.ts b/src/DatabaseServices/Room/ParseService/CurveTrim.ts index 39c056cda..9818b5cb5 100644 --- a/src/DatabaseServices/Room/ParseService/CurveTrim.ts +++ b/src/DatabaseServices/Room/ParseService/CurveTrim.ts @@ -18,7 +18,7 @@ export class CurveTrim public _Box: Box3; constructor(public _curve: Line | Arc) { - this._Box = _curve.BoundingBox; + this._Box = _curve.BoundingBox.expandByVector(new Vector3(0.01, 0.01)); } TrimBy(contour: Contour, box: Box3, saveSyntropy = false) @@ -123,7 +123,7 @@ export class CurveTrimLine extends CurveTrim if (cu.ParamOnCurve(d.param) && equalv3(d.closestPt, p, 1e-5))//点在线上 { let derv = cu.GetFistDeriv(d.param).normalize(); - return equalv3(derv, this.derv) || (saveSyntropy && equalv3(derv.negate(), this.derv));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向 + return equalv3(derv, this.derv, 1e-4) || (saveSyntropy && equalv3(derv.negate(), this.derv, 1e-4));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向 } } else @@ -131,7 +131,7 @@ export class CurveTrimLine extends CurveTrim if (cu.PtOnCurve(p, 1e-5)) { let derv = cu.GetFistDeriv(cu.GetParamAtPoint2(p)).normalize(); - return equalv3(this.derv, derv) || (saveSyntropy && equalv3(derv.negate(), this.derv)); + return equalv3(this.derv, derv, 1e-4) || (saveSyntropy && equalv3(derv.negate(), this.derv, 1e-4)); } } } @@ -190,7 +190,7 @@ export class CurveTrimArc extends CurveTrim if (cu.ParamOnCurve(d.param) && equalv3(d.closestPt, p, 1e-5))//点在线上 //这个代码似乎是错误的,因为直线和圆弧不可能重合 { let derv = cu.GetFistDeriv(d.param).normalize(); - return equalv3(derv, thisDerv) || (saveSyntropy && equalv3(derv.negate(), thisDerv));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向 + return equalv3(derv, thisDerv, 1e-4) || (saveSyntropy && equalv3(derv.negate(), thisDerv, 1e-4));//因为墙体为顺时针 轮廓为逆时针 所以这里相等=反向 } } else @@ -198,7 +198,7 @@ export class CurveTrimArc extends CurveTrim if (cu.PtOnCurve(p, 1e-5)) { let cuDerv = cu.GetFistDeriv(cu.GetParamAtPoint2(p)).normalize(); - return equalv3(thisDerv, cuDerv) || (saveSyntropy && equalv3(cuDerv.negate(), thisDerv)); + return equalv3(thisDerv, cuDerv, 1e-4) || (saveSyntropy && equalv3(cuDerv.negate(), thisDerv, 1e-4)); } } } diff --git a/src/DatabaseServices/Room/ParseService/RoomWallParse.ts b/src/DatabaseServices/Room/ParseService/RoomWallParse.ts index e3634c43e..48914c64c 100644 --- a/src/DatabaseServices/Room/ParseService/RoomWallParse.ts +++ b/src/DatabaseServices/Room/ParseService/RoomWallParse.ts @@ -14,7 +14,7 @@ import { Line } from "../../Entity/Line"; import { Polyline } from "../../Entity/Polyline"; import { RoomWallBase } from "../Entity/Wall/RoomWallBase"; import { CurveTrim, CurveTrimArc, CurveTrimLine } from "./CurveTrim"; -import { CreateGetCurveParam, GetCurveParam, GetLineParam, LEFT_ROTATE_MTX2 } from './GetCurveParam'; +import { CreateGetCurveParam, GetCurveParam, GetLineParam } from './GetCurveParam'; import { RoomRegionParse } from './RoomRegionParse'; import { RoomWallExtendAndBreak } from "./RoomWallExtendAndBreak"; @@ -678,9 +678,7 @@ export class RoomWallParse if (!dir) { - dir = offsetCurve.GetFistDeriv(0).normalize(); - LEFT_ROTATE_MTX2.applyVector(dir); - if (type !== CurveType.Left) dir.negate(); + dir = offsetCurve.GetFistDeriv(0).normalize().negate(); } trim = new CurveTrimLine(offsetCurve, dir); @@ -770,9 +768,12 @@ export class RoomWallParse let fb = new Flatbush(trimContours.length); this.boxs = []; + + let v = new Vector3(1e-2, 1e-2); for (let con of trimContours) { let box = con.BoundingBox; + box.expandByVector(v); fb.add(box.min.x, box.min.y, box.max.x, box.max.y); this.boxs.push(box); }