LINUX.ORG.RU

graphviz, координаты каждого узла


0

0

вопрос господам, когда-либо использовавшим graphviz C API:

допустим я отрисовываю граф - не важно какой, пусть будет планарный - в итоге я получаю готовый имедж, который в дальнейшим передаётся специальным вьювером. каждый узел графа, помимо стандартной информации в поле key хранит дополнительную информацию в поле value. информация в жтом поле может быть любой и может быть сколь угодно сложна, поэтому выводить её на имедже не имеет смысла, тк она может быть довольно велика. соответсвенно нужно реализовать механизм, при котором пользователь, наведя мышь на конкретный нод графа на изображении, видит информацию о контенте поля value в специальном окне. как это сделать, в принципе понятно, соотнести координаты нода на изображении с координатами курсора и проверять, находятся ли координаты курсора в заданном рэньже или нет. НО, как, чёрт возьми, мне взять координаты каждого узла графа до создания имеджа(или после, но такое вроде как не возможно)? есть мнение написать plugin для graphbiz'a, который бы делал свою render опкрацию и собирал координаты к некоторую дата структуру с взаимооднозначным соответсвие между нодом и координатами. но писать плагин довольно геморно, учитывая, что из-за одной мелкой фичи придётся переписывать render операцию с реюзингом основных процедур из канонического render'a. скорее всего это можно сделать как-то иначе. вопрос: как?

p/s:

гугл молчит, graphviz mailing list тоже =(


уф, чёрт возьми, очепяток в торопях наделал, грамотей хренов, я надеюсь, они не будут смущать преверженцов грамотного написания букф... прошу прощения.

asgard
() автор топика
Ответ на: комментарий от asgard

Ух ты, не знал что есть Graphviz C API. Правда я уже давно не заглядывал на их сайт.
А по теме: просто вызывать dot как внешнюю команду не пробовал.
Готовишь .dot файл и передаешь его dot-у.
Для картинки указываешь тип вывода например -Tpng, а для координат нодов на картинке указываешь тип -Tmap . Полученный результат конечно нужно парсить, но это не особо сдожно.

romanSA
()
Ответ на: комментарий от romanSA

Почитал свой пост... не один ты, asgard, делаешь ошибки ;)

romanSA
()
Ответ на: комментарий от romanSA

такого типа вывода "map" - нету :) есть cmap cmapx imap ismap

так же стоит отметить что dot будет генерировать эти map'ы с координатами только для тех объектов, у которых установлен атрибут href (цитата из man dot: "...for each node that has a non-null "href" attribute.")

ps: кстати в выводе в svg наверное тоже есть координаты... %)

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

Извиняюсь, был вечер и ... :)
Конечно имелся ввиду тип cmap .
А насчет SVG, там конечно есть координаты, но:
1) кажется здесь был вопрос о получении координат для растрового рисунка
2) координаты в SVG еще нужно пересчитывать в экранные в пикселях

romanSA
()
Ответ на: комментарий от romanSA

> Готовишь .dot файл и передаешь его dot-у.

это не совсем приемлемо, тк графическая апликуха-вьювер получает через "не графвизовский" граф, далее она конвертит его в графвизовский, создаёт имедж и открывает его. (знаю, что через жопу, но gdk-pixbuf врод как не умеет читать gif/png/jpg из памяти - исключительно из файла), посему не очень бы хотелось создавать помимо файла имеджа ещё и дотфайл.

короче говоря, нашёл приемлемое решение. в graphviz есть понятие device plugin. это такой вид плагина, который может выполнять некоторую работу сразу после job_start и сразу после job_end(пример можно посмотреть в сорцах графвиза: graphviz-2.12/plugin/gtk/gvdevice_gtk.c - + keep in mind - процесс написания пдагинов документирован довольно хреново). т.о. можнно легко собирать координаты каждого нода на изображении + _сразу же_ адаптировать их под координаты конечного окна.

asgard
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.