2010-07-05 5 views
6

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

Каков наилучший способ добавить такие наконечники стрел? Я не против взломать исходный код, если это необходимо. С чего начать?

ответ

3

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

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

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

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

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

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

Смежные вопросы