1 # Copyright (C) 2010-2015 CEA/DEN, EDF R&D
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.
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.
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
17 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 This module provides auxiliary classes, functions and variables for testing.
24 #from __future__ import print_function
30 from datetime import date
38 samples_dir = os.getenv("DATA_DIR")
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/"
46 # Graphics files extension
47 pictureext = os.getenv("PIC_EXT")
48 if pictureext == None:
53 class RepresentationType:
55 Types of representation.
65 _type2name = {OUTLINE: 'Outline',
67 WIREFRAME: 'Wireframe',
69 SURFACEEDGES: 'Surface With Edges',
71 POINTSPRITE: 'Point Sprite'}
74 def get_name(cls, type):
75 """Return paraview representation type by the primitive type."""
76 return cls._type2name[type]
79 class SalomeSession(object):
83 if "INGUI" in sys.argv:
85 sys.argv += ["--show-desktop=1"]
86 sys.argv += ["--splash=0"]
87 #sys.argv += ["--standalone=study"]
88 #sys.argv += ["--embedded=SalomeAppEngine,cppContainer,registry,moduleCatalog"]
90 sys.argv += ["--terminal"]
91 sys.argv += ["--modules=MED,PARAVIS"]
92 clt, d = runSalome.main()
97 #VTN: workaround for crash on CentOS.6.3.64
99 #os.system('killSalomeWithPort.py {0}'.format(self.port))
100 #os.system('killSalomeWithPort.py ' + self.port)
101 #import killSalomeWithPort
102 #killSalomeWithPort.killMyPort(self.port)
107 # Auxiliary functions
108 def test_values(value, et_value, check_error=0):
112 et_length = len(et_value)
113 if (length != et_length):
114 err_msg = "ERROR!!! There is different number of created " + str(length) + " and etalon " + str(et_length) + " values!!!"
118 for i in range(et_length):
119 if abs(et_value[i]) > 1:
120 max_val = abs(0.001 * et_value[i])
121 if abs(et_value[i] - value[i]) > max_val:
122 err_msg = "ERROR!!! Got value " + str(value[i]) + " is not equal to etalon value " + str(ret_value[i]) + "!!!"
127 if abs(et_value[i] - value[i]) > max_val:
128 err_msg = "ERROR!!! Got value " + value[i] + " is not equal to etalon value " + et_value[i] + "!!!"
130 if check_error and error > 0:
131 err_msg = ("There is(are) some error(s) was(were) found... "
132 "For more info see ERRORs above...")
133 raise RuntimeError(err_msg)
137 def get_picture_dir(subdir):
138 res_dir = os.getenv("PARAVIS_TEST_PICS")
140 # Add username and current date to unify the directory
141 cur_user = getpass.getuser()
142 cur_date = date.today().strftime("%Y%m%d")
143 res_dir = tempfile.gettempdir() + \
144 "/pic_" + cur_user + \
146 # Add subdirectory for the case to the directory path
147 res_dir += "/" + subdir
148 # Create the directory if doesn't exist
149 res_dir = os.path.normpath(res_dir)
150 if not os.path.exists(res_dir):
153 # Clean the directory
154 for root, dirs, files in os.walk(res_dir):
156 os.remove(os.path.join(root, f))
161 def call_and_check(prs, property_name, value, do_raise=1, compare_toler=-1.0):
162 """Utility function for 3D viewer test for common check of different
163 types of presentation parameters set"""
164 if property_name == 'Representation':
165 if value in prs.GetProperty('RepresentationTypesInfo'):
166 prs.SetPropertyWithName(property_name, value)
169 error_string = (str(value) + " value of " + property_name + " is not available for this type of presentations")
172 prs.SetPropertyWithName(property_name, value)
174 error_string = (str(value) + "value of " + property_name + " is not available for this type of presentations")
177 is_good = (error_string is None)
180 raise RuntimeError(error_string)
184 # compare just set value and the one got from presentation
185 really_set_value = prs.GetPropertyValue(property_name)
187 if compare_toler > 0:
188 is_equal = (fabs(really_set_value - value) < compare_toler)
190 is_equal = (really_set_value == value)
192 msg = str(really_set_value) + " has been set instead"
194 raise RuntimeError(msg)
202 def compare_lists(value, et_value, check_error=0, eps=1e-04):
204 Compare two lists: the same length and equality of corresponding items
205 param value - list to be compared
206 param et_value - etalon list
207 param check_error - flag to catch exception if errors>0
208 check_error=0 no exception, check_error !=0 catch exception
209 param eps - defines tolerance for comparison
210 return error - number of errors
215 et_length = len(et_value)
216 if length != et_length:
217 print "ERROR!!! There is different number of items in created ", length, " and etalon ", et_length, " lists!!!"
220 for i in range(et_length):
221 if abs(et_value[i]) > 1:
222 MAX = abs(eps*et_value[i])
225 if abs(et_value[i] - value[i])> MAX:
226 print "ERROR!!!", i, "-th item", value[i], " is not equal to etalon item", et_value[i], "!!!"
228 if check_error and error > 0:
229 raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..."
233 def setShaded(view, shading):
234 """Utility function to set shaded mode in view"""
236 view.LightDiffuseColor = [1, 1, 1]
238 view.LightDiffuseColor = [0, 0, 0]
241 def TimeStampId(proxy):
242 """Return tuple for the given MED proxy: (mesh_name, {field_name: [entity, timestamp_id]})
243 Originally defined in KERNEL_TEST/Tools/CommonFunctions file.
246 mesh_name = presentations.get_mesh_full_names(proxy).pop()
249 # get list of field names
250 all_fields = proxy.GetProperty("FieldsTreeInfo")[::2]
253 timestamps = proxy.TimestepValues.GetData()
254 timestamp_nb = len(timestamps)
256 for field in all_fields:
257 entity = presentations.get_field_entity(field)
258 field_short_name = presentations.get_field_short_name(field)
260 iterations[field_short_name] = [entity, timestamp_nb]
262 return mesh_name, iterations
265 def Import_Med_Field(paravis, file, field_names, check_errors=0, prs=[]):
266 """Builds presentations on the given fields of the MED file.
267 Originally defined in VISU_TEST/Grids/visu/ImportMedField/begin file.
270 paravis : PARAVIS instance
271 file_name : the full path to med file
272 field_names : the list of field names (for ex: ["pression","temperature","vitesse"])
273 prs : [[0,1,...], [], []]; empty list (sublist(s)) is ignored
279 5-VISU.TDEFORMEDSHAPE
283 9-VISU.TSCALARMAPONDEFORMEDSHAPE
291 # check the file accessibility
292 if not os.access(file, os.F_OK):
293 msg = "File " + file + " does not exist!!!"
294 raise RuntimeError, msg
297 paravis.ImportFile(file)
298 proxy = presentations.pvs.GetActiveSource()
300 raise RuntimeError, "ERROR!!! Can't import file!!!"
302 for i in range(len(field_names)):
303 print "Name of the field: ", field_names[i]
307 mesh_name, iterations = TimeStampId(proxy)
309 if iterations.has_key(field_names[i]):
310 entity = iterations[field_names[i]][0]
311 iteration = iterations[field_names[i]][1]
313 msg="There is no information about TimeStampId of the " + field_names[i] + " field!!!"
314 raise RuntimeError, msg
320 if presentations.GaussPointsOnField(proxy, entity, field_names[i], iteration) is None:
321 print "ERROR!!! Created GaussPoints presentation is None!!!"; nb_errors+=1
323 if presentations.ScalarMapOnField(proxy, entity, field_names[i], iteration) is None:
324 print "ERROR!!! Created ScalarMap presentation is None!!!"; nb_errors+=1
326 if presentations.IsoSurfacesOnField(proxy, entity, field_names[i], iteration) is None:
327 print "ERROR!!! Created IsoSurfaces presentation is None!!!"; nb_errors+=1
329 if presentations.CutPlanesOnField(proxy, entity, field_names[i], iteration) is None:
330 print "ERROR!!! Created CutPlanes presentation is None!!!"; nb_errors+=1
332 if presentations.CutLinesOnField(proxy, entity, field_names[i], iteration) is None:
333 print "ERROR!!! Created CutLines presentation is None!!!"; nb_errors+=1
335 if presentations.DeformedShapeOnField(proxy, entity, field_names[i], iteration) is None:
336 print "ERROR!!! Created DeformedShape presentation is None!!!"; nb_errors+=1
338 if presentations.VectorsOnField(proxy, entity, field_names[i], iteration) is None:
339 print "ERROR!!! Created Vectors presentation is None!!!"; nb_errors+=1
341 if presentations.StreamLinesOnField(proxy, entity, field_names[i], iteration) is None:
342 print "ERROR!!! Created StreamLines presentation is None!!!"; nb_errors+=1
344 if presentations.Plot3DOnField(proxy, entity, field_names[i], iteration) is None:
345 print "ERROR!!! Created Plot3D presentation is None!!!"; nb_errors+=1
347 if presentations.DeformedShapeAndScalarMapOnField(proxy, entity, field_names[i], iteration) is None:
348 print "ERROR!!! Created ScalarMapOnDeformedShape presentation is None!!!"; nb_errors+=1
350 # check if number of errors has increased
352 print "Presentation(s) creation...OK"
354 if nb_errors > 0 and check_errors:
355 raise RuntimeError, "There are some errors were occured!!! For more information see ERRORs above..."
359 def delete_with_inputs(obj):
360 """Deletes the given object with all its inputs"""
364 while obj_to_delete is not None:
365 tmp_obj = obj_to_delete
367 if hasattr(tmp_obj, 'Input'):
368 obj_to_delete = tmp_obj.Input
370 pvsimple.Delete(tmp_obj)
373 salome_session = SalomeSession()
375 session_server = salome.naming_service.Resolve('/Kernel/Session')
377 session_server.emitMessage("connect_to_study")
378 session_server.emitMessage("activate_viewer/ParaView")