Как написать пользовательские стрелки в Graphviz - PullRequest
6 голосов
/ 05 июля 2010

Я использую Graphviz (в основном, точка и fdp) для автоматического создания диаграмм, которые мне нужны.Для этих диаграмм мне нужны специальные наконечники стрел, которые не являются частью стандартной коллекции стрел: маленький черный треугольник внутри большого белого треугольника и такой же, с черным треугольником, направленным вниз.способ добавить такие стрелки?Я не против взломать исходный код, если это необходимо.С чего мне начать?

1 Ответ

3 голосов
/ 17 января 2011

Вы должны перейти на исходный код для этого.Посмотрите на "lib / common / arrows.c".Вы обнаружите, что вам необходимо:

  • Добавить #define наподобие ARR_TYPE_YOURARROWNAME
  • добавить запись в Arrownames [] с именем, которое вы будете использовать в коде для стрелки иdefine.
  • напишите прототип вашей функции стрелки (см. строку 115), прочитайте точки ниже
  • добавьте вашу функцию в массив Arrowtypes [] запись с определением, которое вы написали ранее,ширина пера, имя вашей функции стрелки, которая будет выглядеть примерно так: arrow_type_yourarrowname
  • напишите свою собственную функцию стрелки.

Чтобы написать свою функцию, взгляните на arrow_type_normal (), он принимает 6 параметров: задание (вам не нужно об этом заботиться, просто используйте его, как в этой функции), две точки ('p' и 'u'), размер стрелки, ширину ручки и флаг.Если вам не нужны разные версии вашей стрелки или если вы хотите игнорировать модификаторы (перевернутые стрелки и т. П.), Игнорируйте параметр flag.

Тогда функция в основном берет две точки pи u (которые являются структурами с атрибутами 'x' и 'y' в них) и объединяют их, создавая массив с именем [], переданный в gvrender_polygon (), который в конечном итоге будет отображать форму стрелки.arrow_type_normal () также портит ширину пера и ширину стрелки.

Подведение итогов: подготовьте graphviz для принятия имени стрелки, сделав первые шаги, затем создайте функцию, которая создаст форму стрелки и которая вызовет gvrender_polygon или gvrender_polyline (еслижелание).

Я еще не пробовал, но это должно сработать.

...