C# приложение для рисования направленных графов

Александр16 років у сервісі
Дані замовника будуть вам доступні після подання заявки
22.12.2016

Нужно создать приложение, которое позволяет пользователю рисовать направленный граф на C#. Обратите внимание – любой направленный граф, а не только дерево или интеллект карту! 

Для дальнейшего описания определимся с терминологией. Узлы (или ноды) – вершины графа. Связи – ребра графа. 

Узлам должна быть возможность задавать размер, иконки, текст. Во внутреннем представлении узла должно присутствовать текстовое поле Description. Желательно сделать нод такой формы prntscr.com/dk7xfc  . Высота у него всегда одинаковая, а длина может меняться в  зависимости от длины текста в нем. Из вышесказанного также делаем вывод – текст должен всегда находиться в ноде 

Для связей нужно иметь возможность задать текст (который лежит на ребре) и оформление. На конце связи (то есть на узле, куда приходит связь) должна быть стрелочка prnt.sc/dk7yea  

Требования к внешнему виду: жестких нету, но по возможности посимпатичнее) Чем ближе Mindjet MindManager , тем лучше)  

Должно поддерживаться: 

1. при нажатии на нод он должен просто выделяться (для выделеного пусть будет окаемка какая то специфическая prntscr.com/dkuyg9 ) 

2. Перемещение узлов: зажали мышку захватили и несем куда хотим. Когда завершили движение и отпустили мышку – все передвижение закончилось. 

3. При клике левой кнопкой мышки на свободном участке экрана – создается нод. 

4. при наведении мышки на нод у него на каждой из сторон появляются кружочки (по аналогии как здесь плюсики prntscr.com/dkuxk0  ). Для создания связи между двумя нодами пользователь должен сделать mousedown на одном из кружочков исходного нода и дотянуть мышку до другого нода. Таким образом у нода 4 кружочка и от любого из них может отходить к другим нодам любое количество связей. Связи на других нодах заканчиваются в произвольной локации. 

5. Отображение поля Description нода. Создаем панель справа (она ВНЕ поля для рисования нодов). При выделении конкретного нода на панели отображается поле RichTextBox, в котором выводится Description этого нода. Пользователь может его редактировать. При снятии выделения новое значение (отредактированное) автоматически сохраняет как актуальный Description prntscr.com/dkuz6m 

Будущее: 

- Автомасштабирование расположения новых вершин с окружения (других вершин), среди которых они созданы. 

- Возможность делать дуговые ребра  prntscr.com/dml2hu 

Нарисованный граф должен сериализоваться в xml (и соответственно десериализоваться).  

Приложение делаем на C# .NET4 под VS 2012. На выходе – проект с исходниками. Можно юзать любую готовую бесплатную либу. Обсудим варианты готовых решений или технологий на базе которых реализовать. Можно, например, на WPF. После реализации отдельно нужно будет создать документацию.