UNPKG

@antv/g6

Version:

graph visualization frame work

122 lines (109 loc) 3.02 kB
/** * @fileOverview random layout * @author shiwu.wyy@antfin.com */ var dagre = require('dagre'); var Layout = require('./layout'); var isArray = require('@antv/util/lib/type/is-array'); /** * 随机布局 */ Layout.registerLayout('dagre', { getDefaultCfg: function getDefaultCfg() { return { rankdir: 'TB', // layout 方向, 可选 TB, BT, LR, RL align: undefined, // 节点对齐方式,可选 UL, UR, DL, DR nodeSize: undefined, // 节点大小 nodesepFunc: function nodesepFunc() { return 50; }, // 节点水平间距(px) ranksepFunc: function ranksepFunc() { return 50; }, // 每一层节点之间间距 nodesep: 50, // 节点水平间距(px) ranksep: 50, // 每一层节点之间间距 controlPoints: true // 是否保留布局连线的控制点 }; }, /** * 执行布局 */ execute: function execute() { var self = this; var nodes = self.nodes; var edges = self.edges; var g = new dagre.graphlib.Graph(); var nodeSize = self.nodeSize; var nodeSizeFunc; if (!nodeSize) { nodeSizeFunc = function nodeSizeFunc(d) { if (d.size) { if (isArray(d.size)) { return d.size; } return [d.size, d.size]; } return [40, 40]; }; } else if (isArray(nodeSize)) { nodeSizeFunc = function nodeSizeFunc() { return nodeSize; }; } else { nodeSizeFunc = function nodeSizeFunc() { return [nodeSize, nodeSize]; }; } var horisep = self.nodesep; if (self.nodesepFunc) horisep = self.nodesepFunc; var vertisep = self.ranksep; if (self.ranksepFunc) vertisep = self.ranksepFunc; var rankdir = self.rankdir; if (rankdir === 'LR' || rankdir === 'RL') { horisep = self.ranksep; if (self.ranksepFunc) horisep = self.ranksepFunc; vertisep = self.nodesep; if (self.nodesepFunc) vertisep = self.nodesepFunc; } g.setDefaultEdgeLabel(function () { return {}; }); g.setGraph(self); nodes.forEach(function (node) { var size = nodeSizeFunc(node); var hori = horisep(node); var verti = vertisep(node); var width = size[0] + 2 * hori; var height = size[1] + 2 * verti; g.setNode(node.id, { width: width, height: height }); }); edges.forEach(function (edge) { g.setEdge(edge.source, edge.target); }); dagre.layout(g); var coord; g.nodes().forEach(function (node, i) { coord = g.node(node); nodes[i].x = coord.x; nodes[i].y = coord.y; }); g.edges().forEach(function (edge, i) { coord = g.edge(edge); edges[i].startPoint = coord.points[0]; edges[i].endPoint = coord.points[coord.points.length - 1]; if (self.controlPoints) { edges[i].controlPoints = coord.points.slice(1, coord.points.length - 1); } }); } });