|
|
|
@ -1,6 +1,6 @@
|
|
|
|
|
import { Box3, Matrix3, Matrix4, Vector2, Vector3 } from 'three';
|
|
|
|
|
import { getArcOrCirNearPts, getCircleCenter, GetTanPtsOnArcOrCircle } from '../../Common/CurveUtils';
|
|
|
|
|
import { reviseMirrorMatrix, SetMtxVector } from '../../Common/Matrix4Utils';
|
|
|
|
|
import { reviseMirrorMatrix, SetMtxVector, TransformVector } from '../../Common/Matrix4Utils';
|
|
|
|
|
import { Status } from '../../Common/Status';
|
|
|
|
|
import { ObjectSnapMode } from '../../Editor/ObjectSnapMode';
|
|
|
|
|
import { Box3Ext } from '../../Geometry/Box';
|
|
|
|
@ -598,7 +598,7 @@ export class Arc extends Curve
|
|
|
|
|
FromThreePoint(pt1: Vector3, pt2: Vector3, pt3: Vector3)
|
|
|
|
|
{
|
|
|
|
|
if (!(pt1 && pt2 && pt3))
|
|
|
|
|
return;
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
|
|
let ocsInv = this.OCSInv;
|
|
|
|
|
pt1 = pt1.clone().applyMatrix4(ocsInv).setZ(0);
|
|
|
|
@ -606,6 +606,12 @@ export class Arc extends Curve
|
|
|
|
|
pt3 = pt3.clone().applyMatrix4(ocsInv).setZ(0);
|
|
|
|
|
|
|
|
|
|
let center = getCircleCenter(pt1, pt2, pt3);
|
|
|
|
|
if (!center)
|
|
|
|
|
{
|
|
|
|
|
this.ParseFromBul(pt1.applyMatrix4(this.OCSNoClone), pt3.applyMatrix4(this.OCSNoClone), 1e-5);//faker line
|
|
|
|
|
return this;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.Center = center.clone().applyMatrix4(this.OCS);
|
|
|
|
|
//用圆心和其中一个点求距离得到半径:
|
|
|
|
|
this._Radius = center.distanceTo(pt1);
|
|
|
|
@ -672,16 +678,49 @@ export class Arc extends Curve
|
|
|
|
|
if (indexList.length > 0)
|
|
|
|
|
{
|
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
|
let ptsArr = this.GetGripPoints();
|
|
|
|
|
let index = indexList[0];
|
|
|
|
|
let p = ptsArr[index];
|
|
|
|
|
if (p)
|
|
|
|
|
|
|
|
|
|
if (index > 2)
|
|
|
|
|
this.Center = this.Center.add(vec);
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
p.add(vec);
|
|
|
|
|
if (index > 2)
|
|
|
|
|
this.Center = this.Center.add(vec);
|
|
|
|
|
else
|
|
|
|
|
this.FromThreePoint(ptsArr[0], ptsArr[1], ptsArr[2]);
|
|
|
|
|
let p1 = polar(new Vector3, this._StartAngle, this._Radius);
|
|
|
|
|
let p2 = polar(new Vector3, this.GetAngleAtParam(0.5), this._Radius);
|
|
|
|
|
let p3 = polar(new Vector3, this._EndAngle, this._Radius);
|
|
|
|
|
|
|
|
|
|
vec = TransformVector(vec.clone(), this.OCSInv).setZ(0);
|
|
|
|
|
|
|
|
|
|
[p1, p2, p3][index].add(vec);
|
|
|
|
|
|
|
|
|
|
let center = getCircleCenter(p1, p2, p3);
|
|
|
|
|
if (!center)//三点共线 使用faker arc
|
|
|
|
|
{
|
|
|
|
|
this.ParseFromBul(p1.applyMatrix4(this.OCSNoClone), p3.applyMatrix4(this.OCSNoClone), 1e-5);
|
|
|
|
|
this.Update();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//起始角度 端点角度
|
|
|
|
|
this._StartAngle = angle(p1.clone().sub(center));
|
|
|
|
|
this._EndAngle = angle(p3.clone().sub(center));
|
|
|
|
|
if (equaln(this._StartAngle, this._EndAngle, 1e-5))//差不多也是三点共线,只不过逃逸了
|
|
|
|
|
{
|
|
|
|
|
this.ParseFromBul(p1.applyMatrix4(this.OCSNoClone), p3.applyMatrix4(this.OCSNoClone), 1e-5);
|
|
|
|
|
this.Update();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//用圆心和其中一个点求距离得到半径:
|
|
|
|
|
this._Radius = center.distanceTo(p1);
|
|
|
|
|
|
|
|
|
|
this.Center = center.clone().applyMatrix4(this.OCS);
|
|
|
|
|
|
|
|
|
|
//求出向量p1->p2,p1->p3
|
|
|
|
|
let v1 = p2.clone().sub(p1);
|
|
|
|
|
let v2 = p3.clone().sub(p1);
|
|
|
|
|
|
|
|
|
|
this._Clockwise = v1.cross(v2).z < 0;
|
|
|
|
|
|
|
|
|
|
this.Update();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|