2012-01-04 3 views
2

Я использую Graphviz как библиотеку (C++). Мне нужен Graphviz для вычисления координат для моих узлов и соответствующих ребер. Я делаю рендеринг (т. Е. Не используя рендереры Graphviz). Мои узлы представляют собой прямоугольники с определенной шириной и высотой (в пикселях).Вопросы о API Graphviz (Graphviz как библиотека)

Я создаю график с agopen. Затем я создаю узлы с agnode и краями с в возрасте. Тогда для вычисления координат следует, насколько мне известно, использовать gvLayout.

Теперь мне нужно знать:

  1. Как задать ширину и высоту узлов прямоугольники, перед использованием gvLayout?

  2. gvLayout, как получить рассчитанные координаты для узлов и сплайнов для ребер?

  3. Как удалить узел (и соответствующие ребра) или ребра из графика (Agraph_t), это можно сделать вообще?

  4. Когда я создаю узлы и ребра с agnode и agedge, мне не нужно, чтобы освободить/удалить их для очистки (когда я закончу с графиком)? Или agclose обрабатывать это неявно?

Важно: Я не хочу использовать текстовый интерфейс (т.е. получить параметры в виде текста), я хочу, чтобы получить доступ указанные параметры (ширину и высоту узла, шлицы края, координаты узла ...) непосредственно как переменные данных.

ответ

3

Добавление немного больше деталей к предыдущему соответственно onse:

1) Ширина узла определяется несколькими свойствами: атрибут width используется минимальная ширина; ширина метки или изображения в узле; атрибут «margin» для поля вокруг метки; количество периферий; и т. д. Если вы действительно хотите исправить ширину, установите атрибут «ширина» на требуемое значение и установите «fixedsize» в 1. Как указано выше, вы устанавливаете атрибуты с помощью функции agset, которая предполагает, что атрибут был ранее объявлен с использованием функция agnodeattr для узлов. Или просто используйте agsafeset, который объединяет операции.

2) Если n является указателем на узел, его положение сохраняется как пара (x, y) в ND_coord (n).Если e является указателем на край, значение ED_spl (e) указывает на структуру, содержащую массив структур, описывающих кубические B-сплайны. (Обычно есть только один.) Если bz = ED_spl (e) -> list [0], то * bz имеет поля для количества точек, точек и информации о том, имеют ли ребро стрелы в голове и/или хвост. Это значение этих значений описано here

3) Чтобы удалить узел n из графа g, используйте agdelete (g, n);

4) Вызов agclose на графике автоматически освободит все узлы и ребра. Если вы вызвали gvLayout, вам сначала нужно вызвать gvFreeLayout, чтобы освободить данные, выделенные для выполнения макета.

this документ полезный.

1

Q1

agset (void* pointer_to_component, char* name_of_attribute, char* value_of_attribute) 
gsafeset which has the same signature. 

Q2

for (n = agfstnode(g); n; n = agnxtnode(n)) { /* do something with n */ } 

Q3

Agnode_t *n; 
n = agnode(g, "some_specific_node_name_to_find", FALSE); 
agdelnode(n); 

Для получения дополнительной информации ознакомьтесь с Agraph API tutorial

+0

Спасибо за ваш ответ :) Но ... Q1 - agset и agsafeset задают параметры как текстовые значения. Как я уже говорил, мне нужно другое решение. Q2 -/* что-то делать с n */хорошо, что делать (и как это сделать) был мой вопрос. Q3 - Удалены ли ребра при удалении одного из соответствующих узлов? –

1

Q1: Вы должны установить ширину и зафиксировать его:

agsafeset(node, "width", "1"); 
agsafeset(node, "fixedsize", "1", ""); 

Если изменить ширину после фиксации его, убедитесь, что называть «фиксированный размер» с «0» перед установкой «ширина» с новое значение.

Q2: вместо того, чтобы использовать ND_coord (п) следующая тоже будет работать:

node->u.coord.x 
node->graph->u.bb.UR.y - node->u.coord.y 

Для того, чтобы обернуть края для линий Безье, взглянуть на, например, http://mupuf.org/blog/article/34/, я сделал преобразование в CGMutablePathRef на его основе (если вас это интересует).

Для Q3 & Q4 посмотрите на ответ Эмдена.