脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - 如何使用Python VTK高亮显示actor

如何使用Python VTK高亮显示actor

2022-12-01 11:03派大大大星 Python

这篇文章主要介绍了如何使用Python VTK高亮显示actor,通过Python-VTK在同一个窗口中,高亮显示选中的actor。本例子中的代码,当窗口中的圆球actor被选中时,会变成红色,并且会显示actor三遍面片边缘信息,下文相关内容需要的小伙伴

前言:

VTK,(visualizationtoolkit)是一个开放资源的免费软件系统,主要用于三维计算机图形学、图像处理和可视化。Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的,包含有大约250,000行代码,2000多个类,还包含有几个转换界面,因此也可以自由的通过Java,Tcl/Tk和Python各种语言使用vtk。

主要函数介绍:

NewPickedActor.GetProperty(): 通过该函数,可以设置actor的性质,如颜色、表面样式等。

vtk.vtkSphereSource(): 创建球体的函数,文中通过一个for循环创建了10个球体。

vtk.vtkMinimalStandardRandomSequence(): VTK的随机数生成器,用于代码中的十个球体,随机生成球体的大小和位置。

MouseInteractorHighLightActor: 定义actor操作方法,这个是一个鼠标操作控件的控制方法。

leftButtonPressEvent(self, obj, event): 这是一个事件触发函数,当鼠标左键点击对应的actor时,会触发函数,对点的actor高亮显示。

主要代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#!/usr/bin/env python
 
# noinspection PyUnresolvedReferences
import vtk
 
colors = vtk.vtkNamedColors()
NUMBER_OF_SPHERES = 10
 
 
class MouseInteractorHighLightActor(vtk.vtkInteractorStyleTrackballCamera):
 
    def __init__(self, parent=None):
        self.AddObserver("LeftButtonPressEvent", self.leftButtonPressEvent)
 
        self.LastPickedActor = None
        self.LastPickedProperty = vtk.vtkProperty()
 
    def leftButtonPressEvent(self, obj, event):
        clickPos = self.GetInteractor().GetEventPosition()
 
        picker = vtk.vtkPropPicker()
        picker.Pick(clickPos[0], clickPos[1], 0, self.GetDefaultRenderer())
 
        # 创建一个新的actor
        self.NewPickedActor = picker.GetActor()
 
        # If something was selected
        if self.NewPickedActor:
            # If we picked something before, reset its property
            if self.LastPickedActor:
                self.LastPickedActor.GetProperty().DeepCopy(self.LastPickedProperty)
 
            # Save the property of the picked actor so that we can
            # restore it next time
            self.LastPickedProperty.DeepCopy(self.NewPickedActor.GetProperty())
            # 高亮选中球体,并显示边缘
            self.NewPickedActor.GetProperty().SetColor(colors.GetColor3d('Red'))
            self.NewPickedActor.GetProperty().SetDiffuse(1.0)
            self.NewPickedActor.GetProperty().SetSpecular(0.0)
            self.NewPickedActor.GetProperty().EdgeVisibilityOn()
 
            # 保存最后一个选中的actor
            self.LastPickedActor = self.NewPickedActor
 
        self.OnLeftButtonDown()
        return
 
 
