如何在控制系统图中用点定位元素?

问题描述 投票:0回答:1

我想控制以下示例中某些元素的位置:

digraph {
        graph [splines=ortho];

        /* Node customization. */
        node [shape=box];
        join [shape=point];
        set [label="set\npoint"];

        /* Define node levels; driving elements on top, feed back below. */
        { rank = min; set; PID; P1; P2; join; OUT;}
        { rank = max; M1;}

        /* Edges */
        set -> PID -> P1 -> P2;
        P2-> join [arrowhead=none];
        join -> {OUT; M1};
        PID -> M1 [dir=back];
}

Control system block diagram

  1. 如果我向M1等级添加更多元素,则边缘将连接到随机点(北/顶侧)。我想保持它们水平连接。能做到吗?
  2. 如何增加PID / P1 / P2之间的间距(边长)?
  3. 垂直对齐P1 / M1会很好。能做到吗?
  4. 传统控制系统图没有join节点,并且一条边刚好从另一条边出来。这可能吗?为此,我卸下了箭头。

也许有些问题是无关紧要的,因为正确定位一个问题会使其他问题自然发生。

graphviz dot
1个回答
1
投票
  1. 通常,您可以使用headport属性控制箭头进入节点的点。但是对于ortho样条曲线,这很少起作用。正交样条线过着自己的生活,并可能引起各种不同的问题,包括边缘标签消失。因此,您的第一个问题没有确定的答案,每种情况都必须专门处理。

  2. 您可以通过设置nodesep图形属性来增加all节点之间的距离。但是,如果只需要增加特定节点之间的距离,可以使用一个技巧:添加一个带有大量空格的标签作为值。

  3. 您可以用不可见的边缘来完成它。

下面编辑示例中说明的第2点和第3点:

digraph {
        graph [splines=ortho];

        /* Node customization. */
        node [shape=box];
        join [shape=point];
        set [label="set\npoint"];

        /* Define node levels; driving elements on top, feed back below. */
        { rank = min; set; PID; P1; P2; join; OUT;}
        { rank = max; M1;}

        /* Edges */
        set -> PID;
        P2-> join [arrowhead=none];
        join -> {OUT; M1}
        PID -> M1 [dir=back];


        PID -> P1 -> P2 [label="               "] /* #2 increase space between specific nodes */
        P1 -> M1 [style=invis] /* #3 align P1 an M1 */
}

结果:

example

© www.soinside.com 2019 - 2024. All rights reserved.