|
|
|
@ -1,18 +1,18 @@
|
|
|
|
|
import { Vector3, Box3 } from "three";
|
|
|
|
|
import { Vector3 } from "three";
|
|
|
|
|
import { arrayLast } from "../Common/ArrayExt";
|
|
|
|
|
import { Vec2DTo3D, Vec3DTo2D, curveLinkGroup, getCirAngleByChordAndTangent } from "../Common/CurveUtils";
|
|
|
|
|
import { curveLinkGroup, getCirAngleByChordAndTangent, Vec2DTo3D, Vec3DTo2D } from "../Common/CurveUtils";
|
|
|
|
|
import { FixIndex } from "../Common/Utils";
|
|
|
|
|
import { Arc } from "../DatabaseServices/Arc";
|
|
|
|
|
import { Circle } from "../DatabaseServices/Circle";
|
|
|
|
|
import { Contour } from "../DatabaseServices/Contour";
|
|
|
|
|
import { Curve } from "../DatabaseServices/Curve";
|
|
|
|
|
import { Line } from "../DatabaseServices/Line";
|
|
|
|
|
import { ptInRectOrCircle } from "../DatabaseServices/PointInPolyline";
|
|
|
|
|
import { Polyline } from '../DatabaseServices/Polyline';
|
|
|
|
|
import { equal, equaln, greater } from "../Geometry/GeUtils";
|
|
|
|
|
import { isTargetCurInOrOnSourceCur, isTargetCurOutOrOnSourceCur, TargetCurPosForSourceCur, isTargetCurOutOrOnSourceCur2 } from "./BoolOperateUtils";
|
|
|
|
|
import { equal, equaln } from "../Geometry/GeUtils";
|
|
|
|
|
import { IsPtsAllOutOrOnReg, isTargetCurInOrOnSourceCur, isTargetCurOutOrOnSourceCur } from "./BoolOperateUtils";
|
|
|
|
|
import { IntersectOption } from "./IntersectWith";
|
|
|
|
|
import { LinkSelf } from "./LinkSelft";
|
|
|
|
|
import { app } from "../ApplicationServices/Application";
|
|
|
|
|
interface offestRes
|
|
|
|
|
{
|
|
|
|
|
index: number,
|
|
|
|
@ -691,7 +691,6 @@ export class PolyOffestUtil1
|
|
|
|
|
{
|
|
|
|
|
private m_Polyline: Polyline;
|
|
|
|
|
private m_OffestDist: number;
|
|
|
|
|
private IsKeepAllCurves = false; //为true时 保留全部,不优化裁剪
|
|
|
|
|
constructor(pl: Polyline, offest: number)
|
|
|
|
|
{
|
|
|
|
|
this.m_Polyline = pl;
|
|
|
|
@ -719,7 +718,7 @@ export class PolyOffestUtil1
|
|
|
|
|
// c.Outline.ColorIndex = 2;
|
|
|
|
|
// app.m_Database.ModelSpace.Append(c.Outline);
|
|
|
|
|
// })
|
|
|
|
|
console.time("trim")
|
|
|
|
|
// console.time("trim")
|
|
|
|
|
cus = this.trimByContours2(cus, contours).filter(c =>
|
|
|
|
|
{
|
|
|
|
|
if (c.IntersectWith(this.m_Polyline, IntersectOption.OnBothOperands).length !== 0) return false;
|
|
|
|
@ -728,7 +727,7 @@ export class PolyOffestUtil1
|
|
|
|
|
let rad2 = Math.pow(this.m_OffestDist, 2);
|
|
|
|
|
return (dist1 - rad2 >= -1e-3 || dist2 - rad2 >= -1e-3);
|
|
|
|
|
});
|
|
|
|
|
console.timeEnd("trim")
|
|
|
|
|
// console.timeEnd("trim")
|
|
|
|
|
|
|
|
|
|
return this.linkCurves(cus);
|
|
|
|
|
}
|
|
|
|
@ -1072,28 +1071,55 @@ export class PolyOffestUtil1
|
|
|
|
|
tmpCus[tmpCus.length] = l;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
let pts = l.IntersectWith(outline, IntersectOption.OnBothOperands);
|
|
|
|
|
// 在上面或者在外面
|
|
|
|
|
if (isTargetCurOutOrOnSourceCur2(outline, l, pts))
|
|
|
|
|
let interPts = l.IntersectWith(outline, IntersectOption.OnBothOperands);
|
|
|
|
|
let pars = interPts.map(p => l.GetParamAtPoint(p));
|
|
|
|
|
let needCaclPts: Vector3[] = [];
|
|
|
|
|
pars.forEach(par =>
|
|
|
|
|
{
|
|
|
|
|
par >= 0.02 && needCaclPts.push(l.GetPointAtParam(par - 0.01));
|
|
|
|
|
par <= (l.EndParam - 0.02) && needCaclPts.push(l.GetPointAtParam(par + 0.01));
|
|
|
|
|
})
|
|
|
|
|
if (needCaclPts.length <= 1)
|
|
|
|
|
{
|
|
|
|
|
if (pars.length === 0)
|
|
|
|
|
{
|
|
|
|
|
needCaclPts = [l.StartPoint];
|
|
|
|
|
} else
|
|
|
|
|
{
|
|
|
|
|
needCaclPts.push(l.StartPoint, l.EndPoint);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (IsPtsAllOutOrOnReg(outline, needCaclPts))
|
|
|
|
|
{
|
|
|
|
|
tmpCus[tmpCus.length] = l;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (pts.length > 0)
|
|
|
|
|
{
|
|
|
|
|
let par = pts.map(p => l.GetParamAtPoint(p));
|
|
|
|
|
let cus = l.GetSplitCurves(par);
|
|
|
|
|
|
|
|
|
|
if (cus.length > 0)
|
|
|
|
|
tmpCus.push(...cus.filter(cu => !equaln(cu.Length, 0, 1e-6) && !isTargetCurInOrOnSourceCur(outline, cu)));
|
|
|
|
|
else if (isTargetCurOutOrOnSourceCur2(outline, l, pts))
|
|
|
|
|
{
|
|
|
|
|
console.warn('不正常情况')
|
|
|
|
|
tmpCus.push(l);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
let cus = l.GetSplitCurves(pars);
|
|
|
|
|
tmpCus.push(...cus.filter(cu => !equaln(cu.Length, 0, 1e-6) && !ptInRectOrCircle(outline, cu.GetPointAtParam(0.5))));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 在上面或者在外面
|
|
|
|
|
// if (isTargetCurOutOrOnSourceCur2(outline, l, interPts))
|
|
|
|
|
// {
|
|
|
|
|
// tmpCus[tmpCus.length] = l;
|
|
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
// else
|
|
|
|
|
// {
|
|
|
|
|
// let pars = interPts.map(p => l.GetParamAtPoint(p));
|
|
|
|
|
// let cus = l.GetSplitCurves(pars);
|
|
|
|
|
|
|
|
|
|
// if (cus.length > 0)
|
|
|
|
|
// tmpCus.push(...cus.filter(cu => !equaln(cu.Length, 0, 1e-6) && !isTargetCurInOrOnSourceCur(outline, cu)));
|
|
|
|
|
// else if (isTargetCurOutOrOnSourceCur2(outline, l, interPts))
|
|
|
|
|
// {
|
|
|
|
|
// console.warn('不正常情况')
|
|
|
|
|
// tmpCus.push(l);
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
needCutCus = tmpCus;
|
|
|
|
|
})
|
|
|
|
|