@logicflow/layout 1.2.0-alpha.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -0
- package/cjs/dagre.js +146 -0
- package/cjs/index.js +13 -0
- package/es/dagre.d.ts +26 -0
- package/es/dagre.js +143 -0
- package/es/index.d.ts +1 -0
- package/es/index.js +1 -0
- package/lib/dagre.js +24 -0
- package/package.json +85 -0
- package/types/dagre.d.ts +26 -0
- package/types/index.d.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# layout
|
|
2
|
+
|
|
3
|
+
layout 扩展包
|
|
4
|
+
|
|
5
|
+
## 使用方式
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
import LogicFlow from '@logicflow/core';
|
|
9
|
+
import { dagre } from '@logicflow/layout';
|
|
10
|
+
|
|
11
|
+
const lf = new LogicFlow({
|
|
12
|
+
container: '#app',
|
|
13
|
+
plugin: [dagre]
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
lf.extension.dagre.layout()
|
|
17
|
+
```
|
package/cjs/dagre.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
+
if (!m) return o;
|
|
16
|
+
var i = m.call(o), r, ar = [], e;
|
|
17
|
+
try {
|
|
18
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
+
}
|
|
20
|
+
catch (error) { e = { error: error }; }
|
|
21
|
+
finally {
|
|
22
|
+
try {
|
|
23
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
+
}
|
|
25
|
+
finally { if (e) throw e.error; }
|
|
26
|
+
}
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.Dagre = void 0;
|
|
31
|
+
var layout_1 = require("@antv/layout");
|
|
32
|
+
var Dagre = /** @class */ (function () {
|
|
33
|
+
function Dagre() {
|
|
34
|
+
}
|
|
35
|
+
Dagre.prototype.render = function (lf) {
|
|
36
|
+
this.lf = lf;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* option: {
|
|
40
|
+
* rankdir: "TB", // layout 方向, 可选 TB, BT, LR, RL
|
|
41
|
+
* align: undefined, // 节点对齐方式,可选 UL, UR, DL, DR
|
|
42
|
+
* nodeSize: undefined, // 节点大小
|
|
43
|
+
* nodesepFunc: undefined, // 节点水平间距(px)
|
|
44
|
+
* ranksepFunc: undefined, // 每一层节点之间间距
|
|
45
|
+
* nodesep: 50, // 节点水平间距(px)
|
|
46
|
+
* ranksep: 50, // 每一层节点之间间距
|
|
47
|
+
* controlPoints: false, // 是否保留布局连线的控制点
|
|
48
|
+
* radial: false, // 是否基于 dagre 进行辐射布局
|
|
49
|
+
* focusNode: null, // radial 为 true 时生效,关注的节点
|
|
50
|
+
* };
|
|
51
|
+
*/
|
|
52
|
+
Dagre.prototype.layout = function (option) {
|
|
53
|
+
var _this = this;
|
|
54
|
+
if (option === void 0) { option = {}; }
|
|
55
|
+
var _a = this.lf.graphModel, nodes = _a.nodes, edges = _a.edges;
|
|
56
|
+
this.option = __assign({ type: 'dagre', rankdir: 'LR', nodesep: 20, begin: [100, 100] }, option);
|
|
57
|
+
var layoutInstance = new layout_1.DagreLayout(this.option);
|
|
58
|
+
var layoutData = layoutInstance.layout({
|
|
59
|
+
nodes: nodes.map(function (node) { return ({
|
|
60
|
+
id: node.id,
|
|
61
|
+
size: {
|
|
62
|
+
width: node.width,
|
|
63
|
+
height: node.height,
|
|
64
|
+
},
|
|
65
|
+
model: node,
|
|
66
|
+
}); }),
|
|
67
|
+
edges: edges.map(function (edge) { return ({
|
|
68
|
+
source: edge.sourceNodeId,
|
|
69
|
+
target: edge.targetNodeId,
|
|
70
|
+
model: edge,
|
|
71
|
+
}); }),
|
|
72
|
+
});
|
|
73
|
+
var newGraphData = {
|
|
74
|
+
nodes: [],
|
|
75
|
+
edges: [],
|
|
76
|
+
};
|
|
77
|
+
layoutData.nodes.forEach(function (node) {
|
|
78
|
+
// @ts-ignore: pass node data
|
|
79
|
+
var model = node.model;
|
|
80
|
+
var data = model.getData();
|
|
81
|
+
// @ts-ignore: pass node data
|
|
82
|
+
data.x = node.x;
|
|
83
|
+
// @ts-ignore: pass node data
|
|
84
|
+
data.y = node.y;
|
|
85
|
+
newGraphData.nodes.push(data);
|
|
86
|
+
});
|
|
87
|
+
layoutData.edges.forEach(function (edge) {
|
|
88
|
+
// @ts-ignore: pass edge data
|
|
89
|
+
var model = edge.model;
|
|
90
|
+
var data = model.getData();
|
|
91
|
+
data.pointsList = _this.calcPointsList(model, newGraphData.nodes);
|
|
92
|
+
if (data.pointsList) {
|
|
93
|
+
var _a = __read(data.pointsList, 4), first = _a[0], next = _a[1], third = _a[2], last = _a[3];
|
|
94
|
+
data.startPoint = { x: first.x, y: first.y };
|
|
95
|
+
data.endPoint = { x: last.x, y: last.y };
|
|
96
|
+
if (data.text && data.text.value) {
|
|
97
|
+
data.text = {
|
|
98
|
+
x: (third.x + last.x) / 2,
|
|
99
|
+
y: last.y,
|
|
100
|
+
value: data.text.value,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
data.startPoint = undefined;
|
|
106
|
+
data.endPoint = undefined;
|
|
107
|
+
if (data.text && data.text.value) {
|
|
108
|
+
data.text = data.text.value;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
newGraphData.edges.push(data);
|
|
112
|
+
});
|
|
113
|
+
this.lf.render(newGraphData);
|
|
114
|
+
};
|
|
115
|
+
Dagre.prototype.calcPointsList = function (model, nodes) {
|
|
116
|
+
console.log(this.option.rankdir, model.modelType);
|
|
117
|
+
// 在节点确认从左向右后,通过计算来保证节点连线清晰。
|
|
118
|
+
if (this.option.rankdir === 'LR' && model.modelType === 'polyline-edge') {
|
|
119
|
+
var sourceNodeModel = this.lf.getNodeModelById(model.sourceNodeId);
|
|
120
|
+
var targetNodeModel = this.lf.getNodeModelById(model.targetNodeId);
|
|
121
|
+
var newSourceNodeData = nodes.find(function (node) { return node.id === model.sourceNodeId; });
|
|
122
|
+
var newTargetNodeData = nodes.find(function (node) { return node.id === model.targetNodeId; });
|
|
123
|
+
var firstPoint = {
|
|
124
|
+
x: newSourceNodeData.x + sourceNodeModel.width / 2,
|
|
125
|
+
y: newSourceNodeData.y,
|
|
126
|
+
};
|
|
127
|
+
var nextPoint = {
|
|
128
|
+
x: newSourceNodeData.x + sourceNodeModel.width / 2 + (model.offset || 50),
|
|
129
|
+
y: newSourceNodeData.y,
|
|
130
|
+
};
|
|
131
|
+
var thirdPoint = {
|
|
132
|
+
x: newSourceNodeData.x + sourceNodeModel.width / 2 + (model.offset || 50),
|
|
133
|
+
y: newTargetNodeData.y,
|
|
134
|
+
};
|
|
135
|
+
var lastPoint = {
|
|
136
|
+
x: newTargetNodeData.x - targetNodeModel.width / 2,
|
|
137
|
+
y: newTargetNodeData.y,
|
|
138
|
+
};
|
|
139
|
+
return [firstPoint, nextPoint, thirdPoint, lastPoint];
|
|
140
|
+
}
|
|
141
|
+
return undefined;
|
|
142
|
+
};
|
|
143
|
+
Dagre.pluginName = 'dagre';
|
|
144
|
+
return Dagre;
|
|
145
|
+
}());
|
|
146
|
+
exports.Dagre = Dagre;
|
package/cjs/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./dagre"), exports);
|
package/es/dagre.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { DagreLayoutOptions } from '@antv/layout';
|
|
2
|
+
export declare class Dagre {
|
|
3
|
+
static pluginName: string;
|
|
4
|
+
lf: any;
|
|
5
|
+
option: DagreLayoutOptions;
|
|
6
|
+
render(lf: any): void;
|
|
7
|
+
/**
|
|
8
|
+
* option: {
|
|
9
|
+
* rankdir: "TB", // layout 方向, 可选 TB, BT, LR, RL
|
|
10
|
+
* align: undefined, // 节点对齐方式,可选 UL, UR, DL, DR
|
|
11
|
+
* nodeSize: undefined, // 节点大小
|
|
12
|
+
* nodesepFunc: undefined, // 节点水平间距(px)
|
|
13
|
+
* ranksepFunc: undefined, // 每一层节点之间间距
|
|
14
|
+
* nodesep: 50, // 节点水平间距(px)
|
|
15
|
+
* ranksep: 50, // 每一层节点之间间距
|
|
16
|
+
* controlPoints: false, // 是否保留布局连线的控制点
|
|
17
|
+
* radial: false, // 是否基于 dagre 进行辐射布局
|
|
18
|
+
* focusNode: null, // radial 为 true 时生效,关注的节点
|
|
19
|
+
* };
|
|
20
|
+
*/
|
|
21
|
+
layout(option?: {}): void;
|
|
22
|
+
calcPointsList(model: any, nodes: any): {
|
|
23
|
+
x: any;
|
|
24
|
+
y: any;
|
|
25
|
+
}[];
|
|
26
|
+
}
|
package/es/dagre.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
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);
|
|
23
|
+
}
|
|
24
|
+
finally { if (e) throw e.error; }
|
|
25
|
+
}
|
|
26
|
+
return ar;
|
|
27
|
+
};
|
|
28
|
+
import { DagreLayout } from '@antv/layout';
|
|
29
|
+
var Dagre = /** @class */ (function () {
|
|
30
|
+
function Dagre() {
|
|
31
|
+
}
|
|
32
|
+
Dagre.prototype.render = function (lf) {
|
|
33
|
+
this.lf = lf;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
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
|
+
* };
|
|
48
|
+
*/
|
|
49
|
+
Dagre.prototype.layout = function (option) {
|
|
50
|
+
var _this = this;
|
|
51
|
+
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 ({
|
|
57
|
+
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
|
+
}); }),
|
|
69
|
+
});
|
|
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);
|
|
83
|
+
});
|
|
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
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
data.startPoint = undefined;
|
|
103
|
+
data.endPoint = undefined;
|
|
104
|
+
if (data.text && data.text.value) {
|
|
105
|
+
data.text = data.text.value;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
newGraphData.edges.push(data);
|
|
109
|
+
});
|
|
110
|
+
this.lf.render(newGraphData);
|
|
111
|
+
};
|
|
112
|
+
Dagre.prototype.calcPointsList = function (model, nodes) {
|
|
113
|
+
console.log(this.option.rankdir, model.modelType);
|
|
114
|
+
// 在节点确认从左向右后,通过计算来保证节点连线清晰。
|
|
115
|
+
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];
|
|
137
|
+
}
|
|
138
|
+
return undefined;
|
|
139
|
+
};
|
|
140
|
+
Dagre.pluginName = 'dagre';
|
|
141
|
+
return Dagre;
|
|
142
|
+
}());
|
|
143
|
+
export { Dagre };
|
package/es/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dagre';
|
package/es/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dagre';
|