Я опубликовал это на форуме MSAGL (Microsoft Automati c Graphi c Layout), но он кажется старым. Я использую только DLL компоновки, а не DLL для рисования, потому что я хочу использовать только возможность компоновки пакета автоматизированного c и рисовать самостоятельно, используя собственные возможности graphi c (в будущем это будет заменено третьим сторонний механизм рисования).
Я использую макет Sugiyama с прямолинейной маршрутизацией кромок (RER).
Кроме того, поскольку компоновка Sugiyama размещает узел снизу вверх> и так как я хотел слева - > Правильно, я применил PlaneTransformation в layoutsettings, чтобы повернуть макет на 90 градусов по часовой стрелке, чтобы нижняя часть стала левой, а верхняя - правой. Ниже приведен код:
var settings = new SugiyamaLayoutSettings {
Transformation = PlaneTransformation.Rotation(Math.PI / 2),
EdgeRoutingSettings = { EdgeRoutingMode = EdgeRoutingMode.Rectilinear },
};
Я хочу подключить узел A к узлу B, и каждый узел представляет собой прямоугольник. Я специально хочу, чтобы исходный порт края исходил от нижней границы A. Я соответственно устанавливаю исходный и целевой порты следующим образом
Node n1 = graph.FindNodeByUserData("A");
Node n2 = graph.FindNodeByUserData("B");
Edge myedge = new Edge(n1, n2);
Microsoft.Msagl.Core.Geometry.Rectangle rect= n1.BoundingBox;
double midx = rect.LeftBottom.X + (rect.Width/ 2); //find the midpoint of the bottom edge of the rect
double midy = rect.LeftBottom.Y;
Microsoft.Msagl.Core.Geometry.Point P=new Microsoft.Msagl.Core.Geometry.Point(midx,midy);
myedge.SourcePort = new FloatingPort(n1.BoundaryCurve,P); //assign the port to the rectangle's boundary curve at point P
myedge.TargetPort = new FloatingPort(n2.BoundaryCurve, n2.Center);
graph.Edges.Add(myedge);
Однако край не появляется там, где это необходимо.
Вы можете мне здесь помочь?