Создайте простую блок-схему с Graphviz

Я пытаюсь создать блок-схему с узлами в заданных положениях. Я использую невидимые узлы, чтобы попытаться изменить направление краев. Моя диаграмма ниже. Это не совсем правильно, так как я хочу, чтобы линии, выходящие из узла d и вокруг края от c до d, были непрерывными (и прямыми).

Как сделать так, чтобы все линии соединялись? Спасибо

введите описание изображения здесь

Мой код для воспроизведения

digraph g1 {

  graph [splines=false];

  // invisible nodes
  node[fontsize=15, shape = box, width=3, height=0] ;
  i1 [ style="invis"];
  i2 [ style="invis"];
  i3 [ style="invis"];
  i4 [ style="invis"];

  node[fontsize=15, color = black, shape = box, width=3, height=1] ;
  a[color=blue, label="a"];
  b[color=green, label="b"];
  c[color=orange, label="c"]; 
  d[color=red, label="d"] ;       

  {rank=same; a -> b -> c};

  {rankdir = TB;    c -> i1[arrowhead=none];
        i1 -> d[label="  FOR EACH\n\n"]; 
        d -> i2[arrowhead=none];
  };

  {rank=same; i3 -> i2[arrowhead=none] };

  {rankdir = TB; 
    b -> i4[style="invis"];
    i4 -> i3[arrowhead=none];
  };

  {rank=same; i4 -> i1};

}

После комментария Пола я попытался использовать node[fontsize=15, shape = box, label="", width=0, height=0, fixedsize=true], что привело к

введите описание изображения здесь


person user2957945    schedule 22.09.2017    source источник
comment
Похоже, что размер невидимых узлов заставляет стрелки лететь в воздухе. Я бы попробовал что-то вроде node[shape = box, width=0, height=0 fixedsize=true] ; для невидимых узлов, но сейчас не могу.   -  person PaulR    schedule 22.09.2017
comment
Спасибо @PaulR; Я отредактировал вопрос с вашим предложением. Кажется, что установка ширины и высоты на ноль меняет расположение узлов.   -  person user2957945    schedule 22.09.2017
comment
Ах, понятно ... Может быть, вы можете использовать ranksep атрибут с равным влиянием на интервал.   -  person PaulR    schedule 22.09.2017
comment
спасибо @PaulR, я попробую.   -  person user2957945    schedule 22.09.2017


Ответы (1)


На помощь приходит использование shape = points и minlen:

digraph g1 {

  graph [splines=false];

  // invisible nodes
  node[ shape = point, width=0, height=0] ;
  i1 [ style="invis"];
  i2 [ style="invis"];
  i3 [ style="invis"];
  i4 [ style="invis"];

  node[fontsize=15, color = black, shape = box, width=3, height=1] ;
  a[color=blue, label="a"];
  b[color=green, label="b"];
  c[color=orange, label="c"]; 
  d[color=red, label="d"] ;       

  {rank=same; a -> b -> c};

  c -> i1[arrowhead=none];
  i1 -> d[label="  FOR EACH\n\n"]; 
  d -> i2[arrowhead=none];

  {rank=same; i3 -> i2[arrowhead=none, minlen = 7 ] };

  b -> i4[style="invis"];
  i4 -> i3[arrowhead=none];

  {rank=same; i4 -> i1};

}

дает

введите описание изображения здесь

person vaettchen    schedule 22.09.2017
comment
Спасибо vaettchen, выглядит хорошо. был minlen=7 след и ошибка, пожалуйста? - person user2957945; 22.09.2017
comment
Да, это было. Так получилось, что это 3 + 3 + 1 (ширина вашего поля умножена на 2 плюс 1 пробел), но не уверен, совпадение ли это ... - person vaettchen; 22.09.2017