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