aldehyde 0.2.479 → 0.2.480
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/lib/controls/2dEditor/components/card.js +2 -2
- package/lib/controls/2dEditor/components/card.js.map +1 -1
- package/lib/controls/entity-select/entity-select.js +3 -3
- package/lib/controls/entity-select/entity-select.js.map +1 -1
- package/lib/draw-canvas-edit/components/asset-bar/index.d.ts +1 -0
- package/lib/draw-canvas-edit/components/asset-bar/index.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/asset-bar/index.js +8 -6
- package/lib/draw-canvas-edit/components/asset-bar/index.js.map +1 -1
- package/lib/draw-canvas-edit/components/main-header/index.less +3 -0
- package/lib/draw-canvas-edit/components/render/draws/bg-draw.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/draws/bg-draw.js +14 -1
- package/lib/draw-canvas-edit/components/render/draws/bg-draw.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/draws/contextmenu-draw.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/draws/contextmenu-draw.js +30 -6
- package/lib/draw-canvas-edit/components/render/draws/contextmenu-draw.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/graphs/bezier.js +3 -3
- package/lib/draw-canvas-edit/components/render/graphs/bezier.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/graphs/circle.js +2 -2
- package/lib/draw-canvas-edit/components/render/graphs/circle.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/graphs/curve.js +3 -3
- package/lib/draw-canvas-edit/components/render/graphs/curve.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/graphs/line.js +3 -3
- package/lib/draw-canvas-edit/components/render/graphs/line.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/graphs/rect.js +2 -2
- package/lib/draw-canvas-edit/components/render/graphs/rect.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.d.ts +1 -1
- package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.js +58 -122
- package/lib/draw-canvas-edit/components/render/handlers/drag-outside-handlers.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/handlers/graph-handlers.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/handlers/graph-handlers.js +2 -1
- package/lib/draw-canvas-edit/components/render/handlers/graph-handlers.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.js +11 -4
- package/lib/draw-canvas-edit/components/render/handlers/selection-handlers.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/index.d.ts +3 -1
- package/lib/draw-canvas-edit/components/render/index.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/index.js +37 -26
- package/lib/draw-canvas-edit/components/render/index.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/attract-tool.d.ts +2 -1
- package/lib/draw-canvas-edit/components/render/tools/attract-tool.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/attract-tool.js +33 -8
- package/lib/draw-canvas-edit/components/render/tools/attract-tool.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts +62 -0
- package/lib/draw-canvas-edit/components/render/tools/component-factory.d.ts.map +1 -0
- package/lib/draw-canvas-edit/components/render/tools/component-factory.js +289 -0
- package/lib/draw-canvas-edit/components/render/tools/component-factory.js.map +1 -0
- package/lib/draw-canvas-edit/components/render/tools/copy-tool.d.ts +0 -2
- package/lib/draw-canvas-edit/components/render/tools/copy-tool.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/copy-tool.js +23 -45
- package/lib/draw-canvas-edit/components/render/tools/copy-tool.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/import-export-tool.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/import-export-tool.js +20 -41
- package/lib/draw-canvas-edit/components/render/tools/import-export-tool.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/index.d.ts +1 -0
- package/lib/draw-canvas-edit/components/render/tools/index.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/index.js +1 -0
- package/lib/draw-canvas-edit/components/render/tools/index.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/selection-tool.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/tools/selection-tool.js +32 -19
- package/lib/draw-canvas-edit/components/render/tools/selection-tool.js.map +1 -1
- package/lib/draw-canvas-edit/components/render/types.d.ts +8 -6
- package/lib/draw-canvas-edit/components/render/types.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/render/types.js.map +1 -1
- package/lib/draw-canvas-edit/components/setting-form/imag-upload.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/setting-form/imag-upload.js +2 -2
- package/lib/draw-canvas-edit/components/setting-form/imag-upload.js.map +1 -1
- package/lib/draw-canvas-edit/components/setting-form/index.d.ts.map +1 -1
- package/lib/draw-canvas-edit/components/setting-form/index.js +3 -5
- package/lib/draw-canvas-edit/components/setting-form/index.js.map +1 -1
- package/lib/draw-canvas-edit/index.d.ts.map +1 -1
- package/lib/draw-canvas-edit/index.js +4 -1
- package/lib/draw-canvas-edit/index.js.map +1 -1
- package/lib/draw-canvas-view/index.d.ts.map +1 -1
- package/lib/draw-canvas-view/index.js +4 -2
- package/lib/draw-canvas-view/index.js.map +1 -1
- package/lib/draw-canvas-view/view.d.ts +2 -0
- package/lib/draw-canvas-view/view.d.ts.map +1 -1
- package/lib/draw-canvas-view/view.js +46 -35
- package/lib/draw-canvas-view/view.js.map +1 -1
- package/lib/form/criteria-form.js +17 -17
- package/lib/form/criteria-form.js.map +1 -1
- package/lib/form/dtmpl-form.d.ts.map +1 -1
- package/lib/form/dtmpl-form.js +9 -0
- package/lib/form/dtmpl-form.js.map +1 -1
- package/lib/form/form-Item-group.js +2 -2
- package/lib/form/form-Item-group.js.map +1 -1
- package/lib/module/dtmpl-edit-card.js +4 -4
- package/lib/module/dtmpl-edit-card.js.map +1 -1
- package/lib/module/dtmpl-edit-page.d.ts.map +1 -1
- package/lib/module/dtmpl-edit-page.js +7 -4
- package/lib/module/dtmpl-edit-page.js.map +1 -1
- package/lib/table/act-table.js +8 -8
- package/lib/table/act-table.js.map +1 -1
- package/lib/table/modal-select-table.d.ts +2 -2
- package/lib/table/modal-select-table.d.ts.map +1 -1
- package/lib/table/modal-select-table.js +10 -10
- package/lib/table/modal-select-table.js.map +1 -1
- package/lib/table/relation-table.d.ts +2 -2
- package/lib/table/relation-table.js +1 -1
- package/lib/table/relation-table.js.map +1 -1
- package/lib/table/select-table.js +2 -2
- package/lib/table/select-table.js.map +1 -1
- package/lib/tmpl/hc-data-source.js +2 -2
- package/lib/tmpl/hc-data-source.js.map +1 -1
- package/lib/tmpl/interface.d.ts +7 -7
- package/lib/tmpl/interface.d.ts.map +1 -1
- package/lib/tmpl/tmpl-config-analysis.d.ts.map +1 -1
- package/lib/tmpl/tmpl-config-analysis.js +23 -23
- package/lib/tmpl/tmpl-config-analysis.js.map +1 -1
- package/lib/units/index.js +3 -3
- package/lib/units/index.js.map +1 -1
- package/package.json +1 -1
- package/src/aldehyde/controls/2dEditor/components/card.tsx +2 -2
- package/src/aldehyde/controls/entity-select/entity-select.tsx +3 -3
- package/src/aldehyde/draw-canvas-edit/components/asset-bar/index.tsx +8 -6
- package/src/aldehyde/draw-canvas-edit/components/main-header/index.less +3 -0
- package/src/aldehyde/draw-canvas-edit/components/render/draws/bg-draw.ts +17 -1
- package/src/aldehyde/draw-canvas-edit/components/render/draws/contextmenu-draw.ts +30 -6
- package/src/aldehyde/draw-canvas-edit/components/render/graphs/bezier.ts +3 -3
- package/src/aldehyde/draw-canvas-edit/components/render/graphs/circle.ts +2 -2
- package/src/aldehyde/draw-canvas-edit/components/render/graphs/curve.ts +3 -3
- package/src/aldehyde/draw-canvas-edit/components/render/graphs/line.ts +3 -3
- package/src/aldehyde/draw-canvas-edit/components/render/graphs/rect.ts +2 -2
- package/src/aldehyde/draw-canvas-edit/components/render/handlers/drag-outside-handlers.ts +45 -130
- package/src/aldehyde/draw-canvas-edit/components/render/handlers/graph-handlers.ts +7 -1
- package/src/aldehyde/draw-canvas-edit/components/render/handlers/selection-handlers.ts +11 -5
- package/src/aldehyde/draw-canvas-edit/components/render/index.ts +38 -29
- package/src/aldehyde/draw-canvas-edit/components/render/tools/attract-tool.ts +30 -10
- package/src/aldehyde/draw-canvas-edit/components/render/tools/component-factory.ts +302 -0
- package/src/aldehyde/draw-canvas-edit/components/render/tools/copy-tool.ts +24 -46
- package/src/aldehyde/draw-canvas-edit/components/render/tools/import-export-tool.ts +22 -46
- package/src/aldehyde/draw-canvas-edit/components/render/tools/index.ts +1 -0
- package/src/aldehyde/draw-canvas-edit/components/render/tools/selection-tool.ts +34 -23
- package/src/aldehyde/draw-canvas-edit/components/render/types.ts +6 -6
- package/src/aldehyde/draw-canvas-edit/components/setting-form/imag-upload.tsx +2 -1
- package/src/aldehyde/draw-canvas-edit/components/setting-form/index.tsx +3 -5
- package/src/aldehyde/draw-canvas-edit/index.tsx +4 -1
- package/src/aldehyde/draw-canvas-view/index.tsx +3 -1
- package/src/aldehyde/draw-canvas-view/view.tsx +228 -212
- package/src/aldehyde/form/criteria-form.tsx +18 -18
- package/src/aldehyde/form/dtmpl-form.tsx +9 -0
- package/src/aldehyde/form/form-Item-group.tsx +2 -2
- package/src/aldehyde/module/dtmpl-edit-card.tsx +4 -4
- package/src/aldehyde/module/dtmpl-edit-page.tsx +7 -4
- package/src/aldehyde/table/act-table.tsx +8 -8
- package/src/aldehyde/table/modal-select-table.tsx +10 -10
- package/src/aldehyde/table/relation-table.tsx +1 -1
- package/src/aldehyde/table/select-table.tsx +2 -2
- package/src/aldehyde/tmpl/hc-data-source.tsx +2 -2
- package/src/aldehyde/tmpl/interface.tsx +7 -7
- package/src/aldehyde/tmpl/tmpl-config-analysis.tsx +23 -24
- package/src/aldehyde/units/index.tsx +3 -3
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
import Konva from 'konva';
|
|
2
|
+
import { nanoid } from 'nanoid';
|
|
3
|
+
import { Render } from '../index';
|
|
4
|
+
import { AssetType, AssetInfoPoint, AssetSettings, LinkDrawPoint } from '../types';
|
|
5
|
+
import { handleImgUrl } from "../../asset-bar/index";
|
|
6
|
+
|
|
7
|
+
// 统一组件创建
|
|
8
|
+
|
|
9
|
+
interface workstationSettings extends AssetSettings {
|
|
10
|
+
workstationNumber: string; // 工位编号
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface CreateImageComponentOptions {
|
|
14
|
+
src: string;
|
|
15
|
+
type: string;
|
|
16
|
+
componentType?: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface CreateJsonComponentOptions {
|
|
20
|
+
src: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class ComponentFactory {
|
|
24
|
+
private render: Render;
|
|
25
|
+
|
|
26
|
+
constructor(render: Render) {
|
|
27
|
+
this.render = render;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 创建图片组件(svg、gif、png等)
|
|
32
|
+
*/
|
|
33
|
+
async createImageComponent(options: CreateImageComponentOptions) {
|
|
34
|
+
const { src, type, componentType } = options;
|
|
35
|
+
const { pageHeight, pageWidth } = this.render.getPageSettings()
|
|
36
|
+
const target = await this.render.assetTool[{ svg: "loadSvg", gif: "loadGif" }[type] || "loadImg"](handleImgUrl(src));
|
|
37
|
+
let width = target.width();
|
|
38
|
+
let height = target.height();
|
|
39
|
+
if (width > pageWidth || height > pageHeight) { // 原图尺寸超过页面大小时进行缩放
|
|
40
|
+
const sizeScale = Math.min(pageWidth / width, pageHeight / height);
|
|
41
|
+
width *= sizeScale;
|
|
42
|
+
height *= sizeScale;
|
|
43
|
+
target.setSize({ width, height });
|
|
44
|
+
}
|
|
45
|
+
const group = new Konva.Group({
|
|
46
|
+
id: nanoid(),
|
|
47
|
+
width,
|
|
48
|
+
height,
|
|
49
|
+
name: 'asset',
|
|
50
|
+
assetType: AssetType.Image,
|
|
51
|
+
draggable: true,
|
|
52
|
+
componentType,
|
|
53
|
+
componentSrc: src,
|
|
54
|
+
imageType: ["svg", "gif", "other"].includes(type) ? type : "other"
|
|
55
|
+
});
|
|
56
|
+
this.render.setAssetSettings(group, this.render.getAssetSettings(), false);
|
|
57
|
+
group.add(target);
|
|
58
|
+
const points: AssetInfoPoint[] = [
|
|
59
|
+
{ x: 0, y: group.height() / 2, direction: 'left' }, // 左
|
|
60
|
+
{ x: group.width(), y: group.height() / 2, direction: 'right' }, // 右
|
|
61
|
+
{ x: group.width() / 2, y: 0, direction: 'top' }, // 上
|
|
62
|
+
{ x: group.width() / 2, y: group.height(), direction: 'bottom' } // 下
|
|
63
|
+
];
|
|
64
|
+
return { group, points };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 创建 JSON 组合组件
|
|
69
|
+
*/
|
|
70
|
+
async createJsonComponent(options: CreateJsonComponentOptions) {
|
|
71
|
+
const { src } = options;
|
|
72
|
+
const { pageHeight, pageWidth } = this.render.getPageSettings()
|
|
73
|
+
const target = await this.render.assetTool["loadJson"](handleImgUrl(src));
|
|
74
|
+
let width = target.width();
|
|
75
|
+
let height = target.height();
|
|
76
|
+
if (width > pageWidth || height > pageHeight) { // 原图尺寸超过页面大小时进行缩放
|
|
77
|
+
const sizeScale = Math.min(pageWidth / width, pageHeight / height);
|
|
78
|
+
width *= sizeScale;
|
|
79
|
+
height *= sizeScale;
|
|
80
|
+
target.setSize({ width, height });
|
|
81
|
+
}
|
|
82
|
+
target.id(nanoid());
|
|
83
|
+
target.setAttrs({
|
|
84
|
+
name: 'asset',
|
|
85
|
+
assetType: AssetType.Json,
|
|
86
|
+
draggable: true
|
|
87
|
+
});
|
|
88
|
+
target.setAttrs({ x: 0, y: 0 } as any);
|
|
89
|
+
this.render.linkTool.groupIdCover(target);
|
|
90
|
+
return { group: target };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// 创建Tooltip
|
|
94
|
+
createTooltipComponent(props: { x: number, y: number }) {
|
|
95
|
+
const { x = 0, y = 0 } = props;
|
|
96
|
+
// 创建一个标签容器
|
|
97
|
+
const tooltip = new Konva.Label({ name: "tooltip", x, y, opacity: 0.75, visible: false, listening: false });
|
|
98
|
+
// 往标签上面添加带箭头的背景形状
|
|
99
|
+
tooltip.add(
|
|
100
|
+
new Konva.Tag({
|
|
101
|
+
fill: 'black',
|
|
102
|
+
pointerDirection: 'down', // 箭头方向
|
|
103
|
+
pointerWidth: 6,
|
|
104
|
+
pointerHeight: 6,
|
|
105
|
+
cornerRadius: 4,
|
|
106
|
+
lineJoin: 'round'
|
|
107
|
+
})
|
|
108
|
+
);
|
|
109
|
+
// 往标签上面添加文字
|
|
110
|
+
const tooltipText = new Konva.Text({
|
|
111
|
+
name: "tooltip-text",
|
|
112
|
+
text: '提示框',
|
|
113
|
+
fontSize: 12,
|
|
114
|
+
padding: 4,
|
|
115
|
+
fill: 'white'
|
|
116
|
+
});
|
|
117
|
+
tooltip.add(tooltipText);
|
|
118
|
+
return tooltip;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 更新Tooltip
|
|
122
|
+
updateTooltipText(node: Konva.Group, newText: string) {
|
|
123
|
+
const tooltipNode = node.findOne('.tooltip') as Konva.Label;
|
|
124
|
+
if (!tooltipNode) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const textNode = tooltipNode.findOne('.tooltip-text') as Konva.Text;
|
|
128
|
+
textNode.setAttr("text", newText);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 根据 componentType 创建特定类型组件
|
|
133
|
+
*/
|
|
134
|
+
async createTypedComponent(options: CreateImageComponentOptions) {
|
|
135
|
+
const { src, type, componentType } = options;
|
|
136
|
+
const { themeToken } = this.render.config || {};
|
|
137
|
+
let comGroup: { group: Konva.Group; points: AssetInfoPoint[] };
|
|
138
|
+
let group: Konva.Group;
|
|
139
|
+
let points: AssetInfoPoint[];
|
|
140
|
+
switch (componentType) {
|
|
141
|
+
case "workstation": // 工位
|
|
142
|
+
const workstationNodes = this.render.getAllAssets()?.filter(asset => asset.componentType === "workstation");
|
|
143
|
+
const order = Math.max(...workstationNodes.map(asset => asset.settings.order), 0) + 1; // 当前工位序号,自增
|
|
144
|
+
comGroup = await this.createImageComponent({ src, type, componentType });
|
|
145
|
+
group = comGroup.group;
|
|
146
|
+
points = comGroup.points;
|
|
147
|
+
const fontSize = Math.min(group.width(), group.height()) * 0.5;
|
|
148
|
+
const text = new Konva.Text({
|
|
149
|
+
name: "order",
|
|
150
|
+
text: `${order}`,
|
|
151
|
+
fontSize, // 字体大小随半径变化
|
|
152
|
+
fontFamily: 'Arial',
|
|
153
|
+
fill: themeToken.colorPrimary || "#000000",
|
|
154
|
+
align: 'center',
|
|
155
|
+
offsetX: 0,
|
|
156
|
+
offsetY: 0,
|
|
157
|
+
width: group.width()
|
|
158
|
+
});
|
|
159
|
+
text.x(0);
|
|
160
|
+
text.y(group.height() / 2 - text.height() / 7);
|
|
161
|
+
const tooltip = this.createTooltipComponent({ x: group.width() / 2, y: group.height() / 2 });
|
|
162
|
+
group.add(text);
|
|
163
|
+
group.add(tooltip);
|
|
164
|
+
this.render.setAssetSettings(group, { ...this.render.getAssetSettings(group), order }, true);
|
|
165
|
+
break;
|
|
166
|
+
default:
|
|
167
|
+
comGroup = await this.createImageComponent({ src, type, componentType });
|
|
168
|
+
group = comGroup.group;
|
|
169
|
+
points = comGroup.points;
|
|
170
|
+
break;
|
|
171
|
+
}
|
|
172
|
+
return { group, points };
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// 创建组件连接点
|
|
176
|
+
createComponentLinkPoints(props: { showPoints: string, points: AssetInfoPoint[], group: Konva.Group }) {
|
|
177
|
+
const { showPoints, points, group } = props;
|
|
178
|
+
if (showPoints === "true") {
|
|
179
|
+
// 连接点信息
|
|
180
|
+
group.setAttrs({
|
|
181
|
+
points: points.map((o) => ({ ...o, id: nanoid(), groupId: group.id(), visible: false, pairs: [], direction: o.direction }) as LinkDrawPoint)
|
|
182
|
+
});
|
|
183
|
+
// 连接点锚点
|
|
184
|
+
for (const point of group.getAttr('points') ?? []) {
|
|
185
|
+
group.add(
|
|
186
|
+
new Konva.Circle({
|
|
187
|
+
name: 'link-anchor',
|
|
188
|
+
id: point.id,
|
|
189
|
+
x: point.x,
|
|
190
|
+
y: point.y,
|
|
191
|
+
radius: this.render.toStageValue(1),
|
|
192
|
+
stroke: 'rgba(0,0,255,1)',
|
|
193
|
+
strokeWidth: this.render.toStageValue(2),
|
|
194
|
+
visible: false,
|
|
195
|
+
direction: point.direction,
|
|
196
|
+
})
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// 渲染页组件设置鼠标移入移出样式
|
|
203
|
+
setCursorPointer = (node: Konva.Group) => {
|
|
204
|
+
node.on('mouseenter', function () {
|
|
205
|
+
const container = this.getStage().getContent();
|
|
206
|
+
container.style.cursor = 'pointer';
|
|
207
|
+
});
|
|
208
|
+
node.on('mouseleave', function () {
|
|
209
|
+
const container = this.getStage().getContent();
|
|
210
|
+
container.style.cursor = 'default';
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// 只读页面组件初始化更新
|
|
215
|
+
readonlyInitComponentSetting(props: { node: Konva.Group }) {
|
|
216
|
+
const { node } = props;
|
|
217
|
+
const { componentType } = node.getAttrs() || {};
|
|
218
|
+
switch (componentType) {
|
|
219
|
+
case "workstation": // 工位
|
|
220
|
+
const orderText = node.findOne(".order");
|
|
221
|
+
orderText?.visible?.(false); // 只读页面不显示工位序号
|
|
222
|
+
this.setCursorPointer(node);
|
|
223
|
+
break;
|
|
224
|
+
default:
|
|
225
|
+
break;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// 更新组件设置
|
|
230
|
+
updateComponentSetting(props: { node: Konva.Group, settings: AssetSettings }) {
|
|
231
|
+
const { node, settings } = props;
|
|
232
|
+
const { componentType } = node.getAttrs() || {};
|
|
233
|
+
switch (componentType) {
|
|
234
|
+
case "workstation":
|
|
235
|
+
this.updateTooltipText(node, (settings as workstationSettings).workstationNumber); // 工位编号弹窗
|
|
236
|
+
node.findOne(".order")?.setAttr("text", settings.order); // 工位序号显示
|
|
237
|
+
break;
|
|
238
|
+
default:
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 克隆组件更新组件配置
|
|
244
|
+
updateCloneNodeSetting(nodes: Konva.Group[]) {
|
|
245
|
+
const allAssets = this.render.getAllAssets();
|
|
246
|
+
const workstationOrders = allAssets?.filter(asset => asset.componentType === "workstation")?.map(asset => asset.settings.order) || []; // 工位组件自增序号
|
|
247
|
+
nodes.forEach(node => {
|
|
248
|
+
const { componentType } = node.getAttrs() || {};
|
|
249
|
+
switch (componentType) {
|
|
250
|
+
case "workstation": // 工位
|
|
251
|
+
const order = Math.max(...workstationOrders, 0) + 1; // 当前工位序号,自增
|
|
252
|
+
workstationOrders.push(order);
|
|
253
|
+
const orderText = node.findOne(".order");
|
|
254
|
+
this.render.setAssetSettings(node, { ...this.render.getAssetSettings(node), order }, true);
|
|
255
|
+
orderText.setAttr("text", order);
|
|
256
|
+
break;
|
|
257
|
+
default:
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
// 克隆已有节点(用于复制粘贴)
|
|
264
|
+
cloneNodes(nodes: Konva.Node[]): Konva.Node[] {
|
|
265
|
+
const clones: Konva.Group[] = [];
|
|
266
|
+
for (const node of nodes) {
|
|
267
|
+
if (node instanceof Konva.Transformer) {
|
|
268
|
+
// 复制已选择:递归处理 selectingNodes
|
|
269
|
+
const backup = [...this.render.selectionTool.selectingNodes];
|
|
270
|
+
this.render.selectionTool.selectingClear();
|
|
271
|
+
this.render.linkTool.selectingClear();
|
|
272
|
+
return this.cloneNodes(backup);
|
|
273
|
+
}
|
|
274
|
+
const newNode = node.clone();
|
|
275
|
+
clones.push(newNode);
|
|
276
|
+
}
|
|
277
|
+
this.updateCloneNodeSetting(clones);
|
|
278
|
+
return clones;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// 组件鼠标移入事件
|
|
282
|
+
groupMouseenter = ({ group }) => {
|
|
283
|
+
group.off('mouseenter');
|
|
284
|
+
group.on('mouseenter', () => {
|
|
285
|
+
this.render.linkTool.pointsVisible(true, group); // 显示 连接点
|
|
286
|
+
const tooltipNode = group.findOne(".tooltip");
|
|
287
|
+
if (tooltipNode) { // 组件存在tooltip且存在文本显示
|
|
288
|
+
const isText = tooltipNode.findOne(".tooltip-text")?.getAttr("text");
|
|
289
|
+
if (isText) tooltipNode.visible(true);
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// 组件鼠标移出事件
|
|
295
|
+
groupMouseleave = ({ group }) => {
|
|
296
|
+
group.off('mouseleave');
|
|
297
|
+
group.on('mouseleave', () => {
|
|
298
|
+
this.render.linkTool.pointsVisible(false, group);
|
|
299
|
+
group.findOne(".tooltip")?.visible(false);
|
|
300
|
+
});
|
|
301
|
+
};
|
|
302
|
+
}
|
|
@@ -183,25 +183,14 @@ export class CopyTool {
|
|
|
183
183
|
|
|
184
184
|
for (const node of nodes) {
|
|
185
185
|
if (node instanceof Konva.Group) {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
this.render.linkTool.pointsVisible(true, node);
|
|
190
|
-
});
|
|
191
|
-
node.off('mouseleave');
|
|
192
|
-
node.on('mouseleave', () => {
|
|
193
|
-
// 隐藏 连接点
|
|
194
|
-
this.render.linkTool.pointsVisible(false, node);
|
|
195
|
-
// 隐藏 hover 框
|
|
196
|
-
node.findOne('#hoverRect')?.visible(false);
|
|
197
|
-
});
|
|
198
|
-
|
|
186
|
+
// 重新绑定鼠标事件
|
|
187
|
+
this.render.componentFactory.groupMouseenter({ group: node });
|
|
188
|
+
this.render.componentFactory.groupMouseleave({ group: node });
|
|
199
189
|
// 使新节点产生偏移
|
|
200
190
|
node.setAttrs({
|
|
201
191
|
x: node.x() + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
|
|
202
|
-
y: node.y() + this.render.toStageValue(this.render.bgSize) * this.pasteCount
|
|
192
|
+
y: node.y() + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
|
|
203
193
|
});
|
|
204
|
-
|
|
205
194
|
// 拐点也需要偏移
|
|
206
195
|
if (node.attrs.manualPointsMap) {
|
|
207
196
|
const manualPointsMap = {} as ManualPointsMap;
|
|
@@ -214,9 +203,9 @@ export class CopyTool {
|
|
|
214
203
|
for (const pairId in manualPointsMap) {
|
|
215
204
|
const manualPoints = manualPointsMap[pairId];
|
|
216
205
|
if (Array.isArray(manualPoints)) {
|
|
217
|
-
manualPointsMap[pairId] = manualPoints.map((o) => ({
|
|
206
|
+
manualPointsMap[pairId] = manualPoints.map((o: any) => ({
|
|
218
207
|
x: o.x + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
|
|
219
|
-
y: o.y + this.render.toStageValue(this.render.bgSize) * this.pasteCount
|
|
208
|
+
y: o.y + this.render.toStageValue(this.render.bgSize) * this.pasteCount,
|
|
220
209
|
}));
|
|
221
210
|
}
|
|
222
211
|
}
|
|
@@ -230,38 +219,27 @@ export class CopyTool {
|
|
|
230
219
|
/**
|
|
231
220
|
* 复制粘贴
|
|
232
221
|
* @param nodes 节点数组
|
|
233
|
-
* @param skip 跳过检查
|
|
234
|
-
* @returns 复制的元素
|
|
235
222
|
*/
|
|
236
223
|
copy(nodes: Konva.Node[]) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
// 复制已选择
|
|
241
|
-
const backup = [...this.render.selectionTool.selectingNodes];
|
|
242
|
-
this.render.selectionTool.selectingClear();
|
|
243
|
-
this.render.linkTool.selectingClear();
|
|
244
|
-
this.copy(backup);
|
|
245
|
-
return;
|
|
246
|
-
} else {
|
|
247
|
-
// 复制未选择(先记录,后处理)
|
|
248
|
-
clones.push(node.clone());
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
// 刷新 id、事件
|
|
224
|
+
// 使用 ComponentFactory 克隆节点
|
|
225
|
+
const clones = this.render.componentFactory.cloneNodes(nodes);
|
|
226
|
+
// 刷新 id、事件、偏移
|
|
252
227
|
this.nodesIdCover(clones);
|
|
253
228
|
// 插入新节点
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
229
|
+
const validGroups = clones.filter((o) => o instanceof Konva.Group) as Konva.Group[];
|
|
230
|
+
if (validGroups.length > 0) {
|
|
231
|
+
this.render.layer.add(...validGroups);
|
|
232
|
+
// 选中复制内容
|
|
233
|
+
this.render.selectionTool.select(validGroups);
|
|
234
|
+
// 更新历史
|
|
235
|
+
this.render.updateHistory();
|
|
236
|
+
// 重绘
|
|
237
|
+
this.render.redraw([
|
|
238
|
+
GraphDraw.name,
|
|
239
|
+
LinkDraw.name,
|
|
240
|
+
RulerDraw.name,
|
|
241
|
+
PreviewDraw.name
|
|
242
|
+
]);
|
|
243
|
+
}
|
|
266
244
|
}
|
|
267
245
|
}
|
|
@@ -36,7 +36,7 @@ export class ImportExportTool {
|
|
|
36
36
|
// 如果当前被选中,listening 会是 false,需恢复
|
|
37
37
|
node.listening(true);
|
|
38
38
|
// 恢复 draggable(因为,绘制 Graph 的时候,不允许直接拖动其他素材)
|
|
39
|
-
node.draggable(!this.render.config.readonly);
|
|
39
|
+
node.draggable(!this.render.config.readonly && !node.attrs.locked);
|
|
40
40
|
for (const child of (node as Konva.Group).children) {
|
|
41
41
|
if (this.render.ignoreSelect(child)) {
|
|
42
42
|
child.remove();
|
|
@@ -107,29 +107,21 @@ export class ImportExportTool {
|
|
|
107
107
|
await this.restoreImage(node.getChildren());
|
|
108
108
|
} else if (node instanceof Konva.Image) {
|
|
109
109
|
// 处理图片
|
|
110
|
-
if (node.attrs.svgXML) {
|
|
111
|
-
// svg 素材
|
|
110
|
+
if (node.attrs.svgXML) { // svg 素材
|
|
112
111
|
const blob = new Blob([node.attrs.svgXML], { type: 'image/svg+xml' });
|
|
113
|
-
// dataurl
|
|
114
112
|
const url = URL.createObjectURL(blob);
|
|
115
|
-
// 加载为图片 element
|
|
116
113
|
const image = await this.loadImage(url);
|
|
117
|
-
if (image) {
|
|
118
|
-
// 设置图片
|
|
114
|
+
if (image) { // 设置图片
|
|
119
115
|
node.image(image);
|
|
120
116
|
}
|
|
121
|
-
} else if (node.attrs.gif) {
|
|
122
|
-
// gif 素材
|
|
117
|
+
} else if (node.attrs.gif) { // gif 素材
|
|
123
118
|
const imageNode = await this.render.assetTool.loadGif(node.attrs.gif);
|
|
124
119
|
if (imageNode) {
|
|
125
|
-
// 设置图片
|
|
126
120
|
node.image(imageNode.image());
|
|
127
121
|
}
|
|
128
|
-
} else if (node.attrs.src) {
|
|
129
|
-
// 其他图片素材
|
|
122
|
+
} else if (node.attrs.src) { // 其他图片素材
|
|
130
123
|
const image = await this.loadImage(node.attrs.src);
|
|
131
124
|
if (image) {
|
|
132
|
-
// 设置图片
|
|
133
125
|
node.image(image);
|
|
134
126
|
}
|
|
135
127
|
}
|
|
@@ -186,9 +178,12 @@ export class ImportExportTool {
|
|
|
186
178
|
}
|
|
187
179
|
}
|
|
188
180
|
|
|
189
|
-
// 恢复
|
|
181
|
+
// 恢复(导入)
|
|
190
182
|
async restore(json: string, silent = false) {
|
|
191
|
-
|
|
183
|
+
if (!Object.keys(JSON.parse(json)).length) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const readonly = this.render.config.readonly;
|
|
192
187
|
try {
|
|
193
188
|
this.render.emit('loading', true);
|
|
194
189
|
// 清空选择
|
|
@@ -197,9 +192,9 @@ export class ImportExportTool {
|
|
|
197
192
|
// 清空 main layer 节点
|
|
198
193
|
this.render.layer.getChildren().forEach((o) => o.destroy());
|
|
199
194
|
this.render.layer.removeChildren();
|
|
200
|
-
|
|
201
195
|
// 加载 json,提取节点
|
|
202
196
|
const container = document.createElement('div');
|
|
197
|
+
// 反序列化
|
|
203
198
|
const stage = Konva.Node.create(json, container);
|
|
204
199
|
const main = stage.getChildren()[0];
|
|
205
200
|
const nodes = main.getChildren();
|
|
@@ -208,34 +203,15 @@ export class ImportExportTool {
|
|
|
208
203
|
await this.restoreGraph(nodes);
|
|
209
204
|
for (const node of nodes) {
|
|
210
205
|
// 重置旧数据节点为可 draggable
|
|
211
|
-
|
|
212
|
-
//
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
});
|
|
219
|
-
// 恢复的时候,恢复 hoverRect
|
|
220
|
-
node.add(
|
|
221
|
-
new Konva.Rect({
|
|
222
|
-
id: 'hoverRect',
|
|
223
|
-
width: node.width(),
|
|
224
|
-
height: node.height(),
|
|
225
|
-
fill: 'rgba(0,255,0,0.3)',
|
|
226
|
-
visible: false
|
|
227
|
-
})
|
|
228
|
-
);
|
|
229
|
-
node.off('mouseleave');
|
|
230
|
-
node.on('mouseleave', () => {
|
|
231
|
-
// 隐藏 连接点
|
|
232
|
-
this.render.linkTool.pointsVisible(false, node);
|
|
233
|
-
// 隐藏 hover 框
|
|
234
|
-
node.findOne('#hoverRect')?.visible(false);
|
|
235
|
-
});
|
|
206
|
+
node.draggable(!readonly && !node.attrs.locked);
|
|
207
|
+
// 组件鼠标移入移出事件
|
|
208
|
+
this.render.componentFactory.groupMouseenter({ group: node });
|
|
209
|
+
this.render.componentFactory.groupMouseleave({ group: node });
|
|
210
|
+
if (readonly) {
|
|
211
|
+
this.render.componentFactory.readonlyInitComponentSetting({ node });
|
|
212
|
+
}
|
|
236
213
|
}
|
|
237
|
-
//
|
|
238
|
-
this.render.layer.add(...nodes);
|
|
214
|
+
this.render.layer.add(...nodes); // 插入节点
|
|
239
215
|
// 同步页面设置
|
|
240
216
|
this.render.stage.setAttr('pageSettings', stage.attrs.pageSettings);
|
|
241
217
|
this.render.emit('page-settings-change', this.render.getPageSettings());
|
|
@@ -554,9 +530,9 @@ export class ImportExportTool {
|
|
|
554
530
|
|
|
555
531
|
// 合并设置
|
|
556
532
|
const assetSettings: AssetSettings = {
|
|
557
|
-
stroke:
|
|
558
|
-
strokeWidth:
|
|
559
|
-
fill:
|
|
533
|
+
stroke: "#000000",
|
|
534
|
+
strokeWidth: 1,
|
|
535
|
+
fill: "#000000",
|
|
560
536
|
arrowStart: false,
|
|
561
537
|
arrowEnd: false,
|
|
562
538
|
fontSize: pageSettings.fontSize,
|
|
@@ -49,28 +49,6 @@ export class SelectionTool {
|
|
|
49
49
|
|
|
50
50
|
// 选择节点
|
|
51
51
|
select(nodes: Konva.Node[]) {
|
|
52
|
-
if (nodes.length > 1) {
|
|
53
|
-
// 多选 不能改变大小/旋转
|
|
54
|
-
this.render.transformer.resizeEnabled(false);
|
|
55
|
-
this.render.transformer.rotateEnabled(false);
|
|
56
|
-
} else {
|
|
57
|
-
if (nodes.length === 1) {
|
|
58
|
-
const target = nodes[0];
|
|
59
|
-
// 图形 不能改变大小
|
|
60
|
-
this.render.transformer.resizeEnabled(
|
|
61
|
-
target.attrs.assetType === AssetType.Graph ? false : true
|
|
62
|
-
);
|
|
63
|
-
this.render.transformer.rotateEnabled(
|
|
64
|
-
target.attrs.assetType === AssetType.Graph &&
|
|
65
|
-
["Line", "Curve", "Bezier"].includes(target.attrs.graphType)
|
|
66
|
-
? false
|
|
67
|
-
: true
|
|
68
|
-
);
|
|
69
|
-
} else {
|
|
70
|
-
this.render.transformer.resizeEnabled(true);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
|
|
74
52
|
// 清除连接线选中
|
|
75
53
|
this.render.linkTool.selectingClear();
|
|
76
54
|
// 选择变化了
|
|
@@ -96,6 +74,9 @@ export class SelectionTool {
|
|
|
96
74
|
listening: false, // 不可交互
|
|
97
75
|
opacity: node.opacity() * 0.8 // 设置透明度
|
|
98
76
|
});
|
|
77
|
+
if (node instanceof Konva.Group) {
|
|
78
|
+
node.findOne(".tooltip")?.visible(false); // 存在tooltip,选中组件时隐藏
|
|
79
|
+
}
|
|
99
80
|
}
|
|
100
81
|
|
|
101
82
|
// 提升层次
|
|
@@ -109,6 +90,36 @@ export class SelectionTool {
|
|
|
109
90
|
// 选中的节点,放进 transformer
|
|
110
91
|
this.render.transformer.nodes(this.selectingNodes);
|
|
111
92
|
}
|
|
93
|
+
|
|
94
|
+
// 设置 transformer 的 resize/rotate/draggable(必须在 selectingClear 和 transformer.nodes 之后)
|
|
95
|
+
const allLocked = nodes.length > 0 && nodes.every((n) => !!n.attrs.locked);
|
|
96
|
+
if (allLocked) {
|
|
97
|
+
this.render.transformer.resizeEnabled(false);
|
|
98
|
+
this.render.transformer.rotateEnabled(false);
|
|
99
|
+
this.render.transformer.draggable(false);
|
|
100
|
+
} else {
|
|
101
|
+
this.render.transformer.draggable(true);
|
|
102
|
+
if (nodes.length > 1) {
|
|
103
|
+
// 多选:允许改变大小和旋转
|
|
104
|
+
this.render.transformer.resizeEnabled(true);
|
|
105
|
+
this.render.transformer.rotateEnabled(true);
|
|
106
|
+
} else if (nodes.length === 1) {
|
|
107
|
+
const target = nodes[0];
|
|
108
|
+
// 图形 不能改变大小
|
|
109
|
+
this.render.transformer.resizeEnabled(
|
|
110
|
+
target.attrs.assetType === AssetType.Graph ? false : true
|
|
111
|
+
);
|
|
112
|
+
this.render.transformer.rotateEnabled(
|
|
113
|
+
target.attrs.assetType === AssetType.Graph &&
|
|
114
|
+
["Line", "Curve", "Bezier"].includes(target.attrs.graphType)
|
|
115
|
+
? false
|
|
116
|
+
: true
|
|
117
|
+
);
|
|
118
|
+
} else {
|
|
119
|
+
this.render.transformer.resizeEnabled(true);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
112
123
|
// 重绘
|
|
113
124
|
this.render.redraw([GraphDraw.name, LinkDraw.name]);
|
|
114
125
|
}
|
|
@@ -124,7 +135,7 @@ export class SelectionTool {
|
|
|
124
135
|
|
|
125
136
|
// 选择所有节点
|
|
126
137
|
selectAll() {
|
|
127
|
-
const nodes = this.render.layer.find('.asset') as Konva.
|
|
138
|
+
const nodes = this.render.layer.find('.asset') as Konva.Group[];
|
|
128
139
|
this.select(nodes);
|
|
129
140
|
}
|
|
130
141
|
}
|
|
@@ -13,6 +13,7 @@ export interface RenderConfig {
|
|
|
13
13
|
attractBg?: boolean;
|
|
14
14
|
attractNode?: boolean;
|
|
15
15
|
readonly?: boolean;
|
|
16
|
+
themeToken?: { [key: string]: any };
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export type RenderEvents = {
|
|
@@ -252,9 +253,6 @@ export interface PageSettings {
|
|
|
252
253
|
src: string;
|
|
253
254
|
code: string;
|
|
254
255
|
};
|
|
255
|
-
stroke: string;
|
|
256
|
-
strokeWidth: number;
|
|
257
|
-
fill: string;
|
|
258
256
|
linkStroke: string;
|
|
259
257
|
linkStrokeWidth: number;
|
|
260
258
|
fontSize: number;
|
|
@@ -265,9 +263,9 @@ export interface PageSettings {
|
|
|
265
263
|
* 素材设置
|
|
266
264
|
*/
|
|
267
265
|
export interface AssetSettings {
|
|
268
|
-
stroke
|
|
269
|
-
strokeWidth
|
|
270
|
-
fill
|
|
266
|
+
stroke?: string;
|
|
267
|
+
strokeWidth?: number;
|
|
268
|
+
fill?: string;
|
|
271
269
|
arrowStart: boolean;
|
|
272
270
|
arrowEnd: boolean;
|
|
273
271
|
fontSize: number;
|
|
@@ -277,6 +275,8 @@ export interface AssetSettings {
|
|
|
277
275
|
y: number;
|
|
278
276
|
rotation: number;
|
|
279
277
|
tension: number;
|
|
278
|
+
dataSource?: string;
|
|
279
|
+
order?: number; // 序号(工位自增序号)
|
|
280
280
|
}
|
|
281
281
|
|
|
282
282
|
/**
|
|
@@ -79,7 +79,7 @@ const ImageUpload: React.FC<UploadProps> = (props) => {
|
|
|
79
79
|
const url = handleImgUrl(basePath);
|
|
80
80
|
setFileList([{ ...info.file, url }]);
|
|
81
81
|
// onChange?.(url);
|
|
82
|
-
onChange?.({ src:
|
|
82
|
+
onChange?.({ src: basePath, code });
|
|
83
83
|
} else {
|
|
84
84
|
setFileList([...info.fileList]);
|
|
85
85
|
}
|
|
@@ -106,6 +106,7 @@ const ImageUpload: React.FC<UploadProps> = (props) => {
|
|
|
106
106
|
onChange={handleChange}
|
|
107
107
|
onRemove={handleDelete}
|
|
108
108
|
onPreview={() => window.open(fileList[0].url)}
|
|
109
|
+
styles={{ root: { overflow: "hidden" } }}
|
|
109
110
|
>
|
|
110
111
|
{fileList.length > 0 ? null : <div className={'upload-btn'}>
|
|
111
112
|
<PlusOutlined />
|