Как я могу зачеркнуть узел в Graphviz? - PullRequest
0 голосов
/ 19 июня 2020

Я хотел бы указать, что узел должен быть там, но в данный момент его не хватает. Интуитивно я хотел бы вычеркнуть его, как показано на изображении ниже (теперь выполняется вручную в Paint):

enter image description here

Есть ли в Graphviz атрибут узла, который Я могу использовать для этого?

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Я не могу найти атрибут или фигуру узла, чтобы сделать то, что вы хотите, но есть два способа сделать это:

  1. создать изображение вне Graphviz (с текстом и X) и используйте атрибут изображения, чтобы использовать изображение в качестве узла (да, боль, если вы хотите делать это часто):

    b [image = "myB.png"]

  2. Для каждого узла X'd out добавьте 2 новых ребра из .ne в .sw и .nw в .se (см. Ниже), каждое с этим (новым) атрибутом: linear = 1. Затем запустите эту команду:

dot -Tdot Xout2.gv |gvpr -f straightline.gvpr -c | neato -n2 -Tpng >out.png

Где это прямая линия. Gvpr:

E[straightline==1]{
  int i, n;
  string pt[int];
  double x1, y1, x2, y2, xI1, yI1, xI2, yI2;

  n=split($.pos, pt, " ");

  for (i=0;i<=1;i++){
    if (match(pt[i],"e,")>=0){
      print ("//  BEFORE: ", pt[i]);
      pt[n-1]=substr(pt[i],2);
      print ("//  AFTER: ", pt[i]);
      pt[i]=pt[i+1];
    }
  }
  for (i=0;i<=1;i++){
    if (match(pt[i],"s,")>=0){
      pt[0]=substr(pt[i],2);
    }
  }

  sscanf (pt[0], "%f,%f", &x1, &y1);
  sscanf (pt[n-1], "%f,%f", &x2, &y2);
  xI1=x1+(x2-x1)*.3;
  yI1=y1+(y2-y1)*.3;
  xI2=x1+(x2-x1)*.7;
  yI2=y1+(y2-y1)*.7;

  $.pos=sprintf("%s %.3f,%.3f %.3f,%.3f %s", pt[0], xI1, yI1, xI2, yI2, pt[n-1]);
}

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

Из этого ввода:

digraph X{
  graph [outputorder=edgefirst]

  b [ label="X me"]
  a -> b -> c 
  a -> d
  d -> c

  e -> f 
  g -> i -> k

  edge [color="#ff000080" penwidth=2]  // note translucent color
  b:ne -> b:sw  [straightline=1]
  b:se -> b:nw  [straightline=1]

  edge [color="green" penwidth=2]
  e:n -> e:s  [straightline=1]
  f:w -> f:se [straightline=1]

  edge [color="orange" penwidth=2]
  g:n -> g:se [dir=back straightline=1]
  edge [color="blue" penwidth=2]
  g:n -> g:sw [dir=back straightline=1]
  i:e -> i:w [dir=none straightline=1]
  k -> k:s [dir=both straightline=1]
}

Извините, запутано, но работает.

0 голосов
/ 21 июня 2020

Хотя ответ srou sh дает мне точный результат, который мне нужен, он требует, чтобы я понимал, как ввести gvpr в свой рабочий процесс, что займет немного времени.

Тем временем я придумал подход только dot, который аппроксимирует вычеркивание узла, достаточного для моей цели.

На графике ниже я хотел бы вычеркнуть узел Some process:

digraph graphname {
    rankdir=LR
    node [fillcolor="lightblue3", style="filled"]
        a
        c
        d
        b [label="Some\nprocess"]
    a -> b -> c
    a -> d -> c
    {rank=same a;d}
}

enter image description here

To do so I change:

digraph graphname {
    rankdir=LR
    node [fillcolor="lightblue3", style="filled"]
        a
        c
        d
    node [fillcolor="lightblue3;0.5:white", style="filled", fontcolor="gray50", color="gray50", gradientangle=100]
        b [label=<<s>Some<br/>process</s>>]
    a -> b -> c
    a -> d -> c
    {rank=same a;d}
}

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

...