@deck.gl-community/graph-layers 9.1.1 → 9.2.0-beta.3
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/dist/_deprecated/old-constants.d.ts +107 -0
- package/dist/_deprecated/old-constants.d.ts.map +1 -0
- package/dist/_deprecated/old-constants.js +111 -0
- package/dist/_deprecated/old-constants.js.map +1 -0
- package/dist/core/cache.d.ts +0 -1
- package/dist/core/cache.js +0 -1
- package/dist/core/constants.d.ts +12 -100
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +3 -44
- package/dist/core/constants.js.map +1 -1
- package/dist/core/graph-engine.d.ts +63 -20
- package/dist/core/graph-engine.d.ts.map +1 -1
- package/dist/core/graph-engine.js +163 -72
- package/dist/core/graph-engine.js.map +1 -1
- package/dist/core/graph-layout.d.ts +63 -32
- package/dist/core/graph-layout.d.ts.map +1 -1
- package/dist/core/graph-layout.js +118 -36
- package/dist/core/graph-layout.js.map +1 -1
- package/dist/core/interaction-manager.d.ts +7 -5
- package/dist/core/interaction-manager.d.ts.map +1 -1
- package/dist/core/interaction-manager.js +64 -20
- package/dist/core/interaction-manager.js.map +1 -1
- package/dist/graph/arrow-graph.d.ts +69 -0
- package/dist/graph/arrow-graph.d.ts.map +1 -0
- package/dist/graph/arrow-graph.js +513 -0
- package/dist/graph/arrow-graph.js.map +1 -0
- package/dist/graph/classic-graph.d.ts +169 -0
- package/dist/graph/classic-graph.d.ts.map +1 -0
- package/dist/graph/classic-graph.js +390 -0
- package/dist/graph/classic-graph.js.map +1 -0
- package/dist/graph/edge.d.ts +12 -12
- package/dist/graph/edge.d.ts.map +1 -1
- package/dist/graph/edge.js +3 -6
- package/dist/graph/edge.js.map +1 -1
- package/dist/graph/functions/arrow-utils.d.ts +6 -0
- package/dist/graph/functions/arrow-utils.d.ts.map +1 -0
- package/dist/graph/functions/arrow-utils.js +67 -0
- package/dist/graph/functions/arrow-utils.js.map +1 -0
- package/dist/graph/functions/create-graph-from-data.d.ts +3 -0
- package/dist/graph/functions/create-graph-from-data.d.ts.map +1 -0
- package/dist/graph/functions/create-graph-from-data.js +12 -0
- package/dist/graph/functions/create-graph-from-data.js.map +1 -0
- package/dist/graph/graph-normalization.d.ts +10 -0
- package/dist/graph/graph-normalization.d.ts.map +1 -0
- package/dist/graph/graph-normalization.js +65 -0
- package/dist/graph/graph-normalization.js.map +1 -0
- package/dist/graph/graph.d.ts +62 -156
- package/dist/graph/graph.d.ts.map +1 -1
- package/dist/graph/graph.js +11 -301
- package/dist/graph/graph.js.map +1 -1
- package/dist/graph/node.d.ts +12 -13
- package/dist/graph/node.d.ts.map +1 -1
- package/dist/graph/node.js +5 -7
- package/dist/graph/node.js.map +1 -1
- package/dist/graph-data/arrow-graph-data-builder.d.ts +21 -0
- package/dist/graph-data/arrow-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/arrow-graph-data-builder.js +105 -0
- package/dist/graph-data/arrow-graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data-builder.d.ts +6 -0
- package/dist/graph-data/graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/graph-data-builder.js +1 -0
- package/dist/graph-data/graph-data-builder.js.map +1 -0
- package/dist/graph-data/graph-data.d.ts +40 -0
- package/dist/graph-data/graph-data.d.ts.map +1 -0
- package/dist/graph-data/graph-data.js +11 -0
- package/dist/graph-data/graph-data.js.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts +20 -0
- package/dist/graph-data/plain-graph-data-builder.d.ts.map +1 -0
- package/dist/graph-data/plain-graph-data-builder.js +105 -0
- package/dist/graph-data/plain-graph-data-builder.js.map +1 -0
- package/dist/graph-style-schema.cdn.d.ts +2 -0
- package/dist/graph-style-schema.cdn.js +2 -0
- package/dist/graph-style-schema.json +12 -0
- package/dist/index.cjs +7851 -3250
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +35 -22
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -25
- package/dist/index.js.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-fragment.glsl.js +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex-tf.glsl.js +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer-vertex.glsl.js +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts +0 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.d.ts.map +1 -1
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js +1 -3
- package/dist/layers/common-layers/flow-path-layer/flow-path-layer.js.map +1 -1
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts +83 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.d.ts.map +1 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js +133 -0
- package/dist/layers/common-layers/grid-layer/grid-layer.js.map +1 -0
- package/dist/layers/common-layers/marker-layer/atlas-data-url.d.ts +0 -1
- package/dist/layers/common-layers/marker-layer/atlas-data-url.js +0 -1
- package/dist/layers/common-layers/marker-layer/marker-layer.d.ts +0 -1
- package/dist/layers/common-layers/marker-layer/marker-layer.js +2 -3
- package/dist/layers/common-layers/marker-layer/marker-list.d.ts +2 -63
- package/dist/layers/common-layers/marker-layer/marker-list.d.ts.map +1 -1
- package/dist/layers/common-layers/marker-layer/marker-list.js +1 -65
- package/dist/layers/common-layers/marker-layer/marker-list.js.map +1 -1
- package/dist/layers/common-layers/marker-layer/marker-mapping.d.ts +0 -1
- package/dist/layers/common-layers/marker-layer/marker-mapping.js +0 -1
- package/dist/layers/common-layers/spline-layer/spline-layer.d.ts +0 -1
- package/dist/layers/common-layers/spline-layer/spline-layer.js +0 -1
- package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.d.ts +0 -1
- package/dist/layers/common-layers/zoomable-text-layer/zoomable-text-layer.js +0 -1
- package/dist/layers/edge-attachment-helper.d.ts +15 -0
- package/dist/layers/edge-attachment-helper.d.ts.map +1 -0
- package/dist/layers/edge-attachment-helper.js +229 -0
- package/dist/layers/edge-attachment-helper.js.map +1 -0
- package/dist/layers/edge-layer.d.ts +1 -5
- package/dist/layers/edge-layer.d.ts.map +1 -1
- package/dist/layers/edge-layer.js +9 -11
- package/dist/layers/edge-layer.js.map +1 -1
- package/dist/layers/edge-layers/arrow-2d-geometry.d.ts +4 -0
- package/dist/layers/edge-layers/arrow-2d-geometry.d.ts.map +1 -0
- package/dist/layers/edge-layers/arrow-2d-geometry.js +42 -0
- package/dist/layers/edge-layers/arrow-2d-geometry.js.map +1 -0
- package/dist/layers/edge-layers/curved-edge-layer.d.ts +1 -2
- package/dist/layers/edge-layers/curved-edge-layer.js +1 -2
- package/dist/layers/edge-layers/edge-arrow-layer.d.ts +21 -0
- package/dist/layers/edge-layers/edge-arrow-layer.d.ts.map +1 -0
- package/dist/layers/edge-layers/edge-arrow-layer.js +131 -0
- package/dist/layers/edge-layers/edge-arrow-layer.js.map +1 -0
- package/dist/layers/edge-layers/edge-label-layer.d.ts +1 -2
- package/dist/layers/edge-layers/edge-label-layer.js +1 -2
- package/dist/layers/edge-layers/flow-layer.d.ts +1 -2
- package/dist/layers/edge-layers/flow-layer.js +1 -2
- package/dist/layers/edge-layers/path-edge-layer.d.ts +0 -1
- package/dist/layers/edge-layers/path-edge-layer.js +0 -1
- package/dist/layers/edge-layers/straight-line-edge-layer.d.ts +0 -1
- package/dist/layers/edge-layers/straight-line-edge-layer.js +0 -1
- package/dist/layers/graph-layer.d.ts +85 -29
- package/dist/layers/graph-layer.d.ts.map +1 -1
- package/dist/layers/graph-layer.js +635 -94
- package/dist/layers/graph-layer.js.map +1 -1
- package/dist/layers/node-layers/circle-layer.d.ts +0 -1
- package/dist/layers/node-layers/circle-layer.js +0 -1
- package/dist/layers/node-layers/image-layer.d.ts +0 -1
- package/dist/layers/node-layers/image-layer.js +0 -1
- package/dist/layers/node-layers/label-layer.d.ts +1 -2
- package/dist/layers/node-layers/label-layer.js +1 -2
- package/dist/layers/node-layers/path-rounded-rectangle-layer.d.ts +0 -1
- package/dist/layers/node-layers/path-rounded-rectangle-layer.js +1 -2
- package/dist/layers/node-layers/rectangle-layer.d.ts +0 -1
- package/dist/layers/node-layers/rectangle-layer.js +0 -1
- package/dist/layers/node-layers/rounded-rectangle-layer-fragment.d.ts +0 -1
- package/dist/layers/node-layers/rounded-rectangle-layer-fragment.js +0 -1
- package/dist/layers/node-layers/rounded-rectangle-layer.d.ts +1 -2
- package/dist/layers/node-layers/rounded-rectangle-layer.js +2 -3
- package/dist/layers/node-layers/zoomable-marker-layer.d.ts +1 -2
- package/dist/layers/node-layers/zoomable-marker-layer.js +1 -2
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts +24 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.d.ts.map +1 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js +251 -0
- package/dist/layouts/d3-dag/collapsable-d3-dag-layout.js.map +1 -0
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts +102 -0
- package/dist/layouts/d3-dag/d3-dag-layout.d.ts.map +1 -0
- package/dist/layouts/d3-dag/d3-dag-layout.js +531 -0
- package/dist/layouts/d3-dag/d3-dag-layout.js.map +1 -0
- package/dist/layouts/d3-force/d3-force-layout.d.ts +23 -11
- package/dist/layouts/d3-force/d3-force-layout.d.ts.map +1 -1
- package/dist/layouts/d3-force/d3-force-layout.js +63 -29
- package/dist/layouts/d3-force/d3-force-layout.js.map +1 -1
- package/dist/layouts/d3-force/worker.d.ts +0 -1
- package/dist/layouts/d3-force/worker.js +0 -1
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts +25 -20
- package/dist/layouts/experimental/force-multi-graph-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/force-multi-graph-layout.js +60 -47
- package/dist/layouts/experimental/force-multi-graph-layout.js.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.d.ts +26 -20
- package/dist/layouts/experimental/hive-plot-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/hive-plot-layout.js +43 -39
- package/dist/layouts/experimental/hive-plot-layout.js.map +1 -1
- package/dist/layouts/experimental/radial-layout.d.ts +20 -12
- package/dist/layouts/experimental/radial-layout.d.ts.map +1 -1
- package/dist/layouts/experimental/radial-layout.js +41 -19
- package/dist/layouts/experimental/radial-layout.js.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts +15 -12
- package/dist/layouts/gpu-force/gpu-force-layout.d.ts.map +1 -1
- package/dist/layouts/gpu-force/gpu-force-layout.js +71 -59
- package/dist/layouts/gpu-force/gpu-force-layout.js.map +1 -1
- package/dist/layouts/gpu-force/worker.d.ts +0 -1
- package/dist/layouts/gpu-force/worker.js +0 -1
- package/dist/layouts/simple-layout.d.ts +21 -31
- package/dist/layouts/simple-layout.d.ts.map +1 -1
- package/dist/layouts/simple-layout.js +33 -26
- package/dist/layouts/simple-layout.js.map +1 -1
- package/dist/loaders/dot-graph-loader.d.ts +25 -0
- package/dist/loaders/dot-graph-loader.d.ts.map +1 -0
- package/dist/loaders/dot-graph-loader.js +668 -0
- package/dist/loaders/dot-graph-loader.js.map +1 -0
- package/dist/loaders/json-graph-loader.d.ts +6 -0
- package/dist/loaders/json-graph-loader.d.ts.map +1 -0
- package/dist/loaders/json-graph-loader.js +31 -0
- package/dist/loaders/json-graph-loader.js.map +1 -0
- package/dist/loaders/parsers/edge-parsers.d.ts +2 -0
- package/dist/loaders/parsers/edge-parsers.d.ts.map +1 -0
- package/dist/loaders/{edge-parsers.js → parsers/edge-parsers.js} +2 -3
- package/dist/loaders/parsers/edge-parsers.js.map +1 -0
- package/dist/loaders/parsers/node-parsers.d.ts +2 -0
- package/dist/loaders/parsers/node-parsers.d.ts.map +1 -0
- package/dist/loaders/{node-parsers.js → parsers/node-parsers.js} +2 -3
- package/dist/loaders/parsers/node-parsers.js.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts +29 -0
- package/dist/loaders/parsers/parse-json-graph.d.ts.map +1 -0
- package/dist/loaders/parsers/parse-json-graph.js +78 -0
- package/dist/loaders/parsers/parse-json-graph.js.map +1 -0
- package/dist/style/graph-layer-stylesheet.d.ts +34 -0
- package/dist/style/graph-layer-stylesheet.d.ts.map +1 -0
- package/dist/style/graph-layer-stylesheet.js +39 -0
- package/dist/style/graph-layer-stylesheet.js.map +1 -0
- package/dist/style/graph-style-accessor-map.d.ts +93 -0
- package/dist/style/graph-style-accessor-map.d.ts.map +1 -0
- package/dist/style/graph-style-accessor-map.js +93 -0
- package/dist/style/graph-style-accessor-map.js.map +1 -0
- package/dist/style/graph-style-engine.d.ts +12 -0
- package/dist/style/graph-style-engine.d.ts.map +1 -0
- package/dist/style/graph-style-engine.js +164 -0
- package/dist/style/graph-style-engine.js.map +1 -0
- package/dist/style/graph-stylesheet.schema.d.ts +310 -0
- package/dist/style/graph-stylesheet.schema.d.ts.map +1 -0
- package/dist/style/graph-stylesheet.schema.js +237 -0
- package/dist/style/graph-stylesheet.schema.js.map +1 -0
- package/dist/style/style-property.d.ts +2 -3
- package/dist/style/style-property.d.ts.map +1 -1
- package/dist/style/style-property.js +224 -48
- package/dist/style/style-property.js.map +1 -1
- package/dist/style/stylesheet-engine.d.ts +33 -0
- package/dist/style/stylesheet-engine.d.ts.map +1 -0
- package/dist/style/stylesheet-engine.js +121 -0
- package/dist/style/stylesheet-engine.js.map +1 -0
- package/dist/utils/collapsed-chains.d.ts +17 -0
- package/dist/utils/collapsed-chains.d.ts.map +1 -0
- package/dist/utils/collapsed-chains.js +192 -0
- package/dist/utils/collapsed-chains.js.map +1 -0
- package/dist/utils/layer-utils.d.ts +0 -1
- package/dist/utils/layer-utils.d.ts.map +1 -1
- package/dist/utils/layer-utils.js +0 -1
- package/dist/utils/log.d.ts +2 -1
- package/dist/utils/log.d.ts.map +1 -1
- package/dist/utils/log.js +12 -2
- package/dist/utils/log.js.map +1 -1
- package/dist/utils/node-boundary.d.ts +10 -0
- package/dist/utils/node-boundary.d.ts.map +1 -0
- package/dist/utils/node-boundary.js +130 -0
- package/dist/utils/node-boundary.js.map +1 -0
- package/dist/utils/polygon-calculations.d.ts +0 -1
- package/dist/utils/polygon-calculations.js +0 -1
- package/dist/utils/rank-grid.d.ts +30 -0
- package/dist/utils/rank-grid.d.ts.map +1 -0
- package/dist/utils/rank-grid.js +306 -0
- package/dist/utils/rank-grid.js.map +1 -0
- package/package.json +25 -13
- package/src/_deprecated/old-constants.ts +122 -0
- package/src/_disabled/arrow-graph-data.ts.disabled +18 -0
- package/src/_disabled/columnar-graph-data-builder.ts.disabled +250 -0
- package/src/_disabled/graph-runtime-layout.ts.disabled +29 -0
- package/src/core/constants.ts +21 -43
- package/src/core/graph-engine.ts +212 -80
- package/src/core/graph-layout.ts +175 -47
- package/src/core/interaction-manager.ts +93 -33
- package/src/graph/arrow-graph.ts +648 -0
- package/src/graph/classic-graph.ts +447 -0
- package/src/graph/edge.ts +13 -13
- package/src/graph/functions/arrow-utils.ts +72 -0
- package/src/graph/functions/convert-arrow-graph-to-classic-graph.ts.disabled +47 -0
- package/src/graph/functions/convert-plain-graph-to-arrow-graph.ts.disabled +119 -0
- package/src/graph/functions/create-graph-from-data.ts +16 -0
- package/src/graph/functions/create-plain-graph-from-data.ts.disabled +176 -0
- package/src/graph/graph-normalization.ts +87 -0
- package/src/graph/graph.ts +68 -339
- package/src/graph/node.ts +15 -15
- package/src/graph/tabular-graph.ts.disabled +761 -0
- package/src/graph-data/arrow-graph-data-builder.ts +165 -0
- package/src/graph-data/graph-data-builder.ts +7 -0
- package/src/graph-data/graph-data.ts +57 -0
- package/src/graph-data/plain-graph-data-builder.ts +132 -0
- package/src/index.ts +82 -17
- package/src/layers/common-layers/flow-path-layer/flow-path-layer.ts +1 -2
- package/src/layers/common-layers/grid-layer/grid-layer.ts +237 -0
- package/src/layers/common-layers/marker-layer/marker-list.ts +62 -64
- package/src/layers/edge-attachment-helper.ts +361 -0
- package/src/layers/edge-layer.ts +6 -7
- package/src/layers/edge-layers/arrow-2d-geometry.ts +51 -0
- package/src/layers/edge-layers/edge-arrow-layer.ts +171 -0
- package/src/layers/graph-layer.ts +928 -130
- package/src/layouts/d3-dag/collapsable-d3-dag-layout.ts +330 -0
- package/src/layouts/d3-dag/d3-dag-layout.ts +739 -0
- package/src/layouts/d3-force/d3-force-layout.ts +83 -39
- package/src/layouts/experimental/force-multi-graph-layout.ts +72 -57
- package/src/layouts/experimental/hive-plot-layout.ts +60 -49
- package/src/layouts/experimental/radial-layout.ts +57 -26
- package/src/layouts/gpu-force/gpu-force-layout.ts +86 -72
- package/src/layouts/simple-layout.ts +51 -52
- package/src/loaders/{create-graph.ts → deprecated/create-graph.ts.disabled} +6 -6
- package/src/loaders/deprecated/json-classic-graph-loader.ts.disabled +33 -0
- package/src/loaders/{simple-json-graph-loader.ts → deprecated/simple-json-graph-loader.ts.disabled} +4 -4
- package/src/loaders/{table-graph-loader.ts → deprecated/table-graph-loader.ts.disabled} +9 -9
- package/src/loaders/dot-graph-loader.ts +860 -0
- package/src/loaders/json-graph-loader.ts +48 -0
- package/src/loaders/parsers/create-graph-data.ts.disabled +45 -0
- package/src/loaders/{edge-parsers.ts → parsers/edge-parsers.ts} +3 -3
- package/src/loaders/{node-parsers.ts → parsers/node-parsers.ts} +3 -3
- package/src/loaders/parsers/parse-json-graph.ts +134 -0
- package/src/style/graph-layer-stylesheet.ts +99 -0
- package/src/style/graph-style-accessor-map.ts +103 -0
- package/src/style/graph-style-engine.ts +232 -0
- package/src/style/graph-stylesheet.schema.ts +344 -0
- package/src/style/style-property.ts +314 -51
- package/src/style/stylesheet-engine.ts +168 -0
- package/src/utils/collapsed-chains.ts +255 -0
- package/src/utils/log.ts +15 -1
- package/src/utils/node-boundary.ts +238 -0
- package/src/utils/rank-grid.ts +426 -0
- package/dist/loaders/create-graph.d.ts +0 -13
- package/dist/loaders/create-graph.d.ts.map +0 -1
- package/dist/loaders/create-graph.js +0 -39
- package/dist/loaders/create-graph.js.map +0 -1
- package/dist/loaders/edge-parsers.d.ts +0 -3
- package/dist/loaders/edge-parsers.d.ts.map +0 -1
- package/dist/loaders/edge-parsers.js.map +0 -1
- package/dist/loaders/json-loader.d.ts +0 -8
- package/dist/loaders/json-loader.d.ts.map +0 -1
- package/dist/loaders/json-loader.js +0 -17
- package/dist/loaders/json-loader.js.map +0 -1
- package/dist/loaders/node-parsers.d.ts +0 -3
- package/dist/loaders/node-parsers.d.ts.map +0 -1
- package/dist/loaders/node-parsers.js.map +0 -1
- package/dist/loaders/simple-json-graph-loader.d.ts +0 -12
- package/dist/loaders/simple-json-graph-loader.d.ts.map +0 -1
- package/dist/loaders/simple-json-graph-loader.js +0 -21
- package/dist/loaders/simple-json-graph-loader.js.map +0 -1
- package/dist/loaders/table-graph-loader.d.ts +0 -17
- package/dist/loaders/table-graph-loader.d.ts.map +0 -1
- package/dist/loaders/table-graph-loader.js +0 -92
- package/dist/loaders/table-graph-loader.js.map +0 -1
- package/dist/style/style-sheet.d.ts +0 -11
- package/dist/style/style-sheet.d.ts.map +0 -1
- package/dist/style/style-sheet.js +0 -253
- package/dist/style/style-sheet.js.map +0 -1
- package/dist/widgets/long-press-button.d.ts +0 -13
- package/dist/widgets/long-press-button.d.ts.map +0 -1
- package/dist/widgets/long-press-button.js +0 -32
- package/dist/widgets/long-press-button.js.map +0 -1
- package/dist/widgets/view-control-widget.d.ts +0 -78
- package/dist/widgets/view-control-widget.d.ts.map +0 -1
- package/dist/widgets/view-control-widget.js +0 -195
- package/dist/widgets/view-control-widget.js.map +0 -1
- package/src/loaders/json-loader.ts +0 -19
- package/src/style/style-sheet.ts +0 -277
- package/src/widgets/long-press-button.tsx +0 -50
- package/src/widgets/view-control-widget.tsx +0 -337
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import {GraphLayout,
|
|
5
|
+
import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
|
|
6
|
+
import type {Graph, NodeInterface, EdgeInterface} from '../../graph/graph';
|
|
7
|
+
import {log} from '../../utils/log';
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export type D3ForceLayoutOptions = GraphLayoutOptions & {
|
|
9
|
+
export type D3ForceLayoutOptions = GraphLayoutProps & {
|
|
10
10
|
alpha?: number;
|
|
11
11
|
resumeAlpha?: number;
|
|
12
12
|
nBodyStrength?: number;
|
|
@@ -16,39 +16,38 @@ export type D3ForceLayoutOptions = GraphLayoutOptions & {
|
|
|
16
16
|
};
|
|
17
17
|
|
|
18
18
|
export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
|
|
19
|
-
static
|
|
19
|
+
static defaultProps = {
|
|
20
|
+
...GraphLayout.defaultProps,
|
|
20
21
|
alpha: 0.3,
|
|
21
22
|
resumeAlpha: 0.1,
|
|
22
23
|
nBodyStrength: -900,
|
|
23
24
|
nBodyDistanceMin: 100,
|
|
24
25
|
nBodyDistanceMax: 400,
|
|
25
26
|
getCollisionRadius: 0
|
|
26
|
-
}
|
|
27
|
+
} as const satisfies Readonly<Required<D3ForceLayoutOptions>>;
|
|
27
28
|
|
|
28
29
|
protected readonly _name = 'D3';
|
|
29
|
-
private _positionsByNodeId = new Map();
|
|
30
|
-
private _graph:
|
|
31
|
-
private _worker:
|
|
30
|
+
private _positionsByNodeId = new Map<string | number, any>();
|
|
31
|
+
private _graph: Graph | null = null;
|
|
32
|
+
private _worker: Worker | null = null;
|
|
32
33
|
|
|
33
|
-
constructor(
|
|
34
|
-
super(
|
|
35
|
-
|
|
36
|
-
this._options = {
|
|
37
|
-
...D3ForceLayout.defaultOptions,
|
|
38
|
-
...options
|
|
39
|
-
};
|
|
34
|
+
constructor(props?: D3ForceLayoutOptions) {
|
|
35
|
+
super(props, D3ForceLayout.defaultProps);
|
|
40
36
|
}
|
|
41
37
|
|
|
42
|
-
initializeGraph(graph) {
|
|
38
|
+
initializeGraph(graph: Graph) {
|
|
43
39
|
this._graph = graph;
|
|
44
40
|
}
|
|
45
41
|
|
|
46
42
|
// for streaming new data on the same graph
|
|
47
|
-
updateGraph(graph) {
|
|
43
|
+
updateGraph(graph: Graph) {
|
|
48
44
|
this._graph = graph;
|
|
49
45
|
|
|
50
46
|
this._positionsByNodeId = new Map(
|
|
51
|
-
this._graph.getNodes()
|
|
47
|
+
Array.from(this._graph.getNodes(), (node) => {
|
|
48
|
+
const id = node.getId();
|
|
49
|
+
return [id, this._positionsByNodeId.get(id)];
|
|
50
|
+
})
|
|
52
51
|
);
|
|
53
52
|
}
|
|
54
53
|
|
|
@@ -70,20 +69,34 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
|
|
|
70
69
|
|
|
71
70
|
this._worker = new Worker(new URL('./worker.js', import.meta.url).href);
|
|
72
71
|
|
|
72
|
+
if (!this._graph) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const options = {...this.props};
|
|
77
|
+
delete options.onLayoutStart;
|
|
78
|
+
delete options.onLayoutChange;
|
|
79
|
+
delete options.onLayoutDone;
|
|
80
|
+
delete options.onLayoutError;
|
|
81
|
+
|
|
73
82
|
this._worker.postMessage({
|
|
74
|
-
nodes: this._graph.getNodes()
|
|
75
|
-
id
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
83
|
+
nodes: Array.from(this._graph.getNodes(), (node) => {
|
|
84
|
+
const id = node.getId();
|
|
85
|
+
return {
|
|
86
|
+
id,
|
|
87
|
+
...this._positionsByNodeId.get(id)
|
|
88
|
+
};
|
|
89
|
+
}),
|
|
90
|
+
edges: Array.from(this._graph.getEdges(), (edge) => ({
|
|
91
|
+
id: edge.getId(),
|
|
80
92
|
source: edge.getSourceNodeId(),
|
|
81
93
|
target: edge.getTargetNodeId()
|
|
82
94
|
})),
|
|
83
|
-
options
|
|
95
|
+
options
|
|
84
96
|
});
|
|
85
97
|
|
|
86
98
|
this._worker.onmessage = (event) => {
|
|
99
|
+
log.log(0, 'D3ForceLayout: worker message', event.data?.type, event.data);
|
|
87
100
|
if (event.data.type !== 'end') {
|
|
88
101
|
return;
|
|
89
102
|
}
|
|
@@ -106,26 +119,44 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
|
|
|
106
119
|
}
|
|
107
120
|
|
|
108
121
|
stop() {
|
|
109
|
-
this._worker
|
|
122
|
+
if (this._worker) {
|
|
123
|
+
this._worker.terminate();
|
|
124
|
+
this._worker = null;
|
|
125
|
+
}
|
|
110
126
|
}
|
|
111
127
|
|
|
112
|
-
getEdgePosition = (edge) => {
|
|
128
|
+
getEdgePosition = (edge: EdgeInterface) => {
|
|
129
|
+
if (!this._graph) {
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
|
|
113
133
|
const sourceNode = this._graph.findNode(edge.getSourceNodeId());
|
|
114
134
|
const targetNode = this._graph.findNode(edge.getTargetNodeId());
|
|
115
|
-
if (!
|
|
135
|
+
if (!sourceNode || !targetNode) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const sourcePosition = this.getNodePosition(sourceNode);
|
|
140
|
+
const targetPosition = this.getNodePosition(targetNode);
|
|
141
|
+
|
|
142
|
+
if (!sourcePosition || !targetPosition) {
|
|
116
143
|
return null;
|
|
117
144
|
}
|
|
118
145
|
|
|
119
146
|
return {
|
|
120
|
-
type:
|
|
121
|
-
sourcePosition
|
|
122
|
-
targetPosition
|
|
147
|
+
type: 'line',
|
|
148
|
+
sourcePosition,
|
|
149
|
+
targetPosition,
|
|
123
150
|
controlPoints: []
|
|
124
151
|
};
|
|
125
152
|
};
|
|
126
153
|
|
|
127
|
-
getNodePosition = (node) => {
|
|
128
|
-
|
|
154
|
+
getNodePosition = (node: NodeInterface | null) => {
|
|
155
|
+
if (!node) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const d3Node = this._positionsByNodeId.get(node.getId());
|
|
129
160
|
if (d3Node) {
|
|
130
161
|
return d3Node.coordinates;
|
|
131
162
|
}
|
|
@@ -133,9 +164,10 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
|
|
|
133
164
|
return null;
|
|
134
165
|
};
|
|
135
166
|
|
|
136
|
-
lockNodePosition = (node, x, y) => {
|
|
137
|
-
const
|
|
138
|
-
this._positionsByNodeId.
|
|
167
|
+
lockNodePosition = (node: NodeInterface, x: number, y: number) => {
|
|
168
|
+
const id = node.getId();
|
|
169
|
+
const d3Node = this._positionsByNodeId.get(id);
|
|
170
|
+
this._positionsByNodeId.set(id, {
|
|
139
171
|
...d3Node,
|
|
140
172
|
x,
|
|
141
173
|
y,
|
|
@@ -147,9 +179,21 @@ export class D3ForceLayout extends GraphLayout<D3ForceLayoutOptions> {
|
|
|
147
179
|
this._onLayoutDone();
|
|
148
180
|
};
|
|
149
181
|
|
|
150
|
-
unlockNodePosition = (node) => {
|
|
151
|
-
const
|
|
182
|
+
unlockNodePosition = (node: NodeInterface) => {
|
|
183
|
+
const id = node.getId();
|
|
184
|
+
const d3Node = this._positionsByNodeId.get(id);
|
|
185
|
+
if (!d3Node) {
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
152
188
|
d3Node.fx = null;
|
|
153
189
|
d3Node.fy = null;
|
|
154
190
|
};
|
|
191
|
+
|
|
192
|
+
protected override _updateBounds(): void {
|
|
193
|
+
const positions = Array.from(
|
|
194
|
+
this._positionsByNodeId.values(),
|
|
195
|
+
(data) => data?.coordinates as [number, number] | null | undefined
|
|
196
|
+
);
|
|
197
|
+
this._bounds = this._calculateBounds(positions);
|
|
198
|
+
}
|
|
155
199
|
}
|
|
@@ -2,43 +2,38 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import {GraphLayout,
|
|
6
|
-
import {
|
|
7
|
-
import {EDGE_TYPE} from '../../core/constants';
|
|
8
|
-
import {Graph} from '../../graph/graph';
|
|
5
|
+
import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
|
|
6
|
+
import type {Graph, NodeInterface, EdgeInterface} from '../../graph/graph';
|
|
9
7
|
import * as d3 from 'd3-force';
|
|
10
8
|
|
|
11
|
-
export type
|
|
9
|
+
export type ForceMultiGraphLayoutProps = GraphLayoutProps & {
|
|
12
10
|
alpha?: number;
|
|
13
11
|
nBodyStrength?: number;
|
|
14
12
|
nBodyDistanceMin?: number;
|
|
15
13
|
nBodyDistanceMax?: number;
|
|
16
14
|
};
|
|
17
15
|
|
|
18
|
-
export class ForceMultiGraphLayout extends GraphLayout<
|
|
19
|
-
static
|
|
16
|
+
export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutProps> {
|
|
17
|
+
static defaultProps = {
|
|
18
|
+
...GraphLayout.defaultProps,
|
|
20
19
|
alpha: 3,
|
|
21
20
|
nBodyStrength: -1200,
|
|
22
21
|
nBodyDistanceMin: 100,
|
|
23
22
|
nBodyDistanceMax: 1400
|
|
24
|
-
}
|
|
23
|
+
} as const satisfies Readonly<Required<ForceMultiGraphLayoutProps>>;
|
|
25
24
|
|
|
26
25
|
_name = 'ForceMultiGraphLayout';
|
|
27
|
-
_graph: Graph;
|
|
26
|
+
_graph: Graph | null = null;
|
|
28
27
|
|
|
29
28
|
// d3 part
|
|
30
29
|
// custom graph data
|
|
31
|
-
_d3Graph = {nodes: [], edges: []};
|
|
32
|
-
_nodeMap =
|
|
33
|
-
_edgeMap =
|
|
34
|
-
_simulator;
|
|
30
|
+
_d3Graph: {nodes: any[]; edges: any[]} = {nodes: [], edges: []};
|
|
31
|
+
_nodeMap = new Map<string | number, any>();
|
|
32
|
+
_edgeMap = new Map<string | number, any>();
|
|
33
|
+
_simulator: d3.Simulation<any, undefined> | null = null;
|
|
35
34
|
|
|
36
|
-
constructor(
|
|
37
|
-
super(
|
|
38
|
-
this._options = {
|
|
39
|
-
...ForceMultiGraphLayout.defaultOptions,
|
|
40
|
-
...options
|
|
41
|
-
};
|
|
35
|
+
constructor(props: ForceMultiGraphLayoutProps = {}) {
|
|
36
|
+
super(props, ForceMultiGraphLayout.defaultProps);
|
|
42
37
|
}
|
|
43
38
|
|
|
44
39
|
initializeGraph(graph: Graph): void {
|
|
@@ -49,8 +44,10 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
49
44
|
if (d3Edge.isVirtual) {
|
|
50
45
|
return 1 / d3Edge.edgeCount;
|
|
51
46
|
}
|
|
52
|
-
const
|
|
53
|
-
const
|
|
47
|
+
const sourceNode = this._graph?.findNode(d3Edge.source.id);
|
|
48
|
+
const targetNode = this._graph?.findNode(d3Edge.target.id);
|
|
49
|
+
const sourceDegree = sourceNode?.getDegree() ?? 0;
|
|
50
|
+
const targetDegree = targetNode?.getDegree() ?? 0;
|
|
54
51
|
return 1 / Math.min(sourceDegree, targetDegree);
|
|
55
52
|
};
|
|
56
53
|
|
|
@@ -59,7 +56,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
59
56
|
this._simulator.on('tick', null).on('end', null);
|
|
60
57
|
this._simulator = null;
|
|
61
58
|
}
|
|
62
|
-
const {alpha, nBodyStrength, nBodyDistanceMin, nBodyDistanceMax} = this.
|
|
59
|
+
const {alpha, nBodyStrength, nBodyDistanceMin, nBodyDistanceMax} = this.props;
|
|
63
60
|
|
|
64
61
|
const g = this._d3Graph;
|
|
65
62
|
this._simulator = d3
|
|
@@ -68,6 +65,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
68
65
|
'edge',
|
|
69
66
|
d3
|
|
70
67
|
.forceLink(g.edges)
|
|
68
|
+
// @ts-ignore TODO id not defined?
|
|
71
69
|
.id((n) => n.id)
|
|
72
70
|
.strength(this._strength)
|
|
73
71
|
)
|
|
@@ -98,25 +96,30 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
98
96
|
this._simulator.stop();
|
|
99
97
|
}
|
|
100
98
|
|
|
101
|
-
|
|
99
|
+
update(): void {}
|
|
100
|
+
|
|
101
|
+
updateGraph(graph: Graph) {
|
|
102
102
|
this._graph = graph;
|
|
103
103
|
|
|
104
104
|
// nodes
|
|
105
|
-
const newNodeMap =
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
const
|
|
109
|
-
|
|
105
|
+
const newNodeMap = new Map<string | number, any>();
|
|
106
|
+
const nodes = Array.from(graph.getNodes());
|
|
107
|
+
const newD3Nodes = nodes.map((node) => {
|
|
108
|
+
const id = node.getId();
|
|
109
|
+
const oldD3Node = this._nodeMap.get(id);
|
|
110
|
+
const newD3Node = oldD3Node ? oldD3Node : {id};
|
|
111
|
+
newNodeMap.set(id, newD3Node);
|
|
110
112
|
return newD3Node;
|
|
111
113
|
});
|
|
112
114
|
|
|
113
115
|
// edges
|
|
114
116
|
// bucket edges between the same source/target node pairs.
|
|
115
|
-
const
|
|
116
|
-
|
|
117
|
+
const edges = Array.from(graph.getEdges());
|
|
118
|
+
const nodePairs = edges.reduce((res, edge) => {
|
|
119
|
+
const endpoints = [edge.getSourceNodeId(), edge.getTargetNodeId()];
|
|
117
120
|
// sort the node ids to count the edges with the same pair
|
|
118
121
|
// but different direction (a -> b or b -> a)
|
|
119
|
-
const pairId =
|
|
122
|
+
const pairId = endpoints.sort().toString();
|
|
120
123
|
// push this edge into the bucket
|
|
121
124
|
if (!res[pairId]) {
|
|
122
125
|
res[pairId] = [edge];
|
|
@@ -129,8 +132,8 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
129
132
|
// go through each pair of edges,
|
|
130
133
|
// if only one edge between two nodes, create a straight line
|
|
131
134
|
// otherwise, create one virtual node and two edges for each edge
|
|
132
|
-
const newD3Edges = [];
|
|
133
|
-
const newEdgeMap =
|
|
135
|
+
const newD3Edges: any[] = [];
|
|
136
|
+
const newEdgeMap = new Map<string | number, any>();
|
|
134
137
|
|
|
135
138
|
Object.keys(nodePairs).forEach((pairId) => {
|
|
136
139
|
const betweenEdges = nodePairs[pairId];
|
|
@@ -138,39 +141,40 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
138
141
|
if (betweenEdges.length === 1) {
|
|
139
142
|
// do nothing, this is a real edge
|
|
140
143
|
const newD3Edge = {
|
|
141
|
-
type:
|
|
144
|
+
type: 'line',
|
|
142
145
|
id: firstEdge.getId(),
|
|
143
|
-
source: newNodeMap
|
|
144
|
-
target: newNodeMap
|
|
146
|
+
source: newNodeMap.get(firstEdge.getSourceNodeId()),
|
|
147
|
+
target: newNodeMap.get(firstEdge.getTargetNodeId()),
|
|
145
148
|
isVirtual: false
|
|
146
149
|
};
|
|
147
|
-
newEdgeMap
|
|
150
|
+
newEdgeMap.set(firstEdge.getId(), newD3Edge);
|
|
148
151
|
newD3Edges.push(newD3Edge);
|
|
149
152
|
return;
|
|
150
153
|
}
|
|
151
154
|
|
|
152
155
|
// else reduce to one virtual edge
|
|
153
156
|
const newD3Edge = {
|
|
154
|
-
type:
|
|
157
|
+
type: 'line',
|
|
155
158
|
id: pairId,
|
|
156
|
-
source: newNodeMap
|
|
157
|
-
target: newNodeMap
|
|
159
|
+
source: newNodeMap.get(firstEdge.getSourceNodeId()),
|
|
160
|
+
target: newNodeMap.get(firstEdge.getTargetNodeId()),
|
|
158
161
|
isVirtual: true,
|
|
159
162
|
edgeCount: betweenEdges.length
|
|
160
163
|
};
|
|
161
|
-
newEdgeMap
|
|
164
|
+
newEdgeMap.set(pairId, newD3Edge);
|
|
162
165
|
newD3Edges.push(newD3Edge);
|
|
163
166
|
|
|
164
167
|
betweenEdges.forEach((e, idx) => {
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
168
|
+
const edgeId = e.getId();
|
|
169
|
+
newEdgeMap.set(edgeId, {
|
|
170
|
+
type: 'spline-curve',
|
|
171
|
+
id: edgeId,
|
|
172
|
+
source: newNodeMap.get(e.getSourceNodeId()),
|
|
173
|
+
target: newNodeMap.get(e.getTargetNodeId()),
|
|
170
174
|
virtualEdgeId: pairId,
|
|
171
175
|
isVirtual: true,
|
|
172
176
|
index: idx
|
|
173
|
-
};
|
|
177
|
+
});
|
|
174
178
|
});
|
|
175
179
|
});
|
|
176
180
|
|
|
@@ -180,8 +184,8 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
180
184
|
this._d3Graph.edges = newD3Edges;
|
|
181
185
|
}
|
|
182
186
|
|
|
183
|
-
getNodePosition = (node:
|
|
184
|
-
const d3Node = this._nodeMap
|
|
187
|
+
getNodePosition = (node: NodeInterface): [number, number] => {
|
|
188
|
+
const d3Node = this._nodeMap.get(node.getId());
|
|
185
189
|
if (d3Node) {
|
|
186
190
|
return [d3Node.x, d3Node.y];
|
|
187
191
|
}
|
|
@@ -189,19 +193,22 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
189
193
|
return [0, 0];
|
|
190
194
|
};
|
|
191
195
|
|
|
192
|
-
getEdgePosition = (edge) => {
|
|
193
|
-
const d3Edge = this._edgeMap
|
|
196
|
+
getEdgePosition = (edge: EdgeInterface) => {
|
|
197
|
+
const d3Edge = this._edgeMap.get(edge.getId());
|
|
194
198
|
if (d3Edge) {
|
|
195
199
|
if (!d3Edge.isVirtual) {
|
|
196
200
|
return {
|
|
197
|
-
type:
|
|
201
|
+
type: 'line',
|
|
198
202
|
sourcePosition: [d3Edge.source.x, d3Edge.source.y],
|
|
199
203
|
targetPosition: [d3Edge.target.x, d3Edge.target.y],
|
|
200
204
|
controlPoints: []
|
|
201
205
|
};
|
|
202
206
|
}
|
|
203
207
|
// else, check the referenced virtual edge
|
|
204
|
-
const virtualEdge = this._edgeMap
|
|
208
|
+
const virtualEdge = this._edgeMap.get(d3Edge.virtualEdgeId);
|
|
209
|
+
if (!virtualEdge) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
205
212
|
const edgeCount = virtualEdge.edgeCount;
|
|
206
213
|
// get the position of source and target nodes
|
|
207
214
|
const sourcePosition = [virtualEdge.source.x, virtualEdge.source.y];
|
|
@@ -222,7 +229,7 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
222
229
|
(symmetricShape ? Math.floor(index / 2 + 1) : Math.ceil(index / 2));
|
|
223
230
|
const controlPoint = computeControlPoint(sourcePosition, targetPosition, direction, offset);
|
|
224
231
|
return {
|
|
225
|
-
type:
|
|
232
|
+
type: 'spline-curve',
|
|
226
233
|
sourcePosition,
|
|
227
234
|
targetPosition,
|
|
228
235
|
controlPoints: [controlPoint]
|
|
@@ -230,20 +237,28 @@ export class ForceMultiGraphLayout extends GraphLayout<ForceMultiGraphLayoutOpti
|
|
|
230
237
|
}
|
|
231
238
|
// default value
|
|
232
239
|
return {
|
|
233
|
-
type:
|
|
240
|
+
type: 'line',
|
|
234
241
|
sourcePosition: [0, 0],
|
|
235
242
|
targetPosition: [0, 0],
|
|
236
243
|
controlPoints: []
|
|
237
244
|
};
|
|
238
245
|
};
|
|
239
246
|
|
|
240
|
-
lockNodePosition = (node, x, y) => {
|
|
241
|
-
const d3Node = this._nodeMap
|
|
247
|
+
lockNodePosition = (node: NodeInterface, x: number, y: number) => {
|
|
248
|
+
const d3Node = this._nodeMap.get(node.getId());
|
|
249
|
+
if (!d3Node) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
242
252
|
d3Node.x = x;
|
|
243
253
|
d3Node.y = y;
|
|
244
254
|
this._onLayoutChange();
|
|
245
255
|
this._onLayoutDone();
|
|
246
256
|
};
|
|
257
|
+
|
|
258
|
+
protected override _updateBounds(): void {
|
|
259
|
+
const positions = Array.from(this._nodeMap.values(), (node) => this._normalizePosition(node));
|
|
260
|
+
this._bounds = this._calculateBounds(positions);
|
|
261
|
+
}
|
|
247
262
|
}
|
|
248
263
|
|
|
249
264
|
/**
|
|
@@ -2,54 +2,47 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
|
|
5
|
-
import {GraphLayout,
|
|
6
|
-
import {
|
|
7
|
-
import {EDGE_TYPE} from '../../core/constants';
|
|
8
|
-
import {Graph} from '../../graph/graph';
|
|
5
|
+
import {GraphLayout, GraphLayoutProps} from '../../core/graph-layout';
|
|
6
|
+
import type {Graph, NodeInterface, EdgeInterface} from '../../graph/graph';
|
|
9
7
|
|
|
10
|
-
export type
|
|
8
|
+
export type HivePlotLayoutProps = GraphLayoutProps & {
|
|
11
9
|
innerRadius?: number;
|
|
12
10
|
outerRadius?: number;
|
|
13
|
-
getNodeAxis?: (node:
|
|
11
|
+
getNodeAxis?: (node: NodeInterface) => any;
|
|
14
12
|
};
|
|
15
13
|
|
|
16
|
-
export class HivePlotLayout extends GraphLayout<
|
|
17
|
-
static
|
|
14
|
+
export class HivePlotLayout extends GraphLayout<HivePlotLayoutProps> {
|
|
15
|
+
static defaultProps = {
|
|
16
|
+
...GraphLayout.defaultProps,
|
|
18
17
|
innerRadius: 100,
|
|
19
18
|
outerRadius: 500,
|
|
20
|
-
getNodeAxis: (node:
|
|
21
|
-
} as const satisfies Readonly<Required<
|
|
19
|
+
getNodeAxis: (node: NodeInterface) => node.getPropertyValue('group')
|
|
20
|
+
} as const satisfies Readonly<Required<HivePlotLayoutProps>>;
|
|
22
21
|
|
|
23
22
|
_name = 'HivePlot';
|
|
24
|
-
_graph: Graph;
|
|
25
|
-
_totalAxis: number;
|
|
26
|
-
_axis: Record<string,
|
|
27
|
-
_nodeMap =
|
|
28
|
-
_nodePositionMap =
|
|
29
|
-
|
|
30
|
-
constructor(
|
|
31
|
-
super(
|
|
32
|
-
this._options = {
|
|
33
|
-
...HivePlotLayout.defaultOptions,
|
|
34
|
-
...options
|
|
35
|
-
};
|
|
23
|
+
_graph: Graph | null = null;
|
|
24
|
+
_totalAxis: number = 0;
|
|
25
|
+
_axis: Record<string, NodeInterface[]> = {};
|
|
26
|
+
_nodeMap = new Map<string | number, NodeInterface>();
|
|
27
|
+
_nodePositionMap = new Map<string | number, [number, number]>();
|
|
28
|
+
|
|
29
|
+
constructor(props: HivePlotLayoutProps = {}) {
|
|
30
|
+
super(props, HivePlotLayout.defaultProps);
|
|
36
31
|
}
|
|
37
32
|
|
|
38
33
|
initializeGraph(graph: Graph) {
|
|
39
34
|
this.updateGraph(graph);
|
|
40
35
|
}
|
|
41
36
|
|
|
42
|
-
updateGraph(graph) {
|
|
43
|
-
const {getNodeAxis, innerRadius, outerRadius} = this.
|
|
37
|
+
updateGraph(graph: Graph) {
|
|
38
|
+
const {getNodeAxis, innerRadius, outerRadius} = this.props;
|
|
44
39
|
this._graph = graph;
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
return res;
|
|
48
|
-
}, {});
|
|
40
|
+
const nodes = Array.from(graph.getNodes());
|
|
41
|
+
this._nodeMap = new Map(nodes.map((node) => [node.getId(), node]));
|
|
49
42
|
|
|
50
43
|
// bucket nodes into few axis
|
|
51
44
|
|
|
52
|
-
this._axis =
|
|
45
|
+
this._axis = nodes.reduce((res, node) => {
|
|
53
46
|
const axis = getNodeAxis(node);
|
|
54
47
|
if (!res[axis]) {
|
|
55
48
|
res[axis] = [];
|
|
@@ -78,7 +71,8 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
|
|
|
78
71
|
const angleInterval = 360 / Object.keys(this._axis).length;
|
|
79
72
|
|
|
80
73
|
// calculate positions
|
|
81
|
-
this._nodePositionMap =
|
|
74
|
+
this._nodePositionMap = new Map();
|
|
75
|
+
Object.keys(this._axis).forEach((axis, axisIdx) => {
|
|
82
76
|
const axisAngle = angleInterval * axisIdx;
|
|
83
77
|
const bucketedNodes = this._axis[axis];
|
|
84
78
|
const interval = (outerRadius - innerRadius) / bucketedNodes.length;
|
|
@@ -87,36 +81,46 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
|
|
|
87
81
|
const radius = innerRadius + idx * interval;
|
|
88
82
|
const x = Math.cos((axisAngle / 180) * Math.PI) * radius + center[0];
|
|
89
83
|
const y = Math.sin((axisAngle / 180) * Math.PI) * radius + center[1];
|
|
90
|
-
|
|
84
|
+
this._nodePositionMap.set(node.getId(), [x, y]);
|
|
91
85
|
});
|
|
92
|
-
|
|
93
|
-
}, {});
|
|
86
|
+
});
|
|
94
87
|
}
|
|
95
88
|
|
|
96
89
|
start() {
|
|
90
|
+
this._onLayoutStart();
|
|
97
91
|
this._onLayoutChange();
|
|
98
92
|
this._onLayoutDone();
|
|
99
93
|
}
|
|
100
94
|
|
|
101
|
-
|
|
95
|
+
stop() {}
|
|
96
|
+
|
|
97
|
+
update() {}
|
|
102
98
|
|
|
103
|
-
|
|
104
|
-
|
|
99
|
+
resume() {}
|
|
100
|
+
|
|
101
|
+
getNodePosition = (node: NodeInterface) => this._nodePositionMap.get(node.getId());
|
|
102
|
+
|
|
103
|
+
getEdgePosition = (edge: EdgeInterface) => {
|
|
104
|
+
const {getNodeAxis} = this.props;
|
|
105
105
|
const sourceNodeId = edge.getSourceNodeId();
|
|
106
106
|
const targetNodeId = edge.getTargetNodeId();
|
|
107
107
|
|
|
108
|
-
const sourcePosition = this._nodePositionMap
|
|
109
|
-
const targetPosition = this._nodePositionMap
|
|
108
|
+
const sourcePosition = this._nodePositionMap.get(sourceNodeId);
|
|
109
|
+
const targetPosition = this._nodePositionMap.get(targetNodeId);
|
|
110
|
+
|
|
111
|
+
if (!sourcePosition || !targetPosition) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
110
114
|
|
|
111
|
-
const sourceNode = this._nodeMap
|
|
112
|
-
const targetNode = this._nodeMap
|
|
115
|
+
const sourceNode = this._nodeMap.get(sourceNodeId);
|
|
116
|
+
const targetNode = this._nodeMap.get(targetNodeId);
|
|
113
117
|
|
|
114
|
-
const sourceNodeAxis = getNodeAxis(sourceNode);
|
|
115
|
-
const targetNodeAxis = getNodeAxis(targetNode);
|
|
118
|
+
const sourceNodeAxis = sourceNode ? getNodeAxis(sourceNode) : null;
|
|
119
|
+
const targetNodeAxis = targetNode ? getNodeAxis(targetNode) : null;
|
|
116
120
|
|
|
117
|
-
if (sourceNodeAxis === targetNodeAxis) {
|
|
121
|
+
if (sourceNodeAxis !== null && sourceNodeAxis === targetNodeAxis) {
|
|
118
122
|
return {
|
|
119
|
-
type:
|
|
123
|
+
type: 'line',
|
|
120
124
|
sourcePosition,
|
|
121
125
|
targetPosition,
|
|
122
126
|
controlPoints: []
|
|
@@ -125,25 +129,32 @@ export class HivePlotLayout extends GraphLayout<HivePlotLayoutOptions> {
|
|
|
125
129
|
|
|
126
130
|
const controlPoint = computeControlPoint({
|
|
127
131
|
sourcePosition,
|
|
128
|
-
sourceNodeAxis,
|
|
132
|
+
sourceNodeAxis: sourceNodeAxis ?? 0,
|
|
129
133
|
targetPosition,
|
|
130
|
-
targetNodeAxis,
|
|
134
|
+
targetNodeAxis: targetNodeAxis ?? 0,
|
|
131
135
|
totalAxis: this._totalAxis
|
|
132
136
|
});
|
|
133
137
|
|
|
134
138
|
return {
|
|
135
|
-
type:
|
|
139
|
+
type: 'spline-curve',
|
|
136
140
|
sourcePosition,
|
|
137
141
|
targetPosition,
|
|
138
142
|
controlPoints: [controlPoint]
|
|
139
143
|
};
|
|
140
144
|
};
|
|
141
145
|
|
|
142
|
-
lockNodePosition = (node, x, y) => {
|
|
143
|
-
this._nodePositionMap
|
|
146
|
+
lockNodePosition = (node: NodeInterface, x: number, y: number) => {
|
|
147
|
+
this._nodePositionMap.set(node.getId(), [x, y]);
|
|
144
148
|
this._onLayoutChange();
|
|
145
149
|
this._onLayoutDone();
|
|
146
150
|
};
|
|
151
|
+
|
|
152
|
+
protected override _updateBounds(): void {
|
|
153
|
+
const positions = Array.from(this._nodePositionMap.values(), (position) =>
|
|
154
|
+
this._normalizePosition(position)
|
|
155
|
+
);
|
|
156
|
+
this._bounds = this._calculateBounds(positions);
|
|
157
|
+
}
|
|
147
158
|
}
|
|
148
159
|
|
|
149
160
|
function computeControlPoint({
|