使用 pyautocad 在 AutoCAD 中创建 3D 网格对象

在这篇博文中,我们将研究如何使用 pyautocad 模块在 AutoCAD 中处理 3D 网格对象。如果需要,我们也可以使用 pywin32 模块来处理 3D 网格。

3D 网格表示的意义

3D 网格可用于多个行业的不同目的。

作为一名土木工程师,我可以肯定地说,在担任土地测量员时,3D 网格在表示轮廓点时非常有用。它也可以通过检查结构的每个小元素的坐标来用于施工缺陷。

它可以在机械设计中用于机械行业。

如今,我们也使用网格模型进行面部识别。在这里,它还可以例如用于检测面部表情的变化。

3D 网格的此类用例更多,在许多行业中发挥着非常重要的作用。

使用 pyautocad 或 pywin32 在 Python 中启动脚本

我们可以使用 pyautocad 模块设置我们的工作环境,如下所示:

from pyautocad import Autocad, aDouble

acad = Autocad(create_if_not_exists=True)

或者,我们也可以使用 win32com.client 按照以下脚本运行:

from win32com.client import *
import pythoncom

acad = win32com.client.Dispatch("AutoCAD.Application")
acadModel = acad.ActiveDocument.ModelSpace

def aDouble(*argv):
    return win32com.client.VARIANT(pythoncom.VT_ARRAY | pythoncom.VT_R8, (argv))

使用 pyautocad 或 pywin32 将 3D 网格添加到 AutoCAD 模板

要在 AutoCAD 模板上绘制 3D 网格,需要一个带有几个参数的非常小的命令。

该命令的语法如下所示:

object.Add3DMesh(M, N, PointsMatrix)

此处,M & N 采用范围为 2-256 的整数输入,表示 M 和 N 两个方向上的数组大小(或顶点数)。

图 1:根据 Autodesk 文档的网格结构

PointsMatrix 表示双精度数组。它与我们在使用 pyautocad创建多段线时使用的矩阵相同。

让我们使用 Autodesk 文档中提供的现有示例创建一个这样的网格模型。我将采用文档中提供的 PointsMatrix。

pmatrx = aDouble(10, 1, 3, 10, 5, 5, 10, 10, 3, 15, 1, 0, 15, 5, 0, 15, 10, 0, 20, 1, 0, 20, 5, -1, 20, 10, 0, 25, 1, 0, 25, 5,  0, 25, 10, 0)

mesh1 = acad.model.Add3DMesh(4, 3, pmatrx)

在这段代码中,我们在 PointsMatrix 中提供了 12 个坐标点。

另外,我们想要沿 M 方向有 4 个顶点,沿 N 方向有 3 个顶点。

图 2.1:使用 pyautocad 在 AutoCAD 模板上创建的 3D 网格的顶视图
图 2.2:使用 pyautocad 在 AutoCAD 模板上创建的 3D 网格的右上角视图

分析新创建的 3D 网格

正如我们从图 2.1 和 2.2 中看到的那样,我们在命令中传递了 M 方向上的 4 个顶点和沿 N 方向的 3 个顶点。

在绘制之前,我们已经设想顶点应采用这种格式。IE

图 3.1:3D 网格形成的描述

否则,如果我们尝试使用同一组坐标点绘制带多段线的网格,则不会生成网格,而只是将给定系列中的点连接起来形成锯齿形图案。

pl = acad.model.AddPolyline(pmatrx)
图 3.2:使用与绘制 3D 网格相同的一组坐标的多段线

如果我们使用真实视图而不是 2D 线框,我们还可以看到网格模型的外观。这将清楚地向我们展示给定网格模型中的凹陷或隆起(如果有的话)。

图 3.3:3D 网格的真实视图

如上所述,从图 3.3 可以清楚地看到网格的右半部分凹陷,左半部分的中心部分在边界处突出。

使用 pyautocad 的 3D 网格的属性

我们有一些特定于网格的方法可用于获取给定网格的属性,而不是我们在 AutoCAD 操作中使用的一些常用方法。

print("Coordinates of the mesh:", end='')
print(mesh1.Coordinates)
print("Is mesh one is closed in M direction: " + str(mesh1.MClose))
print("Density of mesh in M direction: " + str(mesh1.MDensity))
print("Number of vertices in M direction: " + str(mesh1.MVertexCount))
print("Is mesh one is closed in N direction: " + str(mesh1.NClose))
print("Density of mesh in N direction: " + str(mesh1.NDensity))
print("Number of vertices in N direction: " + str(mesh1.NVertexCount))


O/p:

Coordinates of the mesh:(10.0, 1.0, 3.0, 10.0, 5.0, 5.0, 10.0, 10.0, 3.0, 15.0, 1.0, 0.0, 15.0, 5.0, 0.0, 15.0, 10.0, 0.0, 20.0, 1.0, 0.0, 20.0, 5.0, -1.0, 20.0, 10.0, 0.0, 25.0, 1.0, 0.0, 25.0, 5.0, 0.0, 25.0, 10.0, 0.0)
Is mesh one is closed in M direction: False
Density of mesh in M direction: 0
Number of vertices in M direction: 4
Is mesh one is closed in N direction: False
Density of mesh in N direction: 0
Number of vertices in N direction: 3

Leave a Reply

发表回复

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

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

Close

其他操作