|
|
|
@ -1,10 +1,13 @@
|
|
|
|
|
import { Line3, Matrix4, Vector3 } from "three";
|
|
|
|
|
import { app } from "../../ApplicationServices/Application";
|
|
|
|
|
import { arrayLast } from "../../Common/ArrayExt";
|
|
|
|
|
import { Contour } from "../../DatabaseServices/Contour";
|
|
|
|
|
import { Board } from "../../DatabaseServices/Entity/Board";
|
|
|
|
|
import { ExtureContourCurve } from "../../DatabaseServices/Entity/Extrude";
|
|
|
|
|
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
|
|
|
|
|
import { Command } from "../../Editor/CommandMachine";
|
|
|
|
|
import { PromptStatus } from "../../Editor/PromptResult";
|
|
|
|
|
import { CreateContour2 } from "../../Geometry/CreateContour2";
|
|
|
|
|
import { AsVector2, equaln, isParallelTo } from "../../Geometry/GeUtils";
|
|
|
|
|
import { PlaneExt } from "../../Geometry/Plane";
|
|
|
|
|
import { RegionParse } from "../../Geometry/RegionParse";
|
|
|
|
@ -98,19 +101,39 @@ export class LinearCutting implements Command
|
|
|
|
|
|
|
|
|
|
let brContour = br.ContourCurve.Clone() as Polyline;//提取轮廓
|
|
|
|
|
|
|
|
|
|
let allSplitPls: Polyline[] = [];
|
|
|
|
|
let allIntersePts: Vector3[] = [];
|
|
|
|
|
for (let npts of nnpts)
|
|
|
|
|
let clipPls = nnpts.map(npts =>
|
|
|
|
|
{
|
|
|
|
|
npts.forEach(p => p.applyMatrix4(brOcsInv));
|
|
|
|
|
return new Polyline(npts.map(p => { return { pt: AsVector2(p), bul: 0 }; }));
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let pl = new Polyline();
|
|
|
|
|
for (let p of npts)
|
|
|
|
|
pl.AddVertexAt(pl.NumberOfVertices, AsVector2(p));
|
|
|
|
|
if (clipPls.length === 1 && clipPls.every(pl => pl.IsClose && pl.Area > 0))
|
|
|
|
|
{
|
|
|
|
|
let brContourC = Contour.CreateContour(brContour);
|
|
|
|
|
let clipContourC = Contour.CreateContour(clipPls[0]) ?? CreateContour2(clipPls[0].Explode());
|
|
|
|
|
|
|
|
|
|
//差集
|
|
|
|
|
let scons = brContourC.SubstactBoolOperation(clipContourC);
|
|
|
|
|
if (scons.length > 0)
|
|
|
|
|
{
|
|
|
|
|
let icons = brContourC.IntersectionBoolOperation(clipContourC);
|
|
|
|
|
let cus = scons.map(c => c.Curve);
|
|
|
|
|
for (let con of icons)
|
|
|
|
|
cus.push(con.Curve);
|
|
|
|
|
|
|
|
|
|
this.SplitBoard(br, cus);
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
let allSplitPls: Polyline[] = [];
|
|
|
|
|
let allIntersePts: Vector3[] = [];
|
|
|
|
|
for (let pl of clipPls)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
let ipts = pl.IntersectWith(brContour, IntersectOption.ExtendThis);
|
|
|
|
|
allIntersePts.push(...ipts);
|
|
|
|
|
if (npts.length === 2 && ipts.length === 2)
|
|
|
|
|
if (pl.LineData.length === 2 && ipts.length === 2)
|
|
|
|
|
{
|
|
|
|
|
pl.StartPoint = ipts[0];
|
|
|
|
|
pl.EndPoint = ipts[1];
|
|
|
|
@ -134,10 +157,10 @@ export class LinearCutting implements Command
|
|
|
|
|
|
|
|
|
|
allSplitPls = allSplitPls.filter(pl =>
|
|
|
|
|
{
|
|
|
|
|
return brContour.PtInCurve(pl.GetPointAtParam(pl.EndParam / 2));
|
|
|
|
|
return brContour.PtInCurve(pl.GetPointAtParam(pl.EndParam / 2));//切割线必须在板内才有用
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let regionParse = new RegionParse([...brSplitCus, ...allSplitPls]);
|
|
|
|
|
let regionParse = new RegionParse(brSplitCus.concat(allSplitPls));
|
|
|
|
|
|
|
|
|
|
let cus = regionParse.RegionsInternal.map(r =>
|
|
|
|
|
{
|
|
|
|
@ -152,25 +175,31 @@ export class LinearCutting implements Command
|
|
|
|
|
if (cus.length === 0)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
let spliteEnts: Board[] = [];
|
|
|
|
|
|
|
|
|
|
//造型应用
|
|
|
|
|
for (let i = 1; i < cus.length; i++)
|
|
|
|
|
{
|
|
|
|
|
let br2 = br.Clone();
|
|
|
|
|
br2.ContourCurve = cus[i];
|
|
|
|
|
app.Database.ModelSpace.Append(br2);
|
|
|
|
|
br2.RepairRelevance();
|
|
|
|
|
br2.GrooveCheckAllAutoSplit();
|
|
|
|
|
spliteEnts.push(br2);
|
|
|
|
|
}
|
|
|
|
|
this.SplitBoard(br, cus);
|
|
|
|
|
}
|
|
|
|
|
app.Editor.UCSMatrix = oldUcs;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
br.HandleSpliteEntitys(spliteEnts);
|
|
|
|
|
//根据轮廓曲线分裂板件
|
|
|
|
|
protected SplitBoard(br: Board, cus: ExtureContourCurve[])
|
|
|
|
|
{
|
|
|
|
|
let spliteEnts: Board[] = [];
|
|
|
|
|
|
|
|
|
|
br.ContourCurve = cus[0];
|
|
|
|
|
br.GrooveCheckAllAutoSplit();
|
|
|
|
|
//造型应用
|
|
|
|
|
for (let i = 1; i < cus.length; i++)
|
|
|
|
|
{
|
|
|
|
|
let br2 = br.Clone();
|
|
|
|
|
br2.ContourCurve = cus[i];
|
|
|
|
|
app.Database.ModelSpace.Append(br2);
|
|
|
|
|
br2.RepairRelevance();
|
|
|
|
|
br2.GrooveCheckAllAutoSplit();
|
|
|
|
|
spliteEnts.push(br2);
|
|
|
|
|
}
|
|
|
|
|
app.Editor.UCSMatrix = oldUcs;
|
|
|
|
|
|
|
|
|
|
br.HandleSpliteEntitys(spliteEnts);
|
|
|
|
|
|
|
|
|
|
br.ContourCurve = cus[0];
|
|
|
|
|
br.GrooveCheckAllAutoSplit();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected async GetCuttingPoints(): Promise<Vector3[] | undefined>
|
|
|
|
|