mxdraw 0.1.109 → 0.1.111
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -17
- package/dist/index.d.ts +256 -108
- package/dist/lib/MxModule/McEdGetPointWorldDrawObject/index.js +1 -1
- package/dist/lib/MxModule/McGeTool/index.js +1 -1
- package/dist/lib/MxModule/McGiWorldDraw/index.d.ts +3 -2
- package/dist/lib/MxModule/MrxDbgUiPrPoint/index.js +1 -1
- package/dist/lib/MxModule/MrxDbgUtils/index.js +1 -1
- package/dist/lib/MxModule/MxDb2LineAngularDimension/index.d.ts +49 -11
- package/dist/lib/MxModule/MxDb2LineAngularDimension/index.js +1 -1
- package/dist/lib/MxModule/MxDbAlignedDimension/index.d.ts +35 -1
- package/dist/lib/MxModule/MxDbAlignedDimension/index.js +1 -1
- package/dist/lib/MxModule/MxDbAnyLine/index.d.ts +5 -1
- package/dist/lib/MxModule/MxDbAnyLine/index.js +1 -1
- package/dist/lib/MxModule/MxDbCloudLine/index.d.ts +2 -2
- package/dist/lib/MxModule/MxDbCloudLine/index.js +1 -1
- package/dist/lib/MxModule/MxDbEntity/index.d.ts +40 -24
- package/dist/lib/MxModule/MxDbEntity/index.js +1 -1
- package/dist/lib/MxModule/MxDbGradientLine/index.d.ts +62 -0
- package/dist/lib/MxModule/MxDbGradientLine/index.js +1 -0
- package/dist/lib/MxModule/MxDbSVG/index.d.ts +2 -2
- package/dist/lib/MxModule/MxDbSVG/index.js +1 -1
- package/dist/lib/MxModule/MxDrawObject/index.d.ts +2 -1
- package/dist/lib/MxModule/MxDrawObject/index.js +1 -1
- package/dist/lib/MxModule/MxFun/index.d.ts +8 -8
- package/dist/lib/MxModule/MxFun/index.js +1 -1
- package/dist/lib/MxModule/MxThreeJS/MxThreeJS.d.ts +13 -7
- package/dist/lib/MxModule/MxThreeJS/MxThreeJS.js +1 -1
- package/dist/lib/MxModule/MxThreeJS/MxThreeJS.mixin.js +1 -1
- package/dist/lib/MxModule/MxType/index.d.ts +13 -12
- package/dist/lib/MxModule/MxType/index.js +1 -1
- package/dist/lib/MxModule/Mxassembly/index.js +1 -1
- package/dist/lib/MxModule/loadCoreCode/mxfun.es5.js +1 -1
- package/dist/lib/MxModule/store/{PubsubClass.d.ts → Pubsub.d.ts} +0 -0
- package/dist/lib/MxModule/store/{PubsubClass.js → Pubsub.js} +0 -0
- package/dist/lib/MxModule/store/{StoreClass.d.ts → Store.d.ts} +1 -1
- package/dist/lib/MxModule/store/Store.js +1 -0
- package/dist/lib/MxModule/store/index.d.ts +11 -2
- package/dist/lib/MxModule/store/index.js +1 -1
- package/dist/lib/MxModule/useCanvasResizeListener/index.js +1 -1
- package/dist/lib/doc.d.ts +3 -1
- package/dist/lib/doc.js +1 -1
- package/dist/lib/index.js +1 -1
- package/dist/lib/mxdraw.d.ts +1 -0
- package/dist/lib/mxdraw.js +1 -1
- package/dist/lib/test/jestsetup.d.ts +0 -0
- package/dist/lib/test/jestsetup.js +1 -0
- package/dist/mxdraw.es.js +1 -0
- package/dist/mxdraw.umd.js +1 -1
- package/package.json +5 -1
- package/dist/lib/MxModule/store/StoreClass.js +0 -1
- package/dist/lib/MxModule/store/store.d.ts +0 -11
- package/dist/lib/MxModule/store/store.js +0 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import McGiWorldDrawType from '../McGiWorldDrawType';
|
|
3
3
|
import MxDbEntity from '../MxDbEntity';
|
|
4
4
|
import MxDrawObject from '../MxDrawObject';
|
|
5
|
+
import { UnstableColor } from '../MxType';
|
|
5
6
|
/**
|
|
6
7
|
* McGiWorldDraw 用于构建一个动态绘制回调对象的规范接口
|
|
7
8
|
* @abstract 是 {@link MxDbEntity.worldDraw }必须实现的抽象回调方法中的回调对象 通过回调对象完成一些动态绘制任务
|
|
@@ -51,7 +52,7 @@ export default interface McGiWorldDraw {
|
|
|
51
52
|
* ```
|
|
52
53
|
*
|
|
53
54
|
*/
|
|
54
|
-
setColor(iColor:
|
|
55
|
+
setColor(iColor: UnstableColor): void;
|
|
55
56
|
/**
|
|
56
57
|
* 返回绘制颜色
|
|
57
58
|
* @returns
|
|
@@ -104,7 +105,7 @@ export default interface McGiWorldDraw {
|
|
|
104
105
|
* ```
|
|
105
106
|
*
|
|
106
107
|
*/
|
|
107
|
-
drawLines(points: THREE.Vector3[]): void;
|
|
108
|
+
drawLines(points: THREE.Vector3[] | THREE.Vector2[]): void;
|
|
108
109
|
/**
|
|
109
110
|
* 根据几何数据绘制直线
|
|
110
111
|
* @param points 点数组
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import McEdGetPointWorldDrawObject from"../McEdGetPointWorldDrawObject";import store from"../store
|
|
1
|
+
import McEdGetPointWorldDrawObject from"../McEdGetPointWorldDrawObject";import store from"../store";let _MrxDbgUiPrPoint;export default class MrxDbgUiPrPoint{constructor(){var r;_MrxDbgUiPrPoint=new(null===(r=store.state.MxFun)||void 0===r?void 0:r.getMxJigCmdManager().getMrxDbgUiPrPointClass())}keyWords(){return _MrxDbgUiPrPoint.keyWords()}setKeyWords(r){return _MrxDbgUiPrPoint.setKeyWords(r)}message(){return _MrxDbgUiPrPoint.message()}setMessage(r){return _MrxDbgUiPrPoint.setMessage(r)}keyWordPicked(){return _MrxDbgUiPrPoint.keyWordPicked()}isKeyWordPicked(r){return _MrxDbgUiPrPoint.isKeyWordPicked(r)}setUserDraw(r){if("function"!=typeof r)return _MrxDbgUiPrPoint.setUserDraw(r._get?r._get():r);{const e=new McEdGetPointWorldDrawObject;e.setDraw(r),_MrxDbgUiPrPoint.setUserDraw(e._get())}}value(){return _MrxDbgUiPrPoint.value()}valueDocCoord(){return _MrxDbgUiPrPoint.valueDocCoord()}basePt(){return _MrxDbgUiPrPoint.basePt()}setBasePt(r){return _MrxDbgUiPrPoint.setBasePt(r)}setUseBasePt(r){return _MrxDbgUiPrPoint.setUseBasePt(r)}go(r){return r?(_MrxDbgUiPrPoint.go(r),new Promise((r,e)=>{r(null)})):new Promise((r,e)=>{_MrxDbgUiPrPoint.go(e=>{r(0!=e?null:_MrxDbgUiPrPoint.value())})})}goWhile(r,e){return _MrxDbgUiPrPoint.goWhile(r,e)}drawReserve(r){return _MrxDbgUiPrPoint.drawReserve(r)}setInputToucheType(r){return _MrxDbgUiPrPoint.setInputToucheType(r)}getInputToucheType(){return _MrxDbgUiPrPoint.getInputToucheType()}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import MxFun from"../MxFun";import store from"../store
|
|
1
|
+
import MxFun from"../MxFun";import store from"../store";class MrxDbgUtilsClass{constructor(){this.imp=null}initImp(){if(!this.imp&&store.state.MxFun){let t=store.state.MxFun;this.imp=new t.getMrxDbgUtilsClass}}findEntAtPoint(t,i=null,s){return this.initImp(),s||(s=MxFun.getCurrentDraw()),this.imp.findEntAtPoint(s,t,i)}selectEnt(t,i){return this.initImp(),this.imp.selectEnt(t)}}const MrxDbgUtils=new MrxDbgUtilsClass;export default MrxDbgUtils;
|
|
@@ -1,21 +1,59 @@
|
|
|
1
|
-
/** @module MxDb2LineAngularDimension*/
|
|
2
1
|
import McGiWorldDraw from '../McGiWorldDraw';
|
|
3
2
|
import MxDbEntity from '../MxDbEntity';
|
|
4
|
-
|
|
5
|
-
* MxDb2LineAngularDimension
|
|
6
|
-
* 显示角度测量的图形
|
|
7
|
-
*/
|
|
3
|
+
import { MxColorType, UnstableColor } from '../MxType';
|
|
8
4
|
export default class MxDb2LineAngularDimension extends MxDbEntity {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
/**
|
|
6
|
+
* MxDb2LineAngularDimension
|
|
7
|
+
* 显示角度测量的图形
|
|
8
|
+
* @param options.points [point1(起始点)、point2(角顶点)、point3(结束点)]
|
|
9
|
+
* @param options.colors [起始线段颜色, 结束线段颜色, 标注角度圆弧颜色, 文字标注的角度颜色]
|
|
10
|
+
* @example
|
|
11
|
+
* ``` typescript
|
|
12
|
+
* const draw = Mx.MxFun.getCurrentDraw();
|
|
13
|
+
* const points = [ getPoint.value(),
|
|
14
|
+
* getPoint.value().add(new THREE.Vector3(8880, 0, 0)),
|
|
15
|
+
* getPoint.value().add(new THREE.Vector3(0, 6666, 0)),
|
|
16
|
+
* ]
|
|
17
|
+
* const colors = ['#F00880','#00ff1a', void 0, 0XFF0000]
|
|
18
|
+
* const obj = new Mx.MxDb2LineAngularDimension().setPoints(points).setColor(colors).setLineWidth(6)
|
|
19
|
+
* draw.addMxEntity(obj)
|
|
20
|
+
* ```
|
|
21
|
+
**/
|
|
22
|
+
constructor(options?: {
|
|
23
|
+
/** 传入三个位置THREE向量 分别对应 属性: point1(起始点)、point2(角顶点)、point3(结束点) 计算角度 */
|
|
24
|
+
points?: THREE.Vector3[];
|
|
25
|
+
/** colors 各标注的颜色设置:
|
|
26
|
+
* [起始线段颜色, 结束线段颜色, 标注角度圆弧颜色, 文字标注的角度颜色]
|
|
27
|
+
* 某一项为null或undefined采用绘制颜色 */
|
|
28
|
+
colors?: UnstableColor[];
|
|
29
|
+
});
|
|
30
|
+
point1: import("three").Vector3;
|
|
31
|
+
point2: import("three").Vector3;
|
|
32
|
+
point3: import("three").Vector3;
|
|
33
|
+
/**
|
|
34
|
+
* colors 各标注的颜色设置:
|
|
35
|
+
* [起始线段颜色, 结束线段颜色, 标注角度圆弧颜色, 文字标注的角度颜色]
|
|
36
|
+
* 某一项为null或undefined采用绘制颜色
|
|
37
|
+
* */
|
|
38
|
+
colors: UnstableColor[];
|
|
12
39
|
private calculateLineAngle;
|
|
40
|
+
/**
|
|
41
|
+
* 设置point1 、 point2、point3 向量位置
|
|
42
|
+
* @param { THREE.Vector3[] } points
|
|
43
|
+
*/
|
|
44
|
+
setPoints(points: THREE.Vector3[]): this;
|
|
45
|
+
/**
|
|
46
|
+
* 设置颜色组合
|
|
47
|
+
* @param colors [起始线段颜色, 结束线段颜色, 标注角度圆弧颜色, 文字标注的角度颜色]
|
|
48
|
+
* 某一项为null或undefined采用绘制颜色 || 单颜色
|
|
49
|
+
* */
|
|
50
|
+
setColor(colors: UnstableColor[] | MxColorType): this;
|
|
13
51
|
worldDraw(pWorldDraw: McGiWorldDraw): void;
|
|
14
|
-
getGripPoints():
|
|
52
|
+
getGripPoints(): import("three").Vector3[];
|
|
15
53
|
moveGripPointsAt(index: number, offset: THREE.Vector3): boolean;
|
|
16
54
|
dwgIn(obj: any): boolean;
|
|
17
|
-
dwgOut(obj: any):
|
|
18
|
-
create():
|
|
55
|
+
dwgOut(obj: any): any;
|
|
56
|
+
create(): MxDb2LineAngularDimension;
|
|
19
57
|
transformBy(mat: THREE.Matrix4): void;
|
|
20
58
|
getTypeName(): string;
|
|
21
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import McGiWorldDrawType from"../McGiWorldDrawType";import MxDbEntity from"../MxDbEntity";
|
|
1
|
+
import _ from"lodash";import McGiWorldDrawType from"../McGiWorldDrawType";import MxDbEntity from"../MxDbEntity";const propertyDbKeys=["colors","point1","point2","point3"];export default class MxDb2LineAngularDimension extends MxDbEntity{constructor(t){if(super(),this.point1=new THREE.Vector3,this.point2=new THREE.Vector3,this.point3=new THREE.Vector3,this.colors=[],t){const{points:i,colors:o}=t;i&&this.setPoints(i),o&&this.setColor(o)}}calculateLineAngle(t,i,o){const n=2*Math.PI/360;return{startAngle:180*Math.atan2(i.y-t.y,i.x-t.x)/Math.PI*n,endAngle:180*Math.atan2(o.y-t.y,o.x-t.x)/Math.PI*n}}setPoints(t){const[i,o,n]=t;return i&&(this.point1=i),o&&(this.point2=o),n&&(this.point3=n),this}setColor(t){return _.isArray(t)?this.colors=t:this.color=t,this}worldDraw(t){if(t.getType()==McGiWorldDrawType.kWorldDraw||t.getType()==McGiWorldDrawType.kDynDragDraw){const[i,o,n,e]=this.colors||[],s=this.getColor(),r=t.getMxObject();t.setColor(i||s),t.drawLine(this.point1,this.point2),t.setColor(o||s),t.drawLine(this.point2,this.point3);const{startAngle:p,endAngle:h}=this.calculateLineAngle(this.point2,this.point1,this.point3),a=this.point2.distanceTo(this.point1),l=this.point2.distanceTo(this.point3),c=Math.min(a,l)/4;let d=THREE.MathUtils.radToDeg(p-h);d<0&&(d+=360);let y=r.screenCoordLong2Doc(50);const g=new THREE.ArcCurve(this.point2.x,this.point2.y,c,p,h,!0),w=(new THREE.Geometry).setFromPoints(g.getPoints(50));t.setColor(n||s),t.drawGeometryLines(w);const D=g.getPoint(.5);let u=new THREE.Vector3(D.x,D.y,0);const M=u.sub(this.point2),x=M.length()+.5*y;M.normalize().multiplyScalar(x),u=this.point2.clone().add(M),t.setColor(e||s),t.drawText(d.toFixed(3)+"°",.5*y,0,u)}else t.drawLine(this.point1,this.point2),t.drawLine(this.point3,this.point2)}getGripPoints(){return[this.point1,this.point2,this.point3]}moveGripPointsAt(t,i){return 0===t?this.point1.add(i):1===t?this.point2.add(i):2===t&&this.point3.add(i),!0}dwgIn(t){return this.onDwgIn(t),this.dwgInHelp(t,propertyDbKeys),!0}dwgOut(t){return this.onDwgOut(t),this.dwgOutHelp(t,propertyDbKeys),t}create(){return new MxDb2LineAngularDimension}transformBy(t){this.point1.applyMatrix4(t),this.point2.applyMatrix4(t)}getTypeName(){return"MxDb2LineAngularDimension"}};
|
|
@@ -1,14 +1,47 @@
|
|
|
1
1
|
/** @module MxDbAlignedDimension*/
|
|
2
2
|
import McGiWorldDraw from '../McGiWorldDraw';
|
|
3
3
|
import MxDbEntity from '../MxDbEntity';
|
|
4
|
+
import { MxColorType, UnstableColor } from '../MxType';
|
|
4
5
|
/**
|
|
5
6
|
* MxDbAlignedDimension 尺寸标注
|
|
6
7
|
*/
|
|
7
8
|
export default class MxDbAlignedDimension extends MxDbEntity {
|
|
9
|
+
/**
|
|
10
|
+
* MxDbAlignedDimension
|
|
11
|
+
* 尺寸标注
|
|
12
|
+
* @param options.points 提供两个向量测量尺寸
|
|
13
|
+
* @param options.fontColor 字体颜色
|
|
14
|
+
* @example ```typescript
|
|
15
|
+
* const draw = Mx.MxFun.getCurrentDraw();
|
|
16
|
+
* const v3 = new THREE.Vector3()
|
|
17
|
+
* const points = [v3 , v3.clone().add(new THREE.Vector3(8880, 0, 0))]
|
|
18
|
+
* const colors = ['#F00880','#00ff1a']
|
|
19
|
+
* draw.addMxEntity(
|
|
20
|
+
* new Mx.MxDbAlignedDimension({ points })
|
|
21
|
+
* .setColor(colors)
|
|
22
|
+
* .setLineWidth(6)
|
|
23
|
+
* )
|
|
24
|
+
* ```
|
|
25
|
+
**/
|
|
26
|
+
constructor(options?: {
|
|
27
|
+
/** [point1, point2] 两个向量位置 */
|
|
28
|
+
points?: THREE.Vector3[];
|
|
29
|
+
/** 字体颜色 */
|
|
30
|
+
fontColor?: MxColorType;
|
|
31
|
+
});
|
|
8
32
|
point1: THREE.Vector3;
|
|
9
33
|
point2: THREE.Vector3;
|
|
34
|
+
fontColor: UnstableColor;
|
|
35
|
+
/**
|
|
36
|
+
* 设置两个点位置向量
|
|
37
|
+
* @param { THREE.Vector3[] } points [THREE.Vector3, THREE.Vector3]
|
|
38
|
+
*/
|
|
39
|
+
setPoints(points: THREE.Vector3[]): void;
|
|
10
40
|
getTypeName(): string;
|
|
11
41
|
private getDirection;
|
|
42
|
+
/**
|
|
43
|
+
* 获取尺寸距离
|
|
44
|
+
* */
|
|
12
45
|
getDimText(): string;
|
|
13
46
|
worldDraw(pWorldDraw: McGiWorldDraw): void;
|
|
14
47
|
/**
|
|
@@ -21,9 +54,10 @@ export default class MxDbAlignedDimension extends MxDbEntity {
|
|
|
21
54
|
* @parma pt1 three.js坐标点位
|
|
22
55
|
* */
|
|
23
56
|
setPoint2(pt2: THREE.Vector3): void;
|
|
57
|
+
setColor(color: UnstableColor | UnstableColor[]): this;
|
|
24
58
|
getGripPoints(): Array<THREE.Vector3>;
|
|
25
59
|
moveGripPointsAt(index: number, offset: THREE.Vector3): boolean;
|
|
26
60
|
dwgIn(obj: any): boolean;
|
|
27
61
|
dwgOut(obj: any): object;
|
|
28
|
-
create():
|
|
62
|
+
create(): MxDbAlignedDimension;
|
|
29
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import McGiWorldDrawType from"../McGiWorldDrawType";import MxDbEntity from"../MxDbEntity";import MxThreeJS from"../MxThreeJS";export default class MxDbAlignedDimension extends MxDbEntity{constructor(){super(
|
|
1
|
+
import _ from"lodash";import McGiWorldDrawType from"../McGiWorldDrawType";import MxDbEntity from"../MxDbEntity";import MxThreeJS from"../MxThreeJS";const propertyDbKeys=["point1","point2","fontColor"];export default class MxDbAlignedDimension extends MxDbEntity{constructor(t){if(super(),this.point1=new THREE.Vector3,this.point2=new THREE.Vector3,t){const{points:e,fontColor:o}=t;e&&this.setPoints(e),o&&(this.fontColor=o)}}setPoints(t){const[e,o]=t;e&&(this.point1=e),o&&(this.point2=o)}getTypeName(){return"MxDbAlignedDimension"}getDirection(t,e,o){const n=new THREE.Vector3(t.x,t.y,0),i=new THREE.Vector3(1,0,0),r=t.angleTo(i);let a=-1;(r<7*Math.PI/18||r>10*Math.PI/18)&&e.x>o.x&&(a=1);const s=new THREE.Matrix4;return s.makeRotationZ(Math.PI/2*a),n.applyMatrix4(s),n}getDimText(){return new THREE.Vector3(this.point1.x-this.point2.x,this.point1.y-this.point2.y,0).length().toFixed(3)}worldDraw(t){if(t.getType()==McGiWorldDrawType.kWorldDraw||t.getType()==McGiWorldDrawType.kDynDragDraw){const e=this.point1,o=this.point2;let n,i,r,a,s,y,x;const c=new THREE.Vector3(e.x-o.x,e.y-o.y,0),p=this.getDirection(c,e,o),E=new THREE.Matrix4;E.makeScale(.01,.01,.01);const h=new THREE.Vector3(p.x,p.y,0);h.applyMatrix4(E);const l=new THREE.Vector3(e.x+h.x,e.y+h.y,0),w=new THREE.Vector3(o.x+h.x,o.y+h.y,0),T=this.getColor();y=MxThreeJS.createPoint(e,T),x=MxThreeJS.createPoint(o,T);{E.identity(),E.makeScale(.2,.2,0),new THREE.Vector3(p.x,p.y,0).applyMatrix4(E),E.identity(),E.makeScale(.02,.02,0);const r=new THREE.Vector3(p.x,p.y,0);r.applyMatrix4(E),t.drawLine(l,w),n=MxThreeJS.createLine(new THREE.Vector3(l.x+2*r.x,l.y+2*r.y,0),new THREE.Vector3(e.x+r.x,e.y+r.y,0),T),i=MxThreeJS.createLine(new THREE.Vector3(w.x+2*r.x,w.y+2*r.y,0),new THREE.Vector3(o.x+r.x,o.y+r.y,0),T)}{const n=new THREE.Vector3(1,0,0);let i=c.angleTo(n);const a=new THREE.Vector3(p.x,p.y,0);a.normalize();const s=e.distanceTo(o);c.y<0?i=i<Math.PI/2?2*Math.PI-i:Math.PI-i:i>Math.PI/2&&(i=Math.PI+i);const y=t.getMxObject();y&&(i-=y.getViewAngle());const x=this.getDimText();null!=(r=MxThreeJS.creatTextSprite(x,new THREE.Vector3(w.x+c.x/2+a.x*s/30,w.y+c.y/2+a.y*s/30,0),.07*s,i,this.fontColor||T))&&t.drawEntity(r)}{E.identity(),E.makeScale(.08,.08,.08);const t=new THREE.Matrix4;t.makeRotationZ(17*Math.PI/18);let e=new THREE.Vector3(c.x,c.y,0);e.applyMatrix4(E),e.applyMatrix4(t),t.identity(),t.makeRotationZ(17*-Math.PI/18);let o=new THREE.Vector3(c.x,c.y,0);o.applyMatrix4(E),o.applyMatrix4(t);const n=new Array;n.push(new THREE.Vector3(l.x,l.y,0),new THREE.Vector3(l.x+e.x,l.y+e.y,0),new THREE.Vector3(l.x+o.x,l.y+o.y,0)),a=MxThreeJS.createTriangle(n,T),t.identity(),t.makeRotationZ(Math.PI/18),(e=new THREE.Vector3(c.x,c.y,0)).applyMatrix4(E),e.applyMatrix4(t),t.identity(),t.makeRotationZ(-Math.PI/18),(o=new THREE.Vector3(c.x,c.y,0)).applyMatrix4(E),o.applyMatrix4(t);const i=new Array;i.push(new THREE.Vector3(w.x,w.y,0),new THREE.Vector3(w.x+e.x,w.y+e.y,0),new THREE.Vector3(w.x+o.x,w.y+o.y,0)),s=MxThreeJS.createTriangle(i,T)}t.drawEntity(n),t.drawEntity(i),a&&t.drawEntity(a),s&&t.drawEntity(s),t.drawEntity(y),t.drawEntity(x)}else t.drawLine(this.point1,this.point2)}setPoint1(t){this.point1=t}setPoint2(t){this.point2=t}setColor(t){return _.isArray(t)?([this.color=this.color,this.fontColor=this.fontColor||this.color]=t,console.log("this.fontColor : ",this.fontColor)):this.color=t,this}getGripPoints(){let t=[];return t.push(this.point1),t.push(this.point2),t}moveGripPointsAt(t,e){return 0==t?this.point1.add(e):(t=1)&&this.point2.add(e),!0}dwgIn(t){return this.onDwgIn(t),this.dwgInHelp(t,propertyDbKeys),!0}dwgOut(t){return this.onDwgOut(t),this.dwgOutHelp(t,propertyDbKeys),t}create(){return new MxDbAlignedDimension}};
|
|
@@ -9,8 +9,12 @@ export default class MxDbAnyLine extends MxDbEntity {
|
|
|
9
9
|
/** 构成线段的顶点坐标集合 */
|
|
10
10
|
points: THREE.Vector3[];
|
|
11
11
|
getTypeName(): string;
|
|
12
|
-
create():
|
|
12
|
+
create(): MxDbAnyLine;
|
|
13
13
|
worldDraw(pWorldDraw: McGiWorldDraw): void;
|
|
14
|
+
/** 设置线段points
|
|
15
|
+
* @param points 构成线段的多个点
|
|
16
|
+
*/
|
|
17
|
+
setPoints(points: THREE.Vector3[]): this;
|
|
14
18
|
/** 获取线段的包围盒的中心点坐标 */
|
|
15
19
|
getCenter(): THREE.Vector3;
|
|
16
20
|
getGripPoints(): THREE.Vector3[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import MxDbEntity from"../MxDbEntity";import McGiWorldDrawType from"../McGiWorldDrawType";import{Box3}from"three";const propertyDbKeys=["points"];export default class MxDbAnyLine extends MxDbEntity{constructor(){super(...arguments),this.points=[]}getTypeName(){return"MxDbAnyLine"}create(){return new MxDbAnyLine}worldDraw(t){let e=t.getMxObject();const r=(new Box3).setFromPoints(this.points);let n=new THREE.Vector3;if(r.getCenter(n),t.drawLines(this.points),t.getType()===McGiWorldDrawType.kSelectDraw){const o=new THREE.Vector3;r.getSize(o),o.addScalar(e.screenCoordLong2Doc(20));const i=o.x/2,s=o.y/2,y={x:n.x-i,y:n.y-s},x={x:n.x+i,y:n.y-s},p={x:n.x+i,y:n.y+s},c={x:n.x-i,y:n.y+s};t.drawLine(y.x,y.y,x.x,x.y),t.drawLine(x.x,x.y,p.x,p.y),t.drawLine(p.x,p.y,c.x,c.y),t.drawLine(c.x,c.y,y.x,y.y)}}setPoints(t){return this.points=t,this}getCenter(){const t=new THREE.Geometry;t.vertices=this.points;const e=new THREE.Vector3;return t.computeBoundingBox(),t.boundingBox.getCenter(e),e}getGripPoints(){return[this.getCenter()]}moveGripPointsAt(t,e){return 0===t&&this.points.forEach(t=>{t.add(e)}),!0}dwgIn(t){return this.onDwgIn(t),this.dwgInHelp(t,propertyDbKeys),!0}dwgOut(t){return this.onDwgOut(t),this.dwgOutHelp(t,propertyDbKeys),t}};
|
|
@@ -7,7 +7,7 @@ import MxDbEntity from '../MxDbEntity';
|
|
|
7
7
|
export default class MxDbCloudLine extends MxDbEntity {
|
|
8
8
|
private points;
|
|
9
9
|
private radius;
|
|
10
|
-
private
|
|
10
|
+
private cachePoint;
|
|
11
11
|
getTypeName(): string;
|
|
12
12
|
create(): MxDbEntity;
|
|
13
13
|
/** 设置构成云线的每个圆弧半径长度
|
|
@@ -33,7 +33,7 @@ export default class MxDbCloudLine extends MxDbEntity {
|
|
|
33
33
|
* */
|
|
34
34
|
addLine(pt1: THREE.Vector3, pt2: THREE.Vector3): import("three").Vector3;
|
|
35
35
|
/** 重新计算云线的的所有顶点坐标, 如绘制完云线后 重新设置了圆弧半径, 在worldDraw动态绘制时会调用该方法 */
|
|
36
|
-
|
|
36
|
+
reCalculateDrawGeometryPoint(): THREE.Vector3[] | null;
|
|
37
37
|
worldDraw(pWorldDraw: McGiWorldDraw): void;
|
|
38
38
|
/**
|
|
39
39
|
* 获取云线包围盒的中心点
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import MxDbEntity from"../MxDbEntity";import McGiWorldDrawType from"../McGiWorldDrawType";export default class MxDbCloudLine extends MxDbEntity{constructor(){super(...arguments),this.points=[],this.radius=16,this.
|
|
1
|
+
import MxDbEntity from"../MxDbEntity";import McGiWorldDrawType from"../McGiWorldDrawType";const propertyDbKeys=["points","radius","cachePoint"];export default class MxDbCloudLine extends MxDbEntity{constructor(){super(...arguments),this.points=[],this.radius=16,this.cachePoint=null}getTypeName(){return"MxDbCloudLine"}create(){return new MxDbCloudLine}setRadius(t){this.radius=t}getRadius(){return this.radius}clacNewArcDiameterPoint(t){if(0==this.points.length)return t;let e=this.points[this.points.length-1];const n=2*this.radius,i=e.distanceTo(t);if(i<n)return null;const r=n*(t.x-e.x)/i+e.x,o=n*(t.y-e.y)/i+e.y;return new THREE.Vector3(r,o,e.z)}createCloudArcCurvePoints(t,e,n){const i=new THREE.Vector3((t.x+e.x)/2,(t.y+e.y)/2,0);n||(n=i.distanceTo(t));const{startAngle:r,endAngle:o}=function(t,e,n){const i=2*Math.PI/360;return{startAngle:180*Math.atan2(e.y-t.y,e.x-t.x)/Math.PI*i,endAngle:180*Math.atan2(n.y-t.y,n.x-t.x)/Math.PI*i}}(i,t,e);return new THREE.ArcCurve(i.x,i.y,n,r,o,!0).getPoints(10)}addPoint(t,e){let n=this.clacNewArcDiameterPoint(t);n&&(this.points.push(n),this.cachePoint=null,e&&(this.cachePoint=this.reCalculateDrawGeometryPoint()))}addLine(t,e){this.addPoint(t);const n=2*this.radius;let i=this.points[this.points.length-1],r=i.distanceTo(e);const o=Math.round(r/n);for(let t=0;t<o;t++){r=i.distanceTo(e);const t=n*(e.x-i.x)/r+i.x,o=n*(e.y-i.y)/r+i.y;let s=new THREE.Vector3(t,o,e.z);this.addPoint(s),i=s}return this.points[this.points.length-1]}reCalculateDrawGeometryPoint(){if(this.points.length<2)return null;let t=this.points[0],e=this.points.length,n=[];for(let i=1;i<e;i++){let e=this.points[i];this.createCloudArcCurvePoints(t,e).forEach(t=>{n.push(new THREE.Vector3(t.x,t.y,0))}),t=e}return n}worldDraw(t){if(this.cachePoint||(this.cachePoint=this.reCalculateDrawGeometryPoint()),this.cachePoint)if(t.getType()===McGiWorldDrawType.kSelectDraw){let e=new THREE.Geometry;this.cachePoint.forEach(t=>{e.vertices.push(new THREE.Vector3(t.x,t.y,0))}),e.computeBoundingBox();const n=new THREE.Vector3;e.boundingBox.getSize(n);let i=new THREE.Vector3;e.boundingBox.getCenter(i);const r=n.x/2,o=n.y/2,s={x:i.x-r,y:i.y-o},c={x:i.x+r,y:i.y-o},a={x:i.x+r,y:i.y+o},h={x:i.x-r,y:i.y+o};t.drawLine(s.x,s.y,c.x,c.y),t.drawLine(c.x,c.y,a.x,a.y),t.drawLine(a.x,a.y,h.x,h.y),t.drawLine(h.x,h.y,s.x,s.y)}else t.drawLines(this.cachePoint)}getCenter(){const t=new THREE.Geometry;t.vertices=this.points;let e=new THREE.Vector3;return t.computeBoundingBox(),t.boundingBox.getCenter(e),e}getGripPoints(){return[this.getCenter()]}moveGripPointsAt(t,e){return this.points.forEach(t=>{t.add(e)}),this.cachePoint=null,!0}dwgIn(t){return this.onDwgIn(t),this.dwgInHelp(t,propertyDbKeys),!0}dwgOut(t){return this.onDwgOut(t),this.dwgOutHelp(t,propertyDbKeys),t}};
|
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
/** @module MxDbEntity*/
|
|
2
1
|
import McGiWorldDraw from '../McGiWorldDraw';
|
|
3
2
|
import MxDrawObject from '../MxDrawObject';
|
|
3
|
+
import { MxColorType, UnstableColor } from '../MxType';
|
|
4
|
+
export declare enum DataType {
|
|
5
|
+
Default = 0,
|
|
6
|
+
Color = 1,
|
|
7
|
+
Vector2 = 2,
|
|
8
|
+
Vector3 = 3,
|
|
9
|
+
Vector4 = 4,
|
|
10
|
+
Matrix3 = 5,
|
|
11
|
+
Matrix4 = 6
|
|
12
|
+
}
|
|
13
|
+
export declare const MXDBDATATYPE = "datatype";
|
|
4
14
|
/**
|
|
5
15
|
* MxDbEntity 用于构建一个自定义对象的抽象类(该类无法实例化 请通过继承的方式对其抽象方法进行实现)
|
|
6
16
|
* @description MxDbEntity 属于 abstract class(抽象类) 主要用途是通过继承这个类实现一个用于动态绘制的图形对象
|
|
@@ -25,7 +35,7 @@ export default abstract class MxDbEntity {
|
|
|
25
35
|
/**
|
|
26
36
|
* 颜色值
|
|
27
37
|
* */
|
|
28
|
-
color:
|
|
38
|
+
color: UnstableColor;
|
|
29
39
|
/**
|
|
30
40
|
* 显示顺序
|
|
31
41
|
* */
|
|
@@ -44,12 +54,12 @@ export default abstract class MxDbEntity {
|
|
|
44
54
|
userData: {
|
|
45
55
|
[key: string]: any;
|
|
46
56
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
57
|
+
sGuid: string;
|
|
58
|
+
dLineWidth: number;
|
|
59
|
+
lineWidthByPixels: boolean;
|
|
60
|
+
dDashArray: number;
|
|
61
|
+
dDashRatio: number;
|
|
62
|
+
layer: string;
|
|
53
63
|
private _event;
|
|
54
64
|
abstract getTypeName(): string;
|
|
55
65
|
initGuid(guid: string): void;
|
|
@@ -73,7 +83,10 @@ export default abstract class MxDbEntity {
|
|
|
73
83
|
abstract moveGripPointsAt(index: number, offset: THREE.Vector3): boolean;
|
|
74
84
|
/**
|
|
75
85
|
* 自定义对象数据输入,辅助函数.
|
|
76
|
-
* @param
|
|
86
|
+
* @param obj 数据对象
|
|
87
|
+
* @param aryProp 属性名称列表
|
|
88
|
+
* @param hooks.getVal 交互数据输入钩子函数 return null | undefined 默认深拷贝 ; return Value 返回数据
|
|
89
|
+
* @param hooks.getCacheVal 归档数据构子函数 return null | undefined 默认深拷贝 ; return Value 返回数据
|
|
77
90
|
* @returns boolean
|
|
78
91
|
* @example
|
|
79
92
|
* ``` typescript
|
|
@@ -85,7 +98,10 @@ export default abstract class MxDbEntity {
|
|
|
85
98
|
* }
|
|
86
99
|
* ```
|
|
87
100
|
*/
|
|
88
|
-
protected dwgInHelp(obj: any, aryProp:
|
|
101
|
+
protected dwgInHelp<T extends string[]>(obj: any, aryProp: T, hooks?: {
|
|
102
|
+
getVal?: (v: any) => any;
|
|
103
|
+
getCacheVal?: (v: any) => any;
|
|
104
|
+
}): boolean;
|
|
89
105
|
/**
|
|
90
106
|
* 自定义对象数据输出 辅助函数.
|
|
91
107
|
* @param
|
|
@@ -104,10 +120,10 @@ export default abstract class MxDbEntity {
|
|
|
104
120
|
protected callEvent(sEventName: string, param?: any): any;
|
|
105
121
|
/**
|
|
106
122
|
* 新创建一个自定义对象 (默认调用该对象的构造函数来创建新的对象)
|
|
107
|
-
* @param
|
|
123
|
+
* @param { T } options
|
|
108
124
|
* @returns MxDbEntity
|
|
109
125
|
*/
|
|
110
|
-
create():
|
|
126
|
+
create(options?: {}): any;
|
|
111
127
|
/**
|
|
112
128
|
* 自定义对象数据输入,必须要实现该函数
|
|
113
129
|
* @param
|
|
@@ -140,10 +156,10 @@ export default abstract class MxDbEntity {
|
|
|
140
156
|
abstract dwgOut(obj: any): object;
|
|
141
157
|
/**
|
|
142
158
|
* 自定义实体的矩阵 坐标变换 (需要重写该方法实现如果通过矩阵对自定义实体进行操作 默认不会进行任何操作)
|
|
143
|
-
* @param
|
|
159
|
+
* @param _mat THREE.Matrix4 变化矩阵
|
|
144
160
|
* @returns void
|
|
145
161
|
*/
|
|
146
|
-
transformBy(
|
|
162
|
+
transformBy(_mat: THREE.Matrix4): void;
|
|
147
163
|
/**
|
|
148
164
|
* 返回对象最小外包.
|
|
149
165
|
* @param
|
|
@@ -193,18 +209,18 @@ export default abstract class MxDbEntity {
|
|
|
193
209
|
* @param color 颜色值
|
|
194
210
|
* @returns boolean
|
|
195
211
|
*/
|
|
196
|
-
setColor(color:
|
|
212
|
+
setColor(color: MxColorType): this;
|
|
197
213
|
/**
|
|
198
214
|
* 得到颜色
|
|
199
215
|
* @returns boolean
|
|
200
216
|
*/
|
|
201
|
-
getColor():
|
|
217
|
+
getColor(): MxColorType;
|
|
202
218
|
/**
|
|
203
219
|
* 复制克隆对象。
|
|
204
220
|
* @param type {@link MxType.MxCloneType} 传入参数区分是正常拷贝还是动态拷贝
|
|
205
221
|
* @returns MxDbEntity
|
|
206
222
|
*/
|
|
207
|
-
clone(type?: number):
|
|
223
|
+
clone(type?: number): any;
|
|
208
224
|
/**
|
|
209
225
|
* 自定义对象内部数据输入同步(重写实现dwgIn抽象方法时 必须在实现中调用 this.onDwgIn(obj))
|
|
210
226
|
* @param obj dwgIn抽象方法的回调数据
|
|
@@ -234,7 +250,7 @@ export default abstract class MxDbEntity {
|
|
|
234
250
|
* 设置线宽是否随像素
|
|
235
251
|
* @returns number
|
|
236
252
|
*/
|
|
237
|
-
setLineWidthByPixels(isPixels: boolean):
|
|
253
|
+
setLineWidthByPixels(isPixels: boolean): this;
|
|
238
254
|
/**
|
|
239
255
|
* 线宽是否随像素
|
|
240
256
|
* @returns number
|
|
@@ -244,7 +260,7 @@ export default abstract class MxDbEntity {
|
|
|
244
260
|
* 设置线宽
|
|
245
261
|
* @returns number
|
|
246
262
|
*/
|
|
247
|
-
setLineWidth(dLineWidth: number):
|
|
263
|
+
setLineWidth(dLineWidth: number): this;
|
|
248
264
|
/**
|
|
249
265
|
* 得到线宽
|
|
250
266
|
* @returns number
|
|
@@ -260,22 +276,22 @@ export default abstract class MxDbEntity {
|
|
|
260
276
|
* dDashRatio确定虚线,与实线的比率.
|
|
261
277
|
* @returns number
|
|
262
278
|
*/
|
|
263
|
-
setDashLen(dashLen: number):
|
|
279
|
+
setDashLen(dashLen: number): this;
|
|
264
280
|
/**
|
|
265
281
|
* 设置虚线,与实线的比率
|
|
266
282
|
* @returns number
|
|
267
283
|
*/
|
|
268
|
-
setDashRatio(dDashRatio: number):
|
|
284
|
+
setDashRatio(dDashRatio: number): this;
|
|
269
285
|
/**
|
|
270
286
|
* 设置实线虚线总段数 = 1 / dashArray
|
|
271
287
|
* @returns number
|
|
272
288
|
*/
|
|
273
|
-
setDashArray(dDashArray: number):
|
|
289
|
+
setDashArray(dDashArray: number): this;
|
|
274
290
|
/**
|
|
275
291
|
* 设置虚线数据
|
|
276
292
|
* @returns number
|
|
277
293
|
*/
|
|
278
|
-
setDash(dDashArray: number, dDashRatio: number):
|
|
294
|
+
setDash(dDashArray: number, dDashRatio: number): this;
|
|
279
295
|
/**
|
|
280
296
|
* 得到虚线数据
|
|
281
297
|
* @returns number
|
|
@@ -285,7 +301,7 @@ export default abstract class MxDbEntity {
|
|
|
285
301
|
* 设置虚线显示。并初始化一个默认值。
|
|
286
302
|
* @returns number
|
|
287
303
|
*/
|
|
288
|
-
setDashLineDisplay(isDashLine: boolean):
|
|
304
|
+
setDashLineDisplay(isDashLine: boolean): this;
|
|
289
305
|
/**
|
|
290
306
|
* 是否虚线显示
|
|
291
307
|
* @returns number
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import MxType from"../MxType";import store from"../store
|
|
1
|
+
import _ from"lodash";import MxType from"../MxType";import store from"../store";export var DataType;!function(t){t[t.Default=0]="Default",t[t.Color=1]="Color",t[t.Vector2=2]="Vector2",t[t.Vector3=3]="Vector3",t[t.Vector4=4]="Vector4",t[t.Matrix3=5]="Matrix3",t[t.Matrix4=6]="Matrix4"}(DataType||(DataType={}));export const MXDBDATATYPE="datatype";const propertyDbKeys=["color","renderOrder","opacity","visible","userData","sGuid","dLineWidth","lineWidthByPixels","dDashArray","dDashRatio","layer"];export default class MxDbEntity{constructor(){this.color=16777215,this.renderOrder=30,this.opacity=1,this.visible=!0,this.userData={},this.sGuid="",this.dLineWidth=0,this.lineWidthByPixels=!0,this.dDashArray=0,this.dDashRatio=0,this.layer="",this._event={}}initGuid(t){this.sGuid.length>0?console.log("mx: init guid error"):this.sGuid=t}dwgInHelp(t,e,i){let r=this;const s=t.type===MxType.MxCloneType.kMxFileClone,a=t=>{if(!t)return;const{value:e,[MXDBDATATYPE]:r}=t;switch(r){case DataType.Color:return new THREE.Color(...e);case DataType.Vector2:return new THREE.Vector2(...e);case DataType.Vector3:return new THREE.Vector3(...e);case DataType.Vector4:return new THREE.Vector4(...e);case DataType.Matrix3:return(new THREE.Matrix3).fromArray(e);case DataType.Matrix4:return(new THREE.Matrix4).fromArray(e)}return i&&i.getCacheVal?i.getCacheVal(t):void 0};function h(t){return t instanceof THREE.Color||t instanceof THREE.Vector2||t instanceof THREE.Vector3||t instanceof THREE.Vector4||t instanceof THREE.Matrix3||t instanceof THREE.Matrix4?t.clone():i&&i.getVal?i.getVal(t):void 0}return e.forEach(e=>{r[e]=_.cloneDeepWith(t[e],s?a:h)}),!0}dwgOutHelp(t,e){const i=t=>t instanceof THREE.Color?{[MXDBDATATYPE]:DataType.Color,value:t.toArray()}:t instanceof THREE.Vector2?{[MXDBDATATYPE]:DataType.Vector2,value:t.toArray()}:t instanceof THREE.Vector3?{[MXDBDATATYPE]:DataType.Vector3,value:t.toArray()}:t instanceof THREE.Vector4?{[MXDBDATATYPE]:DataType.Vector4,value:t.toArray()}:t instanceof THREE.Matrix3?{[MXDBDATATYPE]:DataType.Matrix3,value:t.toArray()}:t instanceof THREE.Matrix4?{[MXDBDATATYPE]:DataType.Matrix4,value:t.toArray()}:void 0;let r=this;const s=t.type===MxType.MxCloneType.kMxFileClone;return e.forEach(e=>{t[e]=s?_.cloneDeepWith(r[e],i):r[e]}),t}callEvent(t,e){return void 0!=this._event[t]?this._event[t](e):void 0}create(t){return new(0,this.constructor)(t)}transformBy(t){}getGeomExtents(){return null}getImp(){return this.MxDbEntityImp}setNeedUpdateDisplay(t){let e=this.getImp();return!!e&&(t?e.upDisplay():e.setDirtyDisplay(!0),!0)}getMxObject(){let t=this.getImp();return t?t.getMxObject():null}onViewChange(){return!1}objectId(){let t=this.getImp();return t?t.objectId():0}erase(){let t=this.getImp();return!!t&&t.erase()}setLayer(t){let e=this.getImp();e&&e.nodifySetLayer(),this.layer=t}getLayer(){return this.layer}setColor(t){return this.color=t,this}getColor(){return this.color||16777215}clone(t){let e=this.create(),i={type:t||MxType.MxCloneType.kClone};return this.dwgOut(i),e.dwgIn(i),e.sGuid="",e}onDwgIn(t){this.color=t.color,this.renderOrder=t.renderOrder,this.opacity=t.opacity,this.visible=t.visible,t.userData?this.userData=JSON.parse(JSON.stringify(t.userData)):this.userData={},this.dLineWidth=t.lineWidth,this.lineWidthByPixels=t.lineWidthByPixels,this.dDashArray=t.dashArray,this.dDashRatio=t.dashRatio,this.layer=t.layer,t.guid&&(this.sGuid=t.guid)}onDwgOut(t){t.color=this.color,t.renderOrder=this.renderOrder,t.opacity=this.opacity,t.visible=this.visible,t.lineWidth=this.dLineWidth,t.lineWidthByPixels=this.lineWidthByPixels,t.dashArray=this.dDashArray,t.dashRatio=this.dDashRatio,t.layer=this.layer,t.guid=this.sGuid,Object.keys(this.userData).length>0&&(t.userData=this.userData)}rxInit(){store.state.MxFun.initMxDbEntityType(this)}setRenderOrder(t){this.renderOrder=t}getRenderOrder(){return this.renderOrder}setLineWidthByPixels(t){return this.lineWidthByPixels=t,this}getLineWidthByPixels(){return this.lineWidthByPixels}setLineWidth(t){return this.dLineWidth=t,this}getLineWidth(){return this.dLineWidth}getGetLength(){return 0}setDashLen(t){let e=this.getGetLength();if(e<1e-6||t<1e-6)return this;let i=Math.floor(e/t);return i<1e-6&&(this.dDashRatio=0),this.dDashArray=1/i,this}setDashRatio(t){return this.dDashRatio=t,this}setDashArray(t){return this.dDashArray=t,this}setDash(t,e){return this.dDashArray=t,this.dDashRatio=e,0==this.dLineWidth&&(this.dLineWidth=6,this.lineWidthByPixels=!0),this}getDash(){return{dDashArray:this.dDashArray,dDashRatio:this.dDashRatio}}setDashLineDisplay(t){return t?(this.dDashArray<1e-5&&(this.dDashArray=.03),this.dDashRatio<1e-5&&(this.dDashRatio=.1),0==this.dLineWidth&&(this.dLineWidth=6,this.lineWidthByPixels=!0)):(this.dDashArray=0,this.dDashRatio=0),this}isDashLineDisplay(){return this.dDashArray>0&&this.dDashRatio>0}guid(){return this.sGuid}onEndGripEidt(){this.callEvent("onEndGripEidt")}onStartGripEidt(){return this.callEvent("onStartGripEidt")}addEvent(t,e){this._event[t]=e}removeEvent(t){this._event[t]=void 0}};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type McGiWorldDraw from "../McGiWorldDraw";
|
|
2
|
+
import MxDbEntity from "../MxDbEntity";
|
|
3
|
+
/***
|
|
4
|
+
* 渐变线段
|
|
5
|
+
* @augments MxDbEntity
|
|
6
|
+
* */
|
|
7
|
+
export default class MxDbGradientLine extends MxDbEntity {
|
|
8
|
+
/** 点集合 */
|
|
9
|
+
points: THREE.Vector3[];
|
|
10
|
+
/** 渐变色 */
|
|
11
|
+
colors: (THREE.Color | string | number)[];
|
|
12
|
+
/**
|
|
13
|
+
* 定义线两端的样式
|
|
14
|
+
* @access public
|
|
15
|
+
* */
|
|
16
|
+
linecap: 'butt' | 'round' | 'square';
|
|
17
|
+
/**
|
|
18
|
+
* 定义线连接节点的样式
|
|
19
|
+
* @access public
|
|
20
|
+
* */
|
|
21
|
+
linejoin: 'round' | 'bevel' | 'miter';
|
|
22
|
+
/**
|
|
23
|
+
* 定义线形状是否闭合,从而创建多边形或斑点
|
|
24
|
+
* @access public
|
|
25
|
+
* */
|
|
26
|
+
closed: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* 曲线的类型: chordal: 弦线、 centripetal: 向心线、 catmullrom: Catmull-Rom曲线 默认:centripetal
|
|
29
|
+
* @access public
|
|
30
|
+
* */
|
|
31
|
+
curveType: 'chordal' | 'centripetal' | 'catmullrom';
|
|
32
|
+
/**
|
|
33
|
+
* 当curveType为catmullrom时,定义catmullrom的张力。 张力: 数值越大,曲线越弯曲。值为0将导致没有插值。默认值是0
|
|
34
|
+
* @access public
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
tension: number;
|
|
38
|
+
/**
|
|
39
|
+
* 如果没有提供张力,但bezierType赋值为'quadratic'| 'cubic',则使用点集合中的点绘制一条bezier线 默认: undefined
|
|
40
|
+
* @summary quadratic: 三维二次贝塞尔曲线 => 起点 – 中间的控制点 – 终点
|
|
41
|
+
* @summary cubic: 三维三次贝塞尔曲线 => 起点v – 第一个控制点 – 第二个控制点 – 终点
|
|
42
|
+
*/
|
|
43
|
+
bezierType: 'quadratic' | 'cubic' | undefined;
|
|
44
|
+
protected curve?: THREE.CatmullRomCurve3 | THREE.CurvePath<THREE.Vector3>;
|
|
45
|
+
create(): MxDbGradientLine;
|
|
46
|
+
getTypeName(): string;
|
|
47
|
+
setPoints(points: THREE.Vector3[]): this;
|
|
48
|
+
setColors(colors: (THREE.Color | string | number)[]): this;
|
|
49
|
+
addColor(color: THREE.Color): this;
|
|
50
|
+
setLinecap(linecap: "butt" | "round" | "square"): void;
|
|
51
|
+
setClosed(closed: boolean): void;
|
|
52
|
+
setCurveType(curveType: "chordal" | "centripetal" | "catmullrom"): void;
|
|
53
|
+
setTension(tension: number): void;
|
|
54
|
+
setBezierType(bezierType: 'quadratic' | 'cubic'): void;
|
|
55
|
+
worldDraw(pWorldDraw: McGiWorldDraw): void;
|
|
56
|
+
getGripPoints(): THREE.Vector3[];
|
|
57
|
+
getPoints(): import("three").Vector3[];
|
|
58
|
+
moveGripPointsAt(index: number, offset: THREE.Vector3): boolean;
|
|
59
|
+
move(index: number, offset: THREE.Vector3): this;
|
|
60
|
+
dwgIn(obj: any): boolean;
|
|
61
|
+
dwgOut(obj: any): object;
|
|
62
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import McGiWorldDrawType from"../McGiWorldDrawType";import MxDbEntity from"../MxDbEntity";function createCurvePath(e=!1){const t=new THREE.CurvePath;return t.autoClose=e,t}function createQuadraticBezierCurve3(e){let t=0,r=[];for(let i=0;i<e.length;i++){const i=e[t],n=e[++t]||i,s=e[++t]||n;if(!i||!n||!s)break;r.push(new THREE.QuadraticBezierCurve3(i,n,s))}return r}function createCubicBezierCurve3(e){let t=0,r=[];for(let i=0;i<e.length;i++){const i=e[t],n=e[++t]||i,s=e[++t]||n,o=e[++t]||s;if(!(i&&n&&s&&o))break;r.push(new THREE.CubicBezierCurve3(i,n,s,o))}return r}function getCurveColorGradientData(e,t){let r=0,i=[],n=[];const s=Number((1/t.length).toFixed(2));let o=new THREE.Color(t[r]),c=new THREE.Color(t[r+1]);for(let u=0,l=e.length;u<l;u++){const l=e[u],a=u/e.length;a/r>=s&&(r++,c.set(new THREE.Color(t[r]||t[--r]))),i.push(l.x,l.y,l.z||0),o.lerpHSL(c,a),n.push(o.r,o.g,o.b)}return[i,n]}function getColorGradientData(e,t){let r=[],i=[];for(let n=0,s=e.length;n<s;n++){const s=e[n];r.push(s.x,s.y,s.z||0);const o=new THREE.Color(t[n]);i.push(o.r,o.g,o.b)}return[r,i]}const propertyDbKeys=["points","colors","linecap","linejoin","closed","curveType","tension","bezierType"];export default class MxDbGradientLine extends MxDbEntity{constructor(){super(...arguments),this.linecap="round",this.linejoin="round",this.closed=!1,this.curveType="centripetal",this.tension=0,this.bezierType="quadratic"}create(){return new MxDbGradientLine}getTypeName(){return"MxDbGradientLine"}setPoints(e){return this.points=e,this}setColors(e){return this.colors=e,this}addColor(e){return this.colors.push(e),this}setLinecap(e){this.linecap=e}setClosed(e){this.closed=e}setCurveType(e){this.curveType=e}setTension(e){this.tension=e}setBezierType(e){this.bezierType=e}worldDraw(e){const t=e.getType();let r=this.getPoints();const{closed:i,curveType:n,tension:s,bezierType:o}=this,c=new THREE.BufferGeometry;let u=[],l=[];const a="cubic"===o,h="quadratic"===o;0!==s?this.curve=new THREE.CatmullRomCurve3(r,i,n,s):o?(this.curve=createCurvePath(i),a?this.curve.curves=createCubicBezierCurve3(r):h?this.curve.curves=createQuadraticBezierCurve3(r):this.curve=void 0):this.curve=void 0,this.curve&&(r=this.curve.getPoints(50));const{linecap:p,linejoin:d}=this;let v;if(this.colors&&this.colors.length>1){const e=i?[...this.colors,this.colors[0]]:this.colors;[u,l]=this.curve?getCurveColorGradientData(r,e):getColorGradientData(r,e),c.setAttribute("position",new THREE.Float32BufferAttribute(u,3)),c.setAttribute("color",new THREE.Float32BufferAttribute(l,3)),v=new THREE.LineBasicMaterial({vertexColors:THREE.VertexColors,linecap:p,linejoin:d})}else c.setFromPoints(r),v=new THREE.LineBasicMaterial({color:this.color,linecap:p,linejoin:d});const E=i?new THREE.LineLoop(c,v):new THREE.Line(c,v);if(e.drawEntity(E),(t===McGiWorldDrawType.kSelectDraw||t===McGiWorldDrawType.kDynDragDraw)&&this.curve){let t=this.getPoints();const r=e.getLineWidth();e.setLineWidth(1),e.drawLines(t),e.setLineWidth(r)}}getGripPoints(){return this.getPoints()}getPoints(){return this.closed?[...this.points,this.points[0]]:this.points}moveGripPointsAt(e,t){return this.move(e,t),!0}move(e,t){return this.points[e].add(t),this}dwgIn(e){return this.dwgInHelp(e,propertyDbKeys),this.curve=e.curve,!0}dwgOut(e){return this.dwgOutHelp(e,propertyDbKeys),e.curve=this.curve,e}};
|
|
@@ -74,14 +74,14 @@ export default class MxDbSVG extends MxDbEntity {
|
|
|
74
74
|
private calcSvgPosition;
|
|
75
75
|
dwgIn(obj: any): boolean;
|
|
76
76
|
dwgOut(obj: any): object;
|
|
77
|
-
create():
|
|
77
|
+
create(): MxDbSVG;
|
|
78
78
|
transformBy(mat: THREE.Matrix4): void;
|
|
79
79
|
getTypeName(): string;
|
|
80
80
|
/**
|
|
81
81
|
* 设置颜色
|
|
82
82
|
* @param color 颜色值
|
|
83
83
|
* */
|
|
84
|
-
setColor(color: number | string | THREE.Color):
|
|
84
|
+
setColor(color: number | string | THREE.Color): this;
|
|
85
85
|
/**
|
|
86
86
|
* 设置svg对象
|
|
87
87
|
* */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var __awaiter=this&&this.__awaiter||function(t,s,e,i){return new(e||(e=Promise))(function(o,r){function g(t){try{h(i.next(t))}catch(t){r(t)}}function n(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var s;t.done?o(t.value):(s=t.value,s instanceof e?s:new e(function(t){t(s)})).then(g,n)}h((i=i.apply(t,s||[])).next())})};import MxDbEntity from"../MxDbEntity";import MxDbSVGText from"../MxDbSVGText";import MxFun from"../MxFun";import MxThreeJS from"../MxThreeJS";import MxType from"../MxType";export default class MxDbSVG extends MxDbEntity{constructor(){super(...arguments),this.svgPos=new THREE.Vector3,this.svg=null,this.svgPath="",this.svgSize=new THREE.Vector2(50,50),this.svgAlignmentRatio=new THREE.Vector2(0,0),this.svgRotate=0,this.svgReverse=!1,this.svgMirror=!1,this.svgChildColor=[],this.svgMargin=new THREE.Vector2(0,0),this.isSvgDirtyLocation=!1,this.isLoadFromPath=!0,this.aryText=[],this.svgBoxSize=null,this.fixedSize=!1,this.useSvgColor=!1}setSvgChildColor(t){if(this.svgChildColor=t,!this.useSvgColor&&this.svg){let t=new THREE.Color(this.getColor()),s=0,e=this;this.svg.traverse(function(i){i.material&&(s<e.svgChildColor.length?i.material.color=new THREE.Color(e.svgChildColor[s]):i.material.color=t,s++)}),this.setNeedUpdateDisplay(!0)}}getSvgChildColor(){return this.svgChildColor}calcVewSize(t){let s=this.svgSize.x,e=this.svgSize.y;return e<=0&&(e=this.svgBoxSize?this.svgBoxSize.y/this.svgBoxSize.x*s:s),this.fixedSize&&(s=t.screenCoordLong2Doc(s),e=t.screenCoordLong2Doc(e)),[s,e]}worldDraw(t){let s=t.getMxObject();this.calcSvgPosition(s);let[e,i]=this.calcVewSize(s),o=new THREE.Matrix4;o.makeScale(this.svgMirror?-1:1,this.svgReverse?-1:1,1);let r=new THREE.Matrix4;r.makeRotationZ(this.svgRotate);let g=new THREE.Matrix4,n=new THREE.Vector3(this.svgPos.x-e*this.svgAlignmentRatio.x,this.svgPos.y-i*this.svgAlignmentRatio.y,0);g.makeTranslation(n.x,n.y,n.z),r.multiply(o),r.premultiply(g);let h=new THREE.Vector3(0,0,0),l=new THREE.Vector3(e,0,0),a=new THREE.Vector3(e,i,0),x=new THREE.Vector3(0,i,0);h.applyMatrix4(r),l.applyMatrix4(r),a.applyMatrix4(r),x.applyMatrix4(r);let v=a.clone().add(h.clone().sub(a).multiplyScalar(.5));if(this.aryText.forEach(i=>{if(i.txt.length>0){let o=new THREE.Vector3(i.txtPos.x,i.txtPos.y,0);this.fixedSize&&(i.txtPos.x>0?o.x=this.svgPos.x+s.screenCoordLong2Doc(i.txtPos.x):o.x=this.svgPos.x-s.screenCoordLong2Doc(i.txtPos.x),i.txtPos.y>0?o.y=this.svgPos.y+s.screenCoordLong2Doc(i.txtPos.y):o.y=this.svgPos.y-s.screenCoordLong2Doc(i.txtPos.y));let r=void 0;i.color&&(r=t.getColor(),t.setColor(i.color));let g=i.txtHeight;if(this.fixedSize&&(g=s.screenCoordLong2Doc(i.txtHeight)),i._txtObject=t.drawText(i.txt,g,0,o),i._txtAspectRatio=-1,r&&t.setColor(r),i.drawConnectingLine){let s=v.clone().sub(o);if(s.length()>i.txtHeight+e){s.normalize();let r=v.clone().sub(s.clone().multiplyScalar(e)),g=o.clone().add(s.clone().multiplyScalar(i.txtHeight));t.drawLine(r,g)}}}}),1==t.getType()){if(this.svg)t.drawEntity(this.svg);else if(this.svgPath.length>0&&this.isLoadFromPath){let e=this,i=t.getMxObject();MxThreeJS.loadSVG(this.svgPath,void 0,o=>{if(o){let r=o;if(r.boxSize)e.svgBoxSize=r.boxSize.clone();else{let t=(new THREE.Box3).setFromObject(o);e.svgBoxSize||(e.svgBoxSize=new THREE.Vector3),e.svgBoxSize.x=t.max.x-t.min.x,e.svgBoxSize.y=t.max.y-t.min.y}let[g,n]=e.calcVewSize(s);e.svgBoxSize&&(o.scale.x=g/e.svgBoxSize.x,o.scale.y=n/e.svgBoxSize.y),o.scale.z=o.scale.x,e.svgReverse&&(o.scale.y*=-1),e.svgMirror&&(o.scale.x*=-1),o.rotateZ(e.svgRotate),e.isSvgDirtyLocation=!0;let h=new THREE.Color(t.getColor()),l=0;o.traverse(function(t){t.material&&(t.material=t.material.clone(),t.material.transparent=!0,t.material.depthTest=!1,e.useSvgColor||(l<e.svgChildColor.length?t.material.color=new THREE.Color(e.svgChildColor[l]):t.material.color=h),l++)}),e.svg=o,e.setNeedUpdateDisplay(),i.updateDisplay()}else console.log("mx LoadSVG:"+e.svgPath+" failed");e.isLoadFromPath=!1})}t.drawSelectLine(h,a),t.drawSelectLine(l,x),t.drawSelectLine(h,l),t.drawSelectLine(l,a),t.drawSelectLine(a,x),t.drawSelectLine(x,h)}else t.drawLine(h,l),t.drawLine(l,a),t.drawLine(a,x),t.drawLine(x,h)}setSvgPath(t,s=!1){return __awaiter(this,void 0,void 0,function*(){this.svgPath=t,this.svg=null,this.isLoadFromPath=!0,this.svgBoxSize=null,s&&(yield MxThreeJS.loadSVG(t))})}getSvgPath(){return this.svgPath}setSvgPostion(t){this.svgPos=t.clone(),this.isSvgDirtyLocation=!0}getSvgPostion(){return this.svgPos}setSvgSize(t){this.svgSize=t,this.isSvgDirtyLocation=!0}getSvgSize(){return this.svgSize}setSvgAlignmentRatio(t){this.svgAlignmentRatio=t,this.isSvgDirtyLocation=!0}getSvgAlignmentRatio(){return this.svgAlignmentRatio}getText(t){return t<this.aryText.length?this.aryText[t]:null}addText(t){this.aryText.push(t)}getGripPoints(){let t=[];t.push(this.svgPos);let s=0;for(;s<this.aryText.length;s++){let e=this.aryText[s];if(e.move){let s=new THREE.Vector3(e.txtPos.x,e.txtPos.y,0);if(this.fixedSize){let t=MxFun.getCurrentDraw();e.txtPos.x>0?s.x=this.svgPos.x+t.screenCoordLong2Doc(e.txtPos.x):s.x=this.svgPos.x-t.screenCoordLong2Doc(e.txtPos.x),e.txtPos.y>0?s.y=this.svgPos.y+t.screenCoordLong2Doc(e.txtPos.y):s.y=this.svgPos.y-t.screenCoordLong2Doc(e.txtPos.y)}t.push(s)}}return t}moveGripPointsAt(t,s){if(0==t)this.svgPos.add(s),this.fixedSize||this.aryText.forEach(t=>{t.txtPos.add(s)});else if(t-1>=0&&t-1<this.aryText.length){let e=this.aryText[t-1];if(e.move)if(this.fixedSize){let t=MxFun.getCurrentDraw();e.txtPos.x+=t.docCoordLong2Screen(s.x),e.txtPos.y+=t.docCoordLong2Screen(s.y)}else e.txtPos.add(s)}return this.isSvgDirtyLocation=!0,!0}calcSvgPosition(t){if(!this.svg||!this.isSvgDirtyLocation)return;this.isSvgDirtyLocation=!1;let[s,e]=this.calcVewSize(t);this.svg.position.x=this.svgPos.x-s*this.svgAlignmentRatio.x-this.svgMargin.x*s,this.svg.position.y=this.svgPos.y-e*this.svgAlignmentRatio.y-this.svgMargin.y*e}dwgIn(t){this.onDwgIn(t),this.fixedSize=t.fixedSize,this.fixedSize?this.svg=null:t.type==MxType.MxCloneType.kClone&&t.svg&&(this.svg=t.svg.clone()),this.svgPos.copy(t.svgPos),this.svgPath=t.svgPath.substr(0),this.svgSize.copy(t.svgSize),this.svgAlignmentRatio.copy(t.svgAlignmentRatio),this.isSvgDirtyLocation=!0,this.svg||(this.isLoadFromPath=!0),this.svgBoxSize=null;let s=t.txts;return this.aryText=[],s.forEach(t=>{let s=new MxDbSVGText;s.txt=t.txt,s.txtHeight=t.txtHeight,s.txtPos.copy(t.txtPos),s.move=t.move,s.drawConnectingLine=t.drawConnectingLine,this.aryText.push(s)}),this.svgRotate=t.svgRotate,this.useSvgColor=t.useSvgColor,this.svgReverse=t.svgReverse,this.svgMirror=t.svgMirror,this.svgMargin=t.svgMargin,t.svgChildColor?this.svgChildColor=t.svgChildColor:this.svgChildColor=[],!0}dwgOut(t){return this.onDwgOut(t),t.type==MxType.MxCloneType.kClone&&(t.svg=this.svg),t.svgPath=this.svgPath,t.svgPos=this.svgPos,t.svgSize=this.svgSize,t.svgAlignmentRatio=this.svgAlignmentRatio,t.txts=[],this.aryText.forEach(s=>{let e={txtPos:s.txtPos,txt:s.txt,txtHeight:s.txtHeight,color:s.color,_txtAspectRatio:s._txtAspectRatio,move:s.move,drawConnectingLine:s.drawConnectingLine};t.txts.push(e)}),t.fixedSize=this.fixedSize,t.svgRotate=this.svgRotate,t.useSvgColor=this.useSvgColor,t.svgReverse=this.svgReverse,t.svgMirror=this.svgMirror,t.svgMargin=this.svgMargin,t.svgChildColor=this.svgChildColor,t}create(){return new MxDbSVG}transformBy(t){this.svgPos.applyMatrix4(t),this.isSvgDirtyLocation=!0,this.fixedSize||this.aryText.forEach(s=>{s.txtPos.applyMatrix4(t)})}getTypeName(){return"MxDbSVG"}setColor(t){if(super.setColor(t),this.svg){let t=new THREE.Color(this.color);this.svg.traverse(function(s){s.material&&(s.material.color=t)})}}setSvg(t){this.svg=t,this.isLoadFromPath=!1,this.svgBoxSize=null}calcSvgBoxSize(t){if(!this.svgBoxSize)if(t.boxSize)this.svgBoxSize=t.boxSize.clone();else{let s=(new THREE.Box3).setFromObject(t);this.svgBoxSize||(this.svgBoxSize=new THREE.Vector3),this.svgBoxSize.x=s.max.x-s.min.x,this.svgBoxSize.y=s.max.y-s.min.y}}reComputeSVG(){if(!this.svg)return;let t=this.getMxObject();if(!t)return;this.calcSvgBoxSize(this.svg);let[s,e]=this.calcVewSize(t);this.svgBoxSize&&(this.svg.scale.x=s/this.svgBoxSize.x,this.svg.scale.y=e/this.svgBoxSize.y),this.svg.scale.z=this.svg.scale.x,this.svgReverse&&(this.svg.scale.y*=-1),this.svgMirror&&(this.svg.scale.x*=-1),this.isSvgDirtyLocation=!0,this.calcSvgPosition(t)}onViewChange(){if(!this.fixedSize)return!1;let t=this.getMxObject();if(null==t)return!1;if(this.svg){this.calcSvgBoxSize(this.svg);let[s,e]=this.calcVewSize(t);this.svgBoxSize&&(this.svg.scale.x=s/this.svgBoxSize.x,this.svg.scale.y=e/this.svgBoxSize.y),this.svg.scale.z=this.svg.scale.x,this.svgReverse&&(this.svg.scale.y*=-1),this.svgMirror&&(this.svg.scale.x*=-1),this.isSvgDirtyLocation=!0,this.calcSvgPosition(t)}let s=this;return this.aryText.forEach(e=>{if(e._txtObject&&t){let i=t.screenCoordLong2Doc(e.txtHeight);i>1e-5&&(e._txtAspectRatio<=0&&(e._txtAspectRatio=e._txtObject.scale.x/e._txtObject.scale.y),e._txtObject.scale.set(e._txtAspectRatio*i,i,1),e.txtPos.x>0?e._txtObject.position.x=s.svgPos.x+t.screenCoordLong2Doc(e.txtPos.x):e._txtObject.position.x=s.svgPos.x-t.screenCoordLong2Doc(e.txtPos.x),e.txtPos.y>0?e._txtObject.position.y=s.svgPos.y+t.screenCoordLong2Doc(e.txtPos.y):e._txtObject.position.y=s.svgPos.y-t.screenCoordLong2Doc(e.txtPos.y),e._txtObject.updateMatrix())}}),!0}};
|
|
1
|
+
var __awaiter=this&&this.__awaiter||function(t,s,e,i){return new(e||(e=Promise))(function(o,r){function g(t){try{h(i.next(t))}catch(t){r(t)}}function n(t){try{h(i.throw(t))}catch(t){r(t)}}function h(t){var s;t.done?o(t.value):(s=t.value,s instanceof e?s:new e(function(t){t(s)})).then(g,n)}h((i=i.apply(t,s||[])).next())})};import MxDbEntity from"../MxDbEntity";import MxDbSVGText from"../MxDbSVGText";import MxFun from"../MxFun";import MxThreeJS from"../MxThreeJS";import MxType from"../MxType";export default class MxDbSVG extends MxDbEntity{constructor(){super(...arguments),this.svgPos=new THREE.Vector3,this.svg=null,this.svgPath="",this.svgSize=new THREE.Vector2(50,50),this.svgAlignmentRatio=new THREE.Vector2(0,0),this.svgRotate=0,this.svgReverse=!1,this.svgMirror=!1,this.svgChildColor=[],this.svgMargin=new THREE.Vector2(0,0),this.isSvgDirtyLocation=!1,this.isLoadFromPath=!0,this.aryText=[],this.svgBoxSize=null,this.fixedSize=!1,this.useSvgColor=!1}setSvgChildColor(t){if(this.svgChildColor=t,!this.useSvgColor&&this.svg){let t=new THREE.Color(this.getColor()),s=0,e=this;this.svg.traverse(function(i){i.material&&(s<e.svgChildColor.length?i.material.color=new THREE.Color(e.svgChildColor[s]):i.material.color=t,s++)}),this.setNeedUpdateDisplay(!0)}}getSvgChildColor(){return this.svgChildColor}calcVewSize(t){let s=this.svgSize.x,e=this.svgSize.y;return e<=0&&(e=this.svgBoxSize?this.svgBoxSize.y/this.svgBoxSize.x*s:s),this.fixedSize&&(s=t.screenCoordLong2Doc(s),e=t.screenCoordLong2Doc(e)),[s,e]}worldDraw(t){let s=t.getMxObject();this.calcSvgPosition(s);let[e,i]=this.calcVewSize(s),o=new THREE.Matrix4;o.makeScale(this.svgMirror?-1:1,this.svgReverse?-1:1,1);let r=new THREE.Matrix4;r.makeRotationZ(this.svgRotate);let g=new THREE.Matrix4,n=new THREE.Vector3(this.svgPos.x-e*this.svgAlignmentRatio.x,this.svgPos.y-i*this.svgAlignmentRatio.y,0);g.makeTranslation(n.x,n.y,n.z),r.multiply(o),r.premultiply(g);let h=new THREE.Vector3(0,0,0),l=new THREE.Vector3(e,0,0),a=new THREE.Vector3(e,i,0),x=new THREE.Vector3(0,i,0);h.applyMatrix4(r),l.applyMatrix4(r),a.applyMatrix4(r),x.applyMatrix4(r);let v=a.clone().add(h.clone().sub(a).multiplyScalar(.5));if(this.aryText.forEach(i=>{if(i.txt.length>0){let o=new THREE.Vector3(i.txtPos.x,i.txtPos.y,0);this.fixedSize&&(i.txtPos.x>0?o.x=this.svgPos.x+s.screenCoordLong2Doc(i.txtPos.x):o.x=this.svgPos.x-s.screenCoordLong2Doc(i.txtPos.x),i.txtPos.y>0?o.y=this.svgPos.y+s.screenCoordLong2Doc(i.txtPos.y):o.y=this.svgPos.y-s.screenCoordLong2Doc(i.txtPos.y));let r=void 0;i.color&&(r=t.getColor(),t.setColor(i.color));let g=i.txtHeight;if(this.fixedSize&&(g=s.screenCoordLong2Doc(i.txtHeight)),i._txtObject=t.drawText(i.txt,g,0,o),i._txtAspectRatio=-1,r&&t.setColor(r),i.drawConnectingLine){let s=v.clone().sub(o);if(s.length()>i.txtHeight+e){s.normalize();let r=v.clone().sub(s.clone().multiplyScalar(e)),g=o.clone().add(s.clone().multiplyScalar(i.txtHeight));t.drawLine(r,g)}}}}),1==t.getType()){if(this.svg)t.drawEntity(this.svg);else if(this.svgPath.length>0&&this.isLoadFromPath){let e=this,i=t.getMxObject();MxThreeJS.loadSVG(this.svgPath,void 0,o=>{if(o){let r=o;if(r.boxSize)e.svgBoxSize=r.boxSize.clone();else{let t=(new THREE.Box3).setFromObject(o);e.svgBoxSize||(e.svgBoxSize=new THREE.Vector3),e.svgBoxSize.x=t.max.x-t.min.x,e.svgBoxSize.y=t.max.y-t.min.y}let[g,n]=e.calcVewSize(s);e.svgBoxSize&&(o.scale.x=g/e.svgBoxSize.x,o.scale.y=n/e.svgBoxSize.y),o.scale.z=o.scale.x,e.svgReverse&&(o.scale.y*=-1),e.svgMirror&&(o.scale.x*=-1),o.rotateZ(e.svgRotate),e.isSvgDirtyLocation=!0;let h=new THREE.Color(t.getColor()),l=0;o.traverse(function(t){t.material&&(t.material=t.material.clone(),t.material.transparent=!0,t.material.depthTest=!1,e.useSvgColor||(l<e.svgChildColor.length?t.material.color=new THREE.Color(e.svgChildColor[l]):t.material.color=h),l++)}),e.svg=o,e.setNeedUpdateDisplay(),i.updateDisplay()}else console.log("mx LoadSVG:"+e.svgPath+" failed");e.isLoadFromPath=!1})}t.drawSelectLine(h,a),t.drawSelectLine(l,x),t.drawSelectLine(h,l),t.drawSelectLine(l,a),t.drawSelectLine(a,x),t.drawSelectLine(x,h)}else t.drawLine(h,l),t.drawLine(l,a),t.drawLine(a,x),t.drawLine(x,h)}setSvgPath(t,s=!1){return __awaiter(this,void 0,void 0,function*(){this.svgPath=t,this.svg=null,this.isLoadFromPath=!0,this.svgBoxSize=null,s&&(yield MxThreeJS.loadSVG(t))})}getSvgPath(){return this.svgPath}setSvgPostion(t){this.svgPos=t.clone(),this.isSvgDirtyLocation=!0}getSvgPostion(){return this.svgPos}setSvgSize(t){this.svgSize=t,this.isSvgDirtyLocation=!0}getSvgSize(){return this.svgSize}setSvgAlignmentRatio(t){this.svgAlignmentRatio=t,this.isSvgDirtyLocation=!0}getSvgAlignmentRatio(){return this.svgAlignmentRatio}getText(t){return t<this.aryText.length?this.aryText[t]:null}addText(t){this.aryText.push(t)}getGripPoints(){let t=[];t.push(this.svgPos);let s=0;for(;s<this.aryText.length;s++){let e=this.aryText[s];if(e.move){let s=new THREE.Vector3(e.txtPos.x,e.txtPos.y,0);if(this.fixedSize){let t=MxFun.getCurrentDraw();e.txtPos.x>0?s.x=this.svgPos.x+t.screenCoordLong2Doc(e.txtPos.x):s.x=this.svgPos.x-t.screenCoordLong2Doc(e.txtPos.x),e.txtPos.y>0?s.y=this.svgPos.y+t.screenCoordLong2Doc(e.txtPos.y):s.y=this.svgPos.y-t.screenCoordLong2Doc(e.txtPos.y)}t.push(s)}}return t}moveGripPointsAt(t,s){if(0==t)this.svgPos.add(s),this.fixedSize||this.aryText.forEach(t=>{t.txtPos.add(s)});else if(t-1>=0&&t-1<this.aryText.length){let e=this.aryText[t-1];if(e.move)if(this.fixedSize){let t=MxFun.getCurrentDraw();e.txtPos.x+=t.docCoordLong2Screen(s.x),e.txtPos.y+=t.docCoordLong2Screen(s.y)}else e.txtPos.add(s)}return this.isSvgDirtyLocation=!0,!0}calcSvgPosition(t){if(!this.svg||!this.isSvgDirtyLocation)return;this.isSvgDirtyLocation=!1;let[s,e]=this.calcVewSize(t);this.svg.position.x=this.svgPos.x-s*this.svgAlignmentRatio.x-this.svgMargin.x*s,this.svg.position.y=this.svgPos.y-e*this.svgAlignmentRatio.y-this.svgMargin.y*e}dwgIn(t){this.onDwgIn(t),this.fixedSize=t.fixedSize,this.fixedSize?this.svg=null:t.type==MxType.MxCloneType.kClone&&t.svg&&(this.svg=t.svg.clone()),this.svgPos.copy(t.svgPos),this.svgPath=t.svgPath.substr(0),this.svgSize.copy(t.svgSize),this.svgAlignmentRatio.copy(t.svgAlignmentRatio),this.isSvgDirtyLocation=!0,this.svg||(this.isLoadFromPath=!0),this.svgBoxSize=null;let s=t.txts;return this.aryText=[],s.forEach(t=>{let s=new MxDbSVGText;s.txt=t.txt,s.txtHeight=t.txtHeight,s.txtPos.copy(t.txtPos),s.move=t.move,s.drawConnectingLine=t.drawConnectingLine,this.aryText.push(s)}),this.svgRotate=t.svgRotate,this.useSvgColor=t.useSvgColor,this.svgReverse=t.svgReverse,this.svgMirror=t.svgMirror,this.svgMargin=t.svgMargin,t.svgChildColor?this.svgChildColor=t.svgChildColor:this.svgChildColor=[],!0}dwgOut(t){return this.onDwgOut(t),t.type==MxType.MxCloneType.kClone&&(t.svg=this.svg),t.svgPath=this.svgPath,t.svgPos=this.svgPos,t.svgSize=this.svgSize,t.svgAlignmentRatio=this.svgAlignmentRatio,t.txts=[],this.aryText.forEach(s=>{let e={txtPos:s.txtPos,txt:s.txt,txtHeight:s.txtHeight,color:s.color,_txtAspectRatio:s._txtAspectRatio,move:s.move,drawConnectingLine:s.drawConnectingLine};t.txts.push(e)}),t.fixedSize=this.fixedSize,t.svgRotate=this.svgRotate,t.useSvgColor=this.useSvgColor,t.svgReverse=this.svgReverse,t.svgMirror=this.svgMirror,t.svgMargin=this.svgMargin,t.svgChildColor=this.svgChildColor,t}create(){return new MxDbSVG}transformBy(t){this.svgPos.applyMatrix4(t),this.isSvgDirtyLocation=!0,this.fixedSize||this.aryText.forEach(s=>{s.txtPos.applyMatrix4(t)})}getTypeName(){return"MxDbSVG"}setColor(t){if(super.setColor(t),this.svg){let t=new THREE.Color(this.color);this.svg.traverse(function(s){s.material&&(s.material.color=t)})}return this}setSvg(t){this.svg=t,this.isLoadFromPath=!1,this.svgBoxSize=null}calcSvgBoxSize(t){if(!this.svgBoxSize)if(t.boxSize)this.svgBoxSize=t.boxSize.clone();else{let s=(new THREE.Box3).setFromObject(t);this.svgBoxSize||(this.svgBoxSize=new THREE.Vector3),this.svgBoxSize.x=s.max.x-s.min.x,this.svgBoxSize.y=s.max.y-s.min.y}}reComputeSVG(){if(!this.svg)return;let t=this.getMxObject();if(!t)return;this.calcSvgBoxSize(this.svg);let[s,e]=this.calcVewSize(t);this.svgBoxSize&&(this.svg.scale.x=s/this.svgBoxSize.x,this.svg.scale.y=e/this.svgBoxSize.y),this.svg.scale.z=this.svg.scale.x,this.svgReverse&&(this.svg.scale.y*=-1),this.svgMirror&&(this.svg.scale.x*=-1),this.isSvgDirtyLocation=!0,this.calcSvgPosition(t)}onViewChange(){if(!this.fixedSize)return!1;let t=this.getMxObject();if(null==t)return!1;if(this.svg){this.calcSvgBoxSize(this.svg);let[s,e]=this.calcVewSize(t);this.svgBoxSize&&(this.svg.scale.x=s/this.svgBoxSize.x,this.svg.scale.y=e/this.svgBoxSize.y),this.svg.scale.z=this.svg.scale.x,this.svgReverse&&(this.svg.scale.y*=-1),this.svgMirror&&(this.svg.scale.x*=-1),this.isSvgDirtyLocation=!0,this.calcSvgPosition(t)}let s=this;return this.aryText.forEach(e=>{if(e._txtObject&&t){let i=t.screenCoordLong2Doc(e.txtHeight);i>1e-5&&(e._txtAspectRatio<=0&&(e._txtAspectRatio=e._txtObject.scale.x/e._txtObject.scale.y),e._txtObject.scale.set(e._txtAspectRatio*i,i,1),e.txtPos.x>0?e._txtObject.position.x=s.svgPos.x+t.screenCoordLong2Doc(e.txtPos.x):e._txtObject.position.x=s.svgPos.x-t.screenCoordLong2Doc(e.txtPos.x),e.txtPos.y>0?e._txtObject.position.y=s.svgPos.y+t.screenCoordLong2Doc(e.txtPos.y):e._txtObject.position.y=s.svgPos.y-t.screenCoordLong2Doc(e.txtPos.y),e._txtObject.updateMatrix())}}),!0}};
|