layout function

DagreResult layout(
  1. List<DagreNode> nodeList,
  2. List<DagreEdge> edgeList,
  3. Config config, {
  4. bool multiGraph = false,
  5. bool compoundGraph = true,
  6. bool directedGraph = true,
})

给定节点和边进行图布局 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;
}