Какие варианты доступны для компоновки ориентированных или неориентированных графов в .NET?

Под графиком здесь я подразумеваю что-то похожее на эти изображения:

Идеальное решение:

  • использовать только управляемый код
  • разрешить вывод в растровое изображение
  • разрешить вывод в элементы WPF
  • включать какую-то интерактивную поверхность для отображения графика, которая поддерживает масштабирование, панорамирование и реорганизацию узлов

Мне также интересно услышать о проектах, которые потенциально могут быть использованы в качестве отправной точки для такого рода работы. Если для достижения того, чего я хочу, требуется какое-то развитие, я готов взяться за это. Наиболее сложной частью этой цели является получение макета графика в разумные сроки.

Ответов (14)

Я использовал этот http://www.codeproject.com/Articles/484616/MVVM-Diagram-Designer, это проект с открытым исходным кодом, очень простой в использовании. код очень хорошо объяснен.

Я работаю в команде NDepend и подтверждаю: мы перешли с GraphViz на MsAgl в сентябре 2008 года, а также лицензия MsAgl позволяет действительно коммерческое использование. Вот несколько примеров изображений графиков MsAgl, интегрированных в NDepend (все интерактивно, узлы можно перемещать / выбирать / удалять / нажимать, края можно редактировать / выбирать / снимать / щелкать, макет можно масштабировать, а также, хотя он мог бы быть более чистым API MsAgl достаточно чист для работы):

введите описание изображения здесь введите описание изображения здесь введите описание изображения здесь

Microsoft Research предоставляет инструмент под названием MSAGL (Automatic Graph Layout, ранее называвшийся GLEE) для .NET.

MSAGL доступен здесь: http://research.microsoft.com/en-us/downloads/f1303e46-965f-401a-87c3-34e1331d32c5/default.aspx

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

Это не .NET, но часто упоминаемый инструментарий для визуализации графиков - AT&T Graphviz . Я сам использовал только отдельно стоящие приложения, но исходный код доступен под чем-то вроде лицензии с открытым исходным кодом.

Graphviz используется популярным инструментом документирования кода doxygen для автоматического рисования различных диаграмм для созданной им документации.

У мальчиков из Mindscape есть такой инструмент

С творческим названием WPF Flow Diagrams

Также посмотрите демонстрационный проект Vertigo's Family.Show , он имеет простую форму

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

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

На мой взгляд, Graphviz до сих пор остается одной из лучших графических библиотек. Однако интегрировать его в .Net - проблема.

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

Лучшее решение могло бы существовать сегодня; в то время GLEE все еще находился в стадии эмбрионального развития, и с тех пор я не видел прогресса, достигнутого Microsoft.

График № также является еще одним вариантом. Я не использовал его лично, но я хотел найти время, чтобы просмотреть его.

Используйте QuickGraph для вывода файлов Dot для GraphViz . Я сделал это в недавнем проекте, и, похоже, он работает достаточно хорошо. Посмотрите здесь образец кода для разбора файлов .plain или используйте мой проект здесь в качестве справочника для простого вывода изображений .png.

Я играл в GLEE / MSAGL, и фактический макет сам по себе достаточно хорош для того, что мне нужно, однако я хотел бы иметь больше контроля над тем, что на самом деле находится внутри узлов, а не просто одним значением, как сейчас.

Например, я хотел бы, чтобы «детали» были скрыты, пока я не щелкну расширитель в узле, или дважды щелкните узел или не наведу указатель мыши.

Если предположить, что GLEE не может этого сделать, есть ли сейчас какие-нибудь чистые решения .NET, которые могли бы это сделать?

Northwoods предлагает чистое .NET-решение в своем продукте GoLayout . Они предлагают древовидный, силовой и многоуровневый орграф (что не совсем похоже на эффект Суджиямы, но не слишком далеко для многих, если не для большинства наборов данных). При цене 1790 долларов за место это дорого. Есть также некоторые ограничения: самое главное, их реализации предназначены для "удобочитаемых" графов. Я дал ему наборы данных из более чем 5000 узлов, и у меня не было проблем, но я также могу сгенерировать наборы данных из менее 500 узлов, которые вызывают переполнение стека (слишком глубокая рекурсия). В зависимости от вашего домена он может (или не может) подойти. Если вам нужен общий пакет макетов, который обрабатывает любой набор данных, я бы посоветовал GraphViz вместо Northwoods.

Мне еще предстоит использовать их возможности WPF, но я знаю, что они у них есть. Я уже давно использую их вещи на земле WinForms.

Я использовал MsAgl, и это очень хорошо. Он также имеет средства просмотра как для WinForms, так и для WPF, которые могут быть важны или не важны для вас. Необязательно использовать средства просмотра, поскольку они довольно слабо связаны с механизмом компоновки графиков.

Он не поддерживает все, что делает Graphviz (особенно с точки зрения некоторых типов фигур). Также документация могла бы быть лучше, но она довольно солидная, если не самый отполированный продукт MS когда-либо.

Он помечает все элементы, которые вы упоминаете как требования, хотя реорганизация «в средстве просмотра» просто поддерживает перетаскивание узлов, изменение маршрута ребер и изменение положения меток. График не реагирует на движения этих элементов перемещением других элементов.

Я использовал NodeXL, http://www.codeplex.com/NodeXL , который является библиотекой .Net 3.5 (но также надстройкой Excel). NodeXl разработан Microsoft Research и довольно аккуратный: в нем есть алгоритмы визуализации и некоторые показатели, но он все еще находится на ранних стадиях разработки. Если у вас есть опытный разработчик .Net, я бы обязательно взглянул на него.

Однако, если вы знаете Python, я бы определенно порекомендовал Networkx и его двоюродного брата pygraphviz, который является интерфейсом для Graphviz. Я использовал оба, и моя производительность с Python / Networkx намного выше, чем когда я использовал NodeXL.

GLEE - это библиотека с закрытым исходным кодом Microsoft, которую вы можете бесплатно использовать только в некоммерческом программном обеспечении, в то время как NodeXL - это метод Microsoft с открытым исходным кодом, но вы можете свободно использовать его в разрабатываемом вами продукте.

Просто чтобы завершить список вариантов: Graphviz4Net - это реализация с открытым исходным кодом того, что Coincoin предложил в своем ответе.