修复:矩形线切割多余的顶点问题

pull/1470/head
ChenX 4 years ago
parent dbfd6d11f8
commit 1347843a55

@ -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>

Loading…
Cancel
Save