学习笔记5:在python中使用vtk切片stl文件

目的 

在笔记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()切片的效果如下:

要基于VTK实现STL文件的处理,你可以按照以下步骤进行: 1. 首先,确保你已经安装了VTK库。你可以使用pip命令进行安装: ``` pip install vtk ``` 2. 导入必要的模块: ```python import vtk ``` 3. 创建一个读取STL文件的reader对象: ```python reader = vtk.vtkSTLReader() reader.SetFileName("path/to/your/stl/file.stl") reader.Update() ``` 4. 获取读取到的数据: ```python polydata = reader.GetOutput() ``` 5. 如果你需要对STL文件进行操作,你可以使用VTK的各种过滤器和函数。例如,你可以使用vtkPolyDataMapper将数据映射到渲染器上: ```python mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(polydata) ``` 6. 创建一个vtkActor对象,并将上面创建的mapper对象设置给它: ```python actor = vtk.vtkActor() actor.SetMapper(mapper) ``` 7. 创建一个vtkRenderer对象,并将actor对象添加到其: ```python renderer = vtk.vtkRenderer() renderer.AddActor(actor) ``` 8. 创建一个vtkRenderWindow对象,并将renderer对象设置给它: ```python renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) ``` 9. 创建一个vtkRenderWindowInteractor对象,并将renderWindow设置给它: ```python interactor = vtk.vtkRenderWindowInteractor() interactor.SetRenderWindow(renderWindow) ``` 10. 最后,启动交互式窗口,显示STL文件: ```python renderWindow.Render() interactor.Start() ``` 这样,你就可以使用VTK库基于Python来读取和显示STL文件了。你可以根据你的需求进一步扩展和修改代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值