@logicflow/extension 1.2.20 → 1.2.23
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/cjs/tools/auto-layout/index.js +269 -0
- package/cjs/tools/flow-path/index.js +215 -0
- package/cjs/tools/snapshot/index.js +251 -0
- package/es/tools/auto-layout/index.d.ts +40 -0
- package/es/tools/auto-layout/index.js +266 -0
- package/es/tools/flow-path/index.d.ts +47 -0
- package/es/tools/flow-path/index.js +212 -0
- package/es/tools/snapshot/index.d.ts +26 -0
- package/es/tools/snapshot/index.js +248 -0
- package/lib/Snapshot.js +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 自动布局插件
|
|
4
|
+
* 依赖flowPath插件
|
|
5
|
+
* 未完善
|
|
6
|
+
*/
|
|
7
|
+
var __assign = (this && this.__assign) || function () {
|
|
8
|
+
__assign = Object.assign || function(t) {
|
|
9
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
10
|
+
s = arguments[i];
|
|
11
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
12
|
+
t[p] = s[p];
|
|
13
|
+
}
|
|
14
|
+
return t;
|
|
15
|
+
};
|
|
16
|
+
return __assign.apply(this, arguments);
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.AutoLayout = void 0;
|
|
20
|
+
var POSITION_TYPE = {
|
|
21
|
+
LEFT_TOP: -1,
|
|
22
|
+
LEFT: 0,
|
|
23
|
+
LEFT_BOTTOM: 1,
|
|
24
|
+
};
|
|
25
|
+
var AutoLayout = /** @class */ (function () {
|
|
26
|
+
function AutoLayout(_a) {
|
|
27
|
+
var _this = this;
|
|
28
|
+
var lf = _a.lf;
|
|
29
|
+
this.lf = lf;
|
|
30
|
+
/**
|
|
31
|
+
* 用于记录上一次调用layout时计算出的trunk
|
|
32
|
+
* 当旧trunk和新trunk长度一致时,用于选择旧trunk,
|
|
33
|
+
* a->b->c->d
|
|
34
|
+
* |->e
|
|
35
|
+
* e后面新增f节点时候,旧逻辑会返回新trunk[a,b,e,f]
|
|
36
|
+
* 界面布局变成
|
|
37
|
+
* a->b->e->f
|
|
38
|
+
* |->c->d
|
|
39
|
+
* 其实只想要这样 尽量少变化
|
|
40
|
+
* a->b->c->d
|
|
41
|
+
* |->e->f
|
|
42
|
+
* */
|
|
43
|
+
this.trunk = [];
|
|
44
|
+
// 给lf添加方法
|
|
45
|
+
lf.layout = function (startNodeType) {
|
|
46
|
+
var data = _this.lf.getGraphRawData();
|
|
47
|
+
_this.lf.setStartNodeType(startNodeType);
|
|
48
|
+
var path = _this.lf.getPathes();
|
|
49
|
+
_this.levelHeight = [];
|
|
50
|
+
_this.newNodeMap = new Map();
|
|
51
|
+
return _this.layout(data, path);
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// 1) 将所有节点和边的坐标删除。节点上的文本改成偏移量。
|
|
55
|
+
// 2) 找到长度最长的路径,作为基准路径。
|
|
56
|
+
// 3) 依次计算
|
|
57
|
+
// 拿到最长的路径。
|
|
58
|
+
// nodes: [], edges: [],
|
|
59
|
+
AutoLayout.prototype.layout = function (data, path) {
|
|
60
|
+
var _this = this;
|
|
61
|
+
var trunk = [];
|
|
62
|
+
path.forEach(function (p) {
|
|
63
|
+
var elements = p.elements;
|
|
64
|
+
if (elements.length > trunk.length) {
|
|
65
|
+
trunk = elements;
|
|
66
|
+
}
|
|
67
|
+
else if (elements.length === trunk.length) {
|
|
68
|
+
// 考虑是否替换为旧的trunk
|
|
69
|
+
if (JSON.stringify(elements) === JSON.stringify(_this.trunk)) {
|
|
70
|
+
trunk = _this.trunk;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
// 记录上一次trunk
|
|
75
|
+
this.trunk = trunk;
|
|
76
|
+
var nodeMap = this.formatData(data);
|
|
77
|
+
var newGraphData = {
|
|
78
|
+
nodes: [],
|
|
79
|
+
edges: [],
|
|
80
|
+
};
|
|
81
|
+
// 从后向前布局
|
|
82
|
+
for (var i = trunk.length - 1; i >= 0; i--) {
|
|
83
|
+
this.setNodePosition(trunk[i], nodeMap, newGraphData, i, 1);
|
|
84
|
+
}
|
|
85
|
+
this.lf.graphModel.graphDataToModel(newGraphData);
|
|
86
|
+
};
|
|
87
|
+
// 1) 需要知道下一层级已占高度。
|
|
88
|
+
// 2) 基于自己的高度,判断下一个层级的高度
|
|
89
|
+
AutoLayout.prototype.setNodePosition = function (nodeId, nodeMap, newGraphData, xLevel, yLevel) {
|
|
90
|
+
var _this = this;
|
|
91
|
+
var n = nodeMap[nodeId];
|
|
92
|
+
var text = n.text, type = n.type, next = n.next, properties = n.properties;
|
|
93
|
+
var x = xLevel * 160 + 40;
|
|
94
|
+
var y = yLevel * 120;
|
|
95
|
+
var nodeData = {
|
|
96
|
+
id: nodeId,
|
|
97
|
+
x: x,
|
|
98
|
+
text: text,
|
|
99
|
+
y: y,
|
|
100
|
+
type: type,
|
|
101
|
+
properties: properties,
|
|
102
|
+
};
|
|
103
|
+
if (text && typeof text === 'object') {
|
|
104
|
+
nodeData.text = __assign(__assign({}, text), { x: x + text.x, y: y + text.y });
|
|
105
|
+
}
|
|
106
|
+
this.newNodeMap.set(nodeData.id, {
|
|
107
|
+
x: nodeData.x,
|
|
108
|
+
y: nodeData.y,
|
|
109
|
+
type: type,
|
|
110
|
+
});
|
|
111
|
+
newGraphData.nodes.push(nodeData);
|
|
112
|
+
n.isFixed = true;
|
|
113
|
+
this.addLevelHeight(xLevel, 1);
|
|
114
|
+
if (next && next.length > 0) {
|
|
115
|
+
next.forEach(function (nextInfo) {
|
|
116
|
+
// 如果下一个节点还没有被定位,那么设置其定位
|
|
117
|
+
var n1 = nodeMap[nextInfo.nodeId];
|
|
118
|
+
if (!n1.isFixed) {
|
|
119
|
+
var nextYLevel = _this.getLevelHeight(xLevel + 1);
|
|
120
|
+
_this.addLevelHeight(xLevel, 1);
|
|
121
|
+
_this.setNodePosition(nextInfo.nodeId, nodeMap, newGraphData, xLevel + 1, nextYLevel + 1);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// todo: 如果下一个节点是已经定位的,则需要考虑边的规避
|
|
125
|
+
}
|
|
126
|
+
// 设置连接到下一个节点的边
|
|
127
|
+
// 1) 起始位置为source节点的下方,结束位置为target节点左边。
|
|
128
|
+
// 2) 计算折线
|
|
129
|
+
newGraphData.edges.push(__assign({ id: nextInfo.edgeId, type: nextInfo.edgeType, sourceNodeId: nodeId, targetNodeId: nextInfo.nodeId, properties: nextInfo.properties, text: nextInfo.text }, _this.getEdgeDataPoints(nodeId, nextInfo.nodeId)));
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
return nodeData;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* 1. 处理边上的文本
|
|
136
|
+
* 2. 主干节点之间直接的边
|
|
137
|
+
* 3. 一个节点被多个连接作为目标节点,合理分配锚点位置。
|
|
138
|
+
*/
|
|
139
|
+
AutoLayout.prototype.getEdgeDataPoints = function (sourceNodeId, targetNodeId) {
|
|
140
|
+
var source = this.newNodeMap.get(sourceNodeId);
|
|
141
|
+
var target = this.newNodeMap.get(targetNodeId);
|
|
142
|
+
var _a = this.getShape(sourceNodeId), width = _a.width, height = _a.height;
|
|
143
|
+
var _b = this.getShape(targetNodeId), targetWidth = _b.width, targetHeight = _b.height;
|
|
144
|
+
var positionType = this.getRelativePosition(source, target);
|
|
145
|
+
var startPoint = {
|
|
146
|
+
x: source.x,
|
|
147
|
+
y: source.y,
|
|
148
|
+
};
|
|
149
|
+
var endPoint = {
|
|
150
|
+
x: target.x,
|
|
151
|
+
y: target.y,
|
|
152
|
+
};
|
|
153
|
+
switch (positionType) {
|
|
154
|
+
case POSITION_TYPE.LEFT:
|
|
155
|
+
startPoint.x = source.x + width / 2;
|
|
156
|
+
endPoint.x = target.x - targetWidth / 2;
|
|
157
|
+
break;
|
|
158
|
+
case POSITION_TYPE.LEFT_TOP:
|
|
159
|
+
startPoint.y = source.y + height / 2;
|
|
160
|
+
endPoint.x = target.x - targetWidth / 2;
|
|
161
|
+
break;
|
|
162
|
+
case POSITION_TYPE.LEFT_BOTTOM:
|
|
163
|
+
startPoint.x = source.x + width / 2;
|
|
164
|
+
endPoint.y = target.y + targetHeight / 2;
|
|
165
|
+
break;
|
|
166
|
+
default:
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
startPoint: startPoint,
|
|
171
|
+
endPoint: endPoint,
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
/**
|
|
175
|
+
* 获取边的连接节点相对位置。
|
|
176
|
+
* source一定在target左边。
|
|
177
|
+
* 1. 如果source和target在同一x, y坐标内容。
|
|
178
|
+
* 2. 如果source在target左上方。
|
|
179
|
+
* 3. 如果source在target左下方。
|
|
180
|
+
*/
|
|
181
|
+
AutoLayout.prototype.getRelativePosition = function (source, target) {
|
|
182
|
+
var y = source.y;
|
|
183
|
+
var y1 = target.y;
|
|
184
|
+
var positionType;
|
|
185
|
+
if (y < y1) {
|
|
186
|
+
positionType = -1;
|
|
187
|
+
}
|
|
188
|
+
else if (y === y1) {
|
|
189
|
+
positionType = 0;
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
positionType = 1;
|
|
193
|
+
}
|
|
194
|
+
return positionType;
|
|
195
|
+
};
|
|
196
|
+
/**
|
|
197
|
+
* 获取边节点图形的宽高。
|
|
198
|
+
*/
|
|
199
|
+
AutoLayout.prototype.getShape = function (nodeId) {
|
|
200
|
+
var nodeModel = this.lf.getNodeModelById(nodeId);
|
|
201
|
+
return {
|
|
202
|
+
height: nodeModel.height,
|
|
203
|
+
width: nodeModel.width,
|
|
204
|
+
};
|
|
205
|
+
};
|
|
206
|
+
AutoLayout.prototype.formatData = function (data) {
|
|
207
|
+
var nodeMap = data.nodes.reduce(function (nMap, node) {
|
|
208
|
+
var type = node.type, properties = node.properties, text = node.text, x = node.x, y = node.y;
|
|
209
|
+
if (text && typeof text === 'object') {
|
|
210
|
+
// 坐标转换为偏移量
|
|
211
|
+
text.x = text.x - x;
|
|
212
|
+
text.y = text.y - y;
|
|
213
|
+
}
|
|
214
|
+
nMap[node.id] = {
|
|
215
|
+
type: type,
|
|
216
|
+
properties: properties,
|
|
217
|
+
text: text,
|
|
218
|
+
prev: [],
|
|
219
|
+
next: [],
|
|
220
|
+
};
|
|
221
|
+
return nMap;
|
|
222
|
+
}, {});
|
|
223
|
+
data.edges.forEach(function (edge) {
|
|
224
|
+
var sourceNodeId = edge.sourceNodeId, targetNodeId = edge.targetNodeId, id = edge.id, properties = edge.properties, text = edge.text;
|
|
225
|
+
var newText = text;
|
|
226
|
+
if (typeof text === 'object') {
|
|
227
|
+
newText = text.value;
|
|
228
|
+
}
|
|
229
|
+
nodeMap[sourceNodeId].next.push({
|
|
230
|
+
edgeId: id,
|
|
231
|
+
nodeId: targetNodeId,
|
|
232
|
+
edgeType: edge.type,
|
|
233
|
+
properties: properties,
|
|
234
|
+
text: newText,
|
|
235
|
+
});
|
|
236
|
+
nodeMap[targetNodeId].prev.push({
|
|
237
|
+
edgeId: id,
|
|
238
|
+
nodeId: sourceNodeId,
|
|
239
|
+
properties: properties,
|
|
240
|
+
text: newText,
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
return nodeMap;
|
|
244
|
+
};
|
|
245
|
+
AutoLayout.prototype.addLevelHeight = function (level, height, isNegative) {
|
|
246
|
+
if (height === void 0) { height = 1; }
|
|
247
|
+
if (isNegative === void 0) { isNegative = false; }
|
|
248
|
+
var l = this.levelHeight[level];
|
|
249
|
+
if (!l) {
|
|
250
|
+
l = {
|
|
251
|
+
positiveHeight: 0,
|
|
252
|
+
negativeHeight: 0,
|
|
253
|
+
};
|
|
254
|
+
this.levelHeight[level] = l;
|
|
255
|
+
}
|
|
256
|
+
isNegative ? (l.negativeHeight -= height) : (l.positiveHeight += height);
|
|
257
|
+
};
|
|
258
|
+
AutoLayout.prototype.getLevelHeight = function (level, isNegative) {
|
|
259
|
+
if (isNegative === void 0) { isNegative = false; }
|
|
260
|
+
var val = this.levelHeight[level];
|
|
261
|
+
if (!val) {
|
|
262
|
+
return 0;
|
|
263
|
+
}
|
|
264
|
+
return isNegative ? val.negativeHeight : val.positiveHeight;
|
|
265
|
+
};
|
|
266
|
+
AutoLayout.pluginName = 'AutoLayout';
|
|
267
|
+
return AutoLayout;
|
|
268
|
+
}());
|
|
269
|
+
exports.AutoLayout = AutoLayout;
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 路径插件,此插件支持获取绘制的图中所有的路径。
|
|
4
|
+
* 需要指定开始节点类型。
|
|
5
|
+
*/
|
|
6
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
7
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
8
|
+
if (!m) return o;
|
|
9
|
+
var i = m.call(o), r, ar = [], e;
|
|
10
|
+
try {
|
|
11
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
12
|
+
}
|
|
13
|
+
catch (error) { e = { error: error }; }
|
|
14
|
+
finally {
|
|
15
|
+
try {
|
|
16
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
17
|
+
}
|
|
18
|
+
finally { if (e) throw e.error; }
|
|
19
|
+
}
|
|
20
|
+
return ar;
|
|
21
|
+
};
|
|
22
|
+
var __spread = (this && this.__spread) || function () {
|
|
23
|
+
for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
+
exports.FlowPath = void 0;
|
|
28
|
+
var getBpmnId_1 = require("../../bpmn/getBpmnId");
|
|
29
|
+
var FlowPath = /** @class */ (function () {
|
|
30
|
+
function FlowPath(_a) {
|
|
31
|
+
var _this = this;
|
|
32
|
+
var lf = _a.lf;
|
|
33
|
+
this.lf = lf;
|
|
34
|
+
this.pathes = [];
|
|
35
|
+
// 给lf添加方法
|
|
36
|
+
lf.getPathes = function () {
|
|
37
|
+
if (!_this.startNodeType) {
|
|
38
|
+
throw new Error('需要预先指定开始节点类型');
|
|
39
|
+
}
|
|
40
|
+
return _this.getPathes();
|
|
41
|
+
};
|
|
42
|
+
lf.setRawPathes = function (pathes) {
|
|
43
|
+
_this.setPathes(pathes);
|
|
44
|
+
};
|
|
45
|
+
lf.getRawPathes = function () { return _this.pathes; };
|
|
46
|
+
lf.setStartNodeType = function (type) {
|
|
47
|
+
_this.startNodeType = type;
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
FlowPath.prototype.setPathes = function (pathes) {
|
|
51
|
+
this.pathes = pathes.map(function (_a) {
|
|
52
|
+
var routeId = _a.routeId, name = _a.name, elements = _a.elements, type = _a.type;
|
|
53
|
+
return ({
|
|
54
|
+
routeId: routeId,
|
|
55
|
+
name: name,
|
|
56
|
+
elements: elements,
|
|
57
|
+
type: type,
|
|
58
|
+
similarElement: null,
|
|
59
|
+
weight: 0,
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
FlowPath.prototype.getPathes = function () {
|
|
64
|
+
var _this = this;
|
|
65
|
+
var graphData = this.lf.getGraphRawData();
|
|
66
|
+
var nodesMap = new Map();
|
|
67
|
+
var startNodeIds = [];
|
|
68
|
+
graphData.nodes.forEach(function (node) {
|
|
69
|
+
nodesMap.set(node.id, {
|
|
70
|
+
id: node.id,
|
|
71
|
+
data: node,
|
|
72
|
+
nextNodes: [],
|
|
73
|
+
});
|
|
74
|
+
if (node.type === _this.startNodeType) {
|
|
75
|
+
startNodeIds.push(node.id);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
graphData.edges.forEach(function (edge) {
|
|
79
|
+
var node = nodesMap.get(edge.sourceNodeId);
|
|
80
|
+
node.nextNodes.push(edge.targetNodeId);
|
|
81
|
+
});
|
|
82
|
+
var pathElements = [];
|
|
83
|
+
startNodeIds.forEach(function (id) {
|
|
84
|
+
pathElements = pathElements.concat(_this.findPathElements(nodesMap.get(id), nodesMap, []));
|
|
85
|
+
});
|
|
86
|
+
return this.getNewPathes(pathElements);
|
|
87
|
+
};
|
|
88
|
+
FlowPath.prototype.findPathElements = function (node, nodesMap, elements) {
|
|
89
|
+
if (elements === void 0) { elements = []; }
|
|
90
|
+
var newPathes = __spread(elements);
|
|
91
|
+
newPathes.push(node.id);
|
|
92
|
+
if (node.nextNodes.length === 0) {
|
|
93
|
+
return [newPathes];
|
|
94
|
+
}
|
|
95
|
+
var subPath = [];
|
|
96
|
+
for (var i = 0; i < node.nextNodes.length; i++) {
|
|
97
|
+
var n = nodesMap.get(node.nextNodes[i]);
|
|
98
|
+
var p = void 0;
|
|
99
|
+
// 循环路径
|
|
100
|
+
var idx = newPathes.indexOf(n.id);
|
|
101
|
+
if (idx !== -1) {
|
|
102
|
+
p = [__spread(newPathes.slice(idx), [n.id])];
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
p = this.findPathElements(n, nodesMap, __spread(newPathes));
|
|
106
|
+
}
|
|
107
|
+
subPath = subPath.concat(p);
|
|
108
|
+
}
|
|
109
|
+
return subPath;
|
|
110
|
+
};
|
|
111
|
+
/**
|
|
112
|
+
* 设置路径id
|
|
113
|
+
* 如果存在原始路径Id, 则需要比较新路径是否在原始路径中存在相似路径
|
|
114
|
+
* 如果有,则尽量使用原始路径。
|
|
115
|
+
* 相似路径
|
|
116
|
+
* 1. 如果所有的节点都相同,则必定为同一路径。(包括顺序不同)
|
|
117
|
+
* 2. 如果新路径比原来路径少了或者多了部分节点,则记录为相似路径。基于不同的差异,标记不同的权重。
|
|
118
|
+
* 3. 基于新路径在旧路径占用权限,设置新路径Id.
|
|
119
|
+
* 4. 如果某一条旧路径被多条新路径标记为相同的权重,则这两条新路径都使用新Id.
|
|
120
|
+
*/
|
|
121
|
+
FlowPath.prototype.getNewPathes = function (pathElements) {
|
|
122
|
+
var _this = this;
|
|
123
|
+
var pathes = [];
|
|
124
|
+
// 由于循环路径不包括开始,所以存在重复的情况,此处去重。
|
|
125
|
+
var LoopSet = new Set();
|
|
126
|
+
pathElements.forEach(function (elements) {
|
|
127
|
+
var routeId = _this.getNewId('path');
|
|
128
|
+
var name = _this.getNewId('路径');
|
|
129
|
+
var isLoop = _this.isLoopPath(elements);
|
|
130
|
+
var elementStr = elements.join(',');
|
|
131
|
+
if (!LoopSet.has(elementStr)) {
|
|
132
|
+
LoopSet.add(elementStr);
|
|
133
|
+
pathes.push({
|
|
134
|
+
routeId: routeId,
|
|
135
|
+
name: name,
|
|
136
|
+
elements: elements,
|
|
137
|
+
type: isLoop,
|
|
138
|
+
weight: 0,
|
|
139
|
+
similarElement: '',
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
var oldPathes = JSON.parse(JSON.stringify(this.pathes));
|
|
144
|
+
// 1) 找到所有路径最相似的路径, 给旧路径标记其最接近的路径
|
|
145
|
+
pathes.forEach(function (newPath) {
|
|
146
|
+
for (var i = 0; i < oldPathes.length; i++) {
|
|
147
|
+
var oldPath = oldPathes[i];
|
|
148
|
+
var weight = _this.similar2Path(__spread(newPath.elements), __spread(oldPath.elements));
|
|
149
|
+
if (weight > newPath.weight && oldPath.weight <= weight) {
|
|
150
|
+
newPath.weight = weight;
|
|
151
|
+
newPath.similarElement = oldPath;
|
|
152
|
+
if (weight === oldPath.weight && oldPath.similarElement) {
|
|
153
|
+
// 特殊处理,如果两个路径都与同一条旧路径有相似的权重,则这两个路径的相似路径都置空
|
|
154
|
+
oldPath.similarElement.similarElement = null;
|
|
155
|
+
oldPath.similarElement.weight = 0;
|
|
156
|
+
oldPath.similarElement = null;
|
|
157
|
+
oldPath.weight = 0;
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
oldPath.similarElement = newPath;
|
|
161
|
+
oldPath.weight = weight;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
// 2) 再次遍历所有路径,如果该路径的相似路径对应的相似路径是自己,那么就设置该路径id和name为其相似路径。
|
|
167
|
+
pathes.forEach(function (newPath) {
|
|
168
|
+
if (newPath.similarElement && newPath.similarElement.similarElement === newPath) {
|
|
169
|
+
newPath.routeId = newPath.similarElement.routeId;
|
|
170
|
+
newPath.name = newPath.similarElement.name;
|
|
171
|
+
}
|
|
172
|
+
delete newPath.similarElement;
|
|
173
|
+
delete newPath.weight;
|
|
174
|
+
});
|
|
175
|
+
this.setPathes(pathes);
|
|
176
|
+
return pathes;
|
|
177
|
+
};
|
|
178
|
+
FlowPath.prototype.similar2Path = function (x, y) {
|
|
179
|
+
var z = 0;
|
|
180
|
+
var s = x.length + y.length;
|
|
181
|
+
x.sort();
|
|
182
|
+
y.sort();
|
|
183
|
+
var a = x.shift();
|
|
184
|
+
var b = y.shift();
|
|
185
|
+
while (a !== undefined && b !== undefined) {
|
|
186
|
+
if (a === b) {
|
|
187
|
+
z++;
|
|
188
|
+
a = x.shift();
|
|
189
|
+
b = y.shift();
|
|
190
|
+
}
|
|
191
|
+
else if (a < b) {
|
|
192
|
+
a = x.shift();
|
|
193
|
+
}
|
|
194
|
+
else if (a > b) {
|
|
195
|
+
b = y.shift();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return (z / s) * 200;
|
|
199
|
+
};
|
|
200
|
+
FlowPath.prototype.getNewId = function (prefix) {
|
|
201
|
+
return prefix + "_" + getBpmnId_1.getBpmnId();
|
|
202
|
+
};
|
|
203
|
+
/**
|
|
204
|
+
* 判断是否为循环路径
|
|
205
|
+
* 由于前面进行了特殊处理,将循环部分单独提出来作为路径
|
|
206
|
+
* 所有循环路径必定开始节点等于结束节点。
|
|
207
|
+
*/
|
|
208
|
+
FlowPath.prototype.isLoopPath = function (elements) {
|
|
209
|
+
var length = elements.length;
|
|
210
|
+
return elements.indexOf(elements[length - 1]) !== length - 1 ? 1 : 0;
|
|
211
|
+
};
|
|
212
|
+
FlowPath.pluginName = 'flowPath';
|
|
213
|
+
return FlowPath;
|
|
214
|
+
}());
|
|
215
|
+
exports.FlowPath = FlowPath;
|