mirror of https://gitee.com/cf-fz/WebCAD.git
parent
c07318cec0
commit
3af6db9845
@ -0,0 +1,78 @@
|
||||
import { Vector3 } from "three";
|
||||
import { arrayLast } from "../../Common/ArrayExt";
|
||||
import { Polyline } from "../../DatabaseServices/Entity/Polyline";
|
||||
import { ComparePointFnGenerate } from "../../Geometry/GeUtils";
|
||||
import { RegionParse } from "../../Geometry/RegionParse";
|
||||
import { IntersectOption } from "../../GraphicsSystem/IntersectWith";
|
||||
|
||||
/**
|
||||
* 线性切割多线段
|
||||
*
|
||||
* @export
|
||||
* @param {Polyline} meatPl 被切割的曲线
|
||||
* @param {Polyline[]} knifePls 刀曲线
|
||||
* @return {*}
|
||||
*/
|
||||
|
||||
export function SplitPolyline(meatPl: Polyline, knifePls: Polyline[]): Polyline[]
|
||||
{
|
||||
let allSplitPls: Polyline[] = [];
|
||||
let allIntersePts: Vector3[] = [];
|
||||
for (let pl of knifePls)
|
||||
{
|
||||
|
||||
let ipts = pl.IntersectWith(meatPl, IntersectOption.ExtendThis);
|
||||
allIntersePts.push(...ipts);
|
||||
if (pl.LineData.length === 2 && ipts.length > 1) //直线切割,且有2个已经的顶点
|
||||
{
|
||||
if (ipts.length === 2)
|
||||
{
|
||||
pl.StartPoint = ipts[0];
|
||||
pl.EndPoint = ipts[1];
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
ipts.sort(ComparePointFnGenerate("xy"));
|
||||
pl.StartPoint = ipts[0];
|
||||
pl.EndPoint = arrayLast(ipts);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
let iptsNotExt = ipts.filter(p => pl.PtOnCurve(p));
|
||||
if (iptsNotExt.length < 2 && ipts.length === 2)
|
||||
{
|
||||
let params = ipts.map(p => pl.GetParamAtPoint(p));
|
||||
pl.Extend(params[0]);
|
||||
pl.Extend(params[1]);
|
||||
}
|
||||
}
|
||||
|
||||
let splitPls = pl.GetSplitCurvesByPts(ipts) as Polyline[];
|
||||
allSplitPls.push(...splitPls);
|
||||
}
|
||||
|
||||
let brSplitCus = meatPl.GetSplitCurvesByPts(allIntersePts) as Polyline[];
|
||||
|
||||
allSplitPls = allSplitPls.filter(pl =>
|
||||
{
|
||||
return meatPl.PtInCurve(pl.GetPointAtParam(pl.EndParam / 2)); //切割线必须在板内才有用
|
||||
});
|
||||
|
||||
let regionParse = new RegionParse(brSplitCus.concat(allSplitPls));
|
||||
|
||||
let cus = regionParse.RegionsInternal.map(r =>
|
||||
{
|
||||
let pl = new Polyline();
|
||||
for (let route of r)
|
||||
pl.Join(route.curve);
|
||||
if (pl.Area2 < 0)
|
||||
pl.Reverse();
|
||||
return pl;
|
||||
});
|
||||
return cus;
|
||||
}
|
@ -0,0 +1,3 @@
|
||||
|
||||
|
||||
export const CanDrawHoleFuzz = 0.1;
|
Loading…
Reference in new issue