使用 MSAGL 仅路由边缘

Routing only edges with MSAGL

有没有办法使用 MSAGL 在现有布局中只布线边缘?

我有一个 GeometryGraph 对象,其布局是使用 LayeredLayout 生成的,我想 remove/add 边缘而不 运行 再次使用布局算法(此操作进行了重大更改到节点位置并使最终用户感到困惑)。

我能否以某种方式简单地运行再次布局并固定所有节点位置?

您需要 InteractiveEdgeRouter 与您的图表保持同步:

edgeRouter_ = new InteractiveEdgeRouter(Graph.Nodes.Select(n => n.BoundaryCurve), 3, 0.65 * 3, 0);

图形布局的每次重新计算也应调用 edgeRouter_.Run() 以使其与障碍物变化保持同步(您也应添加新节点)。

添加新边后,不用再次计算布局,使用路由器手动设置边曲线:

 private void RouteMissingEdges()
 {
     foreach (var edge in Graph.Edges)
     {
         if (edge.Curve == null)
         {
             SmoothedPolyline ignore;

             edge.Curve = edgeRouter_.RouteSplineFromPortToPortWhenTheWholeGraphIsReady(
                 new FloatingPort(edge.Source.BoundaryCurve, edge.Source.Center),
                 new FloatingPort(edge.Target.BoundaryCurve, edge.Target.Center),
                 true, out ignore);

             Arrowheads.TrimSplineAndCalculateArrowheads(edge.EdgeGeometry,
                                             edge.Source.BoundaryCurve,
                                             edge.Target.BoundaryCurve,
                                             edge.Curve, true,
                                             false);

         }
     }
}

使用可以使用LayoutHelpers.RouteAndLabelEdges

LayoutAlgorithmSettings settings = new MdsLayoutSettings();
RouteAndLabelEdges(geometryGraph, settings, geometryGraph.Edges);

它比 ghord 的解决方案更短,但需要更多的计算。