绘制用户定义的树



我正在制作一个非常抽象的树绘图系统,但是我在形式化它应该具有的所有绘图功能时遇到了很多麻烦。如果有人能指出我有关此主题的内容,我将不胜感激,因为不幸的是,我的搜索是徒劳的。

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

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

一旦对象树被实例化,就必须在没有任何成瘾的用户输入的情况下绘制它,这就是我遇到一些麻烦的地方。对象树的实例化为每个对象分配了一个特定的图形表示(我们称之为符号)。但是,在实例化之前,分配是未知的。不同的对象也可能具有相同的符号,根据对象的选项,这些符号的绘制方式可能不同。

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

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

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

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 作为我的元语言的子集)。然而,我在识别它们时遇到了很多麻烦。

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

我已经用分层数据做了一些类似的项目。 我指出我开始的地方:

Joe Celko是树木数据之王。 我建议你从他的书开始。 它是逻辑和商业案例的混合体。 SQL for Smarties 中的树和层次结构甚至推出了新版本。 那里也有一种描述层次结构的语言。

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

Think in HTML/DOM.

当我发现我正在使用的大纲视图NoteCase的文件格式是纯HTML时,我感到很惊讶。注意可以在这里找到案例:http://notecase.sourceforge.net/index1.html

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

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

  1. 如果格式是 HTML,则只需要一个 CSS 即可在人眼易读的浏览器中显示它。

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

  4. 您应该编写一个转换器,它将源 HTML 文件格式转换为更详细的 HTML 格式,其中包含计算字段(例如,来自子节点的值的总和,或将子节点中的"继承"标记替换为从父节点继承的值),一些额外的格式,或者您可以将属性转换为 HTML 节点:

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


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

  5. 您的数据表示形式有点像 DOM,您应该以类似的方式处理它。首先,解析并从文件中读取值。然后,您应该运行一些额外的轮次(遍历树)以使用默认值填充缺失值,计算继承值和汇总值等。

    我认为,你不能使用标准的 DOM 解析器,因为你提到了根据参数对东西进行自定义排序,DOM modell 并不真正支持。

  6. 不要害怕遍对象树,就像要对其执行多少操作一样多。您可以更改通行证的顺序,启用和禁用通行证...随着您的功能越来越多,它将作为新的处理传递进行铰接。

    您可能有传递,必须运行多次,例如,如果一次传递无法计算值(因为应该首先计算它的源),它可能会返回一个标志"我还没有完成",它应该在树上再次运行,直到它导致"没有进行任何更改,我已经完成了"。

我希望我能推动你一点。

最新更新