aldehyde 0.2.472 → 0.2.474

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.
Files changed (116) hide show
  1. package/lib/controls/entity-select/entity-select.js +1 -1
  2. package/lib/controls/entity-select/entity-select.js.map +1 -1
  3. package/lib/controls/entry-control.js +2 -2
  4. package/lib/controls/entry-control.js.map +1 -1
  5. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
  6. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +12 -12
  7. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js.map +1 -1
  8. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
  9. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
  10. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
  11. package/lib/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
  12. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts +5 -0
  13. package/lib/draw-canvas/edit/components/asset-bar/index.d.ts.map +1 -0
  14. package/lib/draw-canvas/edit/components/asset-bar/index.js +78 -0
  15. package/lib/draw-canvas/edit/components/asset-bar/index.js.map +1 -0
  16. package/lib/draw-canvas/edit/components/asset-bar/index.less +36 -0
  17. package/lib/draw-canvas/edit/components/main-header/index.d.ts +14 -0
  18. package/lib/draw-canvas/edit/components/main-header/index.d.ts.map +1 -0
  19. package/lib/draw-canvas/edit/components/main-header/index.js +163 -0
  20. package/lib/draw-canvas/edit/components/main-header/index.js.map +1 -0
  21. package/lib/draw-canvas/edit/components/main-header/index.less +21 -0
  22. package/lib/draw-canvas/edit/components/render/index.d.ts +86 -0
  23. package/lib/draw-canvas/edit/components/render/index.d.ts.map +1 -0
  24. package/lib/draw-canvas/edit/components/render/index.js +686 -0
  25. package/lib/draw-canvas/edit/components/render/index.js.map +1 -0
  26. package/lib/draw-canvas/edit/components/render/types.d.ts +243 -0
  27. package/lib/draw-canvas/edit/components/render/types.d.ts.map +1 -0
  28. package/lib/draw-canvas/edit/components/render/types.js +66 -0
  29. package/lib/draw-canvas/edit/components/render/types.js.map +1 -0
  30. package/lib/draw-canvas/edit/components/setting-form/index.d.ts +19 -0
  31. package/lib/draw-canvas/edit/components/setting-form/index.d.ts.map +1 -0
  32. package/lib/draw-canvas/edit/components/setting-form/index.js +164 -0
  33. package/lib/draw-canvas/edit/components/setting-form/index.js.map +1 -0
  34. package/lib/draw-canvas/edit/index.d.ts +5 -0
  35. package/lib/draw-canvas/edit/index.d.ts.map +1 -0
  36. package/lib/draw-canvas/edit/index.js +112 -0
  37. package/lib/draw-canvas/edit/index.js.map +1 -0
  38. package/lib/draw-canvas/edit/index.less +34 -0
  39. package/lib/form/form-Item-group.d.ts.map +1 -1
  40. package/lib/form/form-Item-group.js +1 -1
  41. package/lib/form/form-Item-group.js.map +1 -1
  42. package/lib/icon/local-aliIcon/iconfont.js +5 -5
  43. package/lib/icon/local-aliIcon/iconfont.js.map +1 -1
  44. package/lib/table/relation-table.d.ts +4 -0
  45. package/lib/table/relation-table.d.ts.map +1 -1
  46. package/lib/tmpl/hcservice-v3.d.ts +1 -0
  47. package/lib/tmpl/hcservice-v3.d.ts.map +1 -1
  48. package/lib/tmpl/hcservice-v3.js +27 -0
  49. package/lib/tmpl/hcservice-v3.js.map +1 -1
  50. package/lib/tmpl/interface.d.ts +4 -0
  51. package/lib/tmpl/interface.d.ts.map +1 -1
  52. package/lib/tmpl/interface.js.map +1 -1
  53. package/lib/units/index.d.ts +1 -0
  54. package/lib/units/index.d.ts.map +1 -1
  55. package/lib/units/index.js +16 -0
  56. package/lib/units/index.js.map +1 -1
  57. package/package.json +1 -1
  58. package/src/aldehyde/controls/entity-select/entity-select.tsx +1 -1
  59. package/src/aldehyde/controls/entry-control.tsx +2 -2
  60. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.css +47 -3
  61. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.js +1 -1
  62. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.json +77 -0
  63. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.ttf +0 -0
  64. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff +0 -0
  65. package/src/aldehyde/controls/icon-selector/icon/phonenode-menu-icon/iconfont.woff2 +0 -0
  66. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.less +36 -0
  67. package/src/aldehyde/draw-canvas/edit/components/asset-bar/index.tsx +93 -0
  68. package/src/aldehyde/draw-canvas/edit/components/main-header/index.less +21 -0
  69. package/src/aldehyde/draw-canvas/edit/components/main-header/index.tsx +187 -0
  70. package/src/aldehyde/draw-canvas/edit/components/render/draws/bg-draw.ts +98 -0
  71. package/src/aldehyde/draw-canvas/edit/components/render/draws/contextmenu-draw.ts +307 -0
  72. package/src/aldehyde/draw-canvas/edit/components/render/draws/graph-draw.ts +251 -0
  73. package/src/aldehyde/draw-canvas/edit/components/render/draws/index.ts +7 -0
  74. package/src/aldehyde/draw-canvas/edit/components/render/draws/link-draw.ts +1416 -0
  75. package/src/aldehyde/draw-canvas/edit/components/render/draws/preview-draw.ts +257 -0
  76. package/src/aldehyde/draw-canvas/edit/components/render/draws/ref-line-draw.ts +72 -0
  77. package/src/aldehyde/draw-canvas/edit/components/render/draws/ruler-draw.ts +167 -0
  78. package/src/aldehyde/draw-canvas/edit/components/render/graphs/base-graph.ts +241 -0
  79. package/src/aldehyde/draw-canvas/edit/components/render/graphs/bezier.ts +542 -0
  80. package/src/aldehyde/draw-canvas/edit/components/render/graphs/circle.ts +700 -0
  81. package/src/aldehyde/draw-canvas/edit/components/render/graphs/curve.ts +501 -0
  82. package/src/aldehyde/draw-canvas/edit/components/render/graphs/index.ts +6 -0
  83. package/src/aldehyde/draw-canvas/edit/components/render/graphs/line.ts +494 -0
  84. package/src/aldehyde/draw-canvas/edit/components/render/graphs/rect.ts +681 -0
  85. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-handlers.ts +69 -0
  86. package/src/aldehyde/draw-canvas/edit/components/render/handlers/drag-outside-handlers.ts +162 -0
  87. package/src/aldehyde/draw-canvas/edit/components/render/handlers/graph-handlers.ts +108 -0
  88. package/src/aldehyde/draw-canvas/edit/components/render/handlers/index.ts +9 -0
  89. package/src/aldehyde/draw-canvas/edit/components/render/handlers/key-move-handlers.ts +50 -0
  90. package/src/aldehyde/draw-canvas/edit/components/render/handlers/link-handlers.ts +46 -0
  91. package/src/aldehyde/draw-canvas/edit/components/render/handlers/selection-handlers.ts +385 -0
  92. package/src/aldehyde/draw-canvas/edit/components/render/handlers/shutcut-handlers.ts +46 -0
  93. package/src/aldehyde/draw-canvas/edit/components/render/handlers/text-handlers.ts +82 -0
  94. package/src/aldehyde/draw-canvas/edit/components/render/handlers/zoom-handlers.ts +60 -0
  95. package/src/aldehyde/draw-canvas/edit/components/render/index.ts +768 -0
  96. package/src/aldehyde/draw-canvas/edit/components/render/tools/align-tool.ts +91 -0
  97. package/src/aldehyde/draw-canvas/edit/components/render/tools/asset-tool.ts +142 -0
  98. package/src/aldehyde/draw-canvas/edit/components/render/tools/attract-tool.ts +440 -0
  99. package/src/aldehyde/draw-canvas/edit/components/render/tools/copy-tool.ts +269 -0
  100. package/src/aldehyde/draw-canvas/edit/components/render/tools/import-export-tool.ts +603 -0
  101. package/src/aldehyde/draw-canvas/edit/components/render/tools/index.ts +9 -0
  102. package/src/aldehyde/draw-canvas/edit/components/render/tools/link-tool.ts +225 -0
  103. package/src/aldehyde/draw-canvas/edit/components/render/tools/position-tool.ts +212 -0
  104. package/src/aldehyde/draw-canvas/edit/components/render/tools/selection-tool.ts +132 -0
  105. package/src/aldehyde/draw-canvas/edit/components/render/tools/z-index-tool.ts +227 -0
  106. package/src/aldehyde/draw-canvas/edit/components/render/types.ts +287 -0
  107. package/src/aldehyde/draw-canvas/edit/components/render/utils/a-star.ts +116 -0
  108. package/src/aldehyde/draw-canvas/edit/components/render/utils/bezier-scene-func.ts +73 -0
  109. package/src/aldehyde/draw-canvas/edit/components/setting-form/index.tsx +200 -0
  110. package/src/aldehyde/draw-canvas/edit/index.less +34 -0
  111. package/src/aldehyde/draw-canvas/edit/index.tsx +138 -0
  112. package/src/aldehyde/form/form-Item-group.tsx +1 -0
  113. package/src/aldehyde/icon/local-aliIcon/iconfont.js +1 -1
  114. package/src/aldehyde/tmpl/hcservice-v3.tsx +14 -0
  115. package/src/aldehyde/tmpl/interface.tsx +2 -0
  116. package/src/aldehyde/units/index.tsx +15 -0
