Salome HOME
Copyright update 2022
[modules/paravis.git] / examples / command_line / medviewer.py
1 # Copyright (C) 2014-2022  CEA/DEN, EDF R&D
2 #
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2.1 of the License, or (at your option) any later version.
7 #
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11 # Lesser General Public License for more details.
12 #
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the Free Software
15 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
16 #
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
18 #
19 class MEDViewer():
20
21   def __init__(self, createRenderView=True, interactive=False):
22     self.interactive = interactive
23     import pvsimple
24
25     if createRenderView:
26       self.renderView = pvsimple.CreateRenderView()
27     else:
28       self.renderView = pvsimple.GetRenderView()
29   #
30
31   def __displayInteractive(self, element):
32     from PyQt4 import QtCore, QtGui
33     from vtk.qt4 import QVTKRenderWindowInteractor
34
35     class __InteractiveViewer(QtCore.QObject):
36       def __init__(self, viewer):
37         self.renderView = viewer.renderView
38         self.widget = QVTKRenderWindowInteractor.QVTKRenderWindowInteractor(\
39           rw=self.renderView.GetRenderWindow(),
40           iren=self.renderView.GetInteractor())
41         self.widget.Initialize()
42         self.widget.Start()
43         self.widget.show()
44         import pvsimple
45         pvsimple.ResetCamera()
46         pvsimple.Render(view=self.renderView)
47       #
48       def render(self):
49         pvsimple.Render(self.renderView)
50       #
51     #
52     app = QtGui.QApplication(['ParaView Python App'])
53     iv = __InteractiveViewer(self)
54     app.exec_()
55   #
56
57   def __display(self, element, pause=False):
58     import pvsimple
59     pvsimple.SetActiveSource(element)
60     pvsimple.Show(view=self.renderView)
61
62     if self.interactive:
63       self.__displayInteractive(element)
64     else:
65       pvsimple.Render(view=self.renderView)
66       pvsimple.ResetCamera()
67       pvsimple.SetActiveSource(element)
68       pvsimple.Render(view=self.renderView)
69       if pause:
70         input("Press Enter key to continue")
71   #
72
73   def display_mesh(self, element, pause=False):
74     self.__display(element, pause)
75   #
76
77   def display_field(self, element, pause=False):
78     import pvsimple
79     pvsimple.SetActiveSource(element)
80     representation = pvsimple.Show(view=self.renderView)
81
82     from medio import get_element_type, get_element_name
83     etype = get_element_type(element)
84     ename = get_element_name(element)
85
86     if etype == 'P0':
87       representation.ColorArrayName = ("CELLS", ename)
88       data = element.CellData
89     elif etype == 'P1':
90       representation.ColorArrayName = ("POINTS", ename)
91       data = element.PointData
92
93     # :TODO: Determine nb components
94     nb_cmp = 1
95     mode = "Magnitude" # "Component" if nb_cmp > 1
96     scalarbar = self.__build_scalar_bar(data, ename, nb_cmp, mode)
97
98     pvsimple.SetActiveSource(element)
99     self.renderView.Representations.append(scalarbar)
100     self.__display(element, pause)
101   #
102
103   def __build_scalar_bar(self, data, fieldname, nb_components, vector_mode):
104     import pvsimple
105     # Get data range (mini/maxi)
106     for n in range(data.GetNumberOfArrays()):
107         if data.GetArray(n).GetName() == fieldname:
108             mini,maxi = data.GetArray(n).GetRange()
109
110     stepvalue = (maxi-mini)/100. # 100 steps
111
112     # Build Lookup table
113     RGBPoints = [mini, 0.0, 0.0, 1.0, maxi, 1.0, 0.0, 0.0]
114     nb = int((maxi-mini)/stepvalue)-1
115     Table = pvsimple.GetLookupTableForArray("", nb_components, VectorMode=vector_mode, ColorSpace='HSV')
116     Table.Discretize = 1
117     Table.NumberOfTableValues = nb
118     Table.RGBPoints = RGBPoints
119
120     representation = pvsimple.Show(view=self.renderView)
121     representation.Representation = 'Surface'
122     representation.LookupTable = Table
123
124     # Build scalar bar
125     scalarbar = pvsimple.CreateScalarBar(LabelFormat = '%.1f',Title= "",LabelFontSize=12,Enabled=1,LookupTable=Table,TitleFontSize=12,LabelColor=[0.0, 0.0, 0.0],TitleColor=[0.0, 0.0, 0.0],)
126     return scalarbar
127   #
128
129 #