Graphviz в PHP

 
+
-
edit
 

Balancer

администратор
★★★★★
"Пересмешник":
И, в чём чертил такую схему напиши, если не трудно - мне понравилось, я такое же к базе прикручу.
 


Graphviz. Вообще, это консольный комплект, типа ImageMagick'а. Для твоего случая есть биндинги для PHP на PEAR: Image_GraphViz. Там заводишь объект Image_GraphViz и скармливаешь ему методами ноды-объекты, связи, параметры. А оно потом это всё рисует само.

Например, у меня на форуме через этот класс рисуется граф репутаций участников форума, кто кому сколько ставил. Вот исходник обработчика этого рисунка: 401 - Unauthorized

А на форуме в разметке, правда, исторически сложилось, что есть тэг [graphviz] (описание), который принимает сразу набор команд от консольной утилиты. Вот тот пример, что тебя и заинтересовал, и рисовался так с форума, из топика О наследовании
 
UA walltearer #15.05.2011 18:12
+
-
edit
 

walltearer

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

Есть у меня задача построить граф определённой структуры данных. Данные вытаскиваю из мускульной бд (могу тянуть в cp1251 или utf-8).
К пхп подключил расширение 'Image/GraphViz.php', и пытаюсь вывести граф этих данных.
Если в данных встречаются кириллические символы, граф не строится вообще.
ОС: вин ХП, версия графвиз - 2.26.3, пхп - 5.3, мускул - 5(с копейками).
Кстати, Gvedit тоже отказывается выводить русские символы, когда пытаешься вывести граф напрямую от туда.
Видел в интернете объяснения, что проблема с кодировкой, но у меня эта проблема и при цп1251 и при утф-8, не знаю уже куда смотреть.
Подскажите, пожалуйста, если у кого есть какие соображения по этому поводу.
Спасибо.
 6.0.472.636.0.472.63
RU Balancer #16.05.2011 07:34  @walltearer#15.05.2011 18:12
+
-
edit
 

Balancer

администратор
★★★★★
Этот модуль вызывает системные консольные утилиты (dot и neato) напрямую. Т.е. проблема, возможно, в них.

Если .dot-файл с русским языком сделать, то команда dot его обработает корректно?

Вообще, можно ещё тупо влезть в /usr/share/php/Image/GraphViz.php (в твоём дистрибутиве расположение может отличаться), найти строку ~329:
code php
  1. $command = $this->binPath . (($command == 'dot')
  2.     ? $this->dotCommand
  3.     : $this->neatoCommand);
  4.  
  5. $command .= ' -T'.escapeshellarg($format)
  6.     .' -o'.escapeshellarg($outputfile)
  7.     .' '.escapeshellarg($dotfile);

Это формирование команды. Следом идёт:

code php
  1. @`$command`;

исполнение команды.

Вот между ними вставить:
code php
  1. echo $command; exit();


посмотреть, что будет напечатано и посмотреть сохранённые временные файлы, что в них. Если с кодировкой всё хорошо, то виновата команда dot. Если плохо — то PHP :)
 
UA walltearer #17.05.2011 00:21  @Balancer#16.05.2011 07:34
+
-
edit
 

walltearer

новичок
Большое спасибо за быстрый ответ.
Я начал дальше ковырять Graphviz в PHP и заметил, что если я просто создаю граф с кириллицей
code text
  1. $graph = new Image_GraphViz();
  2.  
  3. $graph->addNode('Рус');
  4. $graph->addNode('Щэковиця і Хоривиця');
  5. $graph->addNode('Кириллица');
  6.  
  7. $graph->addEdge(
  8.   array('Рус' => 'Щэковиця і Хоривиця'),
  9.   array('label' => 'Edge Label')
  10. );
  11.  
  12. $name = 'graph.jpg';
  13. $path = 'graphs/' . $name;
  14. $img = $graph->fetch('jpg');
  15. file_put_contents($path, $img);

то он создаётся правильно.

А когда я пытаюсь выводить на графе записи из бд, в которой кодировка cp1251, то граф не создаётся.

Последовал вашему совету, и посмотрел на сгенерированную команду:
code text
  1. dot -T"jpg" -o"C:\Documents and Settings\User\Local Settings\Temp\gra40.tmp.jpg" "C:\Documents and Settings\User\Local Settings\Temp\gra40.tmp" 2>&1

Дот файл получился таким:
code text
  1. strict digraph G {
  2.     "2009-03-17 00:00:00";
  3.     iFactory;
  4.     "Пользователи в роли разработчиков";
  5. }

При этом я ещё в пхп выводил какую кодировку имеет каждая из строк:
code text
  1. add node: 2009-03-17 00:00:00
  2. encoding: ASCII
  3. add node: iFactory
  4. encoding: ASCII
  5. add node: Пользователи в роли разработчиков
  6. encoding: UTF-8

Немного удивляет почему последняя строка в кодировке утф-8, если она была вытянута из бд (впрочем, как и первые две).

Может быть Графвиз отказывается нормально работать на винде?

п.с. Попробовал открыть сохранённый дот файл в программке Gvedit и запустить построение графа. Gvedit показал следующую ошибку:
code text
  1. executing->C:\Program Files\Graphviz2.26.3\bin\\dot.exe  -Tgif -o"C:\dotfile.gif" -Kdot
  2. Error: Invalid 2-byte UTF8 found in input. Perhaps "-Gcharset=latin1" is needed?


п.п.с. временно решил проблему, почесав левой ногой правое ухо:
- установил последнюю версию графвиз (2.28, странно, но ещё недели две назад была доступна лишь 2.27)
- мне видимо дико повезло, так как русский шрифт начал в версии 2.28 немного работать
- к сожалению, из пхп, рисунок с графом так и не рисуется, но благодаря Вашей идее смотреть на результирующий дот файл, я сохраняю этот файл, а потом вручную запускаю его в программе Gvedit и он рисует мне нужный граф.
 6.0.472.636.0.472.63
Это сообщение редактировалось 17.05.2011 в 01:47

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru