|
|
|
@ -28,14 +28,10 @@ export interface PolylineProps
|
|
|
|
|
@Factory
|
|
|
|
|
export class Polyline extends Curve
|
|
|
|
|
{
|
|
|
|
|
//多段线构造数据
|
|
|
|
|
private m_LineData: PolylineProps[];
|
|
|
|
|
private m_ClosedMark: boolean;
|
|
|
|
|
constructor(data?: PolylineProps[])
|
|
|
|
|
private _ClosedMark: boolean = false;
|
|
|
|
|
constructor(private _LineData: PolylineProps[] = [])
|
|
|
|
|
{
|
|
|
|
|
super();
|
|
|
|
|
this.m_LineData = data || [];
|
|
|
|
|
this.m_ClosedMark = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
UpdateMatrixTo(m: Matrix4)
|
|
|
|
@ -46,7 +42,7 @@ export class Polyline extends Curve
|
|
|
|
|
if (equaln(p.z, 0))
|
|
|
|
|
{
|
|
|
|
|
let tm = matrixAlignCoordSys(this.OCS, m);
|
|
|
|
|
for (let p of this.m_LineData)
|
|
|
|
|
for (let p of this._LineData)
|
|
|
|
|
{
|
|
|
|
|
let p3 = AsVector3(p.pt);
|
|
|
|
|
p3.applyMatrix4(tm);
|
|
|
|
@ -71,7 +67,7 @@ export class Polyline extends Curve
|
|
|
|
|
let p = this.Position;
|
|
|
|
|
this._Matrix.makeBasis(x, y, z).setPosition(p);
|
|
|
|
|
|
|
|
|
|
for (let d of this.m_LineData)
|
|
|
|
|
for (let d of this._LineData)
|
|
|
|
|
{
|
|
|
|
|
d.pt.y *= -1;
|
|
|
|
|
d.bul *= -1;
|
|
|
|
@ -83,13 +79,13 @@ export class Polyline extends Curve
|
|
|
|
|
//翻转曲线,首尾调换
|
|
|
|
|
Reverse(): this
|
|
|
|
|
{
|
|
|
|
|
if (this.m_LineData.length === 0)
|
|
|
|
|
if (this._LineData.length === 0)
|
|
|
|
|
return this;
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
|
|
|
|
|
let pts = [];
|
|
|
|
|
let buls = [];
|
|
|
|
|
for (let data of this.m_LineData)
|
|
|
|
|
for (let data of this._LineData)
|
|
|
|
|
{
|
|
|
|
|
pts.push(data.pt);
|
|
|
|
|
buls.push(-data.bul);
|
|
|
|
@ -100,10 +96,10 @@ export class Polyline extends Curve
|
|
|
|
|
|
|
|
|
|
pts.reverse();
|
|
|
|
|
|
|
|
|
|
this.m_LineData.length = 0;
|
|
|
|
|
this._LineData.length = 0;
|
|
|
|
|
for (let i = 0; i < pts.length; i++)
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.push({ pt: pts[i], bul: buls[i] });
|
|
|
|
|
this._LineData.push({ pt: pts[i], bul: buls[i] });
|
|
|
|
|
}
|
|
|
|
|
this.Update();
|
|
|
|
|
|
|
|
|
@ -112,17 +108,17 @@ export class Polyline extends Curve
|
|
|
|
|
set LineData(data: PolylineProps[])
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
this.m_LineData = data;
|
|
|
|
|
this._LineData = data;
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
|
get LineData()
|
|
|
|
|
{
|
|
|
|
|
return this.m_LineData;
|
|
|
|
|
return this._LineData;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get NumberOfVertices(): number
|
|
|
|
|
{
|
|
|
|
|
return this.m_LineData.length;
|
|
|
|
|
return this._LineData.length;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -152,26 +148,26 @@ export class Polyline extends Curve
|
|
|
|
|
else
|
|
|
|
|
pts = [{ pt: pt.clone(), bul: 0 }];
|
|
|
|
|
|
|
|
|
|
this.m_LineData.splice(index, 0, ...pts);
|
|
|
|
|
this._LineData.splice(index, 0, ...pts);
|
|
|
|
|
this.Update();
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
RemoveVertexAt(index: number): this
|
|
|
|
|
{
|
|
|
|
|
if (index < this.m_LineData.length)
|
|
|
|
|
if (index < this._LineData.length)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
this.m_LineData.splice(index, 1);
|
|
|
|
|
this._LineData.splice(index, 1);
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
|
return this;
|
|
|
|
|
}
|
|
|
|
|
RemoveVertexIn(from: number, to: number): this
|
|
|
|
|
{
|
|
|
|
|
if (from + 1 < this.m_LineData.length && to > from)
|
|
|
|
|
if (from + 1 < this._LineData.length && to > from)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
this.m_LineData.splice(from + 1, to - from - 1);
|
|
|
|
|
this._LineData.splice(from + 1, to - from - 1);
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
|
return this;
|
|
|
|
@ -185,20 +181,20 @@ export class Polyline extends Curve
|
|
|
|
|
{
|
|
|
|
|
if (!this.IsClose || index >= this.EndParam) return false;
|
|
|
|
|
|
|
|
|
|
if (equalv2(this.m_LineData[0].pt, arrayLast(this.m_LineData).pt))
|
|
|
|
|
this.m_LineData.pop();
|
|
|
|
|
if (equalv2(this._LineData[0].pt, arrayLast(this._LineData).pt))
|
|
|
|
|
this._LineData.pop();
|
|
|
|
|
|
|
|
|
|
changeArrayStartIndex(this.m_LineData, Math.floor(index + 0.5));
|
|
|
|
|
this.m_LineData.push({
|
|
|
|
|
pt: this.m_LineData[0].pt.clone(),
|
|
|
|
|
changeArrayStartIndex(this._LineData, Math.floor(index + 0.5));
|
|
|
|
|
this._LineData.push({
|
|
|
|
|
pt: this._LineData[0].pt.clone(),
|
|
|
|
|
bul: 0
|
|
|
|
|
});
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
GetPoint2dAt(index: number): Vector2 | undefined
|
|
|
|
|
{
|
|
|
|
|
if (index >= 0 && this.m_LineData.length > index)
|
|
|
|
|
return this.m_LineData[index].pt.clone();
|
|
|
|
|
if (index >= 0 && this._LineData.length > index)
|
|
|
|
|
return this._LineData[index].pt.clone();
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 设置指定点的位置
|
|
|
|
@ -209,7 +205,7 @@ export class Polyline extends Curve
|
|
|
|
|
*/
|
|
|
|
|
SetPointAt(index: number, pt: Vector2): this
|
|
|
|
|
{
|
|
|
|
|
let d = this.m_LineData[index];
|
|
|
|
|
let d = this._LineData[index];
|
|
|
|
|
if (d)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
@ -248,7 +244,7 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
SetBulgeAt(index: number, bul: number): this
|
|
|
|
|
{
|
|
|
|
|
let d = this.m_LineData[index];
|
|
|
|
|
let d = this._LineData[index];
|
|
|
|
|
if (d)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
@ -259,7 +255,7 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
GetBuilgeAt(index: number): number
|
|
|
|
|
{
|
|
|
|
|
return this.m_LineData[index].bul;
|
|
|
|
|
return this._LineData[index].bul;
|
|
|
|
|
}
|
|
|
|
|
Create2Pt(p1: Vector3, p2: Vector3)
|
|
|
|
|
{
|
|
|
|
@ -283,8 +279,8 @@ export class Polyline extends Curve
|
|
|
|
|
//多段线起点
|
|
|
|
|
get StartPoint()
|
|
|
|
|
{
|
|
|
|
|
if (this.m_LineData.length > 0)
|
|
|
|
|
return AsVector3(this.m_LineData[0].pt).applyMatrix4(this.OCS);
|
|
|
|
|
if (this._LineData.length > 0)
|
|
|
|
|
return AsVector3(this._LineData[0].pt).applyMatrix4(this.OCS);
|
|
|
|
|
return new Vector3();
|
|
|
|
|
}
|
|
|
|
|
set StartPoint(p: Vector3)
|
|
|
|
@ -292,9 +288,9 @@ export class Polyline extends Curve
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
p = p.clone().applyMatrix4(this.OCSInv);
|
|
|
|
|
|
|
|
|
|
if (this.m_LineData.length === 0)
|
|
|
|
|
if (this._LineData.length === 0)
|
|
|
|
|
this.AddVertexAt(0, AsVector2(p));
|
|
|
|
|
else if (this.m_LineData.length === 1)
|
|
|
|
|
else if (this._LineData.length === 1)
|
|
|
|
|
this.SetPointAt(0, AsVector2(p));
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
@ -311,14 +307,14 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
get EndPoint()
|
|
|
|
|
{
|
|
|
|
|
if (this.m_ClosedMark) return this.StartPoint;
|
|
|
|
|
if (this.m_LineData.length > 0)
|
|
|
|
|
return AsVector3(this.m_LineData[this.EndParam].pt).applyMatrix4(this.OCS);
|
|
|
|
|
if (this._ClosedMark) return this.StartPoint;
|
|
|
|
|
if (this._LineData.length > 0)
|
|
|
|
|
return AsVector3(this._LineData[this.EndParam].pt).applyMatrix4(this.OCS);
|
|
|
|
|
return new Vector3();
|
|
|
|
|
}
|
|
|
|
|
set EndPoint(p: Vector3)
|
|
|
|
|
{
|
|
|
|
|
if (this.m_LineData.length < 2 || this.CloseMark)
|
|
|
|
|
if (this._LineData.length < 2 || this.CloseMark)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
@ -351,14 +347,14 @@ export class Polyline extends Curve
|
|
|
|
|
*/
|
|
|
|
|
get EndParam(): number
|
|
|
|
|
{
|
|
|
|
|
if (this.m_LineData.length === 0) return 0;
|
|
|
|
|
if (this._LineData.length === 0) return 0;
|
|
|
|
|
|
|
|
|
|
//闭合且起点不等于终点
|
|
|
|
|
if (this.m_ClosedMark &&
|
|
|
|
|
!equalv2(this.m_LineData[0].pt, arrayLast(this.m_LineData).pt)
|
|
|
|
|
if (this._ClosedMark &&
|
|
|
|
|
!equalv2(this._LineData[0].pt, arrayLast(this._LineData).pt)
|
|
|
|
|
)
|
|
|
|
|
return this.m_LineData.length;
|
|
|
|
|
return this.m_LineData.length - 1;
|
|
|
|
|
return this._LineData.length;
|
|
|
|
|
return this._LineData.length - 1;
|
|
|
|
|
}
|
|
|
|
|
get Area2()
|
|
|
|
|
{
|
|
|
|
@ -394,7 +390,7 @@ export class Polyline extends Curve
|
|
|
|
|
//闭合标志
|
|
|
|
|
get CloseMark(): boolean
|
|
|
|
|
{
|
|
|
|
|
return this.m_ClosedMark;
|
|
|
|
|
return this._ClosedMark;
|
|
|
|
|
}
|
|
|
|
|
//曲线是否闭合
|
|
|
|
|
get IsClose(): boolean
|
|
|
|
@ -404,19 +400,19 @@ export class Polyline extends Curve
|
|
|
|
|
set CloseMark(v: boolean)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
this.m_ClosedMark = v;
|
|
|
|
|
this._ClosedMark = v;
|
|
|
|
|
this.Update()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DigestionCloseMark()
|
|
|
|
|
{
|
|
|
|
|
if (this.m_ClosedMark && this.m_LineData.length > 1)
|
|
|
|
|
if (this._ClosedMark && this._LineData.length > 1)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
this.m_ClosedMark = false;
|
|
|
|
|
this._ClosedMark = false;
|
|
|
|
|
|
|
|
|
|
if (!equalv2(this.m_LineData[0].pt, arrayLast(this.m_LineData).pt))
|
|
|
|
|
this.m_LineData.push({ pt: AsVector2(this.m_LineData[0].pt), bul: 0 });
|
|
|
|
|
if (!equalv2(this._LineData[0].pt, arrayLast(this._LineData).pt))
|
|
|
|
|
this._LineData.push({ pt: AsVector2(this._LineData[0].pt), bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -446,7 +442,7 @@ export class Polyline extends Curve
|
|
|
|
|
|
|
|
|
|
GetDistAtParam(param: number): number
|
|
|
|
|
{
|
|
|
|
|
if (this.m_ClosedMark && !this.ParamOnCurve(param))
|
|
|
|
|
if (this._ClosedMark && !this.ParamOnCurve(param))
|
|
|
|
|
return NaN;
|
|
|
|
|
|
|
|
|
|
//参数 整数
|
|
|
|
@ -500,7 +496,7 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//当曲线闭合时,不需要延伸首尾去判断参数
|
|
|
|
|
if (this.m_ClosedMark) return NaN;
|
|
|
|
|
if (this._ClosedMark) return NaN;
|
|
|
|
|
|
|
|
|
|
//起点终点参数集合
|
|
|
|
|
let seParams: number[] = [];
|
|
|
|
@ -541,7 +537,7 @@ export class Polyline extends Curve
|
|
|
|
|
return i + 1;
|
|
|
|
|
dist -= len;
|
|
|
|
|
}
|
|
|
|
|
if (!this.m_ClosedMark)
|
|
|
|
|
if (!this._ClosedMark)
|
|
|
|
|
return cus.length + cus[cus.length - 1].GetParamAtDist(dist);
|
|
|
|
|
|
|
|
|
|
return NaN;
|
|
|
|
@ -665,13 +661,13 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//当曲线为闭合曲线,并且不存在0切割参数时,首尾连接曲线
|
|
|
|
|
if (this.m_ClosedMark && !hasZeroParam && !hasEndParam)
|
|
|
|
|
if (this._ClosedMark && !hasZeroParam && !hasEndParam)
|
|
|
|
|
{
|
|
|
|
|
let lastPl = pls[pls.length - 1];
|
|
|
|
|
if (equalv2(arrayLast(lastPl.m_LineData).pt, pls[0].m_LineData[0].pt))
|
|
|
|
|
lastPl.m_LineData.pop();
|
|
|
|
|
if (equalv2(arrayLast(lastPl._LineData).pt, pls[0]._LineData[0].pt))
|
|
|
|
|
lastPl._LineData.pop();
|
|
|
|
|
|
|
|
|
|
lastPl.m_LineData.push(...pls[0].m_LineData);
|
|
|
|
|
lastPl._LineData.push(...pls[0]._LineData);
|
|
|
|
|
|
|
|
|
|
pls.shift();
|
|
|
|
|
}
|
|
|
|
@ -699,12 +695,12 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//修改顶点
|
|
|
|
|
this.m_LineData[ptIndex].pt = AsVector2(this.GetPointAtParam(newParam).applyMatrix4(this.OCSInv));
|
|
|
|
|
this._LineData[ptIndex].pt = AsVector2(this.GetPointAtParam(newParam).applyMatrix4(this.OCSInv));
|
|
|
|
|
|
|
|
|
|
//修改凸度
|
|
|
|
|
let oldBul = this.m_LineData[bulIndex].bul;
|
|
|
|
|
let oldBul = this._LineData[bulIndex].bul;
|
|
|
|
|
if (oldBul != 0)
|
|
|
|
|
this.m_LineData[bulIndex].bul = Math.tan(Math.atan(oldBul) * (1 + newParam - ptIndex));
|
|
|
|
|
this._LineData[bulIndex].bul = Math.tan(Math.atan(oldBul) * (1 + newParam - ptIndex));
|
|
|
|
|
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
@ -723,7 +719,7 @@ export class Polyline extends Curve
|
|
|
|
|
|
|
|
|
|
let pts: Vector2[] = [];
|
|
|
|
|
let buls: number[] = [];
|
|
|
|
|
for (let d of this.m_LineData)
|
|
|
|
|
for (let d of this._LineData)
|
|
|
|
|
{
|
|
|
|
|
let p = AsVector2(AsVector3(d.pt).applyMatrix4(m));
|
|
|
|
|
pts.push(p);
|
|
|
|
@ -735,27 +731,27 @@ export class Polyline extends Curve
|
|
|
|
|
Join(cu: Curve, allowGap = false, tolerance = 1e-4)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
if (this.m_ClosedMark)
|
|
|
|
|
if (this._ClosedMark)
|
|
|
|
|
return Status.False;
|
|
|
|
|
|
|
|
|
|
let [sp, ep, cuSp, cuEp] = [this.StartPoint, this.EndPoint, cu.StartPoint, cu.EndPoint];
|
|
|
|
|
|
|
|
|
|
if (this.m_LineData.length === 0)
|
|
|
|
|
if (this._LineData.length === 0)
|
|
|
|
|
this.ApplyMatrix(cu.OCS);
|
|
|
|
|
let ocsInv = this.OCSInv;
|
|
|
|
|
let [cuSp2, cuEp2] = [cuSp, cuEp].map(p => AsVector2(p.clone().applyMatrix4(ocsInv)));
|
|
|
|
|
|
|
|
|
|
if (this.m_LineData.length === 0)
|
|
|
|
|
if (this._LineData.length === 0)
|
|
|
|
|
{
|
|
|
|
|
if (cu instanceof Line)
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.push({ pt: cuSp2, bul: 0 });
|
|
|
|
|
this.m_LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
this._LineData.push({ pt: cuSp2, bul: 0 });
|
|
|
|
|
this._LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else if (cu instanceof Arc)
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.push({ pt: cuSp2, bul: cu.Bul });
|
|
|
|
|
this.m_LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
this._LineData.push({ pt: cuSp2, bul: cu.Bul });
|
|
|
|
|
this._LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else if (cu instanceof Polyline)
|
|
|
|
|
{
|
|
|
|
@ -773,19 +769,19 @@ export class Polyline extends Curve
|
|
|
|
|
{
|
|
|
|
|
if (equalv3(cuSp, sp, tolerance))
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.unshift({ pt: cuEp2, bul: 0 });
|
|
|
|
|
this._LineData.unshift({ pt: cuEp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else if (equalv3(cuSp, ep, tolerance))
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
this._LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else if (equalv3(cuEp, sp, tolerance))
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.unshift({ pt: cuSp2, bul: 0 });
|
|
|
|
|
this._LineData.unshift({ pt: cuSp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else if (equalv3(cuEp, ep, tolerance))
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.push({ pt: cuSp2, bul: 0 });
|
|
|
|
|
this._LineData.push({ pt: cuSp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return Status.False;
|
|
|
|
@ -796,21 +792,21 @@ export class Polyline extends Curve
|
|
|
|
|
let bul = cu.Bul * dir;
|
|
|
|
|
if (equalv3(cuSp, sp, tolerance))
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.unshift({ pt: cuEp2, bul: -bul });
|
|
|
|
|
this._LineData.unshift({ pt: cuEp2, bul: -bul });
|
|
|
|
|
}
|
|
|
|
|
else if (equalv3(cuSp, ep, tolerance))
|
|
|
|
|
{
|
|
|
|
|
arrayLast(this.m_LineData).bul = bul;
|
|
|
|
|
this.m_LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
arrayLast(this._LineData).bul = bul;
|
|
|
|
|
this._LineData.push({ pt: cuEp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else if (equalv3(cuEp, sp, tolerance))
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.unshift({ pt: cuSp2, bul: bul });
|
|
|
|
|
this._LineData.unshift({ pt: cuSp2, bul: bul });
|
|
|
|
|
}
|
|
|
|
|
else if (equalv3(cuEp, ep, tolerance))
|
|
|
|
|
{
|
|
|
|
|
arrayLast(this.m_LineData).bul = -bul;
|
|
|
|
|
this.m_LineData.push({ pt: cuSp2, bul: 0 });
|
|
|
|
|
arrayLast(this._LineData).bul = -bul;
|
|
|
|
|
this._LineData.push({ pt: cuSp2, bul: 0 });
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return Status.False;
|
|
|
|
@ -860,10 +856,10 @@ export class Polyline extends Curve
|
|
|
|
|
else
|
|
|
|
|
return Status.False;
|
|
|
|
|
|
|
|
|
|
this.m_LineData.length = 0;
|
|
|
|
|
this._LineData.length = 0;
|
|
|
|
|
for (let i = 0; i < pts.length; i++)
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData.push({ pt: pts[i], bul: buls[i] });
|
|
|
|
|
this._LineData.push({ pt: pts[i], bul: buls[i] });
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -911,7 +907,7 @@ export class Polyline extends Curve
|
|
|
|
|
//当曲线空时,返回空
|
|
|
|
|
if (this.EndParam < 1) return undefined;
|
|
|
|
|
//当有闭合标志时,曲线在任何位置都不延伸
|
|
|
|
|
if (this.m_ClosedMark) extType = ExtendType.None;
|
|
|
|
|
if (this._ClosedMark) extType = ExtendType.None;
|
|
|
|
|
|
|
|
|
|
//最近点
|
|
|
|
|
let ptC = undefined;
|
|
|
|
@ -998,7 +994,7 @@ export class Polyline extends Curve
|
|
|
|
|
*/
|
|
|
|
|
GetCurveAtParam(param: number): Curve
|
|
|
|
|
{
|
|
|
|
|
if (this.m_ClosedMark && !this.ParamOnCurve(param))
|
|
|
|
|
if (this._ClosedMark && !this.ParamOnCurve(param))
|
|
|
|
|
return undefined;
|
|
|
|
|
|
|
|
|
|
if (param < 0)
|
|
|
|
@ -1029,14 +1025,14 @@ export class Polyline extends Curve
|
|
|
|
|
*/
|
|
|
|
|
GetCurveAtIndex(i: number): Curve
|
|
|
|
|
{
|
|
|
|
|
if (i >= this.m_LineData.length) return undefined;
|
|
|
|
|
if (i >= this._LineData.length) return undefined;
|
|
|
|
|
|
|
|
|
|
if (!this.ParamOnCurve(i)) return undefined;
|
|
|
|
|
|
|
|
|
|
if (!this.m_ClosedMark && i === this.m_LineData.length - 1) return undefined;
|
|
|
|
|
if (!this._ClosedMark && i === this._LineData.length - 1) return undefined;
|
|
|
|
|
|
|
|
|
|
let d1 = this.m_LineData[i];
|
|
|
|
|
let d2 = this.m_LineData[FixIndex(i + 1, this.m_LineData)];
|
|
|
|
|
let d1 = this._LineData[i];
|
|
|
|
|
let d2 = this._LineData[FixIndex(i + 1, this._LineData)];
|
|
|
|
|
|
|
|
|
|
if (equaln(d1.bul, 0, 1e-8))
|
|
|
|
|
{
|
|
|
|
@ -1097,17 +1093,17 @@ export class Polyline extends Curve
|
|
|
|
|
let pts: Vector2[] = [];
|
|
|
|
|
let buls: number[] = [];
|
|
|
|
|
|
|
|
|
|
if (this.m_LineData.length === 0)
|
|
|
|
|
if (this._LineData.length === 0)
|
|
|
|
|
return { pts, buls };
|
|
|
|
|
|
|
|
|
|
for (let data of this.m_LineData)
|
|
|
|
|
for (let data of this._LineData)
|
|
|
|
|
{
|
|
|
|
|
pts.push(data.pt.clone());
|
|
|
|
|
buls.push(data.bul);
|
|
|
|
|
}
|
|
|
|
|
//闭合且起点不等于终点
|
|
|
|
|
if (this.m_ClosedMark &&
|
|
|
|
|
!this.m_LineData[0].pt.equals(arrayLast(this.m_LineData).pt))
|
|
|
|
|
if (this._ClosedMark &&
|
|
|
|
|
!this._LineData[0].pt.equals(arrayLast(this._LineData).pt))
|
|
|
|
|
{
|
|
|
|
|
pts.push(pts[0].clone());
|
|
|
|
|
buls.push(buls[0]);
|
|
|
|
@ -1170,7 +1166,7 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return this.m_LineData.length;
|
|
|
|
|
return this._LineData.length;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1214,9 +1210,9 @@ export class Polyline extends Curve
|
|
|
|
|
}
|
|
|
|
|
case ObjectSnapMode.Cen:
|
|
|
|
|
let cenPts: Vector3[] = [];
|
|
|
|
|
for (let i = 0; i < this.m_LineData.length; i++)
|
|
|
|
|
for (let i = 0; i < this._LineData.length; i++)
|
|
|
|
|
{
|
|
|
|
|
let data = this.m_LineData[i];
|
|
|
|
|
let data = this._LineData[i];
|
|
|
|
|
if (!equaln(data.bul, 0))
|
|
|
|
|
{
|
|
|
|
|
let cu = this.GetCurveAtIndex(i) as Arc;
|
|
|
|
@ -1256,7 +1252,7 @@ export class Polyline extends Curve
|
|
|
|
|
GetGripPoints(): Array<Vector3>
|
|
|
|
|
{
|
|
|
|
|
let ptList: Vector3[] = [];
|
|
|
|
|
if (this.m_LineData.length < 2)
|
|
|
|
|
if (this._LineData.length < 2)
|
|
|
|
|
return ptList;
|
|
|
|
|
|
|
|
|
|
let enParam = this.EndParam;
|
|
|
|
@ -1288,41 +1284,41 @@ export class Polyline extends Curve
|
|
|
|
|
{
|
|
|
|
|
let cuIndex = index / 2;
|
|
|
|
|
|
|
|
|
|
let ptCout = this.m_LineData.length;
|
|
|
|
|
let ptCout = this._LineData.length;
|
|
|
|
|
|
|
|
|
|
let frontIndex = cuIndex - 1;
|
|
|
|
|
if (this.m_ClosedMark)
|
|
|
|
|
if (this._ClosedMark)
|
|
|
|
|
frontIndex = FixIndex(frontIndex, ptCout);
|
|
|
|
|
|
|
|
|
|
if (frontIndex >= 0 && this.GetBuilgeAt(frontIndex))
|
|
|
|
|
{
|
|
|
|
|
let arc = this.GetCurveAtIndex(frontIndex) as Arc;
|
|
|
|
|
arc.MoveGripPoints([2], moveVec);
|
|
|
|
|
this.m_LineData[frontIndex].bul = arc.Bul;
|
|
|
|
|
this._LineData[frontIndex].bul = arc.Bul;
|
|
|
|
|
}
|
|
|
|
|
if ((cuIndex !== ptCout - 1) && this.GetBuilgeAt(cuIndex))
|
|
|
|
|
{
|
|
|
|
|
let arc = this.GetCurveAtIndex(cuIndex) as Arc;
|
|
|
|
|
arc.MoveGripPoints([0], moveVec);
|
|
|
|
|
this.m_LineData[cuIndex].bul = arc.Bul;
|
|
|
|
|
this._LineData[cuIndex].bul = arc.Bul;
|
|
|
|
|
}
|
|
|
|
|
this.m_LineData[cuIndex].pt.add(moveVLoc);
|
|
|
|
|
this._LineData[cuIndex].pt.add(moveVLoc);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
let ptIndex = (index - 1) / 2;
|
|
|
|
|
let nextIndex = (FixIndex(ptIndex + 1, this.m_LineData));
|
|
|
|
|
let d = this.m_LineData[ptIndex];
|
|
|
|
|
let nextIndex = (FixIndex(ptIndex + 1, this._LineData));
|
|
|
|
|
let d = this._LineData[ptIndex];
|
|
|
|
|
if (d.bul == 0)
|
|
|
|
|
{
|
|
|
|
|
this.m_LineData[ptIndex].pt.add(moveVLoc);
|
|
|
|
|
this.m_LineData[nextIndex].pt.add(moveVLoc);
|
|
|
|
|
this._LineData[ptIndex].pt.add(moveVLoc);
|
|
|
|
|
this._LineData[nextIndex].pt.add(moveVLoc);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
let arc = this.GetCurveAtIndex(ptIndex) as Arc;
|
|
|
|
|
arc.MoveGripPoints([1], moveVec);
|
|
|
|
|
this.m_LineData[ptIndex].bul = arc.Bul;
|
|
|
|
|
this._LineData[ptIndex].bul = arc.Bul;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1333,7 +1329,7 @@ export class Polyline extends Curve
|
|
|
|
|
{
|
|
|
|
|
let ocs = this.OCS;
|
|
|
|
|
let ptList: Vector3[] = [];
|
|
|
|
|
for (let data of this.m_LineData)
|
|
|
|
|
for (let data of this._LineData)
|
|
|
|
|
{
|
|
|
|
|
ptList.push(AsVector3(data.pt).applyMatrix4(ocs));
|
|
|
|
|
}
|
|
|
|
@ -1355,13 +1351,13 @@ export class Polyline extends Curve
|
|
|
|
|
//本地坐标系移动向量
|
|
|
|
|
let moveVLoc = vec.clone().applyMatrix4(new Matrix4().extractRotation(this.OCSInv));
|
|
|
|
|
|
|
|
|
|
let ptCout = this.m_LineData.length;
|
|
|
|
|
let ptCout = this._LineData.length;
|
|
|
|
|
|
|
|
|
|
for (let index of indexList)
|
|
|
|
|
{
|
|
|
|
|
let frontIndex = index - 1;
|
|
|
|
|
let nextIndex = index + 1;
|
|
|
|
|
if (this.m_ClosedMark)
|
|
|
|
|
if (this._ClosedMark)
|
|
|
|
|
{
|
|
|
|
|
frontIndex = FixIndex(frontIndex, ptCout);
|
|
|
|
|
nextIndex = FixIndex(nextIndex, ptCout);
|
|
|
|
@ -1377,7 +1373,7 @@ export class Polyline extends Curve
|
|
|
|
|
const ChangeBul = (nextIndex: number, bulIndex: number) =>
|
|
|
|
|
{
|
|
|
|
|
//需要修改的点的数据
|
|
|
|
|
let d = this.m_LineData[bulIndex];
|
|
|
|
|
let d = this._LineData[bulIndex];
|
|
|
|
|
if (d === undefined || d.bul == 0) return;
|
|
|
|
|
|
|
|
|
|
//如果隔壁点不在拉伸列表中
|
|
|
|
@ -1404,7 +1400,7 @@ export class Polyline extends Curve
|
|
|
|
|
ChangeBul(nextIndex, index);
|
|
|
|
|
|
|
|
|
|
//修改顶点
|
|
|
|
|
this.m_LineData[index].pt.add(AsVector2(moveVLoc));
|
|
|
|
|
this._LineData[index].pt.add(AsVector2(moveVLoc));
|
|
|
|
|
}
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
@ -1412,30 +1408,30 @@ export class Polyline extends Curve
|
|
|
|
|
{
|
|
|
|
|
super._ReadFile(file);
|
|
|
|
|
let ver = file.Read();
|
|
|
|
|
this.m_LineData.length = 0;
|
|
|
|
|
this._LineData.length = 0;
|
|
|
|
|
let cout = file.Read();
|
|
|
|
|
for (let i = 0; i < cout; i++)
|
|
|
|
|
{
|
|
|
|
|
let v = new Vector2().fromArray(file.Read());
|
|
|
|
|
let bul = file.Read();
|
|
|
|
|
|
|
|
|
|
this.m_LineData.push({ pt: v, bul: bul });
|
|
|
|
|
this._LineData.push({ pt: v, bul: bul });
|
|
|
|
|
}
|
|
|
|
|
if (ver > 1)
|
|
|
|
|
this.m_ClosedMark = file.Read();
|
|
|
|
|
this._ClosedMark = file.Read();
|
|
|
|
|
}
|
|
|
|
|
//对象将自身数据写入到文件.
|
|
|
|
|
WriteFile(file: CADFiler)
|
|
|
|
|
{
|
|
|
|
|
super.WriteFile(file);
|
|
|
|
|
file.Write(2);
|
|
|
|
|
file.Write(this.m_LineData.length);
|
|
|
|
|
file.Write(this._LineData.length);
|
|
|
|
|
|
|
|
|
|
for (let l of this.m_LineData)
|
|
|
|
|
for (let l of this._LineData)
|
|
|
|
|
{
|
|
|
|
|
file.Write(l.pt.toArray());
|
|
|
|
|
file.Write(l.bul);
|
|
|
|
|
}
|
|
|
|
|
file.Write(this.m_ClosedMark);
|
|
|
|
|
file.Write(this._ClosedMark);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|