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

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

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

每个符号由一个图像(或没有图像)加上有限数量的附件表示。附件是符号坐标的相对位置,它告诉绘图代码在哪里绘制对象子项的符号。它们中的每一个都可能具有特定的使用条件(例如,此附件只能由具有特定选项的符号使用,或者如果已经绘制了 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 应该能够访问的变量数量非常多。我将再次提醒的每个符号应该使用这种元语言定义,应该能够访问其子符号的信息(而不是其他符号,以避免死锁和循环引用):例如,用户可能想要高度和宽度一个符号等于所有子符号的高度和宽度之和,或者使用相同的图片,等等。这也是由于用户独立于最终结构编写符号规则的事实造成的。

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

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

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

4

2 回答 2

0

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

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

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

于 2012-05-24T19:46:14.757 回答
0

在 HTML/DOM 中思考。

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

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

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. 不要害怕遍历对象树,就像要在其上执行的操作一样多您可以更改通行证的顺序,启用和禁用通行证......随着您拥有越来越多的功能,它将被表述为新的处理通行证。

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

我希望我已经推动了你一点。

于 2012-05-24T20:18:40.840 回答