layout function
给定节点和边进行图布局
multiGraph
是否为多边图(同一对节点之间可以有多个边的图)
compoundGraph
是否为复合图(一个节点可以是其它节点的父节点)
directedGraph
是否为有向图(如果是,那么边上节点的顺序是有效的)
Implementation
DagreResult layout(
List<DagreNode> nodeList,
List<DagreEdge> edgeList,
Config config, {
bool multiGraph = false,
bool compoundGraph = true,
bool directedGraph = true,
}) {
Graph graph = Graph(isCompound: compoundGraph, isMultiGraph: multiGraph, isDirected: directedGraph);
Map<String, DagreNode> nodeMap = {};
Map<String, DagreEdge> edgeMap = {};
for (var ele in nodeList) {
nodeMap[ele.id] = ele;
graph.setNode(ele.id, NodeProps(width: ele.width, height: ele.height));
}
for (var edge in edgeList) {
String v = edge.source.id;
String w = edge.target.id;
EdgeProps props = EdgeProps(minLen: edge.minLen, weight: edge.weight);
props.width = edge.width;
props.height = edge.height;
props.labelOffset = edge.labelOffset;
props.labelPos = edge.labelPos;
graph.setEdge(v, w, value: props, id: edge.id);
nodeMap[edge.source.id] = edge.source;
nodeMap[edge.target.id] = edge.target;
edgeMap[edge.id] = edge;
}
GraphProps props = GraphProps();
props.rankDir = config.rankDir;
props.align = config.align;
props.acyclicer = config.acyclicer;
props.ranker = config.ranker;
props.marginX = config.marginX;
props.marginY = config.marginY;
props.rankSep = config.rankSep;
props.edgeSep = config.edgeSep;
props.nodeSep = config.nodeSep;
props.width = config.width;
props.height = config.height;
graph.setGraph(props);
layer.layout(graph);
DagreResult result = DagreResult(graph.graph.width ?? 0, graph.graph.height ?? 0);
for (var v in graph.nodes) {
var node = graph.node(v);
result.nodePosMap[v] = Rect.fromCenter(
center: Offset(node.x.toDouble(), node.y.toDouble()),
width: node.width.toDouble(),
height: node.height.toDouble(),
);
}
for (var v in graph.edges) {
var e = graph.edge(v);
EdgeResult result = EdgeResult(e.x.toDouble(), e.y.toDouble());
for (var ep in e.points) {
result.points.add(Offset(ep.x.toDouble(), ep.y.toDouble()));
}
}
return result;
}