Центрирование выравнивания кластеров при их соединении - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть два кластера, которые связаны, но я не могу выровнять крайний левый кластер (с узлом nd_6) с центром другого узла (cluster_circ).Вот пример:

digraph d1 {
  # configs
  rankdir = "LR";
  compound=true;
  node [shape = plaintext];
  edge [arrowhead = "vee"];

  nd_1 [group = g1]
  nd_2 [group = g1]

  # cluster for circular pattern
  subgraph cluster_circ {
    color=none;
    node [shape = plaintext];
    nd_3 [group = g1]
    {rank=same nd_4[group = g2]; nd_5[group = g3]};
    nd_3 -> nd_4:nw;
    nd_4 -> nd_5:ne; 
    nd_5 -> nd_3:se;
  }

  # right-most cluster
  subgraph cluster_r {
    color=none;
    node [shape = plaintext];
    nd_6 [group = g1];
  }

  # edge connections
  nd_1 -> nd_2; 
  nd_2 -> nd_3;

  # connect clusters
  nd_5 -> nd_6 [ltail=cluster_circ lhead=cluster_r]
}

Получение следующего результата: enter image description here

То, чего я пытаюсь добиться, - это разместить узел nd_6 и егосоответствующий край, соединяющийся с cluster_circ, выровнен с nd_3.

Спасибо!

1 Ответ

0 голосов
/ 31 декабря 2018

Вам нужно сделать две вещи, чтобы достичь своей цели:

  • соответствовать вашим точкам компаса
  • иметь невидимое ребро от nd_4, которое перемещается на nd_6 вверх.

Оба пункта объяснены в комментариях к исходному коду ниже.В процессе редактирования я удалил много материала, который не был существенным в контексте, для удобства чтения.

digraph d1 
{
  // configs                      // comment characters changed to "standard"
  rankdir = "LR";
  node [ shape = plaintext ];
  edge [ arrowhead = "vee" ];

  // nodes
  nd_1 nd_2 nd_3;
  { rank=same; nd_4 nd_5 }
  nd_6

  // edges / connections
  nd_1 -> nd_2 -> nd_3;

  nd_3 -> nd_4:nw;                  // matching :s and :n keeps the center:
  nd_4:se -> nd_5:ne;               // balance nd_4:n with nd_4:s
  nd_3 -> nd_5:sw[ dir = back ];    // balance nd_5:n with nd_5:s

  nd_4 -> nd_6[ style = invis  ];   // this gives you a counterweight 
  nd_5 -> nd_6;                     // to nd_5 and thus "centers" nd_6
}

дает

enter image description here

РЕДАКТИРОВАТЬ, чтобы показать альтернативу с пустым узлом.Это результат, который мне нравится больше всего, я вставил несколько строк, где вы можете поиграть с альтернативными настройками.Насколько мне известно, группы или подграфы не помогают, так как ребра проходят только между узлами, а не между кластерами.

digraph d1 
{
  // configs                    // comment characters changed to "standard"
  rankdir = "LR";
  node [ shape = plaintext ];
  edge [ arrowhead = "vee" ];

  // nodes
  nd_1 nd_2 nd_3;
  x[ shape = point, height = 0 ];    // "empty" node
      // x[ shape = point, height = .25, color = white ];   // alternative
  { rank = same; nd_4 nd_5 }        
      // { rank = same; nd_4 x nd_5 }   // try also with x in the same rank
  nd_6

  // edges / connections
  nd_1 -> nd_2 -> nd_3;

  nd_3 -> nd_4:nw;
  nd_4:e -> x:n[ dir = none ];      // route edge via x
  x:s -> nd_5:e;                    // you can try other compass points
  nd_3 -> nd_5:sw[ dir = back ];    // balance nd_4:n with nd_5:s

  x -> nd_6;                        // connect the empty node in the middle
}

, что приводит к

enter image description here

...