@@ -0,0 +1,225 @@
1
+ import { nanoid } from 'nanoid';
2
+ import Konva from 'konva';
3
+ import { Render } from '../index';
4
+ import { LinkDrawPoint, LinkDrawPair } from '../types';
5
+ import { LinkDraw, RulerDraw, PreviewDraw } from '../draws';
6
+
7
+ export class LinkTool {
8
+ // @ts-ignore
9
+ static readonly name = 'LinkTool';
10
+
11
+ private render: Render;
12
+ constructor(render: Render) {
13
+ this.render = render;
14
+ }
15
+
16
+ pointsVisible(visible: boolean, group?: Konva.Group) {
17
+ if (!this.render.config.readonly) {
18
+ const start = group ?? this.render.layer;
19
+ // 查找深层 points
20
+ for (const asset of [
21
+ ...(['asset', 'sub-asset'].includes(start.name()) ? [start] : []),
22
+ ...start.find('.asset'),
23
+ ...start.find('.sub-asset')
24
+ ]) {
25
+ const points = (asset as Konva.Node).getAttr('points') ?? [];
26
+ asset.setAttrs({
27
+ points: points.map((o: any) => ({ ...o, visible }))
28
+ });
29
+ }
30
+ // 拐点操作中,此处不重绘
31
+ if (!(this.render.draws[LinkDraw.name] as LinkDraw)?.state.linkManualing) {
32
+ // 重绘
33
+ this.render.redraw([LinkDraw.name, RulerDraw.name, PreviewDraw.name]);
34
+ }
35
+ }
36
+ }
37
+
38
+ remove(target?: Konva.Line) {
39
+ const line = target ?? this.linkCurrent;
40
+ if (line) {
41
+ const { groupId, pointId, pairId } = line.getAttrs();
42
+
43
+ if (groupId && pointId && pairId) {
44
+ const group = this.render.layer.findOne(`#${groupId}`) as Konva.Group;
45
+ if (group) {
46
+ const points = (group.getAttr('points') ?? []) as LinkDrawPoint[];
47
+ const point = points.find((o) => o.id === pointId);
48
+ if (point) {
49
+ const pairIndex = (point.pairs ?? ([] as LinkDrawPair[])).findIndex((o) => o.id === pairId);
50
+ if (pairIndex > -1) {
51
+ const pair = point.pairs.splice(pairIndex, 1)[0];
52
+
53
+ if (group.attrs.manualPointsMap && group.attrs.manualPointsMap[pair.id]) {
54
+ group.setAttr('manualPointsMap', {
55
+ ...group.attrs.manualPointsMap,
56
+ [pair.id]: undefined
57
+ });
58
+ }
59
+
60
+ // 重绘
61
+ this.render.redraw([
62
+ LinkDraw.name,
63
+ RulerDraw.name,
64
+ PreviewDraw.name
65
+ ]);
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ // 刷新 json 的 id、事件
74
+ jsonIdCover(assets: any[]) {
75
+ let deepAssets = [...assets];
76
+ const idMap = new Map();
77
+
78
+ while (deepAssets.length > 0) {
79
+ const asset = deepAssets.shift();
80
+ if (asset) {
81
+ if (Array.isArray(asset.attrs.points)) {
82
+ for (const point of asset.attrs.points) {
83
+ if (Array.isArray(point.pairs)) {
84
+ for (const pair of point.pairs) {
85
+ if (pair.from.groupId && !idMap.has(pair.from.groupId)) {
86
+ idMap.set(pair.from.groupId, 'g:' + nanoid());
87
+ }
88
+ if (pair.to.groupId && !idMap.has(pair.to.groupId)) {
89
+ idMap.set(pair.to.groupId, 'g:' + nanoid());
90
+ }
91
+ if (pair.from.pointId && !idMap.has(pair.from.pointId)) {
92
+ idMap.set(pair.from.pointId, 'p:' + nanoid());
93
+ }
94
+ if (pair.to.pointId && !idMap.has(pair.to.pointId)) {
95
+ idMap.set(pair.to.pointId, 'p:' + nanoid());
96
+ }
97
+ }
98
+ }
99
+ if (point.id) {
100
+ if (!idMap.has(point.id)) {
101
+ idMap.set(point.id, 'p:' + nanoid());
102
+ }
103
+ }
104
+ if (point.groupId) {
105
+ if (!idMap.has(point.groupId)) {
106
+ idMap.set(point.groupId, 'g:' + nanoid());
107
+ }
108
+ }
109
+ }
110
+ }
111
+ if (asset.attrs.id) {
112
+ if (!idMap.has(asset.attrs.id)) {
113
+ idMap.set(asset.attrs.id, 'n:' + nanoid());
114
+ }
115
+ }
116
+ if (Array.isArray(asset.children)) {
117
+ deepAssets.push(...asset.children);
118
+ }
119
+ }
120
+ }
121
+
122
+ deepAssets = [...assets];
123
+
124
+ while (deepAssets.length > 0) {
125
+ const asset = deepAssets.shift();
126
+ if (asset) {
127
+ if (idMap.has(asset.attrs.id)) {
128
+ asset.attrs.id = idMap.get(asset.attrs.id);
129
+ }
130
+
131
+ if (Array.isArray(asset.attrs.points)) {
132
+ for (const point of asset.attrs.points) {
133
+ if (Array.isArray(point.pairs)) {
134
+ for (const pair of point.pairs) {
135
+ pair.disabled = true;
136
+ if (pair.id) {
137
+ pair.id = 'pr:' + nanoid();
138
+ }
139
+ if (idMap.has(pair.from.groupId)) {
140
+ pair.from.groupId = idMap.get(pair.from.groupId);
141
+ }
142
+ if (idMap.has(pair.to.groupId)) {
143
+ pair.to.groupId = idMap.get(pair.to.groupId);
144
+ }
145
+ if (idMap.has(pair.from.pointId)) {
146
+ pair.from.pointId = idMap.get(pair.from.pointId);
147
+ }
148
+ if (idMap.has(pair.to.pointId)) {
149
+ pair.to.pointId = idMap.get(pair.to.pointId);
150
+ }
151
+ }
152
+ }
153
+
154
+ if (idMap.has(point.id)) {
155
+ const anchor = asset.children.find((o: any) => o.attrs.id === point.id);
156
+ point.id = idMap.get(point.id);
157
+ if (anchor) {
158
+ anchor.attrs.id = point.id;
159
+ }
160
+ }
161
+
162
+ if (idMap.has(point.groupId)) {
163
+ point.groupId = idMap.get(point.groupId);
164
+ }
165
+ }
166
+ }
167
+
168
+ if (Array.isArray(asset.children)) {
169
+ deepAssets.push(...asset.children);
170
+ }
171
+ }
172
+ }
173
+ }
174
+
175
+ // 把深层 group 的 id 统一为顶层 group 的 id
176
+ groupIdCover(group: Konva.Group) {
177
+ const groupId = group.id();
178
+ const subGroups = group.find('.sub-asset') as Konva.Group[];
179
+ while (subGroups.length > 0) {
180
+ const subGroup = subGroups.shift() as Konva.Group | undefined;
181
+ if (subGroup) {
182
+ const points = subGroup.attrs.points;
183
+ if (Array.isArray(points)) {
184
+ for (const point of points) {
185
+ point.rawGroupId = point.groupId;
186
+ point.groupId = groupId;
187
+ for (const pair of point.pairs) {
188
+ pair.from.rawGroupId = pair.from.groupId;
189
+ pair.from.groupId = groupId;
190
+ pair.to.rawGroupId = pair.to.groupId;
191
+ pair.to.groupId = groupId;
192
+ }
193
+ }
194
+ }
195
+ subGroups.push(...(subGroup.find('.sub-asset') as Konva.Group[]));
196
+ }
197
+ }
198
+ }
199
+
200
+ // 选中连接线
201
+ linkCurrent: Konva.Line | undefined = undefined;
202
+
203
+ // 选中
204
+ select(link: Konva.Line) {
205
+ this.render.selectionTool.selectingClear();
206
+ this.linkCurrent = link;
207
+ this.render.emit('link-selection-change', this.linkCurrent);
208
+ // 重绘
209
+ this.render.redraw([
210
+ LinkDraw.name, // 更新连线
211
+ RulerDraw.name // 更新比例尺
212
+ ]);
213
+ }
214
+
215
+ // 清空选中
216
+ selectingClear() {
217
+ this.linkCurrent = undefined;
218
+ this.render.emit('link-selection-change', undefined);
219
+ // 重绘
220
+ this.render.redraw([
221
+ LinkDraw.name, // 更新连线
222
+ RulerDraw.name
223
+ ]);
224
+ }
225
+ }
@@ -0,0 +1,212 @@
1
+ import Konva from 'konva';
2
+ import { Render } from '../index';
3
+ import { GraphDraw, LinkDraw, RulerDraw, PreviewDraw, RefLineDraw, BgDraw } from '../draws';
4
+
5
+ export class PositionTool {
6
+ // @ts-ignore
7
+ static readonly name = 'PositionTool';
8
+
9
+ private render: Render;
10
+ constructor(render: Render) {
11
+ this.render = render;
12
+ }
13
+
14
+ // 自适应大小
15
+ positionFit() {
16
+ const children = [
17
+ ...this.render.layer.getChildren(),
18
+ ...this.render.layerCover.find('.link-line')
19
+ ];
20
+
21
+ let minX = Infinity,
22
+ maxX = -Infinity,
23
+ minY = Infinity,
24
+ maxY = -Infinity,
25
+ minStartX = Infinity,
26
+ minStartY = Infinity;
27
+
28
+ const stageState = this.render.getStageState();
29
+ for (const node of children) {
30
+ if (node instanceof Konva.Group) {
31
+ const { x, y, width, height } = ((rect) => ({
32
+ x: this.render.toStageValue(rect.x - stageState.x),
33
+ y: this.render.toStageValue(rect.y - stageState.y),
34
+ width: this.render.toStageValue(rect.width),
35
+ height: this.render.toStageValue(rect.height)
36
+ }))(node.getClientRect());
37
+ if (x < minX) {
38
+ minX = x;
39
+ }
40
+ if (x + width > maxX) {
41
+ maxX = x + width;
42
+ }
43
+ if (y < minY) {
44
+ minY = y;
45
+ }
46
+ if (y + height > maxY) {
47
+ maxY = y + height;
48
+ }
49
+
50
+ if (x < minStartX) {
51
+ minStartX = x;
52
+ }
53
+ if (y < minStartY) {
54
+ minStartY = y;
55
+ }
56
+ } else if (node instanceof Konva.Line && node.name() === 'link-line') {
57
+ // 连线占用空间
58
+ const points = node.points();
59
+ for (let i = 0; i < points.length; i += 2) {
60
+ const [x, y] = [points[i], points[i + 1]];
61
+ if (x < minX) {
62
+ minX = x - 1;
63
+ }
64
+ if (x > maxX) {
65
+ maxX = x + 1;
66
+ }
67
+ if (y < minY) {
68
+ minY = y - 1;
69
+ }
70
+ if (y > maxY) {
71
+ maxY = y + 1;
72
+ }
73
+ if (x < minStartX) {
74
+ minStartX = x - 1;
75
+ }
76
+ if (y < minStartY) {
77
+ minStartY = y - 1;
78
+ }
79
+ }
80
+ }
81
+ }
82
+
83
+ minX === Infinity && (minX = (this.render.stage.width() - this.render.rulerSize) / 2);
84
+ maxX === -Infinity && (maxX = minX);
85
+ minY === Infinity && (minY = (this.render.stage.height() - this.render.rulerSize) / 2);
86
+ maxY === -Infinity && (maxY = minY);
87
+ minStartX === Infinity && minX;
88
+ minStartY === Infinity && minY;
89
+
90
+ const assetSize = {
91
+ width: maxX - minX,
92
+ height: maxY - minY
93
+ };
94
+ const assetRate = assetSize.width / assetSize.height;
95
+
96
+ const viewSize = {
97
+ width: this.render.stage.width() - (this.render.config.readonly ? 0 : this.render.rulerSize),
98
+ height: this.render.stage.height() - (this.render.config.readonly ? 0 : this.render.rulerSize)
99
+ };
100
+ const viewRate = viewSize.width / viewSize.height;
101
+ let scale = 1;
102
+
103
+ if (viewRate > assetRate) {
104
+ scale = viewSize.height / assetSize.height;
105
+ } else if (viewRate < assetRate) {
106
+ scale = viewSize.width / assetSize.width;
107
+ }
108
+
109
+ scale = Math.max(0.2, scale);
110
+ scale = Math.floor(scale * 100) / 100;
111
+
112
+ if (assetSize.width <= viewSize.width && assetSize.height <= viewSize.height) {
113
+ scale = 1;
114
+ }
115
+ this.render.stage.setAttrs({
116
+ scale: { x: scale, y: scale },
117
+ position: {
118
+ x:
119
+ (this.render.config.readonly ? 0 : this.render.rulerSize) -
120
+ minX * scale +
121
+ (viewSize.width - assetSize.width * scale) / 2,
122
+ y:
123
+ (this.render.config.readonly ? 0 : this.render.rulerSize) -
124
+ minY * scale +
125
+ (viewSize.height - assetSize.height * scale) / 2
126
+ }
127
+ });
128
+
129
+ this.render.emit('scale-change', scale);
130
+
131
+ // 重绘
132
+ this.render.redraw([
133
+ BgDraw.name,
134
+ GraphDraw.name,
135
+ LinkDraw.name,
136
+ RulerDraw.name,
137
+ RefLineDraw.name,
138
+ PreviewDraw.name
139
+ ]);
140
+ }
141
+
142
+ // 恢复位置大小
143
+ positionZoomReset() {
144
+ this.render.stage.setAttrs({
145
+ scale: { x: 1, y: 1 }
146
+ });
147
+ this.render.emit('scale-change', 1);
148
+ this.positionReset();
149
+ }
150
+
151
+ // 恢复位置
152
+ positionReset() {
153
+ this.render.stage.setAttrs({
154
+ x: this.render.rulerSize,
155
+ y: this.render.rulerSize
156
+ });
157
+ // 重绘
158
+ this.render.redraw([
159
+ BgDraw.name,
160
+ GraphDraw.name,
161
+ LinkDraw.name,
162
+ RulerDraw.name,
163
+ RefLineDraw.name,
164
+ PreviewDraw.name
165
+ ]);
166
+ }
167
+
168
+ // 更新中心位置
169
+ updateCenter(x = 0, y = 0) {
170
+ // stage 状态
171
+ const stageState = this.render.getStageState();
172
+ // 提取节点
173
+ const nodes = this.render.layer.getChildren((node) => !this.render.ignore(node));
174
+
175
+ // 计算节点占用的区域(计算起点即可)
176
+ let minX = 0;
177
+ let minY = 0;
178
+ for (const node of nodes) {
179
+ const x = node.x();
180
+ const y = node.y();
181
+ if (x < minX) {
182
+ minX = x;
183
+ }
184
+ if (y < minY) {
185
+ minY = y;
186
+ }
187
+ }
188
+
189
+ // 居中画布
190
+ this.render.stage.setAttrs({
191
+ x:
192
+ stageState.width / 2 -
193
+ this.render.toBoardValue(minX) -
194
+ this.render.toBoardValue(x) +
195
+ this.render.rulerSize,
196
+ y:
197
+ stageState.height / 2 -
198
+ this.render.toBoardValue(minY) -
199
+ this.render.toBoardValue(y) +
200
+ this.render.rulerSize
201
+ });
202
+ // 重绘
203
+ this.render.redraw([
204
+ BgDraw.name,
205
+ GraphDraw.name,
206
+ LinkDraw.name,
207
+ RulerDraw.name,
208
+ RefLineDraw.name,
209
+ PreviewDraw.name
210
+ ]);
211
+ }
212
+ }
@@ -0,0 +1,132 @@
1
+ import Konva from 'konva';
2
+ import { Render } from '../index';
3
+ import { GraphDraw, LinkDraw } from '../draws';
4
+ import { AssetType } from '../types';
5
+
6
+ export class SelectionTool {
7
+ // @ts-ignore
8
+ static readonly name = 'SelectionTool';
9
+
10
+ private render: Render;
11
+ constructor(render: Render) {
12
+ this.render = render;
13
+ }
14
+ // 【被选中的】
15
+ selectingNodes: Konva.Node[] = [];
16
+ // 清空已选
17
+ selectingClear(slient = false) {
18
+ // 选择变化了
19
+ if (this.selectingNodes.length > 0) {
20
+ !slient && this.render.emit('selection-change', []);
21
+ }
22
+ // 清空选择
23
+ this.render.transformer.nodes([]);
24
+ // 恢复透明度、层次、可交互
25
+ for (const node of [...this.selectingNodes].sort(
26
+ (a, b) => a.attrs.lastZIndex - b.attrs.lastZIndex
27
+ )) {
28
+ node.setAttrs({
29
+ listening: true,
30
+ opacity: node.attrs.lastOpacity ?? 1,
31
+ zIndex: node.attrs.lastZIndex
32
+ });
33
+ }
34
+ // 清空状态
35
+ for (const node of this.selectingNodes) {
36
+ node.setAttrs({
37
+ nodeMousedownPos: undefined,
38
+ lastOpacity: undefined,
39
+ lastZIndex: undefined,
40
+ selectingZIndex: undefined,
41
+ selected: false
42
+ });
43
+ }
44
+ // 清空选择节点
45
+ this.selectingNodes = [];
46
+ // 隐藏 连接点
47
+ this.render.linkTool.pointsVisible(false);
48
+ // 重绘
49
+ this.render.redraw([GraphDraw.name, LinkDraw.name]);
50
+ }
51
+
52
+ // 选择节点
53
+ select(nodes: Konva.Node[]) {
54
+ if (nodes.length > 1) {
55
+ // 多选 不能改变大小/旋转
56
+ this.render.transformer.resizeEnabled(false);
57
+ this.render.transformer.rotateEnabled(false);
58
+ } else {
59
+ if (nodes.length === 1) {
60
+ const target = nodes[0];
61
+ // 图形 不能改变大小
62
+ this.render.transformer.resizeEnabled(
63
+ target.attrs.assetType === AssetType.Graph ? false : true
64
+ );
65
+ this.render.transformer.rotateEnabled(
66
+ target.attrs.assetType === AssetType.Graph &&
67
+ ["Line", "Curve", "Bezier"].includes(target.attrs.graphType)
68
+ ? false
69
+ : true
70
+ );
71
+ } else {
72
+ this.render.transformer.resizeEnabled(true);
73
+ }
74
+ }
75
+
76
+ // 清除连接线选中
77
+ this.render.linkTool.selectingClear();
78
+ // 选择变化了
79
+ this.render.emit('selection-change', nodes);
80
+ this.selectingClear(true);
81
+
82
+ if (nodes.length > 0) {
83
+ // 最大zIndex
84
+ const maxZIndex = Math.max(
85
+ ...this.render.layer
86
+ .getChildren((node) => !this.render.ignore(node))
87
+ .map((o) => o.zIndex())
88
+ );
89
+
90
+ // 记录状态
91
+ for (const node of nodes) {
92
+ node.setAttrs({
93
+ nodeMousedownPos: node.position(), // 后面用于移动所选
94
+ lastOpacity: node.opacity(), // 选中时,下面会使其变透明,记录原有的透明度
95
+ lastZIndex: node.zIndex(), // 记录原有的层次,后面暂时提升所选节点的层次
96
+ selectingZIndex: undefined,
97
+ selected: true, // 选择中
98
+ listening: false, // 不可交互
99
+ opacity: node.opacity() * 0.8 // 设置透明度
100
+ });
101
+ }
102
+
103
+ // 提升层次
104
+ for (const node of nodes.sort((a, b) => a.zIndex() - b.zIndex())) {
105
+ node.setAttrs({
106
+ zIndex: maxZIndex // 提升层次
107
+ });
108
+ }
109
+ // 选中的节点
110
+ this.selectingNodes = nodes;
111
+ // 选中的节点,放进 transformer
112
+ this.render.transformer.nodes(this.selectingNodes);
113
+ }
114
+ // 重绘
115
+ this.render.redraw([GraphDraw.name, LinkDraw.name]);
116
+ }
117
+
118
+ // 更新节点位置
119
+ selectingNodesMove(offset: Konva.Vector2d) {
120
+ for (const node of this.render.selectionTool.selectingNodes) {
121
+ node.x(node.x() + offset.x);
122
+ node.y(node.y() + offset.y);
123
+ }
124
+ this.render.emit('asset-position-change', this.render.selectionTool.selectingNodes);
125
+ }
126
+
127
+ // 选择所有节点
128
+ selectAll() {
129
+ const nodes = this.render.layer.find('.asset') as Konva.Node[];
130
+ this.select(nodes);
131
+ }
132
+ }