@logicflow/layout 1.2.0-alpha.15 → 2.0.0

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/es/dagre.js CHANGED
@@ -9,135 +9,373 @@ var __assign = (this && this.__assign) || function () {
9
9
  };
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
- var __read = (this && this.__read) || function (o, n) {
13
- var m = typeof Symbol === "function" && o[Symbol.iterator];
14
- if (!m) return o;
15
- var i = m.call(o), r, ar = [], e;
16
- try {
17
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
18
- }
19
- catch (error) { e = { error: error }; }
20
- finally {
21
- try {
22
- if (r && !r.done && (m = i["return"])) m.call(i);
12
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
13
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
14
+ if (ar || !(i in from)) {
15
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
16
+ ar[i] = from[i];
23
17
  }
24
- finally { if (e) throw e.error; }
25
18
  }
26
- return ar;
19
+ return to.concat(ar || Array.prototype.slice.call(from));
27
20
  };
28
- import { DagreLayout } from '@antv/layout';
21
+ import dagre, { graphlib } from 'dagre';
22
+ /**
23
+ * Dagre布局类 - LogicFlow自动布局插件
24
+ * 基于dagre.js提供图的自动布局能力
25
+ */
29
26
  var Dagre = /** @class */ (function () {
30
27
  function Dagre() {
31
28
  }
29
+ /**
30
+ * 插件初始化方法,由LogicFlow自动调用
31
+ * @param lf - LogicFlow实例
32
+ */
32
33
  Dagre.prototype.render = function (lf) {
33
34
  this.lf = lf;
34
35
  };
35
36
  /**
36
- * option: {
37
- * rankdir: "TB", // layout 方向, 可选 TB, BT, LR, RL
38
- * align: undefined, // 节点对齐方式,可选 UL, UR, DL, DR
39
- * nodeSize: undefined, // 节点大小
40
- * nodesepFunc: undefined, // 节点水平间距(px)
41
- * ranksepFunc: undefined, // 每一层节点之间间距
42
- * nodesep: 50, // 节点水平间距(px)
43
- * ranksep: 50, // 每一层节点之间间距
44
- * controlPoints: false, // 是否保留布局连线的控制点
45
- * radial: false, // 是否基于 dagre 进行辐射布局
46
- * focusNode: null, // radial 为 true 时生效,关注的节点
47
- * };
37
+ * 执行布局算法,重新排列图中的节点和边
38
+ * @param option - 布局配置选项
48
39
  */
49
40
  Dagre.prototype.layout = function (option) {
50
41
  var _this = this;
51
42
  if (option === void 0) { option = {}; }
52
- var _a = this.lf.graphModel, nodes = _a.nodes, edges = _a.edges;
53
- this.option = __assign({ type: 'dagre', rankdir: 'LR', nodesep: 20, begin: [100, 100] }, option);
54
- var layoutInstance = new DagreLayout(this.option);
55
- var layoutData = layoutInstance.layout({
56
- nodes: nodes.map(function (node) { return ({
43
+ var _a = this.lf.graphModel, nodes = _a.nodes, edges = _a.edges, gridSize = _a.gridSize;
44
+ // 根据网格大小调整节点间距
45
+ var nodesep = 100;
46
+ var ranksep = 150;
47
+ if (gridSize > 20) {
48
+ nodesep = gridSize * 2;
49
+ ranksep = gridSize * 2;
50
+ }
51
+ // 合并默认配置和用户配置
52
+ this.option = __assign({
53
+ // 默认从左到右布局
54
+ rankdir: 'LR',
55
+ // 默认右下角对齐
56
+ align: 'UL',
57
+ // 紧凑树形排名算法
58
+ ranker: 'tight-tree',
59
+ // 层级间距
60
+ ranksep: ranksep,
61
+ // 同层节点间距
62
+ nodesep: nodesep,
63
+ // 图的水平边距
64
+ marginx: 120,
65
+ // 图的垂直边距
66
+ marginy: 120 }, option);
67
+ // 创建dagre图实例
68
+ var g = new graphlib.Graph();
69
+ g.setGraph(this.option);
70
+ g.setDefaultEdgeLabel(function () { return ({}); });
71
+ // 将LogicFlow节点添加到dagre图中
72
+ nodes.forEach(function (node) {
73
+ g.setNode(node.id, {
74
+ width: node.width || 150,
75
+ height: node.height || 50,
57
76
  id: node.id,
58
- size: {
59
- width: node.width,
60
- height: node.height,
61
- },
62
- model: node,
63
- }); }),
64
- edges: edges.map(function (edge) { return ({
65
- source: edge.sourceNodeId,
66
- target: edge.targetNodeId,
67
- model: edge,
68
- }); }),
77
+ });
69
78
  });
70
- var newGraphData = {
71
- nodes: [],
72
- edges: [],
73
- };
74
- layoutData.nodes.forEach(function (node) {
75
- // @ts-ignore: pass node data
76
- var model = node.model;
77
- var data = model.getData();
78
- // @ts-ignore: pass node data
79
- data.x = node.x;
80
- // @ts-ignore: pass node data
81
- data.y = node.y;
82
- newGraphData.nodes.push(data);
79
+ // 将LogicFlow边添加到dagre图中
80
+ edges.forEach(function (edge) {
81
+ g.setEdge(edge.sourceNodeId, edge.targetNodeId, {
82
+ id: edge.id,
83
+ });
83
84
  });
84
- layoutData.edges.forEach(function (edge) {
85
- // @ts-ignore: pass edge data
86
- var model = edge.model;
87
- var data = model.getData();
88
- data.pointsList = _this.calcPointsList(model, newGraphData.nodes);
89
- if (data.pointsList) {
90
- var _a = __read(data.pointsList, 4), first = _a[0], next = _a[1], third = _a[2], last = _a[3];
91
- data.startPoint = { x: first.x, y: first.y };
92
- data.endPoint = { x: last.x, y: last.y };
93
- if (data.text && data.text.value) {
94
- data.text = {
95
- x: (third.x + last.x) / 2,
96
- y: last.y,
97
- value: data.text.value,
98
- };
99
- }
85
+ // 执行dagre布局算法
86
+ dagre.layout(g);
87
+ // 存储新的节点和边数据
88
+ var newNodes = [];
89
+ var newEdges = [];
90
+ // 更新节点位置
91
+ nodes.forEach(function (node) {
92
+ var _a;
93
+ var _b = g.node(node.id), x = _b.x, y = _b.y;
94
+ var lfNode = node.getData();
95
+ if (!lfNode) {
96
+ throw new Error("\u5E03\u5C40\u9519\u8BEF\uFF1A\u627E\u4E0D\u5230ID\u4E3A ".concat(node.id, " \u7684\u8282\u70B9"));
97
+ }
98
+ // 更新节点坐标
99
+ lfNode.x = x;
100
+ lfNode.y = y;
101
+ // 更新节点文本位置
102
+ if ((_a = lfNode === null || lfNode === void 0 ? void 0 : lfNode.text) === null || _a === void 0 ? void 0 : _a.x) {
103
+ lfNode.text.x = x;
104
+ lfNode.text.y = y;
105
+ }
106
+ newNodes.push(lfNode);
107
+ });
108
+ // 处理边的路径和锚点
109
+ edges.forEach(function (edge) {
110
+ var lfEdge = edge.getData();
111
+ if (!lfEdge) {
112
+ return;
113
+ }
114
+ if (!option.isDefaultAnchor) {
115
+ // 自定义锚点,不调整边的关联锚点,只清除路径相关数据,让LogicFlow自动计算
116
+ delete lfEdge.pointsList;
117
+ delete lfEdge.startPoint;
118
+ delete lfEdge.endPoint;
100
119
  }
101
120
  else {
102
- data.startPoint = undefined;
103
- data.endPoint = undefined;
104
- if (data.text && data.text.value) {
105
- data.text = data.text.value;
121
+ // 默认锚点,重新计算路径以及边的起点和终点(节点默认锚点为上下左右)
122
+ delete lfEdge.pointsList;
123
+ delete lfEdge.startPoint;
124
+ delete lfEdge.endPoint;
125
+ delete lfEdge.sourceAnchorId;
126
+ delete lfEdge.targetAnchorId;
127
+ var model = _this.lf.getEdgeModelById(edge.id);
128
+ if (model) {
129
+ // 计算自定义折线路径
130
+ lfEdge.pointsList = _this.calcPointsList(model, newNodes);
131
+ }
132
+ if (lfEdge.pointsList) {
133
+ // 设置边的起点和终点
134
+ var first = lfEdge.pointsList[0];
135
+ var last = lfEdge.pointsList[lfEdge.pointsList.length - 1];
136
+ lfEdge.startPoint = { x: first.x, y: first.y };
137
+ lfEdge.endPoint = { x: last.x, y: last.y };
138
+ // 调整边标签位置
139
+ if (lfEdge.text && lfEdge.text.value) {
140
+ lfEdge.text = {
141
+ x: last.x - _this.getBytesLength(lfEdge.text.value) * 6 - 10,
142
+ y: last.y,
143
+ value: lfEdge.text.value,
144
+ };
145
+ }
146
+ }
147
+ else if (lfEdge.text && lfEdge.text.value) {
148
+ // 没有自定义路径时保留文本内容
149
+ lfEdge.text = lfEdge.text.value;
106
150
  }
107
151
  }
108
- newGraphData.edges.push(data);
152
+ newEdges.push(lfEdge);
153
+ });
154
+ // 将计算好的布局数据应用到画布
155
+ this.lf.renderRawData({
156
+ nodes: newNodes,
157
+ edges: newEdges,
109
158
  });
110
- this.lf.render(newGraphData);
111
159
  };
160
+ /**
161
+ * 计算字符串显示宽度(用于文本定位)
162
+ * @param word - 要计算的文本
163
+ * @returns 估算的文本像素宽度
164
+ */
165
+ Dagre.prototype.getBytesLength = function (word) {
166
+ if (!word) {
167
+ return 0;
168
+ }
169
+ var totalLength = 0;
170
+ for (var i = 0; i < word.length; i++) {
171
+ var c = word.charCodeAt(i);
172
+ // 大写字母宽度加权
173
+ if (word.match(/[A-Z]/)) {
174
+ totalLength += 1.5;
175
+ }
176
+ // ASCII字符和半角字符
177
+ else if ((c >= 0x0001 && c <= 0x007e) || (c >= 0xff60 && c <= 0xff9f)) {
178
+ totalLength += 1;
179
+ }
180
+ // 其他字符(如中文)
181
+ else {
182
+ totalLength += 2;
183
+ }
184
+ }
185
+ return totalLength;
186
+ };
187
+ /**
188
+ * 优化折线路径点,移除冗余点
189
+ * @param points - 原始路径点数组
190
+ * @returns 优化后的路径点数组
191
+ */
192
+ Dagre.prototype.pointFilter = function (points) {
193
+ var allPoints = __spreadArray([], points, true); // 创建副本避免修改原始数据
194
+ var i = 1;
195
+ // 删除直线上的中间点(保持路径简洁)
196
+ while (i < allPoints.length - 1) {
197
+ var pre = allPoints[i - 1];
198
+ var current = allPoints[i];
199
+ var next = allPoints[i + 1];
200
+ // 如果三点共线,移除中间点
201
+ if ((pre.x === current.x && current.x === next.x) || // 垂直线上的点
202
+ (pre.y === current.y && current.y === next.y)) {
203
+ // 水平线上的点
204
+ allPoints.splice(i, 1);
205
+ }
206
+ else {
207
+ i++;
208
+ }
209
+ }
210
+ return allPoints;
211
+ };
212
+ /**
213
+ * 计算边的折线路径点
214
+ * @param model - 边模型
215
+ * @param nodes - 节点数据数组
216
+ * @returns 计算后的路径点数组,如果无法计算则返回undefined
217
+ */
112
218
  Dagre.prototype.calcPointsList = function (model, nodes) {
113
- console.log(this.option.rankdir, model.modelType);
114
- // 在节点确认从左向右后,通过计算来保证节点连线清晰。
219
+ var pointsList = [];
220
+ // 获取源节点和目标节点的模型与布局数据
221
+ var sourceNodeModel = this.lf.getNodeModelById(model.sourceNodeId);
222
+ var targetNodeModel = this.lf.getNodeModelById(model.targetNodeId);
223
+ var newSourceNodeData = nodes.find(function (node) { return node.id === model.sourceNodeId; });
224
+ var newTargetNodeData = nodes.find(function (node) { return node.id === model.targetNodeId; });
225
+ // 数据验证
226
+ if (!sourceNodeModel ||
227
+ !targetNodeModel ||
228
+ !newSourceNodeData ||
229
+ !newTargetNodeData) {
230
+ return undefined;
231
+ }
232
+ // 折线偏移量(用于创建合适的转折点)
233
+ var offset = Number(model.offset) || 50;
234
+ // 处理从左到右(LR)布局的边路径
115
235
  if (this.option.rankdir === 'LR' && model.modelType === 'polyline-edge') {
116
- var sourceNodeModel = this.lf.getNodeModelById(model.sourceNodeId);
117
- var targetNodeModel = this.lf.getNodeModelById(model.targetNodeId);
118
- var newSourceNodeData = nodes.find(function (node) { return node.id === model.sourceNodeId; });
119
- var newTargetNodeData = nodes.find(function (node) { return node.id === model.targetNodeId; });
120
- var firstPoint = {
121
- x: newSourceNodeData.x + sourceNodeModel.width / 2,
122
- y: newSourceNodeData.y,
123
- };
124
- var nextPoint = {
125
- x: newSourceNodeData.x + sourceNodeModel.width / 2 + (model.offset || 50),
126
- y: newSourceNodeData.y,
127
- };
128
- var thirdPoint = {
129
- x: newSourceNodeData.x + sourceNodeModel.width / 2 + (model.offset || 50),
130
- y: newTargetNodeData.y,
131
- };
132
- var lastPoint = {
133
- x: newTargetNodeData.x - targetNodeModel.width / 2,
134
- y: newTargetNodeData.y,
135
- };
136
- return [firstPoint, nextPoint, thirdPoint, lastPoint];
236
+ // 正向连线:源节点在目标节点左侧
237
+ if (newSourceNodeData.x < newTargetNodeData.x) {
238
+ // 从源节点右侧中心出发
239
+ pointsList.push({
240
+ x: newSourceNodeData.x + sourceNodeModel.width / 2,
241
+ y: newSourceNodeData.y,
242
+ });
243
+ // 向右延伸一段距离
244
+ pointsList.push({
245
+ x: newSourceNodeData.x + sourceNodeModel.width / 2 + offset,
246
+ y: newSourceNodeData.y,
247
+ });
248
+ // 垂直移动到目标节点的高度
249
+ pointsList.push({
250
+ x: newSourceNodeData.x + sourceNodeModel.width / 2 + offset,
251
+ y: newTargetNodeData.y,
252
+ });
253
+ // 连接到目标节点左侧中心
254
+ pointsList.push({
255
+ x: newTargetNodeData.x - targetNodeModel.width / 2,
256
+ y: newTargetNodeData.y,
257
+ });
258
+ return this.pointFilter(pointsList);
259
+ }
260
+ // 反向连线:源节点在目标节点右侧
261
+ if (newSourceNodeData.x > newTargetNodeData.x) {
262
+ // 根据节点相对Y轴位置选择不同路径
263
+ if (newSourceNodeData.y >= newTargetNodeData.y) {
264
+ // 源节点在目标节点的右下方,从源节点上方出发
265
+ pointsList.push({
266
+ x: newSourceNodeData.x,
267
+ y: newSourceNodeData.y + sourceNodeModel.height / 2,
268
+ });
269
+ pointsList.push({
270
+ x: newSourceNodeData.x,
271
+ y: newSourceNodeData.y + sourceNodeModel.height / 2 + offset,
272
+ });
273
+ pointsList.push({
274
+ x: newTargetNodeData.x,
275
+ y: newSourceNodeData.y + sourceNodeModel.height / 2 + offset,
276
+ });
277
+ pointsList.push({
278
+ x: newTargetNodeData.x,
279
+ y: newTargetNodeData.y + targetNodeModel.height / 2,
280
+ });
281
+ }
282
+ else {
283
+ // 源节点在目标节点的右上方,从源节点下方出发
284
+ pointsList.push({
285
+ x: newSourceNodeData.x,
286
+ y: newSourceNodeData.y - sourceNodeModel.height / 2,
287
+ });
288
+ pointsList.push({
289
+ x: newSourceNodeData.x,
290
+ y: newSourceNodeData.y - sourceNodeModel.height / 2 - offset,
291
+ });
292
+ pointsList.push({
293
+ x: newTargetNodeData.x,
294
+ y: newSourceNodeData.y - sourceNodeModel.height / 2 - offset,
295
+ });
296
+ pointsList.push({
297
+ x: newTargetNodeData.x,
298
+ y: newTargetNodeData.y - targetNodeModel.height / 2,
299
+ });
300
+ }
301
+ return this.pointFilter(pointsList);
302
+ }
303
+ }
304
+ // 处理从上到下(TB)布局的边路径
305
+ if (this.option.rankdir === 'TB' && model.modelType === 'polyline-edge') {
306
+ // 正向连线:源节点在目标节点上方
307
+ if (newSourceNodeData.y < newTargetNodeData.y) {
308
+ // 从源节点底部中心出发
309
+ pointsList.push({
310
+ x: newSourceNodeData.x,
311
+ y: newSourceNodeData.y + sourceNodeModel.height / 2,
312
+ });
313
+ // 向下延伸一段距离
314
+ pointsList.push({
315
+ x: newSourceNodeData.x,
316
+ y: newSourceNodeData.y + sourceNodeModel.height / 2 + offset,
317
+ });
318
+ // 水平移动到目标节点的位置
319
+ pointsList.push({
320
+ x: newTargetNodeData.x,
321
+ y: newSourceNodeData.y + sourceNodeModel.height / 2 + offset,
322
+ });
323
+ // 连接到目标节点顶部中心
324
+ pointsList.push({
325
+ x: newTargetNodeData.x,
326
+ y: newTargetNodeData.y - targetNodeModel.height / 2,
327
+ });
328
+ return this.pointFilter(pointsList);
329
+ }
330
+ // 反向连线:源节点在目标节点下方
331
+ if (newSourceNodeData.y > newTargetNodeData.y) {
332
+ if (newSourceNodeData.x >= newTargetNodeData.x) {
333
+ // 源节点在目标节点右下方,从源节点右侧出发
334
+ pointsList.push({
335
+ x: newSourceNodeData.x + sourceNodeModel.width / 2,
336
+ y: newSourceNodeData.y,
337
+ });
338
+ pointsList.push({
339
+ x: newSourceNodeData.x + sourceNodeModel.width / 2 + offset,
340
+ y: newSourceNodeData.y,
341
+ });
342
+ pointsList.push({
343
+ x: newSourceNodeData.x + sourceNodeModel.width / 2 + offset,
344
+ y: newTargetNodeData.y,
345
+ });
346
+ pointsList.push({
347
+ x: newTargetNodeData.x + targetNodeModel.width / 2,
348
+ y: newTargetNodeData.y,
349
+ });
350
+ }
351
+ else {
352
+ // 源节点在目标节点左下方,从源节点左侧出发
353
+ pointsList.push({
354
+ x: newSourceNodeData.x - sourceNodeModel.width / 2,
355
+ y: newSourceNodeData.y,
356
+ });
357
+ pointsList.push({
358
+ x: newSourceNodeData.x - sourceNodeModel.width / 2 - offset,
359
+ y: newSourceNodeData.y,
360
+ });
361
+ pointsList.push({
362
+ x: newSourceNodeData.x - sourceNodeModel.width / 2 - offset,
363
+ y: newTargetNodeData.y,
364
+ });
365
+ pointsList.push({
366
+ x: newTargetNodeData.x - targetNodeModel.width / 2,
367
+ y: newTargetNodeData.y,
368
+ });
369
+ }
370
+ return this.pointFilter(pointsList);
371
+ }
137
372
  }
373
+ // 无法确定路径时返回undefined,让LogicFlow自行处理
138
374
  return undefined;
139
375
  };
376
+ /** 插件名称,用于在LogicFlow中注册 */
140
377
  Dagre.pluginName = 'dagre';
141
378
  return Dagre;
142
379
  }());
143
380
  export { Dagre };
381
+ //# sourceMappingURL=dagre.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dagre.js","sourceRoot":"","sources":["../src/dagre.ts"],"names":[],"mappings":"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"}
package/es/index.js CHANGED
@@ -1 +1,2 @@
1
1
  export * from './dagre';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
package/lib/dagre.d.ts ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview Dagre布局插件 - 提供自动化图形布局功能
3
+ *
4
+ * 本插件基于dagre.js实现LogicFlow的自动化布局功能,支持多种布局方向
5
+ * 可自动计算节点位置和连线路径,实现整洁的图形展示
6
+ */
7
+ import LogicFlow, { BaseEdgeModel } from '@logicflow/core';
8
+ import { GraphLabel } from 'dagre';
9
+ import NodeConfig = LogicFlow.NodeConfig;
10
+ import Point = LogicFlow.Point;
11
+ /**
12
+ * Dagre布局配置选项接口
13
+ * @interface DagreOption
14
+ * @extends GraphLabel - 继承dagre原生配置
15
+ */
16
+ export interface DagreOption extends GraphLabel {
17
+ /**
18
+ * 是否是默认锚点
19
+ * true: 会根据布局方向自动计算边的路径点
20
+ */
21
+ isDefaultAnchor?: boolean;
22
+ }
23
+ /**
24
+ * Dagre插件接口定义
25
+ */
26
+ export interface DagrePlugin {
27
+ /**
28
+ * 执行布局计算
29
+ * @param option - 布局配置选项
30
+ */
31
+ layout(option: DagreOption): void;
32
+ }
33
+ /**
34
+ * Dagre布局类 - LogicFlow自动布局插件
35
+ * 基于dagre.js提供图的自动布局能力
36
+ */
37
+ export declare class Dagre {
38
+ /** 插件名称,用于在LogicFlow中注册 */
39
+ static pluginName: string;
40
+ /** LogicFlow实例引用 */
41
+ lf: LogicFlow;
42
+ /** 当前布局配置 */
43
+ option: DagreOption;
44
+ /**
45
+ * 插件初始化方法,由LogicFlow自动调用
46
+ * @param lf - LogicFlow实例
47
+ */
48
+ render(lf: LogicFlow): void;
49
+ /**
50
+ * 执行布局算法,重新排列图中的节点和边
51
+ * @param option - 布局配置选项
52
+ */
53
+ layout(option?: DagreOption): void;
54
+ /**
55
+ * 计算字符串显示宽度(用于文本定位)
56
+ * @param word - 要计算的文本
57
+ * @returns 估算的文本像素宽度
58
+ */
59
+ getBytesLength(word: string): number;
60
+ /**
61
+ * 优化折线路径点,移除冗余点
62
+ * @param points - 原始路径点数组
63
+ * @returns 优化后的路径点数组
64
+ */
65
+ pointFilter(points: Point[]): Point[];
66
+ /**
67
+ * 计算边的折线路径点
68
+ * @param model - 边模型
69
+ * @param nodes - 节点数据数组
70
+ * @returns 计算后的路径点数组,如果无法计算则返回undefined
71
+ */
72
+ calcPointsList(model: BaseEdgeModel, nodes: NodeConfig[]): Point[] | undefined;
73
+ }