@antv/layout 0.2.2 → 0.2.5

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 (90) hide show
  1. package/dist/layout.min.js +1 -1
  2. package/dist/layout.min.js.map +1 -1
  3. package/es/layout/comboCombined.js +6 -21
  4. package/es/layout/comboCombined.js.map +1 -1
  5. package/es/layout/grid.js +2 -0
  6. package/es/layout/grid.js.map +1 -1
  7. package/es/layout/types.d.ts +7 -3
  8. package/lib/layout/comboCombined.js +6 -21
  9. package/lib/layout/comboCombined.js.map +1 -1
  10. package/lib/layout/grid.js +2 -0
  11. package/lib/layout/grid.js.map +1 -1
  12. package/lib/layout/types.d.ts +7 -3
  13. package/package.json +2 -1
  14. package/src/index.ts +7 -0
  15. package/src/layout/base.ts +54 -0
  16. package/src/layout/circular.ts +369 -0
  17. package/src/layout/comboCombined.ts +391 -0
  18. package/src/layout/comboForce.ts +873 -0
  19. package/src/layout/concentric.ts +289 -0
  20. package/src/layout/constants.ts +21 -0
  21. package/src/layout/dagre/graph.ts +104 -0
  22. package/src/layout/dagre/index.ts +31 -0
  23. package/src/layout/dagre/src/acyclic.ts +58 -0
  24. package/src/layout/dagre/src/add-border-segments.ts +47 -0
  25. package/src/layout/dagre/src/coordinate-system.ts +77 -0
  26. package/src/layout/dagre/src/data/list.ts +60 -0
  27. package/src/layout/dagre/src/debug.ts +30 -0
  28. package/src/layout/dagre/src/greedy-fas.ts +144 -0
  29. package/src/layout/dagre/src/layout.ts +580 -0
  30. package/src/layout/dagre/src/nesting-graph.ts +143 -0
  31. package/src/layout/dagre/src/normalize.ts +96 -0
  32. package/src/layout/dagre/src/order/add-subgraph-constraints.ts +29 -0
  33. package/src/layout/dagre/src/order/barycenter.ts +26 -0
  34. package/src/layout/dagre/src/order/build-layer-graph.ts +82 -0
  35. package/src/layout/dagre/src/order/cross-count.ts +77 -0
  36. package/src/layout/dagre/src/order/index.ts +105 -0
  37. package/src/layout/dagre/src/order/init-data-order.ts +27 -0
  38. package/src/layout/dagre/src/order/init-order.ts +56 -0
  39. package/src/layout/dagre/src/order/resolve-conflicts.ts +152 -0
  40. package/src/layout/dagre/src/order/sort-subgraph.ts +105 -0
  41. package/src/layout/dagre/src/order/sort.ts +76 -0
  42. package/src/layout/dagre/src/parent-dummy-chains.ts +102 -0
  43. package/src/layout/dagre/src/position/bk.ts +494 -0
  44. package/src/layout/dagre/src/position/index.ts +82 -0
  45. package/src/layout/dagre/src/rank/feasible-tree.ts +165 -0
  46. package/src/layout/dagre/src/rank/index.ts +54 -0
  47. package/src/layout/dagre/src/rank/network-simplex.ts +225 -0
  48. package/src/layout/dagre/src/rank/util.ts +157 -0
  49. package/src/layout/dagre/src/util.ts +308 -0
  50. package/src/layout/dagre.ts +423 -0
  51. package/src/layout/dagreCompound.ts +518 -0
  52. package/src/layout/er/core.ts +117 -0
  53. package/src/layout/er/forceGrid.ts +95 -0
  54. package/src/layout/er/grid.ts +185 -0
  55. package/src/layout/er/index.ts +68 -0
  56. package/src/layout/er/mysqlWorkbench.ts +345 -0
  57. package/src/layout/er/type.ts +39 -0
  58. package/src/layout/force/force-in-a-box.ts +400 -0
  59. package/src/layout/force/force.ts +391 -0
  60. package/src/layout/force/index.ts +1 -0
  61. package/src/layout/forceAtlas2/body.ts +115 -0
  62. package/src/layout/forceAtlas2/index.ts +556 -0
  63. package/src/layout/forceAtlas2/quad.ts +115 -0
  64. package/src/layout/forceAtlas2/quadTree.ts +107 -0
  65. package/src/layout/fruchterman.ts +361 -0
  66. package/src/layout/gForce.ts +487 -0
  67. package/src/layout/gpu/fruchterman.ts +314 -0
  68. package/src/layout/gpu/fruchtermanShader.ts +204 -0
  69. package/src/layout/gpu/gForce.ts +406 -0
  70. package/src/layout/gpu/gForceShader.ts +221 -0
  71. package/src/layout/grid.ts +393 -0
  72. package/src/layout/index.ts +45 -0
  73. package/src/layout/layout.ts +75 -0
  74. package/src/layout/mds.ts +140 -0
  75. package/src/layout/radial/index.ts +1 -0
  76. package/src/layout/radial/mds.ts +51 -0
  77. package/src/layout/radial/radial.ts +500 -0
  78. package/src/layout/radial/radialNonoverlapForce.ts +189 -0
  79. package/src/layout/random.ts +75 -0
  80. package/src/layout/types.ts +425 -0
  81. package/src/registy/index.ts +43 -0
  82. package/src/util/array.ts +1 -0
  83. package/src/util/function.ts +64 -0
  84. package/src/util/gpu.ts +254 -0
  85. package/src/util/index.ts +6 -0
  86. package/src/util/math.ts +158 -0
  87. package/src/util/number.ts +8 -0
  88. package/src/util/object.ts +28 -0
  89. package/src/util/string.ts +18 -0
  90. package/CHANGELOG.md +0 -88
