Как расположить элементы с точкой на схеме системы управления?

Я хочу контролировать позиционирование некоторых элементов в следующем примере:

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];
}

Блок-схема системы управления

  1. Если я добавлю больше элементов в ранг M1, ребра соединятся со случайными точками (северная/верхняя сторона). Я хотел бы, чтобы они соединялись горизонтально. Можно ли это сделать?
  2. Как увеличить расстояние (длину края) между PID/P1/P2?
  3. Было бы неплохо выровнять P1/M1 по вертикали. Можно ли это сделать?
  4. На диаграммах традиционной системы управления нет узла join, и ребро просто выходит из другого ребра. Возможно ли это? Для этого я удалил наконечник стрелки.

Возможно, некоторые из вопросов являются посторонними, поскольку правильная постановка одного из них заставит естественным образом возникнуть другие.


person artless noise    schedule 17.11.2019    source источник
comment
Аналогичная схема... Я думаю, я могу просто использовать другую стрелку (нет) для присоединения узла "P2".   -  person artless noise    schedule 17.11.2019


Ответы (1)


  1. Как правило, вы можете контролировать точку, в которой стрелка входит в узел, с помощью headport< /а> атрибут. Но со сплайнами ortho это редко работает. Ортосплайны живут своей жизнью и могут вызывать множество различных проблем, включая исчезновение меток ребер. Так что однозначного ответа на ваш первый вопрос нет, каждую ситуацию нужно рассматривать отдельно.

  2. Вы можете увеличить расстояние между всеми узлами, установив nodesep. Но если вам нужно увеличить расстояние только между определенными узлами, вы можете воспользоваться хитростью: добавить метку с большим количеством пробелов для значения.

  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 */
}

результат:

пример

person Dany    schedule 18.11.2019