def main():
    # 创建render和window
    renderer = vtk.vtkRenderer()
    renderer.SetBackground(colors.GetColor3d('SteelBlue'))
 
    renwin = vtk.vtkRenderWindow()
    renwin.AddRenderer(renderer)
    renwin.SetSize(640, 480)
    renwin.SetWindowName('HighlightPickedActor')
 
    # 建立interactor(交互操作)
    interactor = vtk.vtkRenderWindowInteractor()
    interactor.SetRenderWindow(renwin)
 
    # 交互操作方法
    style = MouseInteractorHighLightActor()
    style.SetDefaultRenderer(renderer)
    interactor.SetInteractorStyle(style)
 
    randomSequence = vtk.vtkMinimalStandardRandomSequence()
    # randomSequence.SetSeed(1043618065)
    # randomSequence.SetSeed(5170)
    randomSequence.SetSeed(8775070)
    # 添加球体
    for i in range(NUMBER_OF_SPHERES):
        source = vtk.vtkSphereSource()
 
        # random position and radius
        x = randomSequence.GetRangeValue(-5.0, 5.0)
        randomSequence.Next()
        y = randomSequence.GetRangeValue(-5.0, 5.0)
        randomSequence.Next()
        z = randomSequence.GetRangeValue(-5.0, 5.0)
        randomSequence.Next()
        radius = randomSequence.GetRangeValue(0.5, 1.0)
        randomSequence.Next()
 
        source.SetRadius(radius)
        source.SetCenter(x, y, z)
        source.SetPhiResolution(11)
        source.SetThetaResolution(21)
 
        mapper = vtk.vtkPolyDataMapper()
        mapper.SetInputConnection(source.GetOutputPort())
        actor = vtk.vtkActor()
        actor.SetMapper(mapper)
 
        r = randomSequence.GetRangeValue(0.4, 1.0)
        randomSequence.Next()
        g = randomSequence.GetRangeValue(0.4, 1.0)
        randomSequence.Next()
        b = randomSequence.GetRangeValue(0.4, 1.0)
        randomSequence.Next()
 
        actor.GetProperty().SetDiffuseColor(r, g, b)
        actor.GetProperty().SetDiffuse(.8)
        actor.GetProperty().SetSpecular(.5)
        actor.GetProperty().SetSpecularColor(colors.GetColor3d('White'))
        actor.GetProperty().SetSpecularPower(30.0)
 
        renderer.AddActor(actor)
 
    # 运行
    interactor.Initialize()
    renwin.Render()
    interactor.Start()
 
 
if __name__ == '__main__':
    main()

显示结果如下: 未选择球体: 

如何使用Python VTK高亮显示actor

已选取球体后: 

如何使用Python VTK高亮显示actor

到此这篇关于如何使用Python VTK高亮显示actor的文章就介绍到这了,更多相关Python VTK高亮显示actor内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/7031521722301939719

延伸 · 阅读

精彩推荐
  • Pythonpython中opencv实现文字分割的实践

    python中opencv实现文字分割的实践

    图片文字分割的时候,常用的方法有两种。一种是投影法,还有一种是用OpenCV的轮廓检测,本文详细的介绍了这两种方法的使用,感兴趣的可以了解一下...

    告白少年8622021-11-23
  • Python浅谈python对象数据的读写权限

    浅谈python对象数据的读写权限

    下面小编就为大家带来一篇浅谈python对象数据的读写权限。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    脚本之家3892020-09-07
  • Pythonpython 弹窗提示警告框MessageBox的实例

    python 弹窗提示警告框MessageBox的实例

    今天小编就为大家分享一篇python 弹窗提示警告框MessageBox的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    lyhsdy12732021-07-14
  • Pythonpython Pexpect模块的使用

    python Pexpect模块的使用

    这篇文章主要介绍了python Pexpect模块的使用,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下...

    码道仕7942021-08-18
  • PythonPython和Pycharm 环境部署详细步骤

    Python和Pycharm 环境部署详细步骤

    Python环境搭建过程很多朋友都操作过,本次我们将向大家介绍Python和Pycharm 环境部署的流程,文章通过图文的形式给大家展示一目了然一看就懂,需要的朋...

    阿波罗不会钓鱼12482021-11-29
  • PythonPython学习之内置函数总结

    Python学习之内置函数总结

    这篇文章主要为大家总结一下python 中常用的是个内置函数的使用方法,文中的示例代码讲解详细,对我们学习Python有一定的帮助,需要的可以参考一下...

    渴望力量的哈士奇4762022-11-16
  • Python详解Python中元组的三个不常用特性

    详解Python中元组的三个不常用特性

    元组是Python中一种重要的内置数据类型。与列表一样,我们经常使用元组将多个对象保存为相应的数据容器。本文为大家总结了元组的三个不常用特性,感...

    赵卓不凡4322022-07-04
  • Python基于Django模板中的数字自增(详解)

    基于Django模板中的数字自增(详解)

    下面小编就为大家带来一篇基于Django模板中的数字自增(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Charles97034222020-12-05