]> SALOME platform Git repositories - modules/paravis.git/blob - test/VisuPrs/Util/paravistest.py
Salome HOME
Merge akl/tests_update: update tests
[modules/paravis.git] / test / VisuPrs / Util / paravistest.py
1 # Copyright (C) 2010-2014  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
20 """
21 This module provides auxiliary classes, functions and variables for testing.
22 """
23
24 #from __future__ import print_function
25
26 from math import fabs
27 import os
28 import tempfile
29 import getpass
30 from datetime import date
31
32 import salome
33
34
35 # Auxiliary variables
36
37 # Data directory
38 samples_dir = os.getenv("DATA_DIR")
39 datadir = None
40 tablesdir = None
41 if samples_dir is not None:
42     samples_dir = os.path.normpath(samples_dir)
43     datadir = samples_dir + "/MedFiles/"
44     tablesdir = samples_dir + "/Tables/"
45
46 # Graphics files extension
47 pictureext = os.getenv("PIC_EXT")
48 if pictureext == None:
49     pictureext = "png"
50
51
52 # Auxiliary classes
53 class RepresentationType:
54     """
55     Types of representation.
56     """
57     OUTLINE = 0
58     POINTS = 1
59     WIREFRAME = 2
60     SURFACE = 3
61     SURFACEEDGES = 4
62     VOLUME = 5
63     POINTSPRITE = 6
64
65     _type2name = {OUTLINE: 'Outline',
66                   POINTS: 'Points',
67                   WIREFRAME: 'Wireframe',
68                   SURFACE: 'Surface',
69                   SURFACEEDGES: 'Surface With Edges',
70                   VOLUME: 'Volume',
71                   POINTSPRITE: 'Point Sprite'}
72
73     @classmethod
74     def get_name(cls, type):
75         """Return paraview representation type by the primitive type."""
76         return cls._type2name[type]
77
78
79 class SalomeSession(object):
80     def __init__(self):
81         import runSalome
82         import sys
83         #sys.argv += ["--killall"]
84         #sys.argv += ["--portkill=" + port]
85         sys.argv += ["--show-desktop=1"]
86         sys.argv += ["--splash=0"]
87         sys.argv += ["--modules=MED,PARAVIS"]
88         sys.argv += ["--standalone=study"]
89         sys.argv += ["--embedded=SalomeAppEngine,cppContainer,registry,moduleCatalog"]
90         clt, d = runSalome.main()
91         port = d['port']
92         self.port = port
93         return
94
95     #VTN: workaround for crash on CentOS.6.3.64
96     #def __del__(self):
97         #os.system('killSalomeWithPort.py {0}'.format(self.port))
98         #os.system('killSalomeWithPort.py ' + self.port)
99         #import killSalomeWithPort
100         #killSalomeWithPort.killMyPort(self.port)
101         #return
102     pass
103
104
105 # Auxiliary functions
106 def test_values(value, et_value, check_error=0):
107     """Test values."""
108     error = 0
109     length = len(value)
110     et_length = len(et_value)
111     if (length != et_length):
112         err_msg = "ERROR!!! There is different number of created " + str(length) + " and etalon " + str(et_length) + " values!!!"
113         print err_msg
114         error = error + 1
115     else:
116         for i in range(et_length):
117             if abs(et_value[i]) > 1:
118                 max_val = abs(0.001 * et_value[i])
119                 if abs(et_value[i] - value[i]) > max_val:
120                     err_msg = "ERROR!!! Got value " + str(value[i]) + " is not equal to etalon value " + str(ret_value[i]) + "!!!"
121                     print err_msg
122                     error = error + 1
123             else:
124                 max_val = 0.001
125                 if abs(et_value[i] - value[i]) > max_val:
126                     err_msg = "ERROR!!! Got value " + value[i] + " is not equal to etalon value " + et_value[i] + "!!!"
127                     error = error + 1
128     if check_error and error > 0:
129         err_msg = ("There is(are) some error(s) was(were) found... "
130                    "For more info see ERRORs above...")
131         raise RuntimeError(err_msg)
132     return error
133
134
135 def get_picture_dir(subdir):
136     res_dir = os.getenv("PARAVIS_TEST_PICS")
137     if not res_dir:
138         # Add username and current date to unify the directory
139         cur_user = getpass.getuser()
140         cur_date = date.today().strftime("%Y%m%d")
141         res_dir = tempfile.gettempdir() + \
142             "/pic_" + cur_user + \
143             "/test_" + cur_date
144     # Add subdirectory for the case to the directory path
145     res_dir += "/" + subdir
146     # Create the directory if doesn't exist
147     res_dir = os.path.normpath(res_dir)
148     if not os.path.exists(res_dir):
149         os.makedirs(res_dir)
150     else:
151         # Clean the directory
152         for root, dirs, files in os.walk(res_dir):
153             for f in files:
154                 os.remove(os.path.join(root, f))
155
156     return res_dir
157
158
159 def call_and_check(prs, property_name, value, do_raise=1, compare_toler=-1.0):
160     """Utility function for 3D viewer test for common check of different
161     types of presentation parameters set"""
162     if property_name == 'Representation':
163         if value in prs.GetProperty('RepresentationTypesInfo'):
164             prs.SetPropertyWithName(property_name, value)
165             error_string = None
166         else:
167             error_string = (str(value) + " value of " + property_name + " is not available for this type of presentations")
168     else:
169         try:
170             prs.SetPropertyWithName(property_name, value)
171         except ValueError:
172             error_string = (str(value) + "value of " + property_name + " is not available for this type of presentations")
173         else:
174             error_string = None
175     is_good = (error_string is None)
176     if not is_good:
177         if do_raise:
178             raise RuntimeError(error_string)
179         else:
180             print error_string
181     else:
182         # compare just set value and the one got from presentation
183         really_set_value = prs.GetPropertyValue(property_name)
184         is_equal = 1
185         if compare_toler > 0:
186             is_equal = (fabs(really_set_value - value) < compare_toler)
187         else:
188             is_equal = (really_set_value == value)
189         if not is_equal:
190             msg = str(really_set_value) + " has been set instead"
191             if do_raise:
192                 raise RuntimeError(msg)
193             else:
194                 print msg
195                 is_good = False
196
197     return is_good
198
199
200 def compare_lists(value, et_value, check_error=0, eps=1e-04):
201     """
202     Compare two lists: the same length and equality of corresponding items
203     param value - list to be compared
204     param et_value - etalon list
205     param check_error - flag to catch exception if errors>0
206     check_error=0 no exception, check_error !=0 catch exception
207     param eps - defines tolerance for comparison
208     return error - number of errors
209     """
210
211     error=0
212     length = len(value)
213     et_length = len(et_value)
214     if length != et_length:
215         print "ERROR!!! There is different number of items in created ", length, " and etalon ", et_length, " lists!!!"
216         error=error+1
217     else:
218         for i in range(et_length):
219             if abs(et_value[i]) > 1:
220                 MAX = abs(eps*et_value[i])           
221             else:
222                 MAX = eps
223             if abs(et_value[i] - value[i])> MAX:
224                 print "ERROR!!!", i, "-th  item", value[i], " is not equal to etalon item", et_value[i], "!!!"
225                 error=error+1
226     if check_error and error > 0:
227         raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..."
228     return error
229
230
231 def setShaded(view, shading):
232     """Utility function to set shaded mode in view"""
233     if shading == 0:
234         view.LightDiffuseColor = [1, 1, 1]
235     if shading == 1:
236         view.LightDiffuseColor = [0, 0, 0]
237
238
239 def TimeStampId(proxy):
240     """Return tuple for the given MED proxy: (mesh_name, {field_name: [entity, timestamp_id]})
241     Originally defined in KERNEL_TEST/Tools/CommonFunctions file.
242     """
243     import presentations
244     mesh_name = presentations.get_mesh_names(proxy).pop()
245     iterations = {}
246
247     # get list of field names
248     fields_on_points = list(proxy.PointArrays)
249     fields_on_cells = list(proxy.CellArrays)
250     all_fields = fields_on_points + fields_on_cells
251
252     # get timestamps
253     timestamps = proxy.TimestepValues.GetData()
254     timestamp_nb = len(timestamps)
255
256     for field in all_fields:
257         entity = None
258         if fields_on_points.count(field) > 0:
259             entity = presentations.EntityType.NODE
260         elif fields_on_cells.count(field) > 0:
261             entity = presentations.EntityType.CELL
262             
263         iterations[field] = [entity, timestamp_nb]
264
265     return mesh_name, iterations
266     
267     
268 def Import_Med_Field(paravis, file, field_names, check_errors=0, prs=[]):
269     """Builds presentations on the given fields of the MED file.
270     Originally defined in VISU_TEST/Grids/visu/ImportMedField/begin file.
271     
272     Arguments:
273       paravis      : PARAVIS instance     
274       file_name    : the full path to med file
275       field_names  : the list of field names (for ex: ["pression","temperature","vitesse"])
276       prs          : [[0,1,...], [], []]; empty list (sublist(s)) is ignored
277                      0-VISU.TGAUSSPOINTS
278                      1-VISU.TSCALARMAP
279                      2-VISU.TISOSURFACE
280                      3-VISU.TCUTPLANES
281                      4-VISU.TCUTLINES
282                      5-VISU.TDEFORMEDSHAPE
283                      6-VISU.TVECTORS
284                      7-VISU.TSTREAMLINES
285                      8-VISU.TPLOT3D
286                      9-VISU.TSCALARMAPONDEFORMEDSHAPE
287     """
288     import presentations
289     
290     nb_errors = 0
291     
292     print "File: ", file
293     
294     # check the file accessibility
295     if not os.access(file, os.F_OK):
296         msg = "File " + file + " does not exist!!!"
297         raise RuntimeError, msg
298
299     # import MED file
300     paravis.ImportFile(file)
301     proxy = presentations.pvs.GetActiveSource()
302     if proxy is None:
303         raise RuntimeError, "ERROR!!! Can't import file!!!"  
304     
305     for i in range(len(field_names)):
306         print "Name of the field: ", field_names[i]
307         
308         if len(prs) != 0:
309             if len(prs[i]) != 0:
310                 mesh_name, iterations = TimeStampId(proxy)
311                 
312                 if iterations.has_key(field_names[i]):
313                     entity = iterations[field_names[i]][0]
314                     iteration = iterations[field_names[i]][1]
315                 else:
316                     msg="There is no information about TimeStampId of the " + field_names[i] + " field!!!"
317                     raise RuntimeError, msg
318
319                 err = nb_errors
320                 
321                 for type in prs[i]:
322                     if type==0:
323                         if presentations.GaussPointsOnField(proxy, entity, field_names[i], iteration) is None:
324                             print "ERROR!!! Created GaussPoints presentation is None!!!"; nb_errors+=1
325                     if type==1:
326                         if presentations.ScalarMapOnField(proxy, entity, field_names[i], iteration) is None:
327                             print "ERROR!!! Created ScalarMap presentation is None!!!"; nb_errors+=1
328                     if type==2:
329                         if presentations.IsoSurfacesOnField(proxy, entity, field_names[i], iteration) is None:
330                             print "ERROR!!! Created IsoSurfaces presentation is None!!!"; nb_errors+=1
331                     if type==3:
332                         if presentations.CutPlanesOnField(proxy, entity, field_names[i], iteration) is None:
333                             print "ERROR!!! Created CutPlanes presentation is None!!!"; nb_errors+=1
334                     if type==4:
335                         if presentations.CutLinesOnField(proxy, entity, field_names[i], iteration) is None:
336                             print "ERROR!!! Created CutLines presentation is None!!!"; nb_errors+=1
337                     if type==5:
338                         if presentations.DeformedShapeOnField(proxy, entity, field_names[i], iteration) is None:
339                             print "ERROR!!! Created DeformedShape presentation is None!!!"; nb_errors+=1
340                     if type==6:
341                         if presentations.VectorsOnField(proxy, entity, field_names[i], iteration) is None:
342                             print "ERROR!!! Created Vectors presentation is None!!!"; nb_errors+=1
343                     if type==7:
344                         if presentations.StreamLinesOnField(proxy, entity, field_names[i], iteration) is None:
345                             print "ERROR!!! Created StreamLines presentation is None!!!"; nb_errors+=1
346                     if type==8:
347                         if presentations.Plot3DOnField(proxy, entity, field_names[i], iteration) is None:
348                             print "ERROR!!! Created Plot3D presentation is None!!!"; nb_errors+=1
349                     if type==9:
350                         if presentations.DeformedShapeAndScalarMapOnField(proxy, entity, field_names[i], iteration) is None:
351                             print "ERROR!!! Created ScalarMapOnDeformedShape presentation is None!!!"; nb_errors+=1
352                             
353                 # check if number of errors has increased
354                 if err == nb_errors:
355                     print "Presentation(s) creation...OK"
356
357     if nb_errors > 0 and check_errors:
358         raise RuntimeError, "There are some errors were occured!!! For more information see ERRORs above..."
359     else:
360         return nb_errors
361
362 def delete_with_inputs(obj):
363     """Deletes the given object with all its inputs"""
364     import pvsimple
365     
366     obj_to_delete = obj
367     while obj_to_delete is not None:
368         tmp_obj = obj_to_delete
369         obj_to_delete = None
370         if hasattr(tmp_obj, 'Input'):
371             obj_to_delete = tmp_obj.Input
372         
373         pvsimple.Delete(tmp_obj)
374
375 # Run Salome
376 salome_session = SalomeSession()
377 salome.salome_init()