From 1f2163a1291d1f24ebf514ddded1e72be567c2b1 Mon Sep 17 00:00:00 2001 From: ChenX Date: Tue, 14 May 2019 18:11:44 +0800 Subject: [PATCH] =?UTF-8?q?fix=20#IWFYB=20=E4=BF=AE=E6=AD=A3=E5=B8=83?= =?UTF-8?q?=E5=B0=94=E8=BF=90=E7=AE=97=E5=9B=A0=E4=B8=BA=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?=E8=BF=90=E7=AE=97=E5=AF=BC=E8=87=B4=E7=9A=84=E6=9D=BF=E4=BB=B6?= =?UTF-8?q?=E5=88=87=E5=89=B2=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__snapshots__/bool3.test.ts.snap | 5 +++ __test__/Booloperate/bool3.test.ts | 20 +++++++++++ __test__/Geometry/EdgeGeometry.test.ts | 2 +- .../__snapshots__/EdgeGeometry.test.ts.snap | 6 ++-- package.json | 6 ++-- .../BoardCutting/NonAssociativeCutting.ts | 4 +-- src/DatabaseServices/Curve.ts | 4 +-- src/GraphicsSystem/IntersectWith.ts | 35 ++++++++++++------- 8 files changed, 58 insertions(+), 24 deletions(-) create mode 100644 __test__/Booloperate/__snapshots__/bool3.test.ts.snap create mode 100644 __test__/Booloperate/bool3.test.ts diff --git a/__test__/Booloperate/__snapshots__/bool3.test.ts.snap b/__test__/Booloperate/__snapshots__/bool3.test.ts.snap new file mode 100644 index 000000000..6c3c1013a --- /dev/null +++ b/__test__/Booloperate/__snapshots__/bool3.test.ts.snap @@ -0,0 +1,5 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`布尔_误差共线_误差交点 1`] = `739590.0297771678`; + +exports[`布尔_误差共线_误差交点 2`] = `739582.752529773`; diff --git a/__test__/Booloperate/bool3.test.ts b/__test__/Booloperate/bool3.test.ts new file mode 100644 index 000000000..7afc31a93 --- /dev/null +++ b/__test__/Booloperate/bool3.test.ts @@ -0,0 +1,20 @@ +import { LoadRegionsFromFileData } from "../Utils/LoadEntity.util"; +import { BoolOpeartionType } from "../../src/GraphicsSystem/BoolOperateUtils"; + +test('布尔_误差共线_误差交点', () => +{ + let d = [2, "Region", 3, 2, 128, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 2, 4, [600, 0], 0, [600, 1241.380049628613], 0, [0, 1241.380049628613], 0, [0, 0], 0, true, 0, "Region", 3, 2, 129, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1232.380049628613, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1232.380049628613, 0, 1], 2, 4, [0, 0], 0, [582, 0], 0, [582, 8.999955254199449], 0, [0, 8.999955254199449], 0, true, 0]; + + let regs = LoadRegionsFromFileData(d); + + regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract); + + expect(regs[0].Area).toMatchSnapshot(); + + //弧形情况 + d = [2, "Region", 3, 2, 156, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 141.87083942583706, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 141.87083942583706, 0, 1], 2, 4, [600, 0], 0, [600, 1241.380049628613], 0, [0, 1241.380049628613], 0, [0, 0], 0, true, 0, "Region", 3, 2, 155, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 1374.2508890544507, 0, 1], 1, 1, 1, 1, "Polyline", 3, 2, 0, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3051.4141274641142, 1374.2508890544507, 0, 1], 2, 4, [0, 0], 0, [582, 0], 0.26581272283978424, [582, 8.999955254199449], 0, [0, 8.999955254199449], 0, true, 0]; + regs = LoadRegionsFromFileData(d); + regs[0].BooleanOper(regs[1], BoolOpeartionType.Subtract); + expect(regs[0].Area).toMatchSnapshot(); +}); + diff --git a/__test__/Geometry/EdgeGeometry.test.ts b/__test__/Geometry/EdgeGeometry.test.ts index c1f381878..7e30cca38 100644 --- a/__test__/Geometry/EdgeGeometry.test.ts +++ b/__test__/Geometry/EdgeGeometry.test.ts @@ -11,6 +11,6 @@ test('EdgeGeometry生成', () => { let line = br.GetDrawObjectFromRenderType(RenderType.Wireframe) as Line; //@ts-ignore - expect(line.geometry.attributes.position.length).toMatchSnapshot(); + expect(line.geometry.attributes.position.count).toMatchSnapshot(); } }); diff --git a/__test__/Geometry/__snapshots__/EdgeGeometry.test.ts.snap b/__test__/Geometry/__snapshots__/EdgeGeometry.test.ts.snap index e38535d1e..27306e9ed 100644 --- a/__test__/Geometry/__snapshots__/EdgeGeometry.test.ts.snap +++ b/__test__/Geometry/__snapshots__/EdgeGeometry.test.ts.snap @@ -1,7 +1,7 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`EdgeGeometry生成 1`] = `1296`; +exports[`EdgeGeometry生成 1`] = `432`; -exports[`EdgeGeometry生成 2`] = `2592`; +exports[`EdgeGeometry生成 2`] = `864`; -exports[`EdgeGeometry生成 3`] = `438`; +exports[`EdgeGeometry生成 3`] = `146`; diff --git a/package.json b/package.json index bd9ac66a2..57556da11 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "devDependencies": { "@types/blueimp-md5": "^2.7.0", "@types/html-webpack-plugin": "^3.2.0", - "@types/jest": "^24.0.12", - "@types/node": "^12.0.0", + "@types/jest": "^24.0.13", + "@types/node": "^12.0.1", "@types/react": "^16.8.17", "@types/react-color": "^3.0.0", "@types/react-dom": "^16.8.4", @@ -58,7 +58,7 @@ "source-map-loader": "^0.2.4", "style-loader": "^0.23.1", "terser-webpack-plugin": "^1.2.2", - "ts-jest": "^23.10.5", + "ts-jest": "^24.0.2", "ts-loader": "^6.0.0", "ts-node": "^8.1.0", "tsconfig-paths": "^3.8.0", diff --git a/src/Add-on/BoardCutting/NonAssociativeCutting.ts b/src/Add-on/BoardCutting/NonAssociativeCutting.ts index 90a800204..908989a14 100644 --- a/src/Add-on/BoardCutting/NonAssociativeCutting.ts +++ b/src/Add-on/BoardCutting/NonAssociativeCutting.ts @@ -8,7 +8,7 @@ export class NonAssociativeCutting implements Command async exec() { let brsRes2 = await app.m_Editor.GetSelection({ - Msg: "选择所有切割的板件", + Msg: "选择切割的板件", UseSelect: true, Filter: { filterTypes: [Board] } }); @@ -19,7 +19,7 @@ export class NonAssociativeCutting implements Command app.m_Editor.Prompt(`选择切割的板件: 总计${brs2.length}个`); let brsRes = await app.m_Editor.GetSelection({ - Msg: "选择所有被切割的板件(空格选择剩余全部)", + Msg: "选择被切割的板件<全部选择>", UseSelect: true, Filter: { filterTypes: [Board], diff --git a/src/DatabaseServices/Curve.ts b/src/DatabaseServices/Curve.ts index 2a3946951..e52ae6662 100644 --- a/src/DatabaseServices/Curve.ts +++ b/src/DatabaseServices/Curve.ts @@ -132,9 +132,9 @@ export abstract class Curve extends Entity Reverse(): this { return this; } //点在曲线上 - PtOnCurve(pt: Vector3): boolean + PtOnCurve(pt: Vector3, fuzz = 1e-6): boolean { - return equalv3(this.StartPoint, pt, 1e-6) || equalv3(this.EndPoint, pt, 1e-6) || this.ParamOnCurve(this.GetParamAtPoint(pt)); + return equalv3(this.StartPoint, pt, fuzz) || equalv3(this.EndPoint, pt, fuzz) || this.ParamOnCurve(this.GetParamAtPoint(pt)); } //点在曲线中,不在起点或者终点. diff --git a/src/GraphicsSystem/IntersectWith.ts b/src/GraphicsSystem/IntersectWith.ts index d0f748661..1601a5e55 100644 --- a/src/GraphicsSystem/IntersectWith.ts +++ b/src/GraphicsSystem/IntersectWith.ts @@ -5,8 +5,7 @@ import { Circle } from '../DatabaseServices/Circle'; import { Curve } from '../DatabaseServices/Curve'; import { Line } from '../DatabaseServices/Line'; import { Polyline } from '../DatabaseServices/Polyline'; -import { comparePoint, equaln, equalv3, midPoint } from '../Geometry/GeUtils'; - +import { comparePoint, equaln, equalv3 } from '../Geometry/GeUtils'; /** * 相交延伸选项. @@ -52,12 +51,12 @@ export function reverseIntersectOption(intType: IntersectOption) * @param {Intersect} extType 延伸选项. * @returns {Array} 校验完成后的点表 */ -function CheckPointOnCurve(intPts: Vector3[], c1: Curve, c2: Curve, extType: IntersectOption): Array +function CheckPointOnCurve(intPts: Vector3[], c1: Curve, c2: Curve, extType: IntersectOption, fuzz = 1e-4): Array { return intPts.filter(p => { - return (extType & IntersectOption.ExtendThis || c1.PtOnCurve(p)) && (extType & IntersectOption.ExtendArg || c2.PtOnCurve(p)) - }) + return (extType & IntersectOption.ExtendThis || c1.PtOnCurve(p, fuzz)) && (extType & IntersectOption.ExtendArg || c2.PtOnCurve(p, fuzz)) + }); } export function IntersectCircleAndCircle(cu1: Circle | Arc, cu2: Circle | Arc) @@ -274,7 +273,7 @@ function ShortestLine3AndLine3(p1: Vector3, p2: Vector3, p3: Vector3, p4: Vector } //直线和直线 -export function IntersectLineAndLine(l1: Line, l2: Line, extType: IntersectOption): Vector3[] +export function IntersectLineAndLine(l1: Line, l2: Line, extType: IntersectOption, fuzz = 1e-4): Vector3[] { // if (l1.Is2D && l2.Is2D) // { @@ -282,20 +281,30 @@ export function IntersectLineAndLine(l1: Line, l2: Line, extType: IntersectOptio // if (p) return [p]; // else return []; // } + let [pt1, pt2, pt3, pt4] = [l1.StartPoint, l1.EndPoint, l2.StartPoint, l2.EndPoint]; - let pts = ShortestLine3AndLine3(l1.StartPoint, l1.EndPoint, l2.StartPoint, l2.EndPoint); + let pts = ShortestLine3AndLine3(pt1, pt2, pt3, pt4); if (!pts) return []; let pt = pts[0]; let { closestPt: p1, param: param1 } = l1.GetClosestAtPoint(pt, true); let { closestPt: p2, param: param2 } = l2.GetClosestAtPoint(pt, true); - if ( - !equalv3(pt, p1, 1e-6) - || !equalv3(pt, p2, 1e-6) - || !(extType & IntersectOption.ExtendThis || l1.ParamOnCurve(param1)) - || !(extType & IntersectOption.ExtendArg || l2.ParamOnCurve(param2)) - ) + if (!equalv3(pt, p1, fuzz) || !equalv3(pt, p2, fuzz)) + return []; + + if (!(extType & IntersectOption.ExtendThis + || l1.ParamOnCurve(param1, 0) + || equalv3(pt1, pt, fuzz) + || equalv3(pt2, pt, fuzz) + )) + return []; + + if (!(extType & IntersectOption.ExtendArg + || l2.ParamOnCurve(param2, 0) + || equalv3(pt3, pt, fuzz) + || equalv3(pt4, pt, fuzz) + )) return []; return [pt];