在这篇博文中,我们将研究如何使用 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 两个方向上的数组大小(或顶点数)。
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 个顶点。
分析新创建的 3D 网格
正如我们从图 2.1 和 2.2 中看到的那样,我们在命令中传递了 M 方向上的 4 个顶点和沿 N 方向的 3 个顶点。
在绘制之前,我们已经设想顶点应采用这种格式。IE
否则,如果我们尝试使用同一组坐标点绘制带多段线的网格,则不会生成网格,而只是将给定系列中的点连接起来形成锯齿形图案。
pl = acad.model.AddPolyline(pmatrx)
如果我们使用真实视图而不是 2D 线框,我们还可以看到网格模型的外观。这将清楚地向我们展示给定网格模型中的凹陷或隆起(如果有的话)。
如上所述,从图 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