Вопросы о Graphviz API (Graphviz как библиотека) - PullRequest
2 голосов
/ 05 января 2012

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

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

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

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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 05 января 2012

Добавление чуть более подробной информации к предыдущему ответу:

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

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

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

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

этот документ может оказаться полезным.

1 голос
/ 25 марта 2012

Q1: вы должны установить ширину и исправить ее:

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

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

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

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

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

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

1 голос
/ 05 января 2012

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

...