2012-05-24 5 views
1

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

Я ищу/пытаюсь сделать метаязык для отображения деревьев. В этих деревьях каждый узел представляет собой экземпляр пользовательского объекта, который имеет пользовательское графическое представление.

Каждый объект связан с именем, графическим представлением и имеет конечное число дочерних элементов (0+), которые известны как сами объекты. Рекурсия объекта не допускается. У каждого объекта могут быть определенные пользователем параметры, которые используются для запуска условий, которые изменят их графическое представление (определенными пользователем способами). Некоторые параметры автоматически применяются, другие могут потребовать взаимодействия с пользователем («Хотелось бы, чтобы этот объект был A или B?»), Объясняя, почему деревья объектов необходимо установить.

Object 
    Name    // The Object Name 
    Childs    // List of Object Childs 
     ContextName   // The Name of the Child within this context 
     Types    // List of Objects' names. This child may be only one of them. Decided by the user during instancing. 
     Options    // List of Options assigned to this child. Some of them may require user interaction, and apply other Options to the Child's childs. 
     *Priority   // This is an integer which is used to decide the order in which childs are drawn. 
    Symbol Name   // The Graphical representation of the Object 

После того, как объект Дерево было инстансы, оно должно быть обращено без addictional пользовательского ввода, и это, где я имею некоторые проблемы. Инстанцирование дерева объектов присваивает каждому объекту определенное графическое представление (назовем его символом). Однако назначение не известно до начала. Различные объекты могут также иметь один и тот же символ, который может быть выполнен по-разному в зависимости от параметров объекта.

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

Каждый символ представлен изображением (или отсутствием изображения) и конечным числом вложений. Вложения - это относительные положения к координатам символа, которые указывают код чертежа, где нужно нарисовать символы дочерних объектов объекта. Каждый из них может иметь особые условия, которые необходимо использовать (например, это Приложение может использоваться только символом, имеющим конкретный вариант, или если N Символов уже нарисовано, никаких столкновений с уже нарисованными символами и т. Д. И т. Д.).

Алгоритм должен найти бесплатное приложение для каждого дочернего объекта Объекта, следуя порядку, указанному их Приоритетом. Если невозможно найти приложение для ребенка, пользователь может указать заранее правила, которые допускают некоторые автоматические повторные попытки, но если они также терпят неудачу, то весь рисунок дерева не выполняется. Некоторые из этих правил позволяют добавлять addictional дочерние символы и/или назначения ребенку Символы другим Чайлдс (что делает их внуками) и т.д.

Symbol 
    Name 
    Main Image  // Image Path, Height, Width 
    Attachments  // List of the attachments, their position, requirements and addictional infos 
    Fail Rules  // List of actions to do if it is not possible to successfully assign each Child to an Attachment 

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

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

Кроме того, поскольку все это должно быть определено в метаязыке, который я должен иметь возможность формализовать и проанализировать, я должен определить, какие функции должны выполнять метаязыки, чтобы обеспечить максимальный уровень свободы для пользователя, пишущего язык, не слишком сложного (это неопределенный предел, но по существу я не хочу, чтобы Tikz был подмножеством моего метаязыка). У меня, однако, довольно много проблем, идентифицирующих их.

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

ответ

0

Я сделал несколько подобных проектов с иерархическими данными. Я указываю вам, где я начал:

Joe Celko является королем данных о деревьях. Я рекомендую вам начать с его книги. Это сочетание логики и бизнеса. Деревья и иерархии в SQL для Smarties даже выпускают новую версию. Существует также язык для описания иерархий.

Я использовал Oracle для хранения моих иерархий, которая имеет очень эффективную систему для вытягивания и хранения данных дерева. Посмотрите «подключиться» либо в документации, либо в книге: Освоение Oracle SQL Мишрой и Болье.

Вы можете использовать указатели, чтобы вытаскивать изображения с сервера, чтобы вы не хранили их в базе данных. Я создал несколько систем, которые используют иерархические отображения данных с графическими объектами, и таким образом сохраняет накладные расходы. У DevExpress и Telerik есть отличные зрители для отображения деревьев, и у меня есть возможность динамически строить следующие уровни. Он не знает, сколько или какой следующий уровень будет, пока он не будет сверлен. Попробуйте эти примеры и прочитайте документы, и вы сможете собрать их в кратчайшие сроки.

