使用 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 的解决方案更短,但需要更多的计算。
有没有办法使用 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 的解决方案更短,但需要更多的计算。