【发布时间】:2013-06-17 08:15:31
【问题描述】:
我需要打开并读取包含建筑物墙壁、窗户等信息的 Autocad 文件的内容,然后读取这些信息并对其进行分类。由于这些 Autocad 文件各不相同,我需要有经验的人来告诉我如何确定例如是否有窗口。 此外,能够提取墙壁内部、外部等的信息将非常有用......
【问题讨论】:
我需要打开并读取包含建筑物墙壁、窗户等信息的 Autocad 文件的内容,然后读取这些信息并对其进行分类。由于这些 Autocad 文件各不相同,我需要有经验的人来告诉我如何确定例如是否有窗口。 此外,能够提取墙壁内部、外部等的信息将非常有用......
【问题讨论】:
首先,您需要从 Autodesk 下载 ObjectArx 包。 安装它并创建一个新的 Autocad 插件。
我知道有两种工作方式:
使用 Arx 或互操作。我只对互操作有经验,但 Arx 的工作方式完全相同。 (我选择了 Interop,因为它使用与 Autocad 的 VBA 相同的 ActiveX 库。因此,您可以使用 Interop 做的任何事情都可以用 VBA 做)
找一些向导为 Autocad 插件创建项目模板。
然后引用Autodesk.Autocad.Interop 库。
在插件中,您可以从Autodesk.AutoCAD.ApplicationServices.Application获取autocad应用程序。
要使用应用程序的互操作版本,请将 Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication 获取为 AcadApplication 类型。
从应用程序中,您可以获得Documents 集合,以及ActiveDocument。
从文档中可以得到ModelSpace和PaperSpace。
从那些你可以得到Items,它的类型是AcadEntity。
AcadEntity 是图形中出现的所有 Autocad 对象的基本类型。
所以所有的墙壁和窗户都会由一组AcadEntity对象组成。
但AcadEntity 可以有派生类型,例如AcadLine(线)、AcadLWPolyline(带高程的二维折线)、AcadCircle 等等。
现在您必须知道图纸中的窗户和墙壁是如何制作的才能找到它们。如果它们是块,那将非常容易。
只需在模型空间或图纸空间(或任何 autocad 块,因为图纸空间和模型空间被视为块)中选择所有 AcadEntity 对象,即 AcadBlockReference。
每个AcadBlockReference 代表在图形中插入一个块并包含它的参数。
但是如果墙壁和窗户是用线条手工制作的,那么您将不得不稳定一些规则来搜索它们,例如将AcadLine对象与每个对象进行比较,以测试它们是否平行且距离小于墙的最大厚度。
这些规则将非常具体地针对您的情况以及图纸的制作方式。
【讨论】: