AutoCAD 和 pyautocad 的树结构

在我之前的一篇博文中,我讨论了如何使用列表和字典来存储创建的 AutoCAD 对象。在这篇文章中,我想介绍一些更有效的数据结构,我们可以使用这些结构根据它们的属性组织 AutoCAD 对象。其中之一是树数据结构。

用于组织 AutoCAD 对象的树数据结构

树数据结构是一种非线性数据结构,因为它不按顺序存储数据。它是一种层次结构,因为树中的元素排列在多个级别上并采用节点的形式。节点可以包含任何数据类型。对于 pyautocad,我需要获取字符串、整数、浮点数等。

每个节点包含一些数据和其他节点的链接或引用。这些关联节点是父节点或子节点,具体取决于它们在树形数据层次结构中的位置。

树
图 1:树数据结构

例如,如上图所示,节点 A是根节点。根节点是树中的上层节点,代表树中的第一个节点。在这种情况下,根节点 A具有三 (3) 个子节点:B、F 和 J。换句话说,节点 A 是这些节点的节点。

在这种树形分层数据结构中组织 AutoCAD 对象有助于数据的存储、维护、跟踪和操作。

在 Python 中使用 pyautocad 时应用树数据结构

有时我们需要在创建或编辑图纸时互连数据。例如,让我们考虑一个例子,我正在设计一个包含梁和柱的小型混凝土楼板框架。

我可以将每个对象存储为一个单独的节点。在下面显示的编码示例中,我创建了一个名为 Column 的节点,它有 4 个子节点。这些子项包含结构 AutoCAD 元素的数据作为它们各自的子项。

    column = TreeNode("Column")

    c1 = TreeNode("Column1")
    c2 = TreeNode("Column2")
    c3 = TreeNode("Column3")
    c4 = TreeNode("Column4")

    column.add_child(c1)
    column.add_child(c2)
    column.add_child(c3)
    column.add_child(c4)   

    c1.add_child(TreeNode(acad.model.AddPolyline(aDouble(0, 0, 0, 100, 0, 0, 100, 100, 0, 0, 100, 0, 0, 0, 0))))
    c2.add_child(TreeNode(acad.model.AddPolyline(aDouble(500, 0, 0, 600, 0, 0, 600, 100, 0, 500, 100, 0, 500, 0, 0))))
    c3.add_child(TreeNode(acad.model.AddPolyline(aDouble(500, 500, 0, 600, 500, 0, 600, 600, 0, 500, 600, 0, 500, 500, 0))))
    c4.add_child(TreeNode(acad.model.AddPolyline(aDouble(0, 500, 0, 100, 500, 0, 100, 600, 0, 0, 600, 0, 0, 500, 0))))

上面的数据树构建了创建并添加到 AutoCAD 绘图的列元素。这些元素是使用 pyautocad 创建和添加的,pyautocad 是一个用于在 Python 中编写 AutoCAD 工作流脚本的模块。我可以用同样的方式构造梁元素。通过这种方式,我将两者组合成一个整体树形数据结构,用于组织和存储整个建筑物的数据。

对于这个例子,我通过实现一个节点方法来打印节点及其子节点的内容。可以为根节点调用该方法。此外,该方法还将打印与每个子节点内容、梁或列相关联的表面积。这是为此的代码:

def print_tree(self):
        space = "   " * self.get_level()
        prefix = space + "|--" if self.parent else ""
        print(prefix, end="")
        try:
            print("Area = " +  str(round(self.data.Area,2)))
        except:
            print(self.data)
        if self.children:
            for child in self.children:
                child.print_tree()  

在此示例中,我使用下图中显示的结构 AutoCAD 框架。

图 2.1:使用 pyautocad 的结构框架

对于此示例,“print_tree”方法创建了以下输出:

图 2.2:使用 pyautocad 在 Python 中创建的数据树的输出

使用pyautocad时使用树数据结构的优势

由于某些技术问题或结构设计的必要性,可能需要更改结构的尺寸。在这种情况下,一些相互关联的成员将受到影响。因此,必须相应地调整这些构件的尺寸。为了避免大量的手动工作,我可以简单地调整一个成员的尺寸,其他成员将相应地改变。

这可以通过使用数据树和链表的组合来实现。例如,如果我更改对象的维度,我可以在链表中搜索该特定对象的维度属性。该对象也必须与连接对象链接,可以根据连接元素的尺寸所做的更改自动进一步修改。这样,我既可以维护对象的层次结构,也可以将它们链接在一起。

另一个用例是在区块链方面,即如果我们散列存储在每个节点中的数据,我们可以追踪到发生更改的位置。或者我们可以散列整个文档并追踪对其所做的更改。

根据行业、领域或在 AutoCAD 中执行的工作,可能有多个此类用例。有关 AutoCAD 的更多信息,您还可以查看AutoCAD 的官方文档

You May Also Like

Leave a Reply

Leave a Reply

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据