绘制用户定义的树

时间:2012-05-24 19:29:06

标签: algorithm tree drawing metalanguage

我正在制作一个非常抽象的树绘图系统,但是我在描述它应该具有的所有绘图功能时遇到了很多麻烦。如果有人可以指点我阅读有关这个​​主题的内容,我将非常感激,因为不幸的是我的搜索都是徒劳的。

我正在寻找/尝试制作用于显示树木的元语言。在这些树中,每个节点都是用户定义的Object的实例,它具有用户定义的图形表示。

每个对象都与名称,图形表示相关联,并且具有有限数量的子项(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

一旦实例化了一个对象树,就必须在没有任何虚构用户输入的情况下绘制它,这就是我遇到麻烦的地方。 Object树的实例化为每个Object分配一个特定的图形表示(让我们称之为Symbol)。然而,在实例化之前不知道该任务。不同的对象也可以具有相同的符号,可以根据对象的选项进行不同的绘制。

因此,符号必须与对象分开定义,并且必须具有一系列抽象机制,以便能够按照用户指定的规则正确地绘制自己(及其分配的子代)。

每个符号由图像(或无图像)加上有限数量的附件表示。附件是符号坐标的相对位置,它告诉绘图代码在哪里绘制对象子项的符号。它们中的每一个都可能具有特定的使用条件(例如,此附件可能仅由具有特定选项的符号使用,或者如果已经绘制了N个符号,则没有与已绘制的符号等冲突)。

算法必须按照优先级指定的顺序为每个对象的子项找到一个免费的附件。如果无法找到子项的附件,则用户可以预先指定允许某些自动重试的规则,但如果它们也失败则则整个树绘图失败。其中一些规则允许添加上瘾的孩子符号和/或将子符号分配给其他孩子(使他们成为grandChildren)等。

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

我的主要问题是Symbol应该能够访问的变量数量非常多。每个符号,我将再次提醒应该使用这种元语言定义,应该能够访问其子符号的信息(而不是其他符号以避免死锁和循环引用):例如,用户可能想要高度和宽度a符号等于所有Child's符号的高度和宽度之和,或者使用相同的图片,等等。这也是因为用户独立于最终结构编写符号规则。

同时,由于树必须从上到下绘制,因此从一开始就可能无法获得其中一些信息,并且可能需要进行大量的回溯。

此外,由于所有这一切都必须在我必须能够形式化和解析的元语言中定义,我必须定义哪些是元语言所需的功能,以允许最大的自由度。语言写作用户没有过于复杂(这是一个模糊的限制,但基本上我不想让Tikz作为我的元语言的子集)。我在识别它们时遇到了很多麻烦。

正如我之前所说,我正在寻找有关此类主题的信息和/或完成此类项目的方法。一旦我能够完全完成元语言,我想我不会在执行所有这些代码时遇到太多麻烦,我的问题在很大程度上是理论上的。

2 个答案:

答案 0 :(得分:0)

我用分层数据完成了一些类似的项目。我指着你开始的地方:

Joe Celko是树数据的王者。我建议你从他的书开始。它是逻辑和商业案例的混合体。 SQL for Smarties中的树和层次结构甚至还有一个新版本。还有一种用于描述层次结构的语言。

我使用Oracle来存储我的层次结构,它有一个非常有效的系统来提取和存储树数据。在文档或书中查找“connect by”:Mishra和Beaulieu掌握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

答案 1 :(得分:0)

在HTML / DOM中思考。

当我发现,我使用的 outliner 的文件格式NoteCase是纯HTML时,我感到很惊讶。 NoteCase可以在这里找到:http://notecase.sourceforge.net/index1.html

如果您不熟悉它, outliner 是一种应用程序类型,您可以在分层树中主要组织文本节点。还有任务大纲。当大纲图具有图形表示时,它被称为思维导图。无论如何,文件系统的目录结构也是一个大纲。各个领域都有许多大纲。有关详细信息,请参阅维基百科。

Notecase使用DL / DT / DD:DL是列表,DT是项目,DD是项目的描述。当然,它们可以嵌套。

  1. 如果格式为HTML,则只需要一个CSS就可以在浏览器中显示它,这对人眼来说很容易理解。

  2. 如果您有其他属性,则可以定义其他标记或属性,浏览器不会显示,但您的渲染器可以显示。

  3. 您应该编写一个转换器,它将您的源HTML文件格式转换为更详细的HTML格式,其中包含计算字段(例如,来自子节点的值的总和,或者用子节点中的继承值替换子节点中的“inherit”标记,一些额外的格式,或者可以将属性转换为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. 不要害怕走动对象树,就像许多传递一样,要对它执行多少操作。你可以玩改变通行证的顺序,启用和禁用通行证...因为你有越来越多的功能,它将被表达为新的处理过程。

    您可能有通行证,必须多次运行,例如如果一个传递不能计算一个值(因为它的源应该首先计算),它可能会返回一个“我还没有完成”的标志,它应该再次在树上运行,直到它导致“没有变化” ,我已经完成了。

  6. 我希望我能帮你一点。