UNPKG

cione-comp-lib

Version:

`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`

113 lines (112 loc) 4.68 kB
import { forceLayout } from "./forceHelper.mjs"; import { simpleLayout } from "./simpleLayoutHelper.mjs"; import { circularLayout } from "./circularLayoutHelper.mjs"; import { linearMap } from "../../util/number.mjs"; import { copy } from "../../../../zrender/lib/core/vector.mjs"; import { isArray, retrieve3 } from "../../../../zrender/lib/core/util.mjs"; import { getCurvenessForEdge } from "../helper/multipleGraphEdgeHelper.mjs"; function graphForceLayout(ecModel) { ecModel.eachSeriesByType("graph", function(graphSeries) { var coordSys = graphSeries.coordinateSystem; if (coordSys && coordSys.type !== "view") { return; } if (graphSeries.get("layout") === "force") { var preservedPoints_1 = graphSeries.preservedPoints || {}; var graph_1 = graphSeries.getGraph(); var nodeData_1 = graph_1.data; var edgeData = graph_1.edgeData; var forceModel = graphSeries.getModel("force"); var initLayout = forceModel.get("initLayout"); if (graphSeries.preservedPoints) { nodeData_1.each(function(idx) { var id = nodeData_1.getId(idx); nodeData_1.setItemLayout(idx, preservedPoints_1[id] || [NaN, NaN]); }); } else if (!initLayout || initLayout === "none") { simpleLayout(graphSeries); } else if (initLayout === "circular") { circularLayout(graphSeries, "value"); } var nodeDataExtent_1 = nodeData_1.getDataExtent("value"); var edgeDataExtent_1 = edgeData.getDataExtent("value"); var repulsion = forceModel.get("repulsion"); var edgeLength = forceModel.get("edgeLength"); var repulsionArr_1 = isArray(repulsion) ? repulsion : [repulsion, repulsion]; var edgeLengthArr_1 = isArray(edgeLength) ? edgeLength : [edgeLength, edgeLength]; edgeLengthArr_1 = [edgeLengthArr_1[1], edgeLengthArr_1[0]]; var nodes_1 = nodeData_1.mapArray("value", function(value, idx) { var point = nodeData_1.getItemLayout(idx); var rep = linearMap(value, nodeDataExtent_1, repulsionArr_1); if (isNaN(rep)) { rep = (repulsionArr_1[0] + repulsionArr_1[1]) / 2; } return { w: rep, rep, fixed: nodeData_1.getItemModel(idx).get("fixed"), p: !point || isNaN(point[0]) || isNaN(point[1]) ? null : point }; }); var edges = edgeData.mapArray("value", function(value, idx) { var edge = graph_1.getEdgeByIndex(idx); var d = linearMap(value, edgeDataExtent_1, edgeLengthArr_1); if (isNaN(d)) { d = (edgeLengthArr_1[0] + edgeLengthArr_1[1]) / 2; } var edgeModel = edge.getModel(); var curveness = retrieve3(edge.getModel().get(["lineStyle", "curveness"]), -getCurvenessForEdge(edge, graphSeries, idx, true), 0); return { n1: nodes_1[edge.node1.dataIndex], n2: nodes_1[edge.node2.dataIndex], d, curveness, ignoreForceLayout: edgeModel.get("ignoreForceLayout") }; }); var rect = coordSys.getBoundingRect(); var forceInstance = forceLayout(nodes_1, edges, { rect, gravity: forceModel.get("gravity"), friction: forceModel.get("friction") }); forceInstance.beforeStep(function(nodes, edges2) { for (var i = 0, l = nodes.length; i < l; i++) { if (nodes[i].fixed) { copy(nodes[i].p, graph_1.getNodeByIndex(i).getLayout()); } } }); forceInstance.afterStep(function(nodes, edges2, stopped) { for (var i = 0, l = nodes.length; i < l; i++) { if (!nodes[i].fixed) { graph_1.getNodeByIndex(i).setLayout(nodes[i].p); } preservedPoints_1[nodeData_1.getId(i)] = nodes[i].p; } for (var i = 0, l = edges2.length; i < l; i++) { var e = edges2[i]; var edge = graph_1.getEdgeByIndex(i); var p1 = e.n1.p; var p2 = e.n2.p; var points = edge.getLayout(); points = points ? points.slice() : []; points[0] = points[0] || []; points[1] = points[1] || []; copy(points[0], p1); copy(points[1], p2); if (+e.curveness) { points[2] = [(p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness]; } edge.setLayout(points); } }); graphSeries.forceLayout = forceInstance; graphSeries.preservedPoints = preservedPoints_1; forceInstance.step(); } else { graphSeries.forceLayout = null; } }); } export { graphForceLayout as default };