Python 中 Trimesh 模块的 .to_planar() 函数将 Path2D 保存为 .PNG 或 .JPEG

Posted

技术标签:

【中文标题】Python 中 Trimesh 模块的 .to_planar() 函数将 Path2D 保存为 .PNG 或 .JPEG【英文标题】:Save the Path2D as a .PNG or .JPEG from .to_planar() function of Trimesh Module in Python 【发布时间】:2020-10-03 03:10:45 【问题描述】:

我的主要目标是获取 STL 文件的图纸视图。我尝试了将 STL 文件转换为 SLDPRT 的 SolidWorks 方法,然后获取工程视图,但在这种情况下,工程视图包含很多噪音并且不准确。所以,我正在尝试 Trimesh 模块。到目前为止,与

slicex = meshx.section(plane_origin=meshx.centroid, plane_normal=[0,0,30])
slice_2D, to_3D = slicex.to_planar()
slice_2D.show()

通过更改 Plane_normal 数组值,我得到了所需的横截面(这有点类似于三个视图),但我不知道如何将 Spyder 控制台中显示的图像保存为 JPEG 或 PNG。我需要绘图视图以进行进一步的图像分析。

任何有关此方法或任何其他获取图纸视图的方法的线索将不胜感激!谢谢!

【问题讨论】:

【参考方案1】:

我看到的最好的结果是使用 matplotib 并保存散点图。一旦采用该格式,您就可以调整分辨率或另存为矢量:

import matplotlib.pylab as plt
slicex = meshx.section(plane_origin=meshx.centroid, plane_normal=[0,0,30])
slice_2D, to_3D = slicex.to_planar()

fig, ax = plt.subplots(figsize=(16,8))
ax.set_aspect('equal')
_ = ax.scatter(slice_2D.vertices[:,0], slice_2D.vertices[:,1], color='lightgray')
ax.axis('off')
plt.savefig('meshx_slice.png')

有关文件格式和选项的更多详细信息是here。这也适用于保存完整的 2D 网格或 3D 网格的平面视图,使用 Trimesh.vertices 作为点。

另类

如果你想复制 slice_2D.show() 所做的事情,你可以从 its code 借用(使用 matplotlib):

import matplotlib.pyplot as plt
# keep plot axis scaled the same
plt.axes().set_aspect('equal', 'datalim')
# hardcode a format for each entity type
eformat = 'Line0': 'color': 'g', 'linewidth': 1,
       'Line1': 'color': 'y', 'linewidth': 1,
       'Arc0': 'color': 'r', 'linewidth': 1,
       'Arc1': 'color': 'b', 'linewidth': 1,
       'Bezier0': 'color': 'k', 'linewidth': 1,
       'Bezier1': 'color': 'k', 'linewidth': 1,
       'BSpline0': 'color': 'm', 'linewidth': 1,
       'BSpline1': 'color': 'm', 'linewidth': 1
for entity in slice_2D.entities:
    # if the entity has it's own plot method use it
    if hasattr(entity, 'plot'):
        entity.plot(slice_2D.vertices)
        continue
    # otherwise plot the discrete curve
    discrete = entity.discrete(slice_2D.vertices)
    # a unique key for entities
    e_key = entity.__class__.__name__ + str(int(entity.closed))

    fmt = eformat[e_key].copy()
    if hasattr(entity, 'color'):
        # if entity has specified color use it
        fmt['color'] = entity.color
    plt.plot(*discrete.T, **fmt)
    plt.savefig('meshx_slice.png')

【讨论】:

非常感谢您的回复。我试过代码。不幸的是,我没有得到我需要的图像。我得到的不是直线,而是补丁中的点。我想附上图片更清楚地说明,但我做不到。 @Ad23 我添加了一个更新,显示了slice_2D.show() 实际使用的内容,您可以从那里保存。 谢谢。这帮助我解决了我的问题。有什么通用方法可以将控制台上显示的内容保存为图片? @Ad23 我会将其作为一个单独的问题发布,但我认为这取决于您使用什么工具来显示。您始终可以将 savefig 与 matplotlib 一起使用。大多数情节都可以在情节中复制,这也很好导出。

以上是关于Python 中 Trimesh 模块的 .to_planar() 函数将 Path2D 保存为 .PNG 或 .JPEG的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中获取 __main__ 模块的文件名?

将 btSoftBodyHelpers::CreateFromTriMesh 与 trimesh 一起使用

python中的functools模块

Python模块相关

7_python下Crypto模块报错

python中的动态模块导入(代码从3.2到3.3)