|
|
@ -1,7 +1,7 @@
|
|
|
|
import * as THREE from 'three';
|
|
|
|
import * as THREE from 'three';
|
|
|
|
import { Geometry, Object3D, Shape, Vector3 } from 'three';
|
|
|
|
import { Geometry, Object3D, Shape, Vector3 } from 'three';
|
|
|
|
import { ColorMaterial } from '../Common/ColorPalette';
|
|
|
|
import { ColorMaterial } from '../Common/ColorPalette';
|
|
|
|
import { rotatePoint } from '../Geometry/GeUtils';
|
|
|
|
import { MoveMatrix, rotatePoint } from '../Geometry/GeUtils';
|
|
|
|
import { RenderType } from '../GraphicsSystem/Enum';
|
|
|
|
import { RenderType } from '../GraphicsSystem/Enum';
|
|
|
|
import { Factory } from './CADFactory';
|
|
|
|
import { Factory } from './CADFactory';
|
|
|
|
import { CADFile } from './CADFile';
|
|
|
|
import { CADFile } from './CADFile';
|
|
|
@ -10,23 +10,26 @@ import { Curve } from './Curve';
|
|
|
|
@Factory
|
|
|
|
@Factory
|
|
|
|
export class Ellipse extends Curve
|
|
|
|
export class Ellipse extends Curve
|
|
|
|
{
|
|
|
|
{
|
|
|
|
private m_Center: Vector3;
|
|
|
|
|
|
|
|
private m_RadX: number;
|
|
|
|
private m_RadX: number;
|
|
|
|
private m_RadY: number;
|
|
|
|
private m_RadY: number;
|
|
|
|
private m_Angle: number;
|
|
|
|
private m_Angle: number;
|
|
|
|
constructor(center?: Vector3, radX?: number, radY?: number, angle?: number)
|
|
|
|
constructor(
|
|
|
|
{
|
|
|
|
center?: Vector3,
|
|
|
|
super()
|
|
|
|
radX: number = 1e-3,
|
|
|
|
this.m_Center = center || new Vector3();
|
|
|
|
radY: number = 1e-3,
|
|
|
|
this.m_RadX = radX || 0;
|
|
|
|
angle: number = 0)
|
|
|
|
this.m_RadY = radY || 0;
|
|
|
|
{
|
|
|
|
this.m_Angle = angle || 0;
|
|
|
|
super();
|
|
|
|
|
|
|
|
center && this.m_Matrix.setPosition(center);
|
|
|
|
|
|
|
|
this.m_RadX = radX;
|
|
|
|
|
|
|
|
this.m_RadY = radY;
|
|
|
|
|
|
|
|
this.m_Angle = angle;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
get Shape(): Shape
|
|
|
|
get Shape(): Shape
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let sp = new Shape();
|
|
|
|
let sp = new Shape();
|
|
|
|
sp.ellipse(this.m_Center.x, this.m_Center.y, this.m_RadX, this.m_RadY, 0, 2 * Math.PI, false, this.m_Angle);
|
|
|
|
sp.ellipse(0, 0, this.m_RadX, this.m_RadY, 0, 2 * Math.PI, false, this.m_Angle);
|
|
|
|
return sp;
|
|
|
|
return sp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
get IsClose(): boolean
|
|
|
|
get IsClose(): boolean
|
|
|
@ -35,12 +38,12 @@ export class Ellipse extends Curve
|
|
|
|
}
|
|
|
|
}
|
|
|
|
get Center()
|
|
|
|
get Center()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return this.m_Center;
|
|
|
|
return new Vector3().setFromMatrixPosition(this.m_Matrix);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
set Center(v: Vector3)
|
|
|
|
set Center(v: Vector3)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
this.WriteAllObjectRecord();
|
|
|
|
this.m_Center = v;
|
|
|
|
this.m_Matrix.setPosition(v);
|
|
|
|
this.Update();
|
|
|
|
this.Update();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
get RadX()
|
|
|
|
get RadX()
|
|
|
@ -76,9 +79,7 @@ export class Ellipse extends Curve
|
|
|
|
PtInCurve(pt: Vector3)
|
|
|
|
PtInCurve(pt: Vector3)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let p = rotatePoint(pt.clone().sub(this.Center), -this.Angle);
|
|
|
|
let p = rotatePoint(pt.clone().sub(this.Center), -this.Angle);
|
|
|
|
let a = this.RadX;
|
|
|
|
return p.x ** 2 / this.RadX ** 2 + p.y ** 2 / this.RadY ** 2 < 1;
|
|
|
|
let b = this.RadY;
|
|
|
|
|
|
|
|
return Math.pow(p.x, 2) / Math.pow(a, 2) + Math.pow(p.y, 2) / Math.pow(b, 2) < 1
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
InitDrawObject(renderType: RenderType = RenderType.Wireframe): Object3D
|
|
|
|
InitDrawObject(renderType: RenderType = RenderType.Wireframe): Object3D
|
|
|
@ -90,7 +91,7 @@ export class Ellipse extends Curve
|
|
|
|
}
|
|
|
|
}
|
|
|
|
UpdateDrawObject(type: RenderType, en: Object3D)
|
|
|
|
UpdateDrawObject(type: RenderType, en: Object3D)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let geo = en["geometry"] as Geometry;
|
|
|
|
let geo = (en as THREE.Line).geometry as Geometry;
|
|
|
|
this.UpdateGeometry(geo);
|
|
|
|
this.UpdateGeometry(geo);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//更新Geometry
|
|
|
|
//更新Geometry
|
|
|
@ -102,41 +103,45 @@ export class Ellipse extends Curve
|
|
|
|
}
|
|
|
|
}
|
|
|
|
GetStretchPoints(): Array<Vector3>
|
|
|
|
GetStretchPoints(): Array<Vector3>
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let tmpMat4 = new THREE.Matrix4();
|
|
|
|
return this.GetSnapPoints();
|
|
|
|
tmpMat4.makeRotationZ(this.Angle);
|
|
|
|
}
|
|
|
|
return [
|
|
|
|
GetSnapPoints(): Array<Vector3>
|
|
|
|
this.m_Center.clone().add(new Vector3(this.m_RadX, 0).applyMatrix4(tmpMat4)),
|
|
|
|
{
|
|
|
|
this.m_Center.clone().add(new Vector3(-this.m_RadX, 0).applyMatrix4(tmpMat4)),
|
|
|
|
let tmpMat4 = new THREE.Matrix4().makeRotationZ(this.Angle);
|
|
|
|
this.m_Center.clone().add(new Vector3(0, -this.m_RadY).applyMatrix4(tmpMat4)),
|
|
|
|
let pts = [
|
|
|
|
this.m_Center.clone().add(new Vector3(0, this.m_RadY).applyMatrix4(tmpMat4)),
|
|
|
|
new Vector3(this.m_RadX, 0),
|
|
|
|
this.m_Center.clone()
|
|
|
|
new Vector3(-this.m_RadX, 0),
|
|
|
|
|
|
|
|
new Vector3(0, -this.m_RadY),
|
|
|
|
|
|
|
|
new Vector3(0, this.m_RadY),
|
|
|
|
|
|
|
|
new Vector3(),
|
|
|
|
]
|
|
|
|
]
|
|
|
|
|
|
|
|
return pts.map(p => p.applyMatrix4(tmpMat4).applyMatrix4(this.OCS));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
MoveStretchPoints(indexList: Array<number>, vec: Vector3)
|
|
|
|
MoveStretchPoints(indexList: Array<number>, vec: Vector3)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.ApplyMatrix(MoveMatrix(vec));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
MoveSnapPoints(indexList: Array<number>, vec: Vector3)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let pts = this.GetStretchPoints();
|
|
|
|
let pts = this.GetStretchPoints();
|
|
|
|
|
|
|
|
|
|
|
|
if (indexList.length > 0)
|
|
|
|
if (indexList.length > 0)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let p = pts[indexList[0]];
|
|
|
|
let p = pts[indexList[0]];
|
|
|
|
if (p) p.add(vec);
|
|
|
|
p.add(vec);
|
|
|
|
if (indexList[0] === 1 || indexList[0] === 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.RadX = p.distanceTo(this.m_Center);
|
|
|
|
|
|
|
|
} else if (indexList[0] === 2 || indexList[0] === 3)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.RadY = p.distanceTo(this.m_Center);
|
|
|
|
|
|
|
|
} else
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
this.Center = p;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (indexList[0] === 0 || indexList[0] === 1)
|
|
|
|
|
|
|
|
this.RadX = p.distanceTo(this.Center);
|
|
|
|
|
|
|
|
else if (indexList[0] === 2 || indexList[0] === 3)
|
|
|
|
|
|
|
|
this.RadY = p.distanceTo(this.Center);
|
|
|
|
|
|
|
|
else
|
|
|
|
|
|
|
|
this.Center = p;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ReadFile(file: CADFile)
|
|
|
|
ReadFile(file: CADFile)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
super.ReadFile(file);
|
|
|
|
super.ReadFile(file);
|
|
|
|
let ver = file.Read();
|
|
|
|
let ver = file.Read();
|
|
|
|
this.Center.fromArray(file.Read());
|
|
|
|
|
|
|
|
this.RadX = file.Read();
|
|
|
|
this.RadX = file.Read();
|
|
|
|
this.RadY = file.Read();
|
|
|
|
this.RadY = file.Read();
|
|
|
|
this.Angle = file.Read();
|
|
|
|
this.Angle = file.Read();
|
|
|
@ -146,7 +151,6 @@ export class Ellipse extends Curve
|
|
|
|
{
|
|
|
|
{
|
|
|
|
super.WriteFile(file);
|
|
|
|
super.WriteFile(file);
|
|
|
|
file.Write(1);
|
|
|
|
file.Write(1);
|
|
|
|
file.Write(this.Center.toArray());
|
|
|
|
|
|
|
|
file.Write(this.RadX);
|
|
|
|
file.Write(this.RadX);
|
|
|
|
file.Write(this.RadY);
|
|
|
|
file.Write(this.RadY);
|
|
|
|
file.Write(this.Angle);
|
|
|
|
file.Write(this.Angle);
|
|
|
|