|
|
@ -8,6 +8,7 @@ import { Ellipse } from "../DatabaseServices/Entity/Ellipse";
|
|
|
|
import { Line } from "../DatabaseServices/Entity/Line";
|
|
|
|
import { Line } from "../DatabaseServices/Entity/Line";
|
|
|
|
import { Polyline } from "../DatabaseServices/Entity/Polyline";
|
|
|
|
import { Polyline } from "../DatabaseServices/Entity/Polyline";
|
|
|
|
import { Spline } from "../DatabaseServices/Spline";
|
|
|
|
import { Spline } from "../DatabaseServices/Spline";
|
|
|
|
|
|
|
|
import { JigUtils } from "../Editor/JigUtils";
|
|
|
|
import { PromptEntityResult, PromptPointResult } from "../Editor/PromptResult";
|
|
|
|
import { PromptEntityResult, PromptPointResult } from "../Editor/PromptResult";
|
|
|
|
import { angle, AsVector2, equalv3, isParallelTo, midPoint } from "../Geometry/GeUtils";
|
|
|
|
import { angle, AsVector2, equalv3, isParallelTo, midPoint } from "../Geometry/GeUtils";
|
|
|
|
import { IntersectOption } from "../GraphicsSystem/IntersectWith";
|
|
|
|
import { IntersectOption } from "../GraphicsSystem/IntersectWith";
|
|
|
@ -201,7 +202,11 @@ export class FilletUtils
|
|
|
|
let param1 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes1.Point, false));
|
|
|
|
let param1 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes1.Point, false));
|
|
|
|
let param2 = pl.GetParamAtPoint(pl.GetClosestPointTo(enRes2.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 parF1 = Math.floor(param1);
|
|
|
|
let parF2 = Math.floor(param2);
|
|
|
|
let parF2 = Math.floor(param2);
|
|
|
@ -225,29 +230,52 @@ export class FilletUtils
|
|
|
|
es2.Point = enRes2.Point;
|
|
|
|
es2.Point = enRes2.Point;
|
|
|
|
let fres = this.Fillet(es1, es2);
|
|
|
|
let fres = this.Fillet(es1, es2);
|
|
|
|
|
|
|
|
|
|
|
|
if (!fres || !fres.arc)
|
|
|
|
if (!fres)
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
|
|
let pln = pl.Clone();
|
|
|
|
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)
|
|
|
|
if (fres.cu1 instanceof Arc)
|
|
|
|
pln.SetBulgeAt(parF1, fres.cu1.Bul);
|
|
|
|
pln.SetBulgeAt(parF1, fres.cu1.Bul);
|
|
|
|
|
|
|
|
|
|
|
|
if (fres.cu2 instanceof Arc)
|
|
|
|
if (fres.cu2 instanceof Arc)
|
|
|
|
pln.SetBulgeAt(parF2, fres.cu2.Bul);
|
|
|
|
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));
|
|
|
|
let sp = AsVector2(fres.cu1.EndPoint.applyMatrix4(pln.OCSInv));
|
|
|
|
if (parF2 - parF1 === 1)
|
|
|
|
if (parF2 - parF1 === 1)
|
|
|
|