|
|
@ -1,21 +1,15 @@
|
|
|
|
import { Vector2, Vector3 } from "three";
|
|
|
|
import { Vector2, Vector3 } from "three";
|
|
|
|
import { Vec2DTo3D, Vec3DTo2D, getCirAngleByChordAndTangent, curveLinkGroup } from "../Common/CurveUtils";
|
|
|
|
import { arrayLast } from "../Common/ArrayExt";
|
|
|
|
import { sliceDeep } from "../Common/Utils";
|
|
|
|
import { Vec2DTo3D, Vec3DTo2D, curveLinkGroup, getCirAngleByChordAndTangent } from "../Common/CurveUtils";
|
|
|
|
import { Arc } from "../DatabaseServices/Arc";
|
|
|
|
import { Arc } from "../DatabaseServices/Arc";
|
|
|
|
import { Circle } from "../DatabaseServices/Circle";
|
|
|
|
import { Circle } from "../DatabaseServices/Circle";
|
|
|
|
import { Contour } from "../DatabaseServices/Contour";
|
|
|
|
import { Contour } from "../DatabaseServices/Contour";
|
|
|
|
import { Curve } from "../DatabaseServices/Curve";
|
|
|
|
import { Curve } from "../DatabaseServices/Curve";
|
|
|
|
import { Line } from "../DatabaseServices/Line";
|
|
|
|
import { Line } from "../DatabaseServices/Line";
|
|
|
|
import { Polyline, PolylineProps } from '../DatabaseServices/Polyline';
|
|
|
|
import { Polyline, PolylineProps } from '../DatabaseServices/Polyline';
|
|
|
|
import { MoveMatrix, angleTo, equal, equaln } from "../Geometry/GeUtils";
|
|
|
|
import { equal, equaln } from "../Geometry/GeUtils";
|
|
|
|
import { isTargetCurInSourceCur, isTargetCurOutOrOnSourceCur, isTargetCurOnSourceCur } from "./BoolOperateUtils";
|
|
|
|
import { isTargetCurInSourceCur, isTargetCurOutOrOnSourceCur } from "./BoolOperateUtils";
|
|
|
|
import { IntersectOption } from "./IntersectWith";
|
|
|
|
import { IntersectOption } from "./IntersectWith";
|
|
|
|
import { removeRepeat, arrayLast, filterArray } from "../Common/ArrayExt";
|
|
|
|
|
|
|
|
import { Region } from "../DatabaseServices/Region";
|
|
|
|
|
|
|
|
import { Shape } from "../DatabaseServices/Shape";
|
|
|
|
|
|
|
|
import { app } from "../ApplicationServices/Application";
|
|
|
|
|
|
|
|
import { ShapeManager } from "../DatabaseServices/ShapeManager";
|
|
|
|
|
|
|
|
import { intercept } from "mobx";
|
|
|
|
|
|
|
|
interface offestRes
|
|
|
|
interface offestRes
|
|
|
|
{
|
|
|
|
{
|
|
|
|
index: number,
|
|
|
|
index: number,
|
|
|
@ -1079,30 +1073,15 @@ export class PolyOffestUtil3
|
|
|
|
contours.push(this.buildContourByTwoSideOfest(plList1[i].pl, plList2[i].pl));
|
|
|
|
contours.push(this.buildContourByTwoSideOfest(plList1[i].pl, plList2[i].pl));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
let newPls = this.trimAndJointOffestPolyline(plList1, this.m_Polyline);
|
|
|
|
let newPls = this.trimAndJointOffestPolyline(plList1, this.m_Polyline);
|
|
|
|
// let refPls = this.trimAndJointOffestPolyline(plList2, this.m_Polyline);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// let refPl = new Polyline(refProps);
|
|
|
|
|
|
|
|
// return [...newPls, ...refPls]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let cus = this.trimByContours(newPls, contours);
|
|
|
|
let cus = this.trimByContours(newPls, contours);
|
|
|
|
|
|
|
|
|
|
|
|
if (this.m_Polyline.IsClose && this.offDir < 0)
|
|
|
|
if (this.m_Polyline.IsClose && this.offDir < 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
cus = cus.filter(pl => isTargetCurInSourceCur(this.m_Polyline, pl))
|
|
|
|
cus = cus.filter(pl => isTargetCurInSourceCur(this.m_Polyline, pl))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let isIntersectWithSelf = this.isSelfingCUs(cus);
|
|
|
|
return this.linkSelfingCurves(cus);
|
|
|
|
if (isIntersectWithSelf)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
// cus.forEach(c => c.ColorIndex = 2);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// return cus;
|
|
|
|
|
|
|
|
return this.linkSelfingCurves(cus);
|
|
|
|
|
|
|
|
} else
|
|
|
|
|
|
|
|
return this.linkCurves(cus);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// let cus1 = this.trimByContours(refPls, contours);
|
|
|
|
|
|
|
|
// return [...cus, ...cus1]
|
|
|
|
|
|
|
|
// 闭合时向内偏移,偏移线段应在封闭区域内,自交情况下无效
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//偏移曲线
|
|
|
|
//偏移曲线
|
|
|
@ -1343,12 +1322,14 @@ export class PolyOffestUtil3
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return needCutPls;
|
|
|
|
return needCutPls;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
getIntersectWithSelf(cus: Curve[])
|
|
|
|
/**
|
|
|
|
{
|
|
|
|
* 判断曲线是否自交
|
|
|
|
let pls: Polyline[] = [];
|
|
|
|
*
|
|
|
|
|
|
|
|
* @private
|
|
|
|
return pls;
|
|
|
|
* @param {Curve[]} cus
|
|
|
|
}
|
|
|
|
* @returns
|
|
|
|
|
|
|
|
* @memberof PolyOffestUtil3
|
|
|
|
|
|
|
|
*/
|
|
|
|
private isSelfingCUs(cus: Curve[])
|
|
|
|
private isSelfingCUs(cus: Curve[])
|
|
|
|
{
|
|
|
|
{
|
|
|
|
for (let i = 0; i < cus.length; i++)
|
|
|
|
for (let i = 0; i < cus.length; i++)
|
|
|
@ -1391,6 +1372,14 @@ export class PolyOffestUtil3
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return resultPls;
|
|
|
|
return resultPls;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
*连接自交曲线数组
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* @param {Curve[]} cus
|
|
|
|
|
|
|
|
* @returns
|
|
|
|
|
|
|
|
* @memberof PolyOffestUtil3
|
|
|
|
|
|
|
|
*/
|
|
|
|
linkSelfingCurves(cus: Curve[])
|
|
|
|
linkSelfingCurves(cus: Curve[])
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let newPls: Polyline[] = [];
|
|
|
|
let newPls: Polyline[] = [];
|
|
|
@ -1400,7 +1389,6 @@ export class PolyOffestUtil3
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let pl = new Polyline();
|
|
|
|
let pl = new Polyline();
|
|
|
|
let frontLine = cus.shift();
|
|
|
|
let frontLine = cus.shift();
|
|
|
|
pl.Join(frontLine);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let end = 0;
|
|
|
|
let end = 0;
|
|
|
|
|
|
|
|
|
|
|
@ -1424,34 +1412,47 @@ export class PolyOffestUtil3
|
|
|
|
let parForFront = frontLine.GetParamAtPoint(pts[0]);
|
|
|
|
let parForFront = frontLine.GetParamAtPoint(pts[0]);
|
|
|
|
let parForLater = laterLine.GetParamAtPoint(pts[0]);
|
|
|
|
let parForLater = laterLine.GetParamAtPoint(pts[0]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (equaln(parForLater, 1))
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
|
|
if (equaln(parForFront, 0))
|
|
|
|
if (equaln(parForFront, 0))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
pl.LineData.pop()
|
|
|
|
|
|
|
|
cus.unshift(frontLine);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (!equaln(parForFront, 1))
|
|
|
|
else if (equaln(parForFront, 1))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
pl.EndPoint = pts[0];
|
|
|
|
pl.Join(frontLine);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
else
|
|
|
|
if (equaln(parForLater, 0))
|
|
|
|
|
|
|
|
{
|
|
|
|
{
|
|
|
|
pl.Join(laterLine);
|
|
|
|
let spliteCusForFront = frontLine.GetSplitCurves(parForFront);
|
|
|
|
frontLine = laterLine;
|
|
|
|
pl.Join(spliteCusForFront[0]);
|
|
|
|
} else if (!equaln(parForLater, 1))
|
|
|
|
cus.unshift(spliteCusForFront[1]);
|
|
|
|
|
|
|
|
j++;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (equaln(parForLater, 0))
|
|
|
|
|
|
|
|
frontLine = cus.splice(j, 1)[0];
|
|
|
|
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let spliteCusForLater = laterLine.GetSplitCurves(parForLater);
|
|
|
|
let splitCus = laterLine.GetSplitCurves(parForLater);
|
|
|
|
pl.Join(spliteCusForLater[1]);
|
|
|
|
cus[j].EndPoint = pts[0];
|
|
|
|
cus[j].StartPoint = pts[0];
|
|
|
|
frontLine = splitCus[1];
|
|
|
|
|
|
|
|
|
|
|
|
frontLine = spliteCusForLater[1];
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end = j + 1
|
|
|
|
end = j;
|
|
|
|
j = cus.length - 1;
|
|
|
|
j = cus.length;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//搜索到尽头,先直接join,先不判断
|
|
|
|
|
|
|
|
if (end >= j)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pl.Join(frontLine);
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
newPls.push(pl);
|
|
|
|
newPls.push(pl);
|
|
|
|
isSelfing = this.isSelfingCUs(cus);
|
|
|
|
isSelfing = this.isSelfingCUs(cus);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
newPls.push(...this.linkCurves(cus));
|
|
|
|
newPls.push(...this.linkCurves(cus));
|
|
|
|
return newPls;
|
|
|
|
return newPls;
|
|
|
|