目的
在笔记4中我进行了对stl的切割操作
学习笔记4:在python中使用vtk剖切stl文件-CSDN博客
现在我们来提取模型的切片
示例代码
import vtk
import os
def create_slice_actor_from_stl(stl_file, color, opacity, plane_origin, plane_normal):
# 创建STL读取器并加载文件
reader = vtk.vtkSTLReader()
reader.SetFileName(stl_file)
# 创建切割平面
plane = vtk.vtkPlane()
plane.SetOrigin(plane_origin)
plane.SetNormal(plane_normal)
# 使用vtkCutter根据切割平面对模型进行切片
cutter = vtk.vtkCutter()
cutter.SetCutFunction(plane)
cutter.SetInputConnection(reader.GetOutputPort())
cutter.Update()
# 创建映射器
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(cutter.GetOutputPort())
# 创建actor
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# 设置颜色
actor.GetProperty().SetColor(color)
actor.GetProperty().SetOpacity(opacity)
return actor
def main():
folder_path = 'Stl'
stl_files = [] # 示例:添加STL文件路径
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
stl_files.append(file_path)
# 创建渲染器
renderer = vtk.vtkRenderer()
# 预定义颜色列表
colors = [
(1.0, 0.0, 0.0), # 红色
(0.0, 1.0, 0.0), # 绿色
(0.0, 0.0, 1.0), # 蓝色
(1.0, 1.0, 0.0), # 黄色
(0.0, 1.0, 1.0), # 青色
(1.0, 0.0, 1.0), # 紫色
(0.5, 0.0, 0.0), # 深红色
(0.0, 0.5, 0.0), # 深绿色
(0.0, 0.0, 0.5), # 深蓝色
(0.5, 0.5, 0.5), # 灰色
]
opacitys = [0.5, 0.6, 0.9]
# 定义切割平面的原点和法线
plane_origin = [0, 0, 0]
plane_normal = [0, 0, 1]
# 对于每个STL文件,创建一个切片actor并添加到渲染器中
for idx, stl_file in enumerate(stl_files):
color = colors[idx % len(colors)]
opacity = opacitys[idx % len(opacitys)]
actor = create_slice_actor_from_stl(stl_file, color, opacity, plane_origin, plane_normal)
renderer.AddActor(actor)
# 设置背景颜色、渲染窗口和交互器
renderer.SetBackground(0.1, 0.2, 0.4)
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)
# 开始渲染和交互
renderWindow.Render()
renderWindowInteractor.Start()
if __name__ == "__main__":
main()
首先要声明的是针对模型格式来说stl是面模型,切片后的效果是一维的线组成的。个人认为切片操作在单元体构成的模型上进行会显得更加美妙。
代码解释
其实切片操作比切割操作更加简洁,只需要使用函数vtk.vtkCutter()即可提取切片,不需要选择保留哪一个方面。
对比图
使用vtk.vtkClipPolyData()切割的效果如下:
使用vtk.vtkCutter()切片的效果如下: