diff --git a/src/Add-on/Fillet.ts b/src/Add-on/Fillet.ts index b6c14e17b..49594376c 100644 --- a/src/Add-on/Fillet.ts +++ b/src/Add-on/Fillet.ts @@ -331,26 +331,55 @@ export class CommandFillet implements Command let parF1 = Math.floor(param1); let parF2 = Math.floor(param2); - //TODO:自交多段线倒角 //共线 if (parF1 === parF2) return; - //是否相邻。 + let c1 = pl.GetCurveAtParam(param1); + let c2 = pl.GetCurveAtParam(param2); + + if (equalv3(c1.GetFistDeriv(1).normalize(), c2.GetFistDeriv(0).normalize())) + return; + let rem = parF2 - parF1; - if (rem === 1 - || (rem + 1 === pl.EndParam) + if (rem === 1 || (rem + 1 === pl.EndParam)//是否相邻 ) { } - else - return; + else//自交多段线 + { + if (!(c1 instanceof Line && c2 instanceof Line)) + return; - let c1 = pl.GetCurveAtParam(param1); - let c2 = pl.GetCurveAtParam(param2); + let interPts = c1.IntersectWith(c2, IntersectOption.OnBothOperands); + if (interPts.length === 0) + return; + + let ipt = interPts[0]; + let splitParam1 = Math.floor(param1) + c1.GetParamAtPoint(ipt); + let splitParam2 = Math.floor(param2) + c2.GetParamAtPoint(ipt); + + let cus = pl.GetSplitCurves([splitParam1, splitParam2]); + if (cus.length >= 2) + { + cus.splice(1, 1); + + let pl1 = cus[0]; + for (let i = 1; i < cus.length; i++) + pl1.Join(cus[i]); + + let es1 = new PromptEntityResult(); + es1.Entity = pl1; + es1.Point = c1.GetPointAtParam(0.1); + + let es2 = new PromptEntityResult(); + es2.Entity = pl1; + es2.Point = c2.GetPointAtParam(0.9); + + return this.FilletPolyLineSelf(es1, es2); + } + } - if (equalv3(c1.GetFistDeriv(1).normalize(), c2.GetFistDeriv(0).normalize())) - return; let es1 = new PromptEntityResult(); es1.Entity = c1;