@@ -0,0 +1,39 @@
1
+ export interface INode {
2
+ id: string;
3
+ label: string;
4
+ size: number[];
5
+ dx?: number;
6
+ dy?: number;
7
+ x?: number;
8
+ y?: number;
9
+ sizeTemp?: number[];
10
+ }
11
+
12
+ export interface IMysqlNode {
13
+ id: string;
14
+ size: number[];
15
+ x: number;
16
+ y: number;
17
+ }
18
+
19
+ export interface IEdge {
20
+ source: string;
21
+ target: string;
22
+ }
23
+
24
+ export interface IEdgeInfo {
25
+ source: INode;
26
+ target: INode;
27
+ }
28
+
29
+ export interface ICell {
30
+ dx?: number;
31
+ dy?: number;
32
+ x: number;
33
+ y: number;
34
+ occupied: boolean;
35
+ node?: {
36
+ id: string,
37
+ size: number[],
38
+ } | null;
39
+ }
@@ -0,0 +1,400 @@
1
+ import * as d3Force from 'd3-force';
2
+ import { getEdgeTerminal } from '../../util';
3
+
4
+ interface INode {
5
+ id: string;
6
+ x: number;
7
+ y: number;
8
+ vx: number;
9
+ vy: number;
10
+ cluster: any;
11
+ }
12
+
13
+ // https://github.com/john-guerra/forceInABox/blob/master/src/forceInABox.js
14
+ export default function forceInABox() {
15
+ function constant(_: any): () => any {
16
+ return () => _;
17
+ }
18
+
19
+ let groupBy = (d: INode) => {
20
+ return d.cluster;
21
+ };
22
+ let forceNodeSize: (() => number) | ((d: any) => number) = constant(1);
23
+ let forceCharge: (() => number) | ((d: any) => number) = constant(-1);
24
+ let forceLinkDistance: (() => number) | ((d: any) => number) = constant(100);
25
+ let forceLinkStrength: (() => number) | ((d: any) => number) = constant(0.1);
26
+ let offset = [0, 0];
27
+
28
+ let nodes: INode[] = [];
29
+ let nodesMap: any = {};
30
+ let links: any[] = [];
31
+ let centerX = 100;
32
+ let centerY = 100;
33
+ let foci: any = {
34
+ none: {
35
+ x: 0,
36
+ y: 0,
37
+ },
38
+ };
39
+ let templateNodes: INode[] = [];
40
+ let templateForce: any;
41
+ let template = 'force';
42
+ let enableGrouping = true;
43
+ let strength = 0.1;
44
+
45
+ function force(alpha: number) {
46
+ if (!enableGrouping) {
47
+ return force;
48
+ }
49
+ templateForce.tick();
50
+ getFocisFromTemplate();
51
+
52
+ for (let i = 0, n = nodes.length, node, k = alpha * strength; i < n; ++i) {
53
+ node = nodes[i];
54
+ node.vx += (foci[groupBy(node)].x - node.x) * k;
55
+ node.vy += (foci[groupBy(node)].y - node.y) * k;
56
+ }
57
+ }
58
+
59
+ function initialize() {
60
+ if (!nodes) return;
61
+ initializeWithForce();
62
+ }
63
+
64
+ function initializeWithForce() {
65
+ if (!nodes || !nodes.length) {
66
+ return;
67
+ }
68
+
69
+ if (groupBy(nodes[0]) === undefined) {
70
+ throw Error(
71
+ "Couldnt find the grouping attribute for the nodes. Make sure to set it up with forceInABox.groupBy('clusterAttr') before calling .links()",
72
+ );
73
+ }
74
+
75
+ // checkLinksAsObjects();
76
+
77
+ const net = getGroupsGraph();
78
+ templateForce = d3Force
79
+ .forceSimulation(net.nodes)
80
+ .force('x', d3Force.forceX(centerX).strength(0.1))
81
+ .force('y', d3Force.forceY(centerY).strength(0.1))
82
+ .force('collide', d3Force.forceCollide((d: any) => d.r).iterations(4))
83
+ .force('charge', d3Force.forceManyBody().strength(forceCharge))
84
+ .force(
85
+ 'links',
86
+ d3Force
87
+ .forceLink(net.nodes.length ? net.links : [])
88
+ .distance(forceLinkDistance)
89
+ .strength(forceLinkStrength),
90
+ );
91
+
92
+ templateNodes = templateForce.nodes();
93
+
94
+ getFocisFromTemplate();
95
+ }
96
+
97
+ function getGroupsGraph() {
98
+ const gnodes: any = [];
99
+ const glinks: any = [];
100
+ const dNodes: any = {};
101
+ let clustersList = [];
102
+ let clustersCounts: any = {};
103
+ let clustersLinks: any = [];
104
+
105
+ clustersCounts = computeClustersNodeCounts(nodes);
106
+ clustersLinks = computeClustersLinkCounts(links);
107
+
108
+ clustersList = Object.keys(clustersCounts);
109
+
110
+ clustersList.forEach((key, index) => {
111
+ const val = clustersCounts[key];
112
+ // Uses approx meta-node size
113
+ gnodes.push({
114
+ id: key,
115
+ size: val.count,
116
+ r: Math.sqrt(val.sumforceNodeSize / Math.PI),
117
+ });
118
+ dNodes[key] = index;
119
+ });
120
+
121
+ clustersLinks.forEach((l: any) => {
122
+ const sourceTerminal = getEdgeTerminal(l, 'source');
123
+ const targetTerminal = getEdgeTerminal(l, 'target');
124
+ const source = dNodes[sourceTerminal];
125
+ const target = dNodes[targetTerminal];
126
+ if (source !== undefined && target !== undefined) {
127
+ glinks.push({
128
+ source,
129
+ target,
130
+ count: l.count,
131
+ });
132
+ }
133
+ });
134
+
135
+ return {
136
+ nodes: gnodes,
137
+ links: glinks,
138
+ };
139
+ }
140
+
141
+ function computeClustersNodeCounts(nodes: any) {
142
+ const clustersCounts: any = {};
143
+
144
+ nodes.forEach((d: any) => {
145
+ const key = groupBy(d);
146
+ if (!clustersCounts[key]) {
147
+ clustersCounts[key] = {
148
+ count: 0,
149
+ sumforceNodeSize: 0,
150
+ };
151
+ }
152
+ });
153
+ nodes.forEach((d: any) => {
154
+ const key = groupBy(d);
155
+ const nodeSize = forceNodeSize(d);
156
+ const tmpCount = clustersCounts[key];
157
+ tmpCount.count = tmpCount.count + 1;
158
+ tmpCount.sumforceNodeSize =
159
+ tmpCount.sumforceNodeSize + Math.PI * (nodeSize * nodeSize) * 1.3;
160
+ clustersCounts[key] = tmpCount;
161
+ });
162
+
163
+ return clustersCounts;
164
+ }
165
+
166
+ function computeClustersLinkCounts(links: any) {
167
+ const dClusterLinks: any = {};
168
+ const clusterLinks: any = [];
169
+ links.forEach((l: any) => {
170
+ const key = getLinkKey(l);
171
+ let count = 0;
172
+ if (dClusterLinks[key] !== undefined) {
173
+ count = dClusterLinks[key];
174
+ }
175
+ count += 1;
176
+ dClusterLinks[key] = count;
177
+ });
178
+
179
+ // @ts-ignore
180
+ const entries = Object.entries(dClusterLinks);
181
+
182
+ entries.forEach(([key, count]: any) => {
183
+ const source = key.split('~')[0];
184
+ const target = key.split('~')[1];
185
+ if (source !== undefined && target !== undefined) {
186
+ clusterLinks.push({
187
+ source,
188
+ target,
189
+ count,
190
+ });
191
+ }
192
+ });
193
+
194
+ return clusterLinks;
195
+ }
196
+
197
+ function getFocisFromTemplate() {
198
+ foci = {
199
+ none: {
200
+ x: 0,
201
+ y: 0,
202
+ },
203
+ };
204
+ templateNodes.forEach((d) => {
205
+ foci[d.id] = {
206
+ x: d.x - offset[0],
207
+ y: d.y - offset[1],
208
+ };
209
+ });
210
+ return foci;
211
+ }
212
+
213
+ function getLinkKey(l: any) {
214
+ const source = getEdgeTerminal(l, 'source');
215
+ const target = getEdgeTerminal(l, 'target');
216
+ const sourceID = groupBy(nodesMap[source]);
217
+ const targetID = groupBy(nodesMap[target]);
218
+
219
+ return sourceID <= targetID
220
+ ? `${sourceID}~${targetID}`
221
+ : `${targetID}~${sourceID}`;
222
+ }
223
+
224
+ function genNodesMap(nodes: any) {
225
+ nodesMap = {};
226
+ nodes.forEach((node: any) => {
227
+ nodesMap[node.id] = node;
228
+ });
229
+ }
230
+
231
+ function setTemplate(x: any) {
232
+ if (!arguments.length) return template;
233
+ template = x;
234
+ initialize();
235
+ return force;
236
+ }
237
+
238
+ function setGroupBy(x: any) {
239
+ if (!arguments.length) return groupBy;
240
+ if (typeof x === 'string') {
241
+ groupBy = (d: any) => {
242
+ return d[x];
243
+ };
244
+ return force;
245
+ }
246
+ groupBy = x;
247
+ return force;
248
+ }
249
+
250
+ function setEnableGrouping(x: any) {
251
+ if (!arguments.length) return enableGrouping;
252
+ enableGrouping = x;
253
+ return force;
254
+ }
255
+
256
+ function setStrength(x: any) {
257
+ if (!arguments.length) return strength;
258
+ strength = x;
259
+ return force;
260
+ }
261
+
262
+ function setCenterX(_: any) {
263
+ if (arguments.length) {
264
+ centerX = _;
265
+ return force;
266
+ }
267
+
268
+ return centerX;
269
+ }
270
+
271
+ function setCenterY(_: any) {
272
+ if (arguments.length) {
273
+ centerY = _;
274
+ return force;
275
+ }
276
+
277
+ return centerY;
278
+ }
279
+
280
+ function setNodes(_: any) {
281
+ if (arguments.length) {
282
+ genNodesMap(_ || []);
283
+ nodes = _ || [];
284
+ return force;
285
+ }
286
+ return nodes;
287
+ }
288
+
289
+ function setLinks(_: any) {
290
+ if (arguments.length) {
291
+ links = _ || [];
292
+ initialize();
293
+ return force;
294
+ }
295
+ return links;
296
+ }
297
+
298
+ function setForceNodeSize(_: any) {
299
+ if (arguments.length) {
300
+ if (typeof _ === 'function') {
301
+ forceNodeSize = _;
302
+ } else {
303
+ forceNodeSize = constant(+_);
304
+ }
305
+ initialize();
306
+ return force;
307
+ }
308
+
309
+ return forceNodeSize;
310
+ }
311
+
312
+ function setForceCharge(_: any) {
313
+ if (arguments.length) {
314
+ if (typeof _ === 'function') {
315
+ forceCharge = _;
316
+ } else {
317
+ forceCharge = constant(+_);
318
+ }
319
+ initialize();
320
+ return force;
321
+ }
322
+
323
+ return forceCharge;
324
+ }
325
+
326
+ function setForceLinkDistance(_: any) {
327
+ if (arguments.length) {
328
+ if (typeof _ === 'function') {
329
+ forceLinkDistance = _;
330
+ } else {
331
+ forceLinkDistance = constant(+_);
332
+ }
333
+ initialize();
334
+ return force;
335
+ }
336
+
337
+ return forceLinkDistance;
338
+ }
339
+
340
+ function setForceLinkStrength(_: any) {
341
+ if (arguments.length) {
342
+ if (typeof _ === 'function') {
343
+ forceLinkStrength = _;
344
+ } else {
345
+ forceLinkStrength = constant(+_);
346
+ }
347
+ initialize();
348
+ return force;
349
+ }
350
+
351
+ return forceLinkStrength;
352
+ }
353
+
354
+ function setOffset(_: any) {
355
+ if (arguments.length) {
356
+ offset = _;
357
+ return force;
358
+ }
359
+
360
+ return offset;
361
+ }
362
+
363
+ force.initialize = (_: any) => {
364
+ nodes = _;
365
+ initialize();
366
+ };
367
+
368
+ force.template = setTemplate;
369
+
370
+ force.groupBy = setGroupBy;
371
+
372
+ force.enableGrouping = setEnableGrouping;
373
+
374
+ force.strength = setStrength;
375
+
376
+ force.centerX = setCenterX;
377
+
378
+ force.centerY = setCenterY;
379
+
380
+ force.nodes = setNodes;
381
+
382
+ force.links = setLinks;
383
+
384
+ force.forceNodeSize = setForceNodeSize;
385
+
386
+ // Legacy support
387
+ force.nodeSize = force.forceNodeSize;
388
+
389
+ force.forceCharge = setForceCharge;
390
+
391
+ force.forceLinkDistance = setForceLinkDistance;
392
+
393
+ force.forceLinkStrength = setForceLinkStrength;
394
+
395
+ force.offset = setOffset;
396
+
397
+ force.getFocis = getFocisFromTemplate;
398
+
399
+ return force;
400
+ }