From 8460b66973a89ce53e8c17e04b4d26ee823bf876 Mon Sep 17 00:00:00 2001 From: ChenX Date: Mon, 29 Jul 2019 17:01:11 +0800 Subject: [PATCH] =?UTF-8?q?!433=20=E5=A4=9A=E6=AE=B5=E7=BA=BF=E5=80=92?= =?UTF-8?q?=E8=A7=92=E5=8D=8A=E5=BE=84=E4=B8=BA0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __test__/Polyline/Fillet.test.ts | 57 +++++++++++++++++++ .../__snapshots__/Fillet.test.ts.snap | 14 +++++ src/Add-on/FilletUtils.ts | 56 +++++++++++++----- src/Editor/CommandRegister.ts | 2 + 4 files changed, 115 insertions(+), 14 deletions(-) diff --git a/__test__/Polyline/Fillet.test.ts b/__test__/Polyline/Fillet.test.ts index 63275b48c..bd0d799b4 100644 --- a/__test__/Polyline/Fillet.test.ts +++ b/__test__/Polyline/Fillet.test.ts @@ -290,3 +290,60 @@ test('自交多段线', () => } }); + + +//R0 + +test('多段线双圆R0', () => +{ + + let f = [1, "Polyline", 5, 2, 105, false, 1, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1571.0622009569374, 642.1282296650719, 0, 1], 0, 0, 2, 3, [-454.206027432087, 320.6147368421051], -2.9766539744084812, [-431.6922770664303, -350.340837980916], -2.8993396583254722, [-518.3394309084008, 201.0501410134426], 0, false] + + let pl = LoadEntityFromFileData(f)[0] as Polyline; + + let fillet = new FilletUtils(); + + fillet.FilletRadius = 0; + + let pts = [new Vector3(909.9440085668164, 933.3077477050381, 0), new Vector3(1280.5718361808256, 1116.166490576796, 0)]; + + for (let i = 0; i + 1 < pts.length; i = i + 2) + { + let p1 = pts[i]; + let p2 = pts[i + 1]; + + let e1 = new PromptEntityResult(pl, p1); + let e2 = new PromptEntityResult(pl, p2); + let fres = fillet.Fillet(e1, e2); + + excepeRes(fres); + } + +}); + +test('自交多段线R0', () => +{ + + let f = [1, "Polyline", 5, 2, 106, false, 0, 7, 0, [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], 0, 0, 2, 7, [4276.596835215311, 1149.2698457416268], 0, [4814.832566507177, -666.4651513875599], 0, [6251.870712226028, 1084.2122721667558], -0.5612019988173412, [6572.455012671152, 1039.2528815304759], 0, [7078.0165450717695, -128.2294200956936], 0, [9088.294577607654, 1700.475112727273], 0, [5906.768985493756, 210.08998230825014], 0, false] + + let pl = LoadEntityFromFileData(f)[0] as Polyline; + + let fillet = new FilletUtils(); + + fillet.FilletRadius = 10; + + let pts = [new Vector3(4759.472137764609, -479.7070785210667, 0), new Vector3(6024.774672494344, 265.369726606551, 0), new Vector3(5976.082363634626, 748.2320220970707, 0), new Vector3(6672.691303327904, 807.7793855808623, 0), new Vector3(6683.501141538695, 782.8164602281072, 0), new Vector3(6586.348726590796, 528.4389981312158, 0), new Vector3(6696.36087689051, 753.119751786805, 0), new Vector3(7099.123174513582, 768.6481023223804, 0), new Vector3(6658.806811968616, 562.3819760828667, 0), new Vector3(6851.152936781651, 395.661799048499, 0), new Vector3(6890.235750785234, 305.4087027928025, 0), new Vector3(7047.556803344554, 744.4918443904984, 0)]; + + + for (let i = 0; i + 1 < pts.length; i = i + 2) + { + let p1 = pts[i]; + let p2 = pts[i + 1]; + + let e1 = new PromptEntityResult(pl, p1); + let e2 = new PromptEntityResult(pl, p2); + let fres = fillet.Fillet(e1, e2); + + excepeRes(fres); + } +}); diff --git a/__test__/Polyline/__snapshots__/Fillet.test.ts.snap b/__test__/Polyline/__snapshots__/Fillet.test.ts.snap index 5a5c43484..9757e6eae 100644 --- a/__test__/Polyline/__snapshots__/Fillet.test.ts.snap +++ b/__test__/Polyline/__snapshots__/Fillet.test.ts.snap @@ -4,6 +4,8 @@ exports[`只有closemark 1`] = `"4641.27612"`; exports[`圆弧跨越分割线 1`] = `"1420.95209"`; +exports[`多段线双圆R0 1`] = `"5151.46930"`; + exports[`自交多段线 1`] = `"7791.00495"`; exports[`自交多段线 2`] = `"9003.48566"`; @@ -12,6 +14,18 @@ exports[`自交多段线 3`] = `"0.00000"`; exports[`自交多段线 4`] = `"0.00000"`; +exports[`自交多段线R0 1`] = `"11798.05277"`; + +exports[`自交多段线R0 2`] = `"12270.99652"`; + +exports[`自交多段线R0 3`] = `"5952.10633"`; + +exports[`自交多段线R0 4`] = `"0.00000"`; + +exports[`自交多段线R0 5`] = `"0.00000"`; + +exports[`自交多段线R0 6`] = `"6089.71523"`; + exports[`跨越首尾且首尾重叠 1`] = `"4587.13386"`; exports[`跨越首尾且首尾重叠 2`] = `"4587.13386"`; diff --git a/src/Add-on/FilletUtils.ts b/src/Add-on/FilletUtils.ts index 532c4d3a6..d07dbdcf4 100644 --- a/src/Add-on/FilletUtils.ts +++ b/src/Add-on/FilletUtils.ts @@ -8,6 +8,7 @@ import { Ellipse } from "../DatabaseServices/Entity/Ellipse"; import { Line } from "../DatabaseServices/Entity/Line"; import { Polyline } from "../DatabaseServices/Entity/Polyline"; import { Spline } from "../DatabaseServices/Spline"; +import { JigUtils } from "../Editor/JigUtils"; import { PromptEntityResult, PromptPointResult } from "../Editor/PromptResult"; import { angle, AsVector2, equalv3, isParallelTo, midPoint } from "../Geometry/GeUtils"; import { IntersectOption } from "../GraphicsSystem/IntersectWith"; @@ -201,7 +202,11 @@ export class FilletUtils let param1 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes1.Point, false)); let param2 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes2.Point, false)); - if (param1 > param2) [param1, param2] = [param2, param1]; + if (param1 > param2) + { + [param1, param2] = [param2, param1]; + [enRes1, enRes2] = [enRes2, enRes1]; + } let parF1 = Math.floor(param1); let parF2 = Math.floor(param2); @@ -225,29 +230,52 @@ export class FilletUtils es2.Point = enRes2.Point; let fres = this.Fillet(es1, es2); - if (!fres || !fres.arc) + if (!fres) return; let pln = pl.Clone(); - let notCycle = equalv3(pl.GetPointAtParam(parF1), fres.cu1.StartPoint); - - let c1Derv = c1.GetFistDeriv(fres.arc.StartPoint).normalize(); - let c2Derv = c2.GetFistDeriv(fres.arc.EndPoint).normalize(); - let asDerv = fres.arc.GetFistDeriv(0).normalize(); - let aeDerv = fres.arc.GetFistDeriv(1).normalize(); - - //自交多段线时 - if (equalv3(c1Derv, asDerv) !== equalv3(c2Derv, aeDerv)) - return; - if (fres.cu1 instanceof Arc) pln.SetBulgeAt(parF1, fres.cu1.Bul); if (fres.cu2 instanceof Arc) pln.SetBulgeAt(parF2, fres.cu2.Bul); - if (notCycle)//没有经过起点 + let splitType1 = equalv3(c1.StartPoint, fres.cu1.StartPoint); + let splitType2 = equalv3(c2.StartPoint, fres.cu2.StartPoint); + + if (splitType1 === splitType2) + return; + if (!fres.arc) + { + if (splitType1) + { + let ep = AsVector2(fres.cu1.EndPoint.applyMatrix4(pln.OCSInv)); + pln.SetPointAt(parF1 + 1, ep); + + let sp = AsVector2(fres.cu2.StartPoint.applyMatrix4(pln.OCSInv)); + pln.SetPointAt(parF2, sp); + //移除多余的点 + pln.LineData.splice(parF1 + 1, parF2 - parF1 - 1); + pln.Update(); + return { cu1: pln }; + } + else + { + let ep = AsVector2(fres.cu1.StartPoint.applyMatrix4(pln.OCSInv)); + pln.SetPointAt(parF1, ep); + + let sp = AsVector2(fres.cu2.EndPoint.applyMatrix4(pln.OCSInv)); + pln.SetPointAt(parF2 + 1, sp); + + pln.LineData.splice(parF2 + 2); + pln.LineData.splice(0, parF1); + pln.Update(); + return { cu1: pln }; + } + } + + if (splitType1)//没有经过起点 { let sp = AsVector2(fres.cu1.EndPoint.applyMatrix4(pln.OCSInv)); if (parF2 - parF1 === 1) diff --git a/src/Editor/CommandRegister.ts b/src/Editor/CommandRegister.ts index dff5b8212..40508bd4d 100644 --- a/src/Editor/CommandRegister.ts +++ b/src/Editor/CommandRegister.ts @@ -124,6 +124,7 @@ import { ShowTemplate } from '../Add-on/Template/ShowTemplate'; import { ReverseDrillFace } from '../Add-on/DrawDrilling/ReverseDrillFace'; import { DeleteDim } from '../Add-on/DrawDim/DeleteDim'; import { Command_FastDimBrs } from '../Add-on/DrawDim/FastDim'; +import { TestFillet } from '../Add-on/testEntity/TestFilletCode'; export function registerCommand() @@ -215,6 +216,7 @@ export function registerCommand() commandMachine.RegisterCommand("ss", new Command_Ssget()); commandMachine.RegisterCommand("f", new CommandFillet()); + commandMachine.RegisterCommand("testFilletCode", new TestFillet()); commandMachine.RegisterCommand("O", new Command_Offset()); commandMachine.RegisterCommand("Length", new Command_Length());