pull/544/head
ChenX 5 years ago
parent f152df5787
commit c988ac1b7f

@ -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);
}
}

Loading…
Cancel
Save