Для Telerik эта ссылка будет показывать вам несколько нагрузки на взгляды спроса: http://demos.telerik.com/aspnet-ajax/treeview/examples/programming/loadondemandmodes/defaultcs.aspx

Для DevExpress: http://demos.devexpress.com/ASPxTreeListDemos/Data/VirtualMode.aspx

+0

Спасибо, но моя проблема больше всего связана с описанием формы и визуального представления дерева (путем определения каждой формы символа и вложений и связывания их в структуре с использованием деревьев объектов), а не столько от данных. – Svalorzen

+0

В книгах Селько говорится об этой части его ссылки. Вы имеете в виду метаданные, которые используются для описания деревьев. Представление объектов не является чем-то необычным. Числа, объекты, кластеры слов, файлов, изображений и т. Д. Описаны с использованием одной и той же системы. Даже при использовании данных из базы данных вы будете использовать те же условия. Это уже язык, чтобы описать это. Это частично связано с математическим миром. Вы можете попробовать искать ссылки на основе XML, если SQL незначителен. – Stradas

0

Думай в HTML/DOM.

Я был удивлен, когда нашел, что формат файла outliner Я использую, NoteCase, является простым HTML. NoteCase можно найти здесь: http://notecase.sourceforge.net/index1.html

Если вы не знакомы с ним, Структуризатором является типом приложения, которые можно организовать в основном текстовые узлы в иерархическом дереве. Есть и задачи. Когда у outliner есть графическое представление, это называется mind mapping. В любом случае, структура каталогов файловой системы также является контуром. Есть много предложений для различных областей. См. Википедию для более подробной информации.

Notecase использует DL/DT/DD: DL - это список, DT - это элемент, а DD - описание элемента. Конечно, они могут быть вложенными.

  1. Если формат HTML, вам нужен только CSS, чтобы показать его в браузере, легко читаемом для глаз человека.

  2. Если у вас есть дополнительные свойства, вы можете определить дополнительные теги или атрибуты, которые браузер не будет показывать, но ваш рендеринг может.

  3. Вы должны написать конвертер, который преобразует исходный формат HTML файла к более детальному формату HTML, который содержит вычисленных поля (например, подводящие значения из подузлов, или заменяет «наследуют» знаки в суб-узел с унаследованным от родительского узла), некоторые дополнительные форматировании, или вы можете преобразовать атрибуты в HTML-узлы:

    <node type="x" size="y" />

    в

    <div class="node">
        <div class="param"> type: x </div>
        <div class="param"> size: y </div>
    </div>

  4. Ваше представление данных является своего рода DOM, и вы должны обработать его подобным образом. Сначала проанализируйте и прочитайте значения из файла. Затем, вы должны выполнить некоторые дополнительные раунды (ходить по дереву), чтобы заполнить недостающие значения со значениями по умолчанию, вычислить унаследовал и обобщенные значения и т.д.

    Я думаю, вы не можете использовать стандартные DOM парсеров, потому что вы упомянули обычай сортировкой в зависимости от параметров, которые DOM modell на самом деле не поддерживает.

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

    У вас могут быть пропуски, которые должны выполняться несколько раз, например. если один проход не может вычислить значение (потому что его источник должен быть рассчитан первым), он может вернуть флаг, который «я еще не сделал», и он должен снова запускаться на дереве, пока он не будет «без изменений» , Я сделал".

Надеюсь, я немного подтолкнул вас.

+0

Основой моего метаязыка является JSON, и да, то, что я пытаюсь сделать, в значительной степени является языком для описания карты разума. Однако программное обеспечение для отображения разума работает, добавляя отдельные узлы в предопределенную структуру, в то время как я должен заранее описать визуальные эффекты/реакции каждого узла (символ), чтобы они могли после размещения в древовидной иерархии координировать автономно строить сложную и упорядоченную структуру, как предполагал пользователь. Обратите внимание, что конечная структура может не выглядеть как дерево. Я не видел никакого программного обеспечения, которое описывает уникальные типы узлов, а затем связывает их. @ Ern0 – Svalorzen