学习笔记3:python中使用vtk对stl模型进行属性修改

前面我们实现了使用vtk读取stl文件:

学习笔记1:在python中使用vtk读取并显示单个stl文件-CSDN博客

学习笔记2:在python中使用vtk在一个渲染窗口中读取并显示多个stl文件-CSDN博客

目的

现在我们使用vtk修改stl模型的颜色和透明度

示例代码

import vtk
import os

def create_actor_from_stl(stl_file, color, opacity):
    # 创建STL读取器并加载文件
    reader = vtk.vtkSTLReader()
    reader.SetFileName(stl_file)

    # 创建映射器
    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(reader.GetOutputPort())

    # 创建actor
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    # 设置颜色
    actor.GetProperty().SetColor(color)  # 设置对象的颜色
    # 设置透明度
    actor.GetProperty().SetOpacity(opacity)  # 设置对象的透明度

    return actor


def main():
    folder_path = 'Stl'
    # 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()

    # 扩展颜色列表到10种颜色
    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),  # 灰色
    ]

    # 定义透明度列表
    opacities = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.2]



    # 对于每个STL文件,创建一个actor并添加到渲染器中

    for idx, stl_file in enumerate(stl_files):
        color = colors[idx % len(colors)]  # 循环使用预定义的颜色  %:模运算即取余数
        opacity = opacities[idx % len(opacities)]  # 循环使用预定义的透明度
        actor = create_actor_from_stl(stl_file, color, opacity)
        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()

代码解释

为了我给对象赋予(改变)颜色和透明度属性,我们在def create_actor_from_stl(stl_file, color, opacity):中加入了两个参数即color, opacity,后面使用actor.GetProperty().SetColor(color)和actor.GetProperty().SetOpacity(opacity)达到改变颜色和透明度的目的。

在mian()中需要注意的是

    for idx, stl_file in enumerate(stl_files):
        color = colors[idx % len(colors)]  # 循环使用预定义的颜色  %:模运算即取余数
        opacity = opacities[idx % len(opacities)]  # 循环使用预定义的透明度
        actor = create_actor_from_stl(stl_file, color, opacity)
        renderer.AddActor(actor)

在上面的代码中enumerate()接受一个可迭代对象(如列表)作为参数,并返回一个枚举对象。这个枚举对象生成一对一的索引和值的元组,允许在循环中同时访问它们。简而言之,idx是列表stl_files中每一个stl_file对象的索引值。这样后面的代码就非常容易理解了,每一次渲染器renderer()都会接收到一个编辑过属性的actor。这个属性是由模运算决定的,因为我给每一个文件中的stl都赋予了响应的属性,即我的属性列表中的元素数量和stl文件数量相同。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值