Python讀取stp,stl文件

STL文件

STL(StereoLithography:立体光刻)文件是 3 维表面几何形状的三角形表示。 表面被逻辑地细分或分解为一系列小三角形(面)。 每个面由垂直方向和代表三角形顶点(角)的三个点来描述。 切片算法使用这些数据来确定制造商要构建的 3 维形状的横截面。
STL文件格式是由3D SYSTEMS 公司于1988 年制定的一个接口协议,是一种为快速原型制造技术服务的三维图形文件格式。STL 文件由多个三角形面片的定义组成,每个三角形面片的定义包括三角形各个定点的三维坐标及三角形面片的法矢量。三角形顶点的排列顺序遵循右手法则。 STL 文件有2 种类型:文本文件(ASCII格式)和二进制文件(BINARY)。

numpy-stl

使用Python的numpy-stl库加载STL文件,并通过numpy处理STL网格数据,包括提取顶点坐标及三角面片序列。https://github.com/WoLpH/numpy-stl
需要先安装 numpy-stl:

pip install numpy-stl

numpy-stl 中常见属性说明
vectors:所有三角形面片的顶点坐标,形状为 (n, 3, 3),n為三角形數量
normals:每个三角形的法向量,形状为 (n, 3)
points:所有三角形展平成一个二维数组,形状为 (n, 9)

from stl import mesh

stl_model = 'model.stl'   # 讀入一個立方體模型
your_mesh = mesh.Mesh.from_file(stl_model)

print(f'vectors形狀={
            your_mesh.vectors.shape}')
print(f'normals形狀={
            your_mesh.normals.shape}')
print(f'points形狀={
            your_mesh.points.shape}') #注意這裡的points屬性不是模型點雲的點,=12

print(f'共有{len(your_mesh.vectors)}个三角形面')
print(f'共有{len(your_mesh.normals)}个法向量')
print(f'共有{len(your_mesh.points)}个點')

輸出:

vectors形狀=(12, 3, 3)
normals形狀=(12, 3)
points形狀=(12, 9)
共有12个三角形面
共有12个法向量
共有12个點

PyVista

PyVista 是一个可视化工具包(VTK)的辅助模块,通过NumPy和各种方法和类直接访问数组来包装VTK库。https://github.com/pyvista/pyvista
需要先安装 PyVista:

pip install pyvista
import pyvista as pv

stl_model = 'model.stl'  # 讀入一個立方體模型
your_mesh = pv.read(stl_model)

print(f'共有{your_mesh.n_points}个頂點') #注意這裡的n_points屬性是模型點雲的點,=8
print(f'共有{your_mesh.n_cells}个三角形面')
print(f'边界范围={your_mesh.bounds}')
print(f'体积(如果是封闭体)={your_mesh.volume}')

plotter = pv.Plotter(shape=(1, 1))  # 显示模型
plotter.add_mesh(your_mesh, show_edges=True, color='white')
plotter.add_points(your_mesh.points, color='red', point_size=10)
plotter.show()

輸出:

共有8个頂點
共有12个三角形面
边界范围=BoundsTuple(x_min=0.0, x_max=200.0, y_min=0.0, y_max=10.0, z_min=0.0, z_max=100.0)
体积(如果是封闭体)=200000.00000000003

图片[1] - Python讀取stp,stl文件 - 宋马
顯示模型,鼠標左鍵按住拖動可以旋轉,shift+鼠標左鍵按住拖動可以平移,滾輪滑動可以縮放。

模型簡化

使用 PyVista 简化 STL 等三角网格模型中的三角面(即降低面数 / 简化网格),可以使用 decimate() 或 decimate_pro() 函数。这两个函数内部基于 VTK 的 vtkDecimatePro 算法,用于保持几何特征的前提下尽量减少三角面数量。函數說明如下:
https://docs.pyvista.org/api/core/_autosummary/pyvista.polydatafilters.decimate#pyvista.PolyDataFilters.decimate
https://docs.pyvista.org/api/core/_autosummary/pyvista.polydatafilters.decimate_pro#pyvista.PolyDataFilters.decimate_pro

