本篇文章将介绍如何读取读取多块的plot3d,点击各个块可以交互。

环境

  • VTK : 9.1.0
  • Python : 3.6.5

功能

  • 读取plot3d网格
  • 显示几何
  • 点击交互

效果图

代码

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
#!/usr/bin/python
# -*- coding: utf-8 -*-


import os
import sys
import vtkmodules.all as vtk

vtk.vtkOutputWindow.SetGlobalWarningDisplay(0)

r = vtk.vtkMultiBlockPLOT3DReader()
r.SetXYZFileName('m6wing.xyz')
r.Update()
data = r.GetOutput()
color = [[0.1, 0.3, 0.9],
[0.6, 0.5, 0.1],
[0.1, 0.8, 0.6],
[0.9, 0.2, 0.4],
]
all_actor = []
colors = vtk.vtkNamedColors()
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())

# get the new
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())
# Highlight the picked actor by changing its properties
self.NewPickedActor.GetProperty().SetColor(colors.GetColor3d('Red'))
self.NewPickedActor.GetProperty().SetDiffuse(1.0)
self.NewPickedActor.GetProperty().SetSpecular(0.0)
self.NewPickedActor.GetProperty().EdgeVisibilityOn()

# save the last picked actor
self.LastPickedActor = self.NewPickedActor

self.OnLeftButtonDown()
return

for i in range(data.GetNumberOfBlocks()):
c = color[i]
cell = data.GetBlock(i)
g = vtk.vtkGeometryFilter()
g.SetInputData(cell)
MeshMapper = vtk.vtkCompositePolyDataMapper2()

MeshMapper.SetInputConnection(g.GetOutputPort())
MeshMapper.ScalarVisibilityOff()
MeshActor = vtk.vtkActor()
MeshActor.SetMapper(MeshMapper)
MeshProp = MeshActor.GetProperty()
# MeshProp.EdgeVisibilityOn()
# MeshProp.SetRepresentationToSurface()
MeshActor.GetProperty().SetColor(c[0], c[1], c[2])
all_actor.append(MeshActor)
MeshRen = vtk.vtkRenderer()
MeshRen.SetViewport(0, 0, 1.0, 1.0)
MeshRen.GradientBackgroundOn()
MeshRen.SetBackground(1, 1, 1)
MeshRen.SetBackground2(0.4, 0.55, 0.75)
for i in all_actor:
MeshRen.AddActor(i)

renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(MeshRen)
style = MouseInteractorHighLightActor()
style.SetDefaultRenderer(MeshRen)
iren = vtk.vtkRenderWindowInteractor()
iren.SetInteractorStyle(style)
iren.SetRenderWindow(renWin)
renWin.SetSize(300, 300)
renWin.Render()
iren.Initialize()
iren.Start()

代码库

相关代码可以查看:

hufei/vtk-examples