import pyvista as pv

stl_model = 'bunny.stl'
mesh1 = pv.read(stl_model)
print(f'原始三角面数: {mesh1.n_cells}')
print(f'原始頂點数: {mesh1.n_points}')

mesh2 = mesh1.decimate(target_reduction=0.75)
# decimate it by 0.75, will leave 25% of the original number of vertices.
# mesh2.save("simplified_model.stl")
print(f'decimate简化后三角面数: {mesh2.n_cells}')
print(f'decimate简化后頂點数: {mesh2.n_points}')

mesh3 = mesh1.decimate_pro(reduction=0.75)
# decimate it by 0.75, will leave 25% of the original number of vertices.

print(f'decimate_pro简化后三角面数: {
            mesh3.n_cells}')
print(f'decimate_pro简化后頂點数: {
            mesh3.n_points}')

plotter = pv.Plotter(shape=(2, 2))

plotter.subplot(0, 0)
plotter.add_text("original", font_size=10)
plotter.add_mesh(mesh1, color="white", show_edges=True)
plotter.add_points(mesh1.points, color='red', point_size=5)

plotter.subplot(0, 1)
plotter.add_text("decimate", font_size=10)
plotter.add_mesh(mesh2, color="white", show_edges=True)
plotter.add_points(mesh2.points, color='red', point_size=5)

plotter.subplot(1, 0)
plotter.add_text("decimate_pro", font_size=10)
plotter.add_mesh(mesh3, color="white", show_edges=True)
plotter.add_points(mesh3.points, color='red', point_size=5)

plotter.show()

輸出:

原始三角面数: 3482
原始頂點数: 1743
decimate简化后三角面数: 870
decimate简化后頂點数: 437
decimate_pro简化后三角面数: 870
decimate_pro简化后頂點数: 437

相關工具

MeshLab,是一个用于处理和编辑三维网格模型的开源软件,它提供了各种功能和工具来处理和重建三维模型。
https://www.meshlab.net/
导入模型后使用Filters > Remeshing, Simplification and Reconstruction > Simplification: Quadric Edge Collapse Decimation
图片[2] - Python讀取stp,stl文件 - 宋马
设置目标面数(Target Face Number)或简化比例(Percentage Reduction),Apply即可。

STP文件

Python的OCC-Core库

PythonOCC-Core 是一个用于 3D 几何 CAD/BIM/CAM 的 Python 包。它提供了 3D 建模和数据交换功能,旨在为 CAD/PDM/PLM 和 BIM 相关的开发提供支持。PythonOCC-Core 基于 OpenCascade Technology 建模内核,允许开发者通过 Python 访问几乎所有 OpenCascade 的 C++ 类。
https://github.com/tpaviot/pythonocc-core
目前PythonOCC-Core 只支持到Python 3.11 版本,不支持更高版本。
目前只可以使用 Conda 安装 PythonOCC-Core。PythonOCC-Core 的预编译包依赖于 conda-forge 频道中的第三方库:

conda install -c conda-forge pythonocc-core

pip安裝會報錯:

pip install pythonocc-core
ERROR: Could not find a version that satisfies the requirement pythonocc-core (from versions: none)
ERROR: No matching distribution found for pythonocc-core

可以讀取STP文件並顯示:

from OCC.Core.STEPControl import STEPControl_Reader
from OCC.Display.SimpleGui import init_display

# 初始化可视化窗口
display, start_display, add_menu, add_function_to_menu = init_display()

# 创建STEP读取器
step_reader = STEPControl_Reader()
status = step_reader.ReadFile('model.stp')

if status == 1:  # 文件读取成功
    step_reader.TransferRoots()
    shape = step_reader.Shape()

    # 显示3D形状
    display.DisplayShape(shape, update=True)
    start_display()
    print("STP文件读取成功。")
else:
    print("STP文件读取失败。")

顯示圖形

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容