From f284847a1f9ec2519639285396adf10a84903eea Mon Sep 17 00:00:00 2001 From: vsr Date: Thu, 29 Aug 2013 10:56:49 +0000 Subject: [PATCH] 0022071: EDF 2497 PARAVIS : Porting of VISU tests for PARAVIS --- src/PV_SWIG/presentations.py | 145 +++++++- test/VisuPrs/3D_viewer/B1.py | 54 +++ test/VisuPrs/3D_viewer/CMakeLists.txt | 1 + test/VisuPrs/Animation/A1.py | 111 +++++++ test/VisuPrs/Animation/CMakeLists.txt | 1 + test/VisuPrs/CMakeLists.txt | 27 +- test/VisuPrs/GaussPoints/C8.py | 59 ++++ test/VisuPrs/GaussPoints/C9.py | 59 ++++ test/VisuPrs/GaussPoints/CMakeLists.txt | 2 + test/VisuPrs/ImportMedField/A0.py | 30 ++ test/VisuPrs/ImportMedField/A1.py | 30 ++ test/VisuPrs/ImportMedField/A2.py | 30 ++ test/VisuPrs/ImportMedField/A3.py | 30 ++ test/VisuPrs/ImportMedField/A4.py | 30 ++ test/VisuPrs/ImportMedField/A5.py | 30 ++ test/VisuPrs/ImportMedField/A6.py | 30 ++ test/VisuPrs/ImportMedField/A7.py | 30 ++ test/VisuPrs/ImportMedField/A8.py | 30 ++ test/VisuPrs/ImportMedField/A9.py | 30 ++ test/VisuPrs/ImportMedField/B0.py | 30 ++ test/VisuPrs/ImportMedField/B1.py | 30 ++ test/VisuPrs/ImportMedField/B2.py | 30 ++ test/VisuPrs/ImportMedField/B3.py | 30 ++ test/VisuPrs/ImportMedField/B4.py | 30 ++ test/VisuPrs/ImportMedField/B5.py | 30 ++ test/VisuPrs/ImportMedField/B6.py | 30 ++ test/VisuPrs/ImportMedField/B7.py | 30 ++ test/VisuPrs/ImportMedField/B8.py | 30 ++ test/VisuPrs/ImportMedField/B9.py | 30 ++ test/VisuPrs/ImportMedField/C0.py | 30 ++ test/VisuPrs/ImportMedField/C1.py | 30 ++ test/VisuPrs/ImportMedField/C2.py | 30 ++ test/VisuPrs/ImportMedField/CMakeLists.txt | 50 +++ test/VisuPrs/SWIG_scripts/B4.py | 65 ++++ test/VisuPrs/SWIG_scripts/C6.py | 50 +++ test/VisuPrs/SWIG_scripts/C7.py | 1 - test/VisuPrs/SWIG_scripts/CMakeLists.txt | 2 + test/VisuPrs/ScalarMap/B3.py | 179 ++++++++++ test/VisuPrs/ScalarMap/CMakeLists.txt | 1 + test/VisuPrs/StreamLines/A0.py | 3 + test/VisuPrs/StreamLines/B3.py | 43 +++ test/VisuPrs/StreamLines/B4.py | 64 ++++ test/VisuPrs/StreamLines/CMakeLists.txt | 3 + test/VisuPrs/StreamLines/G0.py | 45 +++ test/VisuPrs/Util/paravistest.py | 170 +++++++++- test/VisuPrs/bugs/A0.py | 67 ++++ test/VisuPrs/bugs/A1.py | 61 ++++ test/VisuPrs/bugs/A2.py | 74 +++++ test/VisuPrs/bugs/A3.py | 51 +++ test/VisuPrs/bugs/A4.py | 42 +++ test/VisuPrs/bugs/A5.py | 50 +++ test/VisuPrs/bugs/A6.py | 59 ++++ test/VisuPrs/bugs/A7.py | 33 ++ test/VisuPrs/bugs/A9.py | 172 ++++++++++ test/VisuPrs/bugs/B1.py | 72 ++++ test/VisuPrs/bugs/C3.py | 62 ++++ test/VisuPrs/bugs/C4.py | 69 ++++ test/VisuPrs/bugs/C5.py | 158 +++++++++ test/VisuPrs/bugs/C6.py | 57 ++++ test/VisuPrs/bugs/C7.py | 66 ++++ test/VisuPrs/bugs/C8.py | 66 ++++ test/VisuPrs/bugs/C9.py | 57 ++++ test/VisuPrs/bugs/CMakeLists.txt | 51 +++ test/VisuPrs/bugs/D0.py | 73 ++++ test/VisuPrs/bugs/D1.py | 87 +++++ test/VisuPrs/bugs/D3.py | 70 ++++ test/VisuPrs/bugs/D5.py | 45 +++ test/VisuPrs/bugs/D6.py | 80 +++++ test/VisuPrs/bugs/D7.py | 62 ++++ test/VisuPrs/bugs/E0.py | 125 +++++++ test/VisuPrs/dump_study/A0.py | 157 +++++++++ test/VisuPrs/dump_study/A1.py | 166 ++++++++++ test/VisuPrs/dump_study/A2.py | 173 ++++++++++ test/VisuPrs/dump_study/A3.py | 176 ++++++++++ test/VisuPrs/dump_study/A4.py | 140 ++++++++ test/VisuPrs/dump_study/A5.py | 194 +++++++++++ test/VisuPrs/dump_study/A6.py | 176 ++++++++++ test/VisuPrs/dump_study/A7.py | 171 ++++++++++ test/VisuPrs/dump_study/A8.py | 200 +++++++++++ test/VisuPrs/dump_study/A9.py | 195 +++++++++++ test/VisuPrs/dump_study/B0.py | 84 +++++ test/VisuPrs/dump_study/B1.py | 72 ++++ test/VisuPrs/dump_study/B3.py | 95 ++++++ test/VisuPrs/dump_study/B4.py | 95 ++++++ test/VisuPrs/dump_study/B5.py | 66 ++++ test/VisuPrs/dump_study/CMakeLists.txt | 42 +++ test/VisuPrs/dump_study/test1.hdf | Bin 0 -> 922911 bytes test/VisuPrs/imps/A1.py | 115 +++++++ test/VisuPrs/imps/A2.py | 80 +++++ test/VisuPrs/imps/A3.py | 56 ++++ test/VisuPrs/imps/A4.py | 67 ++++ test/VisuPrs/imps/A6.py | 50 +++ test/VisuPrs/imps/A9.py | 40 +++ test/VisuPrs/imps/B1.py | 51 +++ test/VisuPrs/imps/B2.py | 60 ++++ test/VisuPrs/imps/CMakeLists.txt | 35 ++ test/VisuPrs/united/A1.py | 204 ++++++++++++ test/VisuPrs/united/A2.py | 122 +++++++ test/VisuPrs/united/A4.py | 366 +++++++++++++++++++++ test/VisuPrs/united/A5.py | 110 +++++++ test/VisuPrs/united/B0.py | 107 ++++++ test/VisuPrs/united/CMakeLists.txt | 32 ++ 102 files changed, 7317 insertions(+), 14 deletions(-) create mode 100644 test/VisuPrs/3D_viewer/B1.py create mode 100644 test/VisuPrs/Animation/A1.py create mode 100644 test/VisuPrs/GaussPoints/C8.py create mode 100644 test/VisuPrs/GaussPoints/C9.py create mode 100644 test/VisuPrs/ImportMedField/A0.py create mode 100644 test/VisuPrs/ImportMedField/A1.py create mode 100644 test/VisuPrs/ImportMedField/A2.py create mode 100644 test/VisuPrs/ImportMedField/A3.py create mode 100644 test/VisuPrs/ImportMedField/A4.py create mode 100644 test/VisuPrs/ImportMedField/A5.py create mode 100644 test/VisuPrs/ImportMedField/A6.py create mode 100644 test/VisuPrs/ImportMedField/A7.py create mode 100644 test/VisuPrs/ImportMedField/A8.py create mode 100644 test/VisuPrs/ImportMedField/A9.py create mode 100644 test/VisuPrs/ImportMedField/B0.py create mode 100644 test/VisuPrs/ImportMedField/B1.py create mode 100644 test/VisuPrs/ImportMedField/B2.py create mode 100644 test/VisuPrs/ImportMedField/B3.py create mode 100644 test/VisuPrs/ImportMedField/B4.py create mode 100644 test/VisuPrs/ImportMedField/B5.py create mode 100644 test/VisuPrs/ImportMedField/B6.py create mode 100644 test/VisuPrs/ImportMedField/B7.py create mode 100644 test/VisuPrs/ImportMedField/B8.py create mode 100644 test/VisuPrs/ImportMedField/B9.py create mode 100644 test/VisuPrs/ImportMedField/C0.py create mode 100644 test/VisuPrs/ImportMedField/C1.py create mode 100644 test/VisuPrs/ImportMedField/C2.py create mode 100644 test/VisuPrs/ImportMedField/CMakeLists.txt create mode 100644 test/VisuPrs/SWIG_scripts/B4.py create mode 100644 test/VisuPrs/SWIG_scripts/C6.py create mode 100644 test/VisuPrs/ScalarMap/B3.py create mode 100644 test/VisuPrs/StreamLines/B3.py create mode 100644 test/VisuPrs/StreamLines/B4.py create mode 100644 test/VisuPrs/StreamLines/G0.py create mode 100644 test/VisuPrs/bugs/A0.py create mode 100644 test/VisuPrs/bugs/A1.py create mode 100644 test/VisuPrs/bugs/A2.py create mode 100644 test/VisuPrs/bugs/A3.py create mode 100644 test/VisuPrs/bugs/A4.py create mode 100644 test/VisuPrs/bugs/A5.py create mode 100644 test/VisuPrs/bugs/A6.py create mode 100644 test/VisuPrs/bugs/A7.py create mode 100644 test/VisuPrs/bugs/A9.py create mode 100644 test/VisuPrs/bugs/B1.py create mode 100644 test/VisuPrs/bugs/C3.py create mode 100644 test/VisuPrs/bugs/C4.py create mode 100644 test/VisuPrs/bugs/C5.py create mode 100644 test/VisuPrs/bugs/C6.py create mode 100644 test/VisuPrs/bugs/C7.py create mode 100644 test/VisuPrs/bugs/C8.py create mode 100644 test/VisuPrs/bugs/C9.py create mode 100644 test/VisuPrs/bugs/CMakeLists.txt create mode 100644 test/VisuPrs/bugs/D0.py create mode 100644 test/VisuPrs/bugs/D1.py create mode 100644 test/VisuPrs/bugs/D3.py create mode 100644 test/VisuPrs/bugs/D5.py create mode 100644 test/VisuPrs/bugs/D6.py create mode 100644 test/VisuPrs/bugs/D7.py create mode 100644 test/VisuPrs/bugs/E0.py create mode 100644 test/VisuPrs/dump_study/A0.py create mode 100644 test/VisuPrs/dump_study/A1.py create mode 100644 test/VisuPrs/dump_study/A2.py create mode 100644 test/VisuPrs/dump_study/A3.py create mode 100644 test/VisuPrs/dump_study/A4.py create mode 100644 test/VisuPrs/dump_study/A5.py create mode 100644 test/VisuPrs/dump_study/A6.py create mode 100644 test/VisuPrs/dump_study/A7.py create mode 100644 test/VisuPrs/dump_study/A8.py create mode 100644 test/VisuPrs/dump_study/A9.py create mode 100644 test/VisuPrs/dump_study/B0.py create mode 100644 test/VisuPrs/dump_study/B1.py create mode 100644 test/VisuPrs/dump_study/B3.py create mode 100644 test/VisuPrs/dump_study/B4.py create mode 100644 test/VisuPrs/dump_study/B5.py create mode 100644 test/VisuPrs/dump_study/CMakeLists.txt create mode 100644 test/VisuPrs/dump_study/test1.hdf create mode 100644 test/VisuPrs/imps/A1.py create mode 100644 test/VisuPrs/imps/A2.py create mode 100644 test/VisuPrs/imps/A3.py create mode 100644 test/VisuPrs/imps/A4.py create mode 100644 test/VisuPrs/imps/A6.py create mode 100644 test/VisuPrs/imps/A9.py create mode 100644 test/VisuPrs/imps/B1.py create mode 100644 test/VisuPrs/imps/B2.py create mode 100644 test/VisuPrs/imps/CMakeLists.txt create mode 100644 test/VisuPrs/united/A1.py create mode 100644 test/VisuPrs/united/A2.py create mode 100644 test/VisuPrs/united/A4.py create mode 100644 test/VisuPrs/united/A5.py create mode 100644 test/VisuPrs/united/B0.py create mode 100644 test/VisuPrs/united/CMakeLists.txt diff --git a/src/PV_SWIG/presentations.py b/src/PV_SWIG/presentations.py index 4d6396c2..05b78de4 100644 --- a/src/PV_SWIG/presentations.py +++ b/src/PV_SWIG/presentations.py @@ -739,6 +739,9 @@ def select_cells_with_data(proxy, on_points=None, on_cells=None): types with data for even one field (from available) will be selected. """ + if not hasattr(proxy, 'Entity'): + return + #all_cell_types = proxy.CellTypes.Available all_cell_types = proxy.Entity.Available all_arrays = list(proxy.CellArrays.GetData()) @@ -981,7 +984,13 @@ def get_group_names(proxy, mesh_name, entity, wo_nogroups=False): def get_time(proxy, timestamp_nb): """Get time value by timestamp number.""" # Check timestamp number - timestamps = proxy.TimestepValues.GetData() + timestamps = [] + + if (hasattr(proxy, 'TimestepValues')): + timestamps = proxy.TimestepValues.GetData() + elif (hasattr(proxy.Input, 'TimestepValues')): + timestamps = proxy.Input.TimestepValues.GetData() + if ((timestamp_nb - 1) not in xrange(len(timestamps))): raise ValueError("Timestamp number is out of range: " + str(timestamp_nb)) @@ -2163,6 +2172,140 @@ def GaussPointsOnField(proxy, entity, field_name, return gausspnt +def GaussPointsOnField1(proxy, entity, field_name, + timestamp_nb, + is_colored=True, color=None, + primitive=GaussType.SPHERE, + is_proportional=True, + max_pixel_size=256, + multiplier=None, + vector_mode='Magnitude'): + """Creates Gauss Points on the given field. Use GaussPoints() Paraview interface. + + Arguments: + proxy: the pipeline object, containig data + entity: the field entity type from PrsTypeEnum + field_name: the field name + timestamp_nb: the number of time step (1, 2, ...) + is_colored -- defines whether the Gauss Points will be multicolored, + using the corresponding data values + color: defines the presentation color as [R, G, B] triple. Taken into + account only if is_colored is False. + primitive: primitive type from GaussType + is_proportional: if True, the size of primitives will depends on + the gauss point value + max_pixel_size: the maximum sizr of the Gauss Points primitive in pixels + multiplier: coefficient between data values and the size of primitives + If not passed by user, default scale will be computed. + vector_mode: the mode of transformation of vector values into + scalar values, applicable only if the field contains vector values. + Possible modes: 'Magnitude' - vector module; + 'X', 'Y', 'Z' - vector components. + + Returns: + Gauss Points as representation object. + + """ + # Get time value + time_value = get_time(proxy, timestamp_nb) + + # Set timestamp + pv.GetRenderView().ViewTime = time_value + proxy.UpdatePipeline(time=time_value) + + # Create Gauss Points object + source = pv.GaussPoints(proxy) + source.UpdatePipeline() + + # Get Gauss Points representation object + gausspnt = pv.GetRepresentation(source) + + # Get lookup table + entity_data_info = None + point_data_info = source.GetPointDataInformation() + if field_name in point_data_info.keys(): + entity_data_info = point_data_info + else: + entity_data_info = source.GetCellDataInformation() + nb_components = entity_data_info[field_name].GetNumberOfComponents() + + lookup_table = get_lookup_table(field_name, nb_components, vector_mode) + + # Set field range if necessary + data_range = get_data_range(proxy, entity, + field_name, vector_mode) + lookup_table.LockScalarRange = 1 + lookup_table.RGBPoints = [data_range[0], 0, 0, 1, data_range[1], 1, 0, 0] + + # Set display properties + if is_colored: + gausspnt.ColorAttributeType = EntityType.get_pvtype(entity) + gausspnt.ColorArrayName = field_name + else: + gausspnt.ColorArrayName = '' + if color: + gausspnt.DiffuseColor = color + + gausspnt.LookupTable = lookup_table + + # Add scalar bar + add_scalar_bar(field_name, nb_components, + vector_mode, lookup_table, time_value) + + # Set point sprite representation + gausspnt.Representation = 'Point Sprite' + + # Point sprite settings + gausspnt.InterpolateScalarsBeforeMapping = 0 + gausspnt.MaxPixelSize = max_pixel_size + + # Render mode + gausspnt.RenderMode = GaussType.get_mode(primitive) + + #if primitive == GaussType.SPRITE: + # Set texture + # TODO(MZN): replace with pvsimple high-level interface + # texture = sm.CreateProxy("textures", "SpriteTexture") + # alphamprop = texture.GetProperty("AlphaMethod") + # alphamprop.SetElement(0, 2) # Clamp + # alphatprop = texture.GetProperty("AlphaThreshold") + # alphatprop.SetElement(0, 63) + # maxprop = texture.GetProperty("Maximum") + # maxprop.SetElement(0, 255) + # texture.UpdateVTKObjects() + + # gausspnt.Texture = texture + #gausspnt.Texture.AlphaMethod = 'Clamp' + #gausspnt.Texture.AlphaThreshold = 63 + #gausspnt.Texture.Maximum= 255 + + # Proportional radius + gausspnt.RadiusUseScalarRange = 0 + gausspnt.RadiusIsProportional = 0 + + if is_proportional: + mult = multiplier + if mult is None: + mult = abs(0.1 / data_range[1]) + + gausspnt.RadiusScalarRange = data_range + gausspnt.RadiusTransferFunctionEnabled = 1 + gausspnt.RadiusMode = 'Scalar' + gausspnt.RadiusArray = ['POINTS', field_name] + if nb_components > 1: + v_comp = get_vector_component(vector_mode) + gausspnt.RadiusVectorComponent = v_comp + gausspnt.RadiusTransferFunctionMode = 'Table' + gausspnt.RadiusScalarRange = data_range + gausspnt.RadiusUseScalarRange = 1 + gausspnt.RadiusIsProportional = 1 + gausspnt.RadiusProportionalFactor = mult + else: + gausspnt.RadiusTransferFunctionEnabled = 0 + gausspnt.RadiusMode = 'Constant' + gausspnt.RadiusArray = ['POINTS', 'Constant Radius'] + + return gausspnt def StreamLinesOnField(proxy, entity, field_name, timestamp_nb, direction='BOTH', is_colored=False, color=None, diff --git a/test/VisuPrs/3D_viewer/B1.py b/test/VisuPrs/3D_viewer/B1.py new file mode 100644 index 00000000..7d55af22 --- /dev/null +++ b/test/VisuPrs/3D_viewer/B1.py @@ -0,0 +1,54 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/3D_viewer/B1 case + +from paravistest import * +from presentations import * +from pvsimple import * +import paravis + +import math + +# 1. First viewer creation +view1 = GetRenderView() + +# 2. Second viewer creation +view2 = CreateRenderView() + +# 3. Change view size +size1 = view1.ViewSize +size2 = view2.ViewSize + +w = size1[0] + size2[0] +w1 = math.trunc(w * 0.7) +w2 = w - w1 + +view1.ViewSize = [w1, size1[1]] +view2.ViewSize = [w2, size2[1]] + +# 4. Change view position +h = view1.ViewSize[1] +view1.ViewSize = [h//2, w] +view2.ViewSize = [h//2, w] +view1.ViewPosition = [0, h//2] +view1.ViewPosition = [0, 0] + +Render(view1) +Render(view2) diff --git a/test/VisuPrs/3D_viewer/CMakeLists.txt b/test/VisuPrs/3D_viewer/CMakeLists.txt index bad44ac0..69e7300d 100755 --- a/test/VisuPrs/3D_viewer/CMakeLists.txt +++ b/test/VisuPrs/3D_viewer/CMakeLists.txt @@ -29,6 +29,7 @@ IF (PYTHON_EXECUTABLE) A8 A9 B0 + B1 B2 ) SET(TIMEOUT 10000) diff --git a/test/VisuPrs/Animation/A1.py b/test/VisuPrs/Animation/A1.py new file mode 100644 index 00000000..2cd99116 --- /dev/null +++ b/test/VisuPrs/Animation/A1.py @@ -0,0 +1,111 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/animation/A1 case +# Test animation API + +import sys +import os +from paravistest import * +from presentations import * +from pvsimple import * +import paravis + +my_paravis = paravis.myParavis + +# 1. TimeStamps.med import +print 'Importing "TimeStamps.med"................', +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. CutLines creation +print "Creating Cut Lines........................", +med_field = "vitesse" +cutlines = CutLinesOnField(med_reader, EntityType.NODE, med_field, 1, + nb_lines = 20, + orientation1=Orientation.XY, orientation2=Orientation.ZX) +if cutlines is None: + print "FAILED" +else: + print "OK" + +# 3. Display CutLines +print "Getting a Viewer.........................", +view = GetRenderView() +if view is None: + print "FAILED" +else: + print "OK" +cutlines.Visibility = 1 +Render(view=view) +cutlines.Visibility = 0 +Render(view=view) +display_only(cutlines, view=view) +reset_view(view=view) + +# 4. Animation +print "Get Animation scene.....................", +scene = GetAnimationScene() +if scene is None: + print "FAILED" +else: + print "OK" + +print "Duration default... ", scene.Duration +scene.Duration = -10 +scene.Duration = 120 +scene.Duration = 0 +scene.Duration = 30 +print "Duration ... ", scene.Duration + +print "Loop ... ", scene.Loop +scene.Loop = 1 +print "Loop ... ", scene.Loop +scene.Loop = 0 +print "Loop ... ", scene.Loop + +print "AnimationTime ... ", scene.AnimationTime + +scene.Play() + +scene.GoToFirst() +scene.GoToNext() +scene.GoToNext() + +print "AnimationTime ... ", scene.AnimationTime + +scene.GoToPrevious() +scene.GoToLast() + +scene.Stop() + +print "AnimationTime ... ", scene.AnimationTime + +scene.AnimationTime = -1 +scene.AnimationTime = scene.TimeKeeper.TimestepValues[1] +scene.AnimationTime = scene.TimeKeeper.TimestepValues[0] + +nb_frames = scene.NumberOfFrames +print "NumberOfFrames ... ", nb_frames + diff --git a/test/VisuPrs/Animation/CMakeLists.txt b/test/VisuPrs/Animation/CMakeLists.txt index 1f08bea6..2cfa9fc7 100755 --- a/test/VisuPrs/Animation/CMakeLists.txt +++ b/test/VisuPrs/Animation/CMakeLists.txt @@ -20,6 +20,7 @@ IF (PYTHON_EXECUTABLE) FOREACH ( tfile A0 + A1 A2 A4 A7 diff --git a/test/VisuPrs/CMakeLists.txt b/test/VisuPrs/CMakeLists.txt index 36d3a15f..228d3c06 100644 --- a/test/VisuPrs/CMakeLists.txt +++ b/test/VisuPrs/CMakeLists.txt @@ -19,19 +19,24 @@ SUBDIRS(Util 2D_viewer - 3D_viewer - ScalarMap - DeformedShape - ScalarMap_On_DeformedShape - CutPlanes - CutLines - Vectors + 3D_viewer + ScalarMap + DeformedShape + ScalarMap_On_DeformedShape + CutPlanes + CutLines + Vectors Plot3D IsoSurfaces MeshPresentation Animation - GaussPoints - StreamLines - SWIG_scripts - Tables + GaussPoints + StreamLines + SWIG_scripts + Tables + ImportMedField + united + bugs + imps + dump_study ) diff --git a/test/VisuPrs/GaussPoints/C8.py b/test/VisuPrs/GaussPoints/C8.py new file mode 100644 index 00000000..a804bffd --- /dev/null +++ b/test/VisuPrs/GaussPoints/C8.py @@ -0,0 +1,59 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/GaussPoints/C8 case +# Create Gauss Points on the field of the MED file + +import os +import sys + +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + + +# Directory for saving snapshots +picturedir = get_picture_dir(sys.argv[1], "GaussPoints/C8") +if not picturedir.endswith(os.sep): + picturedir += os.sep + +# MED file +file_name = datadir + "ir.resu.med" +field_name = "gravit_VARI_ELGA" +timestamp_nb = 1 + +paravis.myParavis.ImportFile(file_name) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + raise RuntimeError("File wasn't imported!!!") + +pvsimple.Show() + +# Create Gauss Points presentation +view = pvsimple.GetRenderView() +time = get_time(med_reader, timestamp_nb) + +prs = GaussPointsOnField1(med_reader, EntityType.CELL, field_name, timestamp_nb) +if prs is None: + raise RuntimeError, "Created presentation is None!!!" + +# Display presentation and get snapshot +pic_name = picturedir + field_name + "_" + str(time) + "_GAUSSPOINTS." + pictureext +process_prs_for_test(prs, view, pic_name) diff --git a/test/VisuPrs/GaussPoints/C9.py b/test/VisuPrs/GaussPoints/C9.py new file mode 100644 index 00000000..61d2e0f2 --- /dev/null +++ b/test/VisuPrs/GaussPoints/C9.py @@ -0,0 +1,59 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/GaussPoints/C9 case +# Create Gauss Points on the field of the MED file + +import os +import sys + +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + + +# Directory for saving snapshots +picturedir = get_picture_dir(sys.argv[1], "GaussPoints/C9") +if not picturedir.endswith(os.sep): + picturedir += os.sep + +# MED file +file_name = datadir + "petit.rmed" +field_name = "RESPIL_SIEF_ELGA" +timestamp_nb = 1 + +paravis.myParavis.ImportFile(file_name) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + raise RuntimeError("File wasn't imported!!!") + +# Create Gauss Points presentation +view = pvsimple.GetRenderView() +time = get_time(med_reader, timestamp_nb) + +prs = GaussPointsOnField1(med_reader, EntityType.CELL, field_name, timestamp_nb, multiplier=4E-9) +if prs is None: + raise RuntimeError, "Created presentation is None!!!" + +# Display presentation and get snapshot +pic_name = picturedir + field_name + "_" + str(time) + "_GAUSSPOINTS." + pictureext +process_prs_for_test(prs, view, pic_name) + + diff --git a/test/VisuPrs/GaussPoints/CMakeLists.txt b/test/VisuPrs/GaussPoints/CMakeLists.txt index d1a3a233..4106a908 100644 --- a/test/VisuPrs/GaussPoints/CMakeLists.txt +++ b/test/VisuPrs/GaussPoints/CMakeLists.txt @@ -46,6 +46,8 @@ IF (PYTHON_EXECUTABLE) C5 C6 C7 + C8 + C9 ) SET(TIMEOUT 10000) ADD_TEST(GAUSSPOINTS_${tfile} ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/test/VisuPrs/Util/paravistesthelper.py ${TIMEOUT} ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}.py) diff --git a/test/VisuPrs/ImportMedField/A0.py b/test/VisuPrs/ImportMedField/A0.py new file mode 100644 index 00000000..0daa5079 --- /dev/null +++ b/test/VisuPrs/ImportMedField/A0.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A0 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "ResOK_0000.med" +field_names = ["temperature", "vitesse", "pression"] +prs_list = [ [1,2,3,4,8], range(1,10), [0,1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A1.py b/test/VisuPrs/ImportMedField/A1.py new file mode 100644 index 00000000..3b642eff --- /dev/null +++ b/test/VisuPrs/ImportMedField/A1.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A1 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "TimeStamps.med" +field_names = ["pression", "temperature", "vitesse"] +prs_list = [ [0,1,2,3,4,8], [1,2,3,4,8], range(1,10) ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A2.py b/test/VisuPrs/ImportMedField/A2.py new file mode 100644 index 00000000..9360c309 --- /dev/null +++ b/test/VisuPrs/ImportMedField/A2.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A2 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "carre_en_quad4_import22.med" +field_names = ["fieldcelldouble", "fieldnodedouble", "fieldnodedouble", "fieldnodedouble", "fieldnodeint"] +prs_list = [ range(10), [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A3.py b/test/VisuPrs/ImportMedField/A3.py new file mode 100644 index 00000000..3bc1b044 --- /dev/null +++ b/test/VisuPrs/ImportMedField/A3.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A3 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "carre_en_quad4_seg2.med" +field_names = ["fieldcelldouble", "fieldnodedouble", "fieldnodedouble", "fieldnodedouble", "fieldnodeint"] +prs_list = [ range(10), [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A4.py b/test/VisuPrs/ImportMedField/A4.py new file mode 100644 index 00000000..dd2c77ce --- /dev/null +++ b/test/VisuPrs/ImportMedField/A4.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A4 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "test_hydro_darcy1a_out.med" +field_names = ["DarcyVelocity","Head"] +prs_list = [ range(10), [0,1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A5.py b/test/VisuPrs/ImportMedField/A5.py new file mode 100644 index 00000000..3b2bbea7 --- /dev/null +++ b/test/VisuPrs/ImportMedField/A5.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A5 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "clo2.med" +field_names = ["PRESSION", "TAUX_DE_VIDE", "VITESSE"] +prs_list = [ [0,1,2,3,4,8], [1,2,3,4,8], range(1,10) ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A6.py b/test/VisuPrs/ImportMedField/A6.py new file mode 100644 index 00000000..41e8a13f --- /dev/null +++ b/test/VisuPrs/ImportMedField/A6.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A6 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "cube_hexa8_import22.med" +field_names = ["fieldcelldouble", "fieldnodedouble", "fieldnodedouble", "fieldnodedouble", "fieldnodeint"] +prs_list = [ range(10), [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A7.py b/test/VisuPrs/ImportMedField/A7.py new file mode 100644 index 00000000..5f1857be --- /dev/null +++ b/test/VisuPrs/ImportMedField/A7.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A7 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "cube_hexa8_quad4_import22.med" +field_names = ["fieldcelldouble", "fieldnodedouble", "fieldnodedouble", "fieldnodedouble", "fieldnodeint"] +prs_list = [ range(10), [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A8.py b/test/VisuPrs/ImportMedField/A8.py new file mode 100644 index 00000000..3667eac4 --- /dev/null +++ b/test/VisuPrs/ImportMedField/A8.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A8 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "fra1.med" +field_names = ["TAUX_DE_VIDE", "VITESSE"] +prs_list = [ [1,2,3,4,8], range(1,10) ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/A9.py b/test/VisuPrs/ImportMedField/A9.py new file mode 100644 index 00000000..89dc9bc1 --- /dev/null +++ b/test/VisuPrs/ImportMedField/A9.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/A9 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "maill.0.med" +field_names = ["REQT_GD_________________________", "RESUTRQUDEPL____________________", "RESUTRQUERRE_ELGA_NORE__________", "RESUTRQUSIEF_ELGA_DEPL__________", "RESUTRQUSIGM_ELNO_DEPL__________"] +prs_list = [ range(1,10), range(1,10), range(10), range(10), range(10)]) + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B0.py b/test/VisuPrs/ImportMedField/B0.py new file mode 100644 index 00000000..6cb8bdfb --- /dev/null +++ b/test/VisuPrs/ImportMedField/B0.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B0 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "maill.0_volumes.med" +field_names = ["RETH____FLUX_NOEU_TEMP__________", "RETH____TEMP____________________"] +prs_list = [ range(1,10), [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B1.py b/test/VisuPrs/ImportMedField/B1.py new file mode 100644 index 00000000..1a1d6229 --- /dev/null +++ b/test/VisuPrs/ImportMedField/B1.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B1 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "maill.1.med" +field_names = ["RETH____FLUX_NOEU_TEMP__________", "RETH____TEMP____________________"] +prs_list = [ range(1,10), [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B2.py b/test/VisuPrs/ImportMedField/B2.py new file mode 100644 index 00000000..190c64bb --- /dev/null +++ b/test/VisuPrs/ImportMedField/B2.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B2 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "maill.2.med" +field_names = ["RETH____FLUX_NOEU_TEMP__________","RETH____TEMP____________________"] +prs_list = [ range(1,10), [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B3.py b/test/VisuPrs/ImportMedField/B3.py new file mode 100644 index 00000000..9bb96df4 --- /dev/null +++ b/test/VisuPrs/ImportMedField/B3.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B3 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "zzzz121b.med" +field_names = ["RESUZERODEPL____________________", "RESUZEROERRE_ELGA_NORE__________", "RESUZEROSIEF_ELGA_DEPL__________", "RESUZEROSIGM_ELNO_DEPL__________"] +prs_list = [ [0,1,5,6,7], [0,1,5,6,7], [0,1,5,6,7], [0,1,5,6,7,9] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B4.py b/test/VisuPrs/ImportMedField/B4.py new file mode 100644 index 00000000..233e8ab4 --- /dev/null +++ b/test/VisuPrs/ImportMedField/B4.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B4 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "pointe_4fields.med" +field_names = ["fieldcelldoublescalar", "fieldcelldoublevector", "fieldnodedouble", "fieldnodedouble", "fieldnodedouble", "fieldnodeint"] +prs_list = [ [0,1,2,3,4,8], range(10), [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B5.py b/test/VisuPrs/ImportMedField/B5.py new file mode 100644 index 00000000..b33f1ca4 --- /dev/null +++ b/test/VisuPrs/ImportMedField/B5.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B5 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "pointe.med" +field_names = ["fieldcelldoublescalar", "fieldcelldoublevector", "fieldnodedouble", "fieldnodedouble", "fieldnodedouble", "fieldnodeint"] +prs_list = [ [0,1,2,3,4,8], range(10), [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8], [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B6.py b/test/VisuPrs/ImportMedField/B6.py new file mode 100644 index 00000000..5817714b --- /dev/null +++ b/test/VisuPrs/ImportMedField/B6.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B6 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "polygones.med" +field_names = ["bord_:_distorsion","bord_:_familles","bord_:_non-ortho"] +prs_list = [ [0,1,2,3,4,8], [0,1,2,3,4,8], [0,1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B7.py b/test/VisuPrs/ImportMedField/B7.py new file mode 100644 index 00000000..6e384bfb --- /dev/null +++ b/test/VisuPrs/ImportMedField/B7.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B7 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "recoll_bord.med" +field_names = ["bord_:_distorsion","bord_:_familles","bord_:_non-ortho"] +prs_list = [ [0,1,2,3,4,8], [0,1,2,3,4,8], [0,1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B8.py b/test/VisuPrs/ImportMedField/B8.py new file mode 100644 index 00000000..74731182 --- /dev/null +++ b/test/VisuPrs/ImportMedField/B8.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B8 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "resu.2.med" +field_names = ["RETH____FLUX_NOEU_TEMP__________","RETH____TEMP____________________"] +prs_list = [ range(1,10), [1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/B9.py b/test/VisuPrs/ImportMedField/B9.py new file mode 100644 index 00000000..79ab782f --- /dev/null +++ b/test/VisuPrs/ImportMedField/B9.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/B9 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "test_2D.med" +field_names = ["champ","field_v","field_v_p"] +prs_list = [ [0,1,2,3,4,8], [0,1,2,3,4,8], [0,1,2,3,4,8] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/C0.py b/test/VisuPrs/ImportMedField/C0.py new file mode 100644 index 00000000..49b69dc1 --- /dev/null +++ b/test/VisuPrs/ImportMedField/C0.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/C0 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "homard_ASTER_OSF_MEDV2.1.5_1_v2.1.med" +field_names = ["REMEZEROERRE_ELGA_NORE__________", "RETHZEROTEMP____________________"] +prs_list = [ [0,1], [1] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/C1.py b/test/VisuPrs/ImportMedField/C1.py new file mode 100644 index 00000000..1e8b3ff2 --- /dev/null +++ b/test/VisuPrs/ImportMedField/C1.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/C1 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "homard_ASTER_OSF_MEDV2.1.5_1.med2.2.med" +field_names = ["REMEUN__ERRE_ELGA_NORE__________", "RETHUN__TEMP____________________"] +prs_list = [ [0,1], [1] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/C2.py b/test/VisuPrs/ImportMedField/C2.py new file mode 100644 index 00000000..d6e26e91 --- /dev/null +++ b/test/VisuPrs/ImportMedField/C2.py @@ -0,0 +1,30 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ImportMedField/C2 case +# Import MED file; create presentations for the given fields. + +from paravistest import datadir, Import_Med_Field +import paravis + +med_file = datadir + "homard_ASTER_OSF_MEDV2.1.5_1.med2.3.med" +field_names = ["REMEZEROERRE_ELGA_NORE__________", "RETHZEROTEMP____________________"] +prs_list = [ [0,1], [1] ] + +Import_Med_Field(paravis.myParavis, med_file, field_names, 1, prs_list) diff --git a/test/VisuPrs/ImportMedField/CMakeLists.txt b/test/VisuPrs/ImportMedField/CMakeLists.txt new file mode 100644 index 00000000..02242051 --- /dev/null +++ b/test/VisuPrs/ImportMedField/CMakeLists.txt @@ -0,0 +1,50 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +IF (PYTHON_EXECUTABLE) + FOREACH ( tfile + A0 + A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + B0 + B1 + B2 + B3 + B4 + B5 + B6 + B7 + B8 + B9 + C0 + C1 + C2 + ) + SET(TIMEOUT 10000) + ADD_TEST(IMPORTMEDFIELD_${tfile} ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/test/VisuPrs/Util/paravistesthelper.py ${TIMEOUT} ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}.py ${PARAVIS_TEST_OUTPUT_DIR}) + SET_TESTS_PROPERTIES(IMPORTMEDFIELD_${tfile} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED" TIMEOUT ${TIMEOUT}) + ENDFOREACH( tfile ) +ENDIF (PYTHON_EXECUTABLE) diff --git a/test/VisuPrs/SWIG_scripts/B4.py b/test/VisuPrs/SWIG_scripts/B4.py new file mode 100644 index 00000000..78caf05e --- /dev/null +++ b/test/VisuPrs/SWIG_scripts/B4.py @@ -0,0 +1,65 @@ + +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/SWIG_scripts/B4 case + +import sys +import os + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# Import MED file +med_file_path = datadir + "pointe.med" +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "MED file was not imported successfully." + +# Create presentations +try: + if os.access(med_file_path, os.R_OK) : + if os.access(med_file_path, os.W_OK) : + mesh_name = "maa1" + entity = EntityType.NODE + field_name = "fieldnodedouble" + timestamp_id = 1 + + scalarmap = ScalarMapOnField(med_reader, entity, field_name, timestamp_id) + if get_nb_components(med_reader, entity, field_name) > 1: + vectors = VectorsOnField(med_reader, entity, field_name, timestamp_id) + cutplanes = CutPlanesOnField(med_reader, entity, field_name, timestamp_id) + + mesh = MeshOnEntity(med_reader, mesh_name, entity) + else: + print "We have no permission to rewrite medFile" + else: + print "We have no permission to read medFile, it will not be opened"; +except: + print sys.exc_type + print sys.exc_value + print sys.exc_traceback + + diff --git a/test/VisuPrs/SWIG_scripts/C6.py b/test/VisuPrs/SWIG_scripts/C6.py new file mode 100644 index 00000000..4aaa1104 --- /dev/null +++ b/test/VisuPrs/SWIG_scripts/C6.py @@ -0,0 +1,50 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/SWIG_scripts/C6 case +# Import a table from file and show it in 2D viewer + +from paravistest import tablesdir +from presentations import * +import paravis +import pvsimple + + +# 1. Import tables from file +file_path = tablesdir + "tables_test.xls" +table_reader = pvsimple.TableReader(FileName=file_path) +if table_reader is None: + print "FAILED to import tables from tables_test.xls file." + +# 2. Create curves viewer +cur_view = pvsimple.GetRenderView() +if cur_view: + pvsimple.Delete(cur_view) +xy_view = pvsimple.CreateXYPlotView() + +# 3. Display curves in the viewer +table_reader.TableNumber = 1 +xy_rep = pvsimple.Show(table_reader) +xy_rep.AttributeType = 'Row Data' +xy_rep.UseIndexForXAxis = 0 +xy_rep.XArrayName = 'toto 1 [s]' +xy_rep.SeriesVisibility = [xy_rep.XArrayName, '0'] +xy_rep.SeriesVisibility = ['vtkOriginalIndices', '0'] +pvsimple.Render(xy_view) + diff --git a/test/VisuPrs/SWIG_scripts/C7.py b/test/VisuPrs/SWIG_scripts/C7.py index 58a8da9e..7a074db8 100755 --- a/test/VisuPrs/SWIG_scripts/C7.py +++ b/test/VisuPrs/SWIG_scripts/C7.py @@ -108,7 +108,6 @@ add_scalar_bar(table_name, nb_components, vector_mode, # Reset view reset_view(view=view) - # Write image # Directory for saving snapshots diff --git a/test/VisuPrs/SWIG_scripts/CMakeLists.txt b/test/VisuPrs/SWIG_scripts/CMakeLists.txt index e6b44824..5163b64f 100644 --- a/test/VisuPrs/SWIG_scripts/CMakeLists.txt +++ b/test/VisuPrs/SWIG_scripts/CMakeLists.txt @@ -29,12 +29,14 @@ IF (PYTHON_EXECUTABLE) A9 B0 B1 + B4 B5 B6 B7 B8 B9 C3 + C6 C7 ) SET(TIMEOUT 10000) diff --git a/test/VisuPrs/ScalarMap/B3.py b/test/VisuPrs/ScalarMap/B3.py new file mode 100644 index 00000000..99d1fec1 --- /dev/null +++ b/test/VisuPrs/ScalarMap/B3.py @@ -0,0 +1,179 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/ScalarMap/B3 case +# Test ScalarMap interface methods. + +from paravistest import datadir +import presentations +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file + +print 'Importing "fra.med"...', +file_path = datadir + "fra.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Create ScalarMap +field_name = 'TAUX_DE_VIDE' +entity = presentations.EntityType.NODE +myMeshName='LE VOLUME' + +scalarmap = presentations.ScalarMapOnField(med_reader, entity, field_name, 1) +if scalarmap is None: + print "FAILED" + +# 3. Scalar mode +lookup_table = scalarmap.LookupTable +print "Vector mode .....", lookup_table.VectorMode +print "Vector component .....", lookup_table.VectorComponent + +lookup_table.VectorMode = 'Component' +lookup_table.VectorComponent = 0 + +scalarmap.LookupTable = lookup_table + +print "Vector mode .....", scalarmap.LookupTable.VectorMode +print "Vector component .....", scalarmap.LookupTable.VectorComponent + +# 4. Scaling mode +scalarmap.LookupTable.UseLogScale = 1 +print "Use logarithmic scaling ....", scalarmap.LookupTable.UseLogScale + +scalarmap.LookupTable.UseLogScale = 0 +print "Use logarithmic scaling ....", scalarmap.LookupTable.UseLogScale + +# 5. Scalar range +print "Set scalar range min=12 < max=120 ...", +rmin = 12 +rmax = 120 +scalarmap.LookupTable.RGBPoints[0] = rmin +scalarmap.LookupTable.RGBPoints[4] = rmax +print "min = ", scalarmap.LookupTable.RGBPoints[0]," : max = ",scalarmap.LookupTable.RGBPoints[4] + +print "Set scalar range min=max=12 ...", +rmin = 120 +rmax = rmin +scalarmap.LookupTable.RGBPoints[0] = rmin +scalarmap.LookupTable.RGBPoints[4] = rmax +print "min = ", scalarmap.LookupTable.RGBPoints[0]," : max = ",scalarmap.LookupTable.RGBPoints[4] + +print "Set scalar range min=120 > max=15 ...", +rmin = 120 +rmax = 15 +scalarmap.LookupTable.RGBPoints[0] = rmin +scalarmap.LookupTable.RGBPoints[4] = rmax +print "min = ", scalarmap.LookupTable.RGBPoints[0]," : max = ",scalarmap.LookupTable.RGBPoints[4] + +# 6. Bar orientation +bar = presentations.get_bar() + +print "Set bar orientation = 'Horizontal'" +bar.Orientation = 'Horizontal' +print "Bar orientation ....", bar.Orientation + +print "Set bar orientation = 'Vertical'" +bar.Orientation = 'Vertical' +print "Bar orientation ....", bar.Orientation + +# 7. Position of scalar bar +print "Default position ....", bar.Position + +print "Set left down corner position" +bar.Position = [0, 0] +print "Position =", bar.Position + +print "Set position outside of the screen" +bar.Position = [-1, -1] +print "Position =", bar.Position + +# 8. Size of scalar bar +print "Default Height=", bar.Position2[1]," : Width=", bar.Position2[0] + +print "Set positive Height and Width" +h = 0.4 +w = 0.2 +bar.Position2 = [w, h] +print "Size =", bar.Position2 + +print "Set negative Height and Width" +h = -0.4 +w = -0.2 +bar.Position2 = [w, h] +print "Size =", bar.Position2 + +# 9. Number of colors +print "Default number of colors = ", scalarmap.LookupTable.NumberOfTableValues + +scalarmap.LookupTable.Discretize = 1 + +print "Set negative number of colors" +nb_colors = -128 +scalarmap.LookupTable.NumberOfTableValues = nb_colors +print "Number of colors =", scalarmap.LookupTable.NumberOfTableValues + +print "Set zero number of colors" +nb_colors = 0 +scalarmap.LookupTable.NumberOfTableValues = nb_colors +print "Number of colors =", scalarmap.LookupTable.NumberOfTableValues + +print "Set positive number of colors" +nb_colors = 256 +scalarmap.LookupTable.NumberOfTableValues = nb_colors +print "Number of colors =", scalarmap.LookupTable.NumberOfTableValues + +# 10. Number of labels +print "Default number of labels = ", bar.NumberOfLabels + +print "Set negative number of labels" +nb_labels = -10 +bar.NumberOfLabels = nb_labels +print "Number of labels=", bar.NumberOfLabels + +print "Set zero number of labels" +nb_labels = 0 +bar.NumberOfLabels = nb_labels +print "Number of labels=", bar.NumberOfLabels + +print "Set positive number of labels" +nb_labels = 10 +bar.NumberOfLabels = nb_labels +print "Number of labels=", bar.NumberOfLabels + +# 11. Scalar bar title +print 'Default Title ="', bar.Title, '"' + +print "Set not null title" +title = "Scalar Bar Title" +bar.Title = title +print ' Title ="', bar.Title, '"' + +print "Set title from spaces" +title=' ' +bar.Title = title +print ' Title ="', bar.Title, '"' diff --git a/test/VisuPrs/ScalarMap/CMakeLists.txt b/test/VisuPrs/ScalarMap/CMakeLists.txt index 2771ac98..ef5ae263 100644 --- a/test/VisuPrs/ScalarMap/CMakeLists.txt +++ b/test/VisuPrs/ScalarMap/CMakeLists.txt @@ -32,6 +32,7 @@ IF (PYTHON_EXECUTABLE) B0 B1 B2 + B3 E0 E1 E2 diff --git a/test/VisuPrs/StreamLines/A0.py b/test/VisuPrs/StreamLines/A0.py index 90241486..d04af640 100644 --- a/test/VisuPrs/StreamLines/A0.py +++ b/test/VisuPrs/StreamLines/A0.py @@ -39,3 +39,6 @@ print "file ", file print " --------------------------------- " print "\nCreatePrsForFile..." CreatePrsForFile(myParavis, file, [PrsTypeEnum.STREAMLINES], picturedir, pictureext) + +import time +time.sleep(10000) diff --git a/test/VisuPrs/StreamLines/B3.py b/test/VisuPrs/StreamLines/B3.py new file mode 100644 index 00000000..6c281274 --- /dev/null +++ b/test/VisuPrs/StreamLines/B3.py @@ -0,0 +1,43 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/StreamLines/B3 case +# Create Stream Lines for all fields of each MED file from the given MED files list + +import sys + +from paravistest import datadir, pictureext, get_picture_dir +from presentations import CreatePrsForFile, PrsTypeEnum +import paravis + +myParavis = paravis.myParavis + +# Directory for saving snapshots +picturedir = get_picture_dir(sys.argv[1], "StreamLines/B3") + +# Create presentations +files = ["fra", "TimeStamps", "pointe", "Fields_group3D", "Hexa8", "Penta6", "Quad4", "Tetra4", "Tria3", "clo", "carre_en_quad4_seg2", "carre_en_quad4_seg2_fields", "cube_hexa8_quad4"] + +for item in files: + file = datadir + item + ".med" + print " --------------------------------- " + print "file ", file + print "\nCreatePrsForFile..." + print "BREAKPOINT_1" + CreatePrsForFile(myParavis, file, [PrsTypeEnum.STREAMLINES], picturedir, pictureext) diff --git a/test/VisuPrs/StreamLines/B4.py b/test/VisuPrs/StreamLines/B4.py new file mode 100644 index 00000000..d19ac2c2 --- /dev/null +++ b/test/VisuPrs/StreamLines/B4.py @@ -0,0 +1,64 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/StreamLines/B4 case +# StreamTracer filter properties + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +print 'Import "ResOK_0000.med"...............', +file_path = datadir + "ResOK_0000.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Creating StreamLines +print "Creating Stream Lines.....", +streamlines = StreamLinesOnField(med_reader, EntityType.NODE, 'vitesse', 1) +if streamlines is None: + print "FAILED" +else: + print "OK" + +# 3. StreamLines parameters +stream_tracer = pvsimple.GetActiveSource() + +print "Initial Step Length: ", stream_tracer.InitialStepLength +print "Integration Direction: ", stream_tracer.IntegrationDirection +print "Integration Step Unit: ", stream_tracer.IntegrationStepUnit +print "Integrator Type: ", stream_tracer.IntegratorType +print "Interpolator Type: ", stream_tracer.InterpolatorType +print "Maximum Error: ", stream_tracer.MaximumError +print "Minimum Step Length: ", stream_tracer.MinimumStepLength +print "Maximum Step Length: ", stream_tracer.MaximumStepLength +print "Maximum Steps: ", stream_tracer.MaximumSteps +print "Maximum Streamline Length: ", stream_tracer.MaximumStreamlineLength +print "Seed Type: ", type(stream_tracer.SeedType) +print "Center: ", stream_tracer.SeedType.Center +print "Number Of Points: ", stream_tracer.SeedType.NumberOfPoints +print "Radius: ", stream_tracer.SeedType.Radius diff --git a/test/VisuPrs/StreamLines/CMakeLists.txt b/test/VisuPrs/StreamLines/CMakeLists.txt index 6aac5b9a..af4fdc7a 100644 --- a/test/VisuPrs/StreamLines/CMakeLists.txt +++ b/test/VisuPrs/StreamLines/CMakeLists.txt @@ -32,6 +32,8 @@ IF (PYTHON_EXECUTABLE) B0 B1 B2 + B3 + B4 E0 E1 E2 @@ -51,6 +53,7 @@ IF (PYTHON_EXECUTABLE) F7 F8 F9 + G0 ) SET(TIMEOUT 10000) ADD_TEST(STREAMLINES_${tfile} ${PYTHON_EXECUTABLE} ${PROJECT_SOURCE_DIR}/test/VisuPrs/Util/paravistesthelper.py ${TIMEOUT} ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}.py) diff --git a/test/VisuPrs/StreamLines/G0.py b/test/VisuPrs/StreamLines/G0.py new file mode 100644 index 00000000..3afb9a48 --- /dev/null +++ b/test/VisuPrs/StreamLines/G0.py @@ -0,0 +1,45 @@ + +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/StreamLines/G0 case +# StreamTracer filter properties + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +file_path = datadir + "new_case.rmed" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + raise RuntimeError, "new_case.rmed was not imported!!!" + +# 2. Creation of a set of "StreamLines" presentations, based on time stamps of "RESU_DEPL" field +streamlines = StreamLinesOnField(med_reader, EntityType.NODE, 'RESU_DEPL', 1) +if streamlines is None: + raise RuntimeError, "Presentation is None!!!" + +import time +time.sleep(10000) + diff --git a/test/VisuPrs/Util/paravistest.py b/test/VisuPrs/Util/paravistest.py index 1665c2f2..eff246a5 100755 --- a/test/VisuPrs/Util/paravistest.py +++ b/test/VisuPrs/Util/paravistest.py @@ -31,6 +31,7 @@ from datetime import date import salome + # Auxiliary variables # Data directory @@ -42,7 +43,7 @@ if samples_dir is not None: datadir = samples_dir + "/MedFiles/" tablesdir = samples_dir + "/Tables/" -# Graphica files extension +# Graphics files extension pictureext = os.getenv("PIC_EXT") if pictureext == None: pictureext = "png" @@ -189,6 +190,37 @@ def call_and_check(prs, property_name, value, do_raise=1, compare_toler=-1.0): return is_good +def compare_lists(value, et_value, check_error=0, eps=1e-04): + """ + Compare two lists: the same length and equality of corresponding items + param value - list to be compared + param et_value - etalon list + param check_error - flag to catch exception if errors>0 + check_error=0 no exception, check_error !=0 catch exception + param eps - defines tolerance for comparison + return error - number of errors + """ + + error=0 + length = len(value) + et_length = len(et_value) + if length != et_length: + print "ERROR!!! There is different number of items in created ", length, " and etalon ", et_length, " lists!!!" + error=error+1 + else: + for i in range(et_length): + if abs(et_value[i]) > 1: + MAX = abs(eps*et_value[i]) + else: + MAX = eps + if abs(et_value[i] - value[i])> MAX: + print "ERROR!!!", i, "-th item", value[i], " is not equal to etalon item", et_value[i], "!!!" + error=error+1 + if check_error and error > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." + return error + + def setShaded(view, shading): """Utility function to set shaded mode in view""" if shading == 0: @@ -197,6 +229,142 @@ def setShaded(view, shading): view.LightDiffuseColor = [0, 0, 0] +def TimeStampId(proxy): + """Return tuple for the given MED proxy: (mesh_name, {field_name: [entity, timestamp_id]}) + Originally defined in KERNEL_TEST/Tools/CommonFunctions file. + """ + import presentations + mesh_name = presentations.get_mesh_names(proxy).pop() + iterations = {} + + # get list of field names + fields_on_points = list(proxy.PointArrays) + fields_on_cells = list(proxy.CellArrays) + all_fields = fields_on_points + fields_on_cells + + # get timestamps + timestamps = proxy.TimestepValues.GetData() + timestamp_nb = len(timestamps) + + for field in all_fields: + entity = None + if fields_on_points.count(field) > 0: + entity = presentations.EntityType.NODE + elif fields_on_cells.count(field) > 0: + entity = presentations.EntityType.CELL + + iterations[field] = [entity, timestamp_nb] + + return mesh_name, iterations + + +def Import_Med_Field(paravis, file, field_names, check_errors=0, prs=[]): + """Builds presentations on the given fields of the MED file. + Originally defined in VISU_TEST/Grids/visu/ImportMedField/begin file. + + Arguments: + paravis : PARAVIS instance + file_name : the full path to med file + field_names : the list of field names (for ex: ["pression","temperature","vitesse"]) + prs : [[0,1,...], [], []]; empty list (sublist(s)) is ignored + 0-VISU.TGAUSSPOINTS + 1-VISU.TSCALARMAP + 2-VISU.TISOSURFACE + 3-VISU.TCUTPLANES + 4-VISU.TCUTLINES + 5-VISU.TDEFORMEDSHAPE + 6-VISU.TVECTORS + 7-VISU.TSTREAMLINES + 8-VISU.TPLOT3D + 9-VISU.TSCALARMAPONDEFORMEDSHAPE + """ + import presentations + + nb_errors = 0 + + print "File: ", file + + # check the file accessibility + if not os.access(file, os.F_OK): + msg = "File " + file + " does not exist!!!" + raise RuntimeError, msg + + # import MED file + paravis.ImportFile(file) + proxy = presentations.pv.GetActiveSource() + if proxy is None: + raise RuntimeError, "ERROR!!! Can't import file!!!" + + for i in range(len(field_names)): + print "Name of the field: ", field_names[i] + + if len(prs) != 0: + if len(prs[i]) != 0: + mesh_name, iterations = TimeStampId(proxy) + + if iterations.has_key(field_names[i]): + entity = iterations[field_names[i]][0] + iteration = iterations[field_names[i]][1] + else: + msg="There is no information about TimeStampId of the " + field_names[i] + " field!!!" + raise RuntimeError, msg + + err = nb_errors + + for type in prs[i]: + if type==0: + if presentations.GaussPointsOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created GaussPoints presentation is None!!!"; nb_errors+=1 + if type==1: + if presentations.ScalarMapOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created ScalarMap presentation is None!!!"; nb_errors+=1 + if type==2: + if presentations.IsoSurfacesOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created IsoSurfaces presentation is None!!!"; nb_errors+=1 + if type==3: + if presentations.CutPlanesOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created CutPlanes presentation is None!!!"; nb_errors+=1 + if type==4: + if presentations.CutLinesOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created CutLines presentation is None!!!"; nb_errors+=1 + if type==5: + if presentations.DeformedShapeOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created DeformedShape presentation is None!!!"; nb_errors+=1 + if type==6: + if presentations.VectorsOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created Vectors presentation is None!!!"; nb_errors+=1 + if type==7: + if presentations.StreamLinesOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created StreamLines presentation is None!!!"; nb_errors+=1 + if type==8: + if presentations.Plot3DOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created Plot3D presentation is None!!!"; nb_errors+=1 + if type==9: + if presentations.DeformedShapeAndScalarMapOnField(proxy, entity, field_names[i], iteration) is None: + print "ERROR!!! Created ScalarMapOnDeformedShape presentation is None!!!"; nb_errors+=1 + + # check if number of errors has increased + if err == nb_errors: + print "Presentation(s) creation...OK" + + if nb_errors > 0 and check_errors: + raise RuntimeError, "There are some errors were occured!!! For more information see ERRORs above..." + else: + return nb_errors + +def delete_with_inputs(obj): + """Deletes the given object with all its inputs""" + import pvsimple + + obj_to_delete = obj + while obj_to_delete is not None: + tmp_obj = obj_to_delete + obj_to_delete = None + if hasattr(tmp_obj, 'Input'): + obj_to_delete = tmp_obj.Input + + pvsimple.Delete(tmp_obj) + # Run Salome salome_session = SalomeSession() salome.salome_init() diff --git a/test/VisuPrs/bugs/A0.py b/test/VisuPrs/bugs/A0.py new file mode 100644 index 00000000..d5252947 --- /dev/null +++ b/test/VisuPrs/bugs/A0.py @@ -0,0 +1,67 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A0 case + +import sys +import os +from paravistest import datadir, pictureext, get_picture_dir +import presentations +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/A0") + +# 1. Import MED file +print 'Importing "hydro_sea_alv.med"...', +file_path = datadir + "hydro_sea_alv.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Create cut lines on "Head" field +mesh_name = "maillage_migr3d" +field_name = "Head" +cell_entity = presentations.EntityType.CELL +timestamps = med_reader.TimestepValues.GetData() + +for ts in xrange(1, len(timestamps) + 1): + print "Timestamp: ", ts + cutlines = presentations.CutLinesOnField(med_reader, cell_entity, field_name, ts, + orientation1=presentations.Orientation.ZX, + orientation2=presentations.Orientation.YZ) + pic_name = mesh_name + "_" + str(cell_entity) + "_" + field_name + "_" + str(ts) + "_TCUTLINES." + pictureext + pic_path = os.path.join(picturedir, pic_name) + print pic_path + presentations.process_prs_for_test(cutlines, pvsimple.GetRenderView(), pic_path) + nb_lines = len(cutlines.Input.SliceOffsetValues) + print "Number of lines = ", nb_lines + + + + + + + + diff --git a/test/VisuPrs/bugs/A1.py b/test/VisuPrs/bugs/A1.py new file mode 100644 index 00000000..6dbb7472 --- /dev/null +++ b/test/VisuPrs/bugs/A1.py @@ -0,0 +1,61 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A1 case + +import sys +import os +import time +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/A1") + +med_file_path = datadir + "fra1.med" +pic_path = os.path.join(picturedir, "A1." + pictureext) + +# 1. Import MED file +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +# 2. Create mesh +mesh = MeshOnEntity(med_reader, "LE_VOLUME", EntityType.CELL) +mesh.Representation = 'Surface With Edges' + +# 3. Display mesh and make snapshot +view = pvsimple.GetRenderView() + +display_only(mesh, view) +reset_view(view) + +view.CameraViewUp = [0,1,0] +view.CameraPosition = [0, 42, -200] +view.CameraFocalPoint = [25, 0, 5] +view.CameraParallelScale = 1 + +view.ResetCamera() + +pvsimple.Render(view) + +print "Picure file name is " + pic_path +pv.WriteImage(pic_path, view=view, Magnification=1) +time.sleep(1) diff --git a/test/VisuPrs/bugs/A2.py b/test/VisuPrs/bugs/A2.py new file mode 100644 index 00000000..a1d5c358 --- /dev/null +++ b/test/VisuPrs/bugs/A2.py @@ -0,0 +1,74 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A2 case + +import sys +import os +import time +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/A2") + +med_file_path = datadir + "carre_MIXTE_0000_v3.0.6.med" +pic_path = os.path.join(picturedir, "A2." + pictureext) + +print "BREAKPOINT_1" +# 1. Import MED file +print 'Importing "carre_MIXTE_0000.med"...', +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Create mesh +print "Creating MeshOnEntity..............", +mesh = MeshOnEntity(med_reader, "dom", EntityType.CELL) + +if mesh is None: + print "FAILED" +else: + mesh.Representation = 'Surface With Edges' + print "OK" + +# 3. Display mesh and make snapshot +view = pvsimple.GetRenderView() + +display_only(mesh, view) +reset_view(view) + +view.CameraViewUp = [0, 0, 1] +view.CameraPosition = [50, 180, 0] +view.CameraFocalPoint = [0.2, 0, 0.5] +view.CameraParallelScale = 0.1 + +#view.ResetCamera() + +pvsimple.Render(view) + +print "Picure file name is " + pic_path +pv.WriteImage(pic_path, view=view, Magnification=1) +time.sleep(1) diff --git a/test/VisuPrs/bugs/A3.py b/test/VisuPrs/bugs/A3.py new file mode 100644 index 00000000..e9654746 --- /dev/null +++ b/test/VisuPrs/bugs/A3.py @@ -0,0 +1,51 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A3 case + +import time +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +med_file_path = datadir + "hexa_28320_ELEM.med" +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +# 2. Create vectors +vectors = VectorsOnField(med_reader, EntityType.CELL, "vitesse_elem_dom_pb1", 2) # 1e-05 + +display_only(vectors) +reset_view() +time.sleep(1) + +vectors.Input.SetScaleFactor = 0.005 +display_only(vectors) +reset_view() +time.sleep(1) + + +vectors.Input.SetScaleFactor = 0.002 +display_only(vectors) +reset_view() +time.sleep(1) diff --git a/test/VisuPrs/bugs/A4.py b/test/VisuPrs/bugs/A4.py new file mode 100644 index 00000000..598fb56f --- /dev/null +++ b/test/VisuPrs/bugs/A4.py @@ -0,0 +1,42 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A4 case + +import time +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +med_file_path = datadir + "carre_ELEM_0000.med" +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +# 2. Create vectors +vectors = VectorsOnField(med_reader, EntityType.CELL, "vitesse", 1) # 0 +vectors.Input.GlyphType = "Line" + +display_only(vectors) +reset_view() + +time.sleep(1) diff --git a/test/VisuPrs/bugs/A5.py b/test/VisuPrs/bugs/A5.py new file mode 100644 index 00000000..53b6710e --- /dev/null +++ b/test/VisuPrs/bugs/A5.py @@ -0,0 +1,50 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A5 case + +import os +import salome + +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +myStudy = salome.myStudy +myStudyManager = salome.myStudyManager + +data_file = datadir + "TimeStamps.med" + +tmp_dir = os.getenv("TmpDir") +if tmp_dir == None: + tmp_dir = "/tmp" + +save_file = tmp_dir + "/TimeStamps_save.hdf" +print "Save to file ", save_file + +paravis.myParavis.ImportFile(data_file) +myStudyManager.SaveAs(save_file, myStudy, 0) +myStudyManager.Close(myStudy) +openedStudy = myStudyManager.Open(data_file) +myStudyManager.Close(openedStudy) + +os.remove(save_file) + +print "OK" diff --git a/test/VisuPrs/bugs/A6.py b/test/VisuPrs/bugs/A6.py new file mode 100644 index 00000000..16543b79 --- /dev/null +++ b/test/VisuPrs/bugs/A6.py @@ -0,0 +1,59 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A6 case + +import sys +import os +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/A6") + +med_file_path = datadir + "fra.med" + +# 1. Import MED file +print 'Importing "fra.med"....', +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "Error" +else: + print "OK" + +# 2. Create mesh +mesh_names = get_mesh_names(med_reader) +for mesh_name in mesh_names: + print "Mesh name: ", mesh_name + mesh = MeshOnEntity(med_reader, mesh_name, EntityType.CELL) + if mesh is None: + raise RuntimeError, "Error" + + mesh.Representation = 'Wireframe' + + pic_path = os.path.join(picturedir, mesh_name + "_Cell." + pictureext) + pic_path = re.sub("\s+","_", pic_path) + print "Save picture ", pic_path + process_prs_for_test(mesh, pvsimple.GetRenderView(), pic_path) + + diff --git a/test/VisuPrs/bugs/A7.py b/test/VisuPrs/bugs/A7.py new file mode 100644 index 00000000..e8151774 --- /dev/null +++ b/test/VisuPrs/bugs/A7.py @@ -0,0 +1,33 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A7 case + +import sys +from paravistest import datadir, pictureext, get_picture_dir +from presentations import CreatePrsForFile, PrsTypeEnum +import paravis + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/A7") + +med_file_path = datadir + "hexa_28320_ELEM.med" +CreatePrsForFile(my_paravis, med_file_path, [PrsTypeEnum.MESH], picturedir, pictureext) +CreatePrsForFile(my_paravis, med_file_path, [PrsTypeEnum.SCALARMAP], picturedir, pictureext) +CreatePrsForFile(my_paravis, med_file_path, [PrsTypeEnum.CUTPLANES], picturedir, pictureext) diff --git a/test/VisuPrs/bugs/A9.py b/test/VisuPrs/bugs/A9.py new file mode 100644 index 00000000..5adb3367 --- /dev/null +++ b/test/VisuPrs/bugs/A9.py @@ -0,0 +1,172 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs/A9 case + +import os +import sys + +from paravistest import datadir, get_picture_dir, pictureext +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +picturedir = get_picture_dir(sys.argv[1], "bugs/A9") + +# 1. Step1: Import MED file +print "**** Step1: Importing MED file" + +print 'Import "sortie_med_volumique.med"...............', +file_path = datadir + "sortie_med_volumique_v3.0.6.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +print 'Get view........................................', +view = pvsimple.GetRenderView() +if view is None: + print "FAILED" +else: + reset_view(view) + print "OK" + +mesh_name = 'Volume_fluide' +cell_entity = EntityType.CELL +node_entity = EntityType.NODE + +# 2. Step2: Displaying mesh +errors = 0 + +print "**** Step2: Display mesh" +print "BREAKPOINT_1" + +# Creation of Mesh presentation on nodes +print "Creating Mesh presentation on nodes......." +mesh = MeshOnEntity(med_reader, mesh_name, node_entity) +if mesh is None: + print "ERROR!!! Mesh presentation on nodes creation FAILED!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "MeshPresentation_OnNodes." + pictureext) + process_prs_for_test(mesh, view, picture_path) + print "OK" + +# Creation of Mesh presentation on cells +print "Creating Mesh presentation on cells......." +mesh = MeshOnEntity(med_reader, mesh_name, cell_entity) +if mesh is None: + print "ERROR!!! Mesh presentation on cells creation FAILED!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "MeshPresentation_OnCells." + pictureext) + process_prs_for_test(mesh, view, picture_path) + print "OK" + +# 3. Step3: Displaying scalar field 'Dissip' +print "**** Step3: Display scalar field 'Dissip'" + +entity = cell_entity + +# Scalar Map creation +print "Creating Scalar Map.......", +scalarmap = ScalarMapOnField(med_reader, entity, 'Dissip', 1) + +if scalarmap is None: + print "ERROR!!! Scalar Map creation FAILED!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "ScalarMap_Dissip." + pictureext) + process_prs_for_test(scalarmap, view, picture_path) + print "OK" + +# Iso Surfaces creation +print "Creating Iso Surfaces.......", +isosurfaces = IsoSurfacesOnField(med_reader, entity, 'Dissip', 1) + +if isosurfaces is None: + print "ERROR!!! Iso Surfaces creation FAILED!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "IsoSurfaces_Dissip." + pictureext) + process_prs_for_test(isosurfaces, view, picture_path) + print "OK" + +# Gauss Points creation +print "Creating Gauss Points.......", +gausspoints = GaussPointsOnField(med_reader, entity, 'Dissip', 1) + +if gausspoints is None: + print "ERROR!!! Gauss Points creation FAILED!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "GaussPoints_Dissip." + pictureext) + process_prs_for_test(isosurfaces, view, picture_path) + print "OK" + +# 4. Step4: Displaying vectoriel field 'VitesseX' +entity = cell_entity + +print "**** Step5: Display vectoriel field 'VitesseX'" +# Deformed Shape creation +print "Creating Deformed Shape.......", + +defshape = DeformedShapeOnField(med_reader, entity, 'VitesseX', 1) +if defshape is None: + print "ERROR!!! Deformed Shape creation FAILED!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "DeformedShape_VitesseX." + pictureext) + process_prs_for_test(defshape, view, picture_path) + print "OK" + +# Vectors creation +print "Creating Vectors.......", +vectors = VectorsOnField(med_reader, entity, 'VitesseX', 1) + +if vectors is None: + print "ERROR!!! Vectors creation FAILED!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "Vectors_VitesseX." + pictureext) + process_prs_for_test(vectors, view, picture_path) + print "OK" + +# Scalar Map On Deformed Shape creation +print "Creating Scalar Map On Deformed Shape.......", +smapondefshape = DeformedShapeAndScalarMapOnField(med_reader, entity, 'VitesseX', 1) + +if smapondefshape is None: + print "ERROR!!! ScalarMapOnDeformedShape creation failed!!!" + errors += 1 +else: + picture_path = os.path.join(picturedir, "ScalMapOnDefShape_VitesseX." + pictureext) + process_prs_for_test(smapondefshape, view, picture_path) + print "OK" + +if errors == 1: + raise RuntimeError, "There is an error was occured... For more info see ERROR message above.." +elif errors > 1: + raise RuntimeError, "There are some errors were occured... For more info see ERRORs messages above.." +print "BREAKPOINT_2" diff --git a/test/VisuPrs/bugs/B1.py b/test/VisuPrs/bugs/B1.py new file mode 100644 index 00000000..8c859245 --- /dev/null +++ b/test/VisuPrs/bugs/B1.py @@ -0,0 +1,72 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs1/B1 case + + +import sys +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/B1") + +# 1. Import MED file +med_file_path = datadir + "resultat.01.med" + +print 'Importing "resultat.01.med"....', +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "resultat.01.med was not imported!!!" +else: + print "OK" + +# 2. Creation of presentation of each group +groups_on_cells = get_group_names(med_reader, "MAILLAGE_01_001", EntityType.CELL, wo_nogroups=True) +groups_on_nodes = get_group_names(med_reader, "MAILLAGE_01_001", EntityType.NODE, wo_nogroups=True) + +groups = groups_on_cells + groups_on_nodes + +errors = 0 +i = 0 +for group in groups: + i += 1 + shor_name = group.split('/')[-1] + print "group: ", shor_name + prs = MeshOnGroup(med_reader, group) + + if prs is None : + print "FAILED!!! Created presentation is None!!!" + errors += 1 + else : + print "Presentation was created!" + pic_path = os.path.join(picturedir, shor_name.strip().split("_")[0]+str(i)+"."+pictureext) + process_prs_for_test(prs, pvsimple.GetRenderView(), pic_path) + + +# check errors +if errors == 1: + raise RuntimeError, "There is an error was occured... For more info see ERROR message above.." +elif errors > 1: + raise RuntimeError, "There are some errors were occured... For more info see ERRORs messages above.." + diff --git a/test/VisuPrs/bugs/C3.py b/test/VisuPrs/bugs/C3.py new file mode 100644 index 00000000..4785f09f --- /dev/null +++ b/test/VisuPrs/bugs/C3.py @@ -0,0 +1,62 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs2/C3 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +med_file_path = datadir + "MEDfileForStructuredMesh.med" + +print 'Importing "MEDfileForStructuredMesh.med"....', +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +errors = 0 + +# 2. Creation of the mesh presentations for the "AssemblyMesh" mesh +mesh_name = "AssemblyMesh" + +for entity in [EntityType.NODE, EntityType.CELL]: + if MeshOnEntity(med_reader, mesh_name, entity) is None: + print "Entity:", str(entity) + print "ERROR!!! Mesh presentation for \""+mesh_name+"\" wasn't created!!!" + errors += 1 + +# 3. Creation of the mesh presentations for the "CoreMesh" mesh +mesh_name = "CoreMesh" + +for entity in [EntityType.NODE, EntityType.CELL]: + if MeshOnEntity(med_reader, mesh_name, entity) is None: + print "Entity:", str(entity) + print "ERROR!!! Mesh presentation for \""+mesh_name+"\" wasn't created!!!" + errors += 1 + +if errors > 0: + raise RuntimeError, "Some errors were occured during execution... See ERRORs above for details!" diff --git a/test/VisuPrs/bugs/C4.py b/test/VisuPrs/bugs/C4.py new file mode 100644 index 00000000..96216c73 --- /dev/null +++ b/test/VisuPrs/bugs/C4.py @@ -0,0 +1,69 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs2/C4 case + +import sys +import os +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/C4") + +# 1. Import MED file +med_file_path = datadir + "forma01f.resu.med" + +print 'Importing "forma01f.resu.med"....', +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Creation of ScalarMap On DeformedShape presentation +scales=[None, 0, 1e-05] +fields=["RESU1_DEPL", "RESU1_SIGM_ELNO_DEPL"] +entities=[EntityType.NODE, EntityType.CELL] +entities_str=["NODE", "CELL"] + +view = pvsimple.GetRenderView() + +for scale in scales: + for i in range(len(fields)): + print "Field: ", fields[i], "; Scale: ", scale + presentation = None + try: + presentation = DeformedShapeAndScalarMapOnField(med_reader, entities[i], fields[i], 1) + except ValueError as e: + print "Error:", e + + if presentation is not None: + if scale is not None: + presentation.Input.ScaleFactor = scale + # save picture + pic_path = os.path.join(picturedir, "MAIL_" + entities_str[i] + "_" + fields[i] + "_" + str(scale) + "_." + pictureext) + process_prs_for_test(presentation, view, pic_path) + else: + print "FAILED! Created presentation is None!!!" + diff --git a/test/VisuPrs/bugs/C5.py b/test/VisuPrs/bugs/C5.py new file mode 100644 index 00000000..a783f3ce --- /dev/null +++ b/test/VisuPrs/bugs/C5.py @@ -0,0 +1,158 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs2/C5 case + +import sys +import os +import time +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +medPath = datadir + +class DisplayManager: + """ + Create 3D presentations on entities on a given med file and mesh + """ + def __init__(self, medFile=None, meshName=None, myEntity=None): + if ( medFile is not None and meshName is not None and myEntity is not None): + self.loadData(medFile, meshName, myEntity) + else: + self.medFile = None + self.meshName = None + self.myData = None + self.myMesh = None + self.myEntity = None + + def loadData(self, medFile, meshName=None, myEntity=EntityType.NODE): + self.medFile = medFile + my_paravis.ImportFile(medFile) + self.myData = pvsimple.GetActiveSource() + self.myEntity = myEntity + if meshName is not None: + self.setMesh(meshName) + + def getData(self): + return self.myData + + def checkData(self): + if ( self.myData is None or self.myMesh is None ): + return False + return True + + def setMesh(self,meshName): + self.meshName = meshName + self.myMesh = MeshOnEntity(self.myData, + self.meshName, + self.myEntity) + self.myMesh.Representation = 'Surface' + + def DisplayMap(self, aView, aMap, title, aDelay=0): + if aMap is None: + print "Null scalar map is created" + display_only(aMap, aView) + reset_view(aView) + time.sleep(aDelay) + + def ScalarMap(self, aView, fieldName, iteration, title , delay=0): + if not self.checkData(): return + aMap = ScalarMapOnField(self.myData, self.myEntity, fieldName, iteration) + self.DisplayMap(aView, aMap, title, delay) + + def DeformedShape(self, aView, fieldName, iteration, title , delay=0): + if not self.checkData(): return + aMap = DeformedShapeOnField(self.myData, self.myEntity, fieldName, iteration) + if aMap is not None: + aMap.ColorArrayName = fieldName + self.DisplayMap(aView, aMap, title, delay) + + def Vectors(self, aView, fieldName, iteration, title , delay=0): + if not self.checkData(): return + aMap = VectorsOnField(self.myData, self.myEntity, fieldName, iteration) + if aMap is not None: + aMap.ColorArrayName = fieldName + self.DisplayMap(aView, aMap, title, delay) + + def IsoSurfaces(self, aView, fieldName, iteration, title , delay=0): + if not self.checkData(): return + aMap = IsoSurfacesOnField(self.myData, self.myEntity, fieldName, iteration) + self.DisplayMap(aView, aMap, title, delay) + + def Animation(self, aView, theObj, theDuration, NbOfLoops, title, aPath=""): + + path = None + if aPath is not "": + print "Define save path" + path = aPath + + scene = pvsimple.AnimateReader(theObj, aView, path) + + print "Start Animation" + + scene.Duration = theDuration + NbOfFrames = len(scene.TimeKeeper.TimestepValues) + NbOfIter = NbOfFrames-1 + + reset_view(view=aView) + + ind = 0 + while ind < NbOfLoops: + scene.Play() + ind = ind + 1 + + print "Stop Animation" + scene.Stop() + + return scene + + def XYPlot(self, myView, txtFile, theTableName, theDelay, theColor): + table = TableReader(FileName=txtFile) + + # >>> Create curve + myView = CreateXYPlotView() + myCurve = Show(table, view = myView) + +def createView(): + aView=pvsimple.GetRenderView() + return aView + + +theEntity = EntityType.CELL +theMedFile = "TETRA_domaine_fluide.med" +theMedFile = os.path.join(medPath,theMedFile) +theMeshName = "Domaine_fluide" +theFieldName = "TempC" +theDuration = 20 +NbOfLoops = 4 +#thePath = os.getenv("TMP_DIR") +thePrefix = "TestPngFromAnim" +thePath = os.path.join("/tmp", thePrefix) +thePath += ".png" + +displayMng = DisplayManager() +displayMng.loadData(theMedFile,theMeshName,theEntity) +ScalarMapOnField(displayMng.getData(), theEntity, theFieldName, 1) + +myView = createView() +displayMng.Animation(myView, displayMng.getData(), theDuration, NbOfLoops, "", thePath) diff --git a/test/VisuPrs/bugs/C6.py b/test/VisuPrs/bugs/C6.py new file mode 100644 index 00000000..97dfbee3 --- /dev/null +++ b/test/VisuPrs/bugs/C6.py @@ -0,0 +1,57 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs2/C6 case + +import sys +import os +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/C6") + +# 1. Import MED file +med_file_path = datadir + "relachement_brutal_sans_dudg_gauss.med" + +print 'Importing "relachement_brutal_sans_dudg_gauss.med"....', +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "File wasn't imported!!!" +else: + print "OK" + +# 2. Creation of GaussPoints presentations +mesh_name = "Maillage" +field_name = "Result_EQUI_ELGA_SIGM" +timestamp_list = range(1, 5) + +for timestamp in timestamp_list: + print "Creation of the GaussPoints presentation.. Field: ", field_name, "; Timestamp: ", timestamp + gauss_points = GaussPointsOnField1(med_reader, EntityType.CELL, field_name, timestamp) + if gauss_points is None: + raise RuntimeError, "Created presentation is None!!!" + pic_path = os.path.join(picturedir, "GaussPoints_" + mesh_name + "_" + field_name + "_" + str(timestamp) + "." + pictureext) + process_prs_for_test(gauss_points, pvsimple.GetRenderView(), pic_path) + + diff --git a/test/VisuPrs/bugs/C7.py b/test/VisuPrs/bugs/C7.py new file mode 100644 index 00000000..b55d346e --- /dev/null +++ b/test/VisuPrs/bugs/C7.py @@ -0,0 +1,66 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs2/C7 case + +import os +import sys +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/C7") + +# 1. Import MED file +med_file_path = datadir + "Bug583-Quadratique.resu.med" + +print 'Importing "Bug583-Quadratique.resu.med"....', +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "File wasn't imported!!!" +else: + print "OK" + +# 2. Creation of GaussPoints presentations +mesh_name = "MAIL" +field_names = ["RESU_EQUI_ELNO_SIGM", "RESU_SIEF_ELGA_DEPL", "RESU_SIEF_ELNO_ELGA", "RESU_SIGM_ELNO_DEPL"] + +view = pvsimple.GetRenderView() + +print "BREAKPOINT_1" +error = 0 + +for field in field_names: + print "Creation of the GaussPoints presentation.. Field: ", field, "; Iteration: 1" + presentation = GaussPointsOnField1(med_reader, EntityType.CELL, field, 1) + if presentation is None: + print "ERROR!!! GaussPoints presentation wasn't created for the ", field, " field!!!" + error += 1 + else: + pic_path = os.path.join(picturedir, "GaussPoints_" + mesh_name + "_" + field + "." + pictureext) + process_prs_for_test(presentation, view, pic_path) + +if not error: + print "BREAKPOINT_2" +else: + raise RuntimeError, "There are some errors were occured... For more info see ERRORs above..." diff --git a/test/VisuPrs/bugs/C8.py b/test/VisuPrs/bugs/C8.py new file mode 100644 index 00000000..52d6e4bb --- /dev/null +++ b/test/VisuPrs/bugs/C8.py @@ -0,0 +1,66 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs2/C8 case + +from paravistest import tablesdir +from presentations import * +import paravis +import pvsimple + +# 1. Import table from file +file_path = tablesdir + "tables_test.xls" + +print 'Import tables_test.xls ....', +file_path = tablesdir + "tables_test.xls" +table_reader = pvsimple.TableReader(FileName=file_path) +table_reader.UpdatePipeline() +if table_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Show curves +cur_view = pvsimple.GetRenderView() +if cur_view: + pvsimple.Delete(cur_view) + +xy_view = pvsimple.CreateXYPlotView() +xy_view.ChartTitle = "The viewer for Curves from the Table" + + +print 'Get available tables .....' +available_tables = table_reader.GetPropertyValue("AvailableTables") +if (available_tables is None) or (len(available_tables) == 0): + print "FAILED" +else: + print available_tables + +for table in available_tables: + table_reader.TableNumber = available_tables.GetData().index(table) + + xy_rep = pvsimple.Show() + xy_rep.AttributeType = 'Row Data' + xy_rep.UseIndexForXAxis = 0 + xy_rep.SeriesVisibility = ['0', '0'] + + pvsimple.Render() + + + diff --git a/test/VisuPrs/bugs/C9.py b/test/VisuPrs/bugs/C9.py new file mode 100644 index 00000000..18b4ec39 --- /dev/null +++ b/test/VisuPrs/bugs/C9.py @@ -0,0 +1,57 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs2/C9 case + +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +med_file_path = datadir + "TimeStamps.med" + +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "TimeStamps.med was not imported!!!" + +# 2. Creation of presentations +mesh_on_cells = MeshOnEntity(med_reader, "dom", EntityType.CELL) +if mesh_on_cells is None : + raise RuntimeError, "Mesh presentation is None!!!" + +view = pvsimple.GetRenderView() +display_only(mesh_on_cells, view) +reset_view(view) + +mesh_on_cells.Representation = 'Wireframe' + +scalar_map = ScalarMapOnField(med_reader, EntityType.NODE, "vitesse", 1) +if scalar_map is None : + raise RuntimeError, "ScalarMap presentation is None!!!" + +scalar_map.Visibility = 1 +pvsimple.Render() + +pvsimple.Delete(scalar_map) +pvsimple.Render() diff --git a/test/VisuPrs/bugs/CMakeLists.txt b/test/VisuPrs/bugs/CMakeLists.txt new file mode 100644 index 00000000..81e00821 --- /dev/null +++ b/test/VisuPrs/bugs/CMakeLists.txt @@ -0,0 +1,51 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +IF (PYTHON_EXECUTABLE) + FOREACH ( tfile + A0 + A1 + A2 + A3 + A4 + A5 + A6 + A7 + A9 + B1 + C3 + C4 + C5 + C6 + C7 + C8 + C9 + D0 + D1 + D3 + D5 + D6 + D7 + E0 + ) + SET(TIMEOUT 10000) + ADD_TEST(BUGS_${tfile} ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/test/VisuPrs/Util/paravistesthelper.py ${TIMEOUT} ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}.py ${PARAVIS_TEST_OUTPUT_DIR}) + SET_TESTS_PROPERTIES(BUGS_${tfile} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED" TIMEOUT ${TIMEOUT}) + ENDFOREACH( tfile ) +ENDIF (PYTHON_EXECUTABLE) diff --git a/test/VisuPrs/bugs/D0.py b/test/VisuPrs/bugs/D0.py new file mode 100644 index 00000000..3c1240d0 --- /dev/null +++ b/test/VisuPrs/bugs/D0.py @@ -0,0 +1,73 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs3/D0 case + +import sys +import os +import time +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/D0") + +# Aux method +def get_group_full_name(source, group_name): + result_name = group_name + + full_names = source.Groups.Available + for name in full_names: + if name.endswith(group_name): + result_name = name + break + + return result_name + +# 1. Import of the "Bug619-result_calcul_OCC.med" file +med_file_path = datadir + "Bug619-result_calcul_OCC.med" + +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "Bug619-result_calcul_OCC.med was not imported!!!" + +# 2. Creation of ScalarMap: +# iteration1: on the "TU_3D_G1" group +# iteration2: on the "TU_3D_D1" group +view = pvsimple.GetRenderView() +field_name = "MECASTATEQUI_ELNO_SIGM" + +groups = ['TU_3D_G1', 'TU_3D_D1'] + +for group_name in groups: + extract_group = pvsimple.ExtractGroup(med_reader) + extract_group.Groups = [get_group_full_name(med_reader, group_name)] + extract_group.UpdatePipeline() + + scalar_map = ScalarMapOnField(extract_group, EntityType.CELL, field_name, 1) + if scalar_map is None : + raise RuntimeError, "ScalarMap presentation on '" + group_name + "' group is None!!!" + + pic_path = os.path.join(picturedir, "npal18711_" + group_name + "." + pictureext) + process_prs_for_test(scalar_map, view, pic_path) + diff --git a/test/VisuPrs/bugs/D1.py b/test/VisuPrs/bugs/D1.py new file mode 100644 index 00000000..34343dd9 --- /dev/null +++ b/test/VisuPrs/bugs/D1.py @@ -0,0 +1,87 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs3/D1 case + +import sys +import os +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "bugs/D1") + +# 1. Import of the "Bug829_resu_mode.med" file at first time +med_file_path = datadir + "Bug829_resu_mode.med" +my_paravis.ImportFile(med_file_path) +med_reader1 = pvsimple.GetActiveSource() +if med_reader1 is None: + raise RuntimeError, "Bug829_resu_mode.med was not imported!!!" + +# 2. Creation of a set of "DeformedShape and ScalarMap" presentations, based on time stamps of "MODES_DEPL" field +errors=0 +sizes=[] + +for i in range(1,11): + presentation = DeformedShapeAndScalarMapOnField(med_reader1, EntityType.NODE, "MODES_DEPL", i) + if presentation is None : + raise RuntimeError, "Presentation is None!!!" + + pic_path = os.path.join(picturedir, "npal19999_1_time_stamp_" + str(i) + "." + pictureext) + process_prs_for_test(presentation, pvsimple.GetRenderView(), pic_path) + + sizes.append(os.path.getsize(pic_path)) + +if abs(max(sizes)-min(sizes)) > 0.01*max(sizes): + print "WARNING!!! Pictures have different sizes!!!" + errors += 1 + for i in range(1,11): + picture_name = "npal19999_1_time_stamp_" + str(i) + "." + pictureext + print "Picture: " + picture_name + "; size: " + str(sizes[i-1]) + raise RuntimeError + +# 3. Import of the "Bug829_resu_mode.med" file at second time +my_paravis.ImportFile(med_file_path) +med_reader2 = pvsimple.GetActiveSource() +if med_reader2 is None: + raise RuntimeError, "Bug829_resu_mode.med was not imported second time!!!" + +# 4. Creation of a set of "DeformedShape and ScalarMap" presentations, based on time stamps of "MODES_DEPL" field +errors = 0 +sizes=[] + +for i in range(1,11): + presentation = DeformedShapeAndScalarMapOnField(med_reader2, EntityType.NODE, "MODES_DEPL", 11-i) + if presentation is None : + raise RuntimeError, "Presentation is None!!!" + + pic_path = os.path.join(picturedir, "npal19999_2_time_stamp_" + str(i) + "." + pictureext) + process_prs_for_test(presentation, pvsimple.GetRenderView(), pic_path) + + sizes.append(os.path.getsize(pic_path)) + +if abs(max(sizes)-min(sizes)) > 0.01*max(sizes): + print "WARNING!!! Pictures have different sizes!!!" + errors += 1 + for i in range(1,11): + picture_name = "npal19999_2_time_stamp_" + str(i) + "." + pictureext + print "Picture: " + picture_name + "; size: " + str(sizes[i-1]) + raise RuntimeError diff --git a/test/VisuPrs/bugs/D3.py b/test/VisuPrs/bugs/D3.py new file mode 100644 index 00000000..598efa02 --- /dev/null +++ b/test/VisuPrs/bugs/D3.py @@ -0,0 +1,70 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs3/D3 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import of the "LinearStaticsSTA9.resu.med" file +med_file_path = datadir + "LinearStaticsSTA9.resu.med" +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + raise RuntimeError, "LinearStaticsSTA9.resu.med was not imported!!!" + +view = pvsimple.GetRenderView() + +# Creation of colored "DeformedShape" presentations, based on time stamps of "RESU_DEPL" field +presentation = DeformedShapeOnField(med_reader, EntityType.NODE, 'RESU_DEPL', 1, is_colored=True) +if presentation is None : + raise RuntimeError, "DeformedShapeOnField Presentation is None!!!" + +display_only(presentation, view) +reset_view(view) + +# Creation of colored "Vectors" presentations, based on time stamps of "RESU_DEPL" field +presentation = VectorsOnField(med_reader, EntityType.NODE, 'RESU_DEPL', 1, is_colored=True) +if presentation is None : + raise RuntimeError, "Vectors Presentation is None!!!" + +display_only(presentation, view) +reset_view(view) + +# Creation of colored "DeformedShapeAndScalarMap" presentations, based on time stamps of "RESU_DEPL" field +presentation = DeformedShapeAndScalarMapOnField(med_reader, EntityType.NODE, 'RESU_DEPL', 1) +if presentation is None : + raise RuntimeError, "DeformedShapeAndScalarMap Presentation is None!!!" + +display_only(presentation, view) +reset_view(view) + +# Creation of colored "CutPlanes" presentations, based on time stamps of "RESU_DEPL" field +presentation = CutPlanesOnField(med_reader, EntityType.NODE, 'RESU_DEPL', 1) +if presentation is None : + raise RuntimeError, "CutPlanes Presentation is None!!!" + +display_only(presentation, view) +reset_view(view) + + diff --git a/test/VisuPrs/bugs/D5.py b/test/VisuPrs/bugs/D5.py new file mode 100644 index 00000000..44215a9e --- /dev/null +++ b/test/VisuPrs/bugs/D5.py @@ -0,0 +1,45 @@ +from paravistest import tablesdir +from presentations import * +import paravis +import pvsimple + +# Import table from file +print 'Import file with tables....', +file_path = tablesdir + "tables_test.xls" +table_reader = pvsimple.TableReader(FileName=file_path) + +if table_reader is None: + print "FAILED" +else: + table_reader.UpdatePipeline() + print "OK" + +# Display +table_to_3d = pvsimple.TableTo3D(table_reader) +prs = pvsimple.Show() +#prs.ColorArrayName = 'Table' + +available_tables = table_reader.GetPropertyValue("AvailableTables") +tables_count = len(available_tables) +for table_nb in range(0, tables_count): + table_reader.TableNumber = table_nb + + field_name = 'Table' + vector_mode = 'Magnitude' + nb_components = 1 + + # Get lookup table + lookup_table = get_lookup_table(field_name, nb_components, vector_mode) + lookup_table.LockScalarRange = 0 + + # Set properties + prs.ColorAttributeType = EntityType.get_pvtype(EntityType.NODE) + prs.ColorArrayName = field_name + prs.LookupTable = lookup_table + + # Add scalar bar + bar = add_scalar_bar(available_tables[table_nb], nb_components, vector_mode, + lookup_table, "") + + reset_view() + pvsimple.Delete(bar) diff --git a/test/VisuPrs/bugs/D6.py b/test/VisuPrs/bugs/D6.py new file mode 100644 index 00000000..1bf2eec4 --- /dev/null +++ b/test/VisuPrs/bugs/D6.py @@ -0,0 +1,80 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs3/D6 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +med_file_path = datadir + "fra.med" + +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +# 2. Creation of CutSegment presentations, based on time stamps of "VITESSE" field +point1 = [0.0, 0.0, 0.0] +point2 = [0.4, 0.05, 1.0] +cut_segment1 = CutSegmentOnField(med_reader, EntityType.NODE, "VITESSE", 1, + point1, point2) +if cut_segment1 == None: + raise RuntimeError, "ERROR!!! The first CutSegment presentation is not built!" + +# 3. Creation of CutSegment presentations, based on time stamps of "TAUX_DE_VIDE" field +point1 = [0, 0, 1] +point2 = [0.2055, 0.0685, 0.541] +cut_segment2 = CutSegmentOnField(med_reader, EntityType.NODE, "TAUX_DE_VIDE", 1, + point1, point2) +if cut_segment2 == None: + raise RuntimeError, "ERROR!!! The second CutSegment presentation is not built!" + +# 4. Creation of Table based on CutSegment presentation + +# TODO: it's possible to display CutSegment (PlotOverLine in terms of ParaViS) presentation +# as a table in GUI, but it seems that there is no possibility to create table view +# (spreadsheet view in terms of ParaViS) from in Python script + +# 5. Creation of curve based on Table +xy_view = pv.CreateXYPlotView() + +curve1 = pv.Show(cut_segment1.Input, xy_view) +if curve1 == None: + raise RuntimeError, " ERROR!!! Curve based on the first CutSegment is not built!" + +curve2 = pv.Show(cut_segment2.Input, xy_view) +if curve2 == None: + raise RuntimeError, " ERROR!!! Curve based on the second CutSegment is not built!" + +curves = [curve1, curve2] +for c in curves: + c.AttributeType = 'Point Data' + c.UseIndexForXAxis = 0 + c.XArrayName = 'arc_length' + +pvsimple.SetActiveSource(cut_segment1.Input) +set_visible_lines(curve1, ['VITESSE (Magnitude)']) + +pvsimple.SetActiveSource(cut_segment2.Input) +set_visible_lines(curve2, ['TAUX_DE_VIDE']) + +pvsimple.ResetCamera(xy_view) diff --git a/test/VisuPrs/bugs/D7.py b/test/VisuPrs/bugs/D7.py new file mode 100644 index 00000000..cb00a40e --- /dev/null +++ b/test/VisuPrs/bugs/D7.py @@ -0,0 +1,62 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs3/D7 case + +import sys +import os +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. MED file import +print 'Importing "Fields_group3D.med"........', + +med_file_path = datadir + "Fields_group3D.med" +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + print "FAILED" +else: + print "OK" + +print 'Get view..............................', +view = pvsimple.GetRenderView() +if view is None: + print "FAILED" +else: + print "OK" + +# 2. Displaying scalar field +print "Creating Scalar Map.......", + +scalarmap = ScalarMapOnField(med_reader, EntityType.CELL, 'scalar_field', 1) +if scalarmap is None: + print "FAILED" +else: + print "OK" + +med_reader.Groups = ['GROUP/mailles_MED/OnCell/box_1'] + +display_only(scalarmap, view) +reset_view(view) + diff --git a/test/VisuPrs/bugs/E0.py b/test/VisuPrs/bugs/E0.py new file mode 100644 index 00000000..39cb041e --- /dev/null +++ b/test/VisuPrs/bugs/E0.py @@ -0,0 +1,125 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/bugs4/E0 case + +import time +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +sleep_delay = 1 +my_paravis = paravis.myParavis + +# 1. MED file import +print 'Import "ResOK_0000.med"...............', +med_file_path = datadir + "ResOK_0000.med" +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + raise RuntimeError, "ResOK_0000.med was not imported!!!" +else: + print "OK" + +# TODO: in the original VISU script the timestamp id was equal to 2, +# but in PARAVIS it's inly one timestamp accessible +timestamp_id = 1 + +# 2. Create Scalar Map +field_name = 'vitesse' + +print "Creating Scalar Map......." +scmap1 = ScalarMapOnField(med_reader, EntityType.NODE, field_name, timestamp_id) +if scmap1 is None : + raise RuntimeError, "ScalarMap presentation is None!!!" +else: + print "OK" + +display_only(scmap1) +reset_view() + +print "WIREFRAME sur scmap1" +scmap1.Representation = 'Wireframe' +time.sleep(sleep_delay) + +print "POINT sur scmap1" +scmap1.Representation = 'Points' +time.sleep(sleep_delay) + +print "SURFACEFRAME sur scmap1" +scmap1.Representation = 'Surface With Edges' +time.sleep(sleep_delay) + +# 3. Create Deformed Shape And Scalar Map +print "Creating DeformedShapeAndScalarMap......." +scmap2 = DeformedShapeAndScalarMapOnField(med_reader, EntityType.NODE, field_name, timestamp_id) +if scmap2 is None : + raise RuntimeError, "DeformedShapeAndScalarMapOnField presentation is None!!!" +else: + print "OK" + +scmap2.Input.ScaleFactor = 1.0 + +display_only(scmap2) +reset_view() + +print "WIREFRAME sur scmap2" +scmap2.Representation = 'Wireframe' +time.sleep(sleep_delay) + +print "POINT sur scmap2" +scmap2.Representation = 'Points' +time.sleep(sleep_delay) + +print "SURFACEFRAME sur scmap2" +scmap2.Representation = 'Surface With Edges' +time.sleep(sleep_delay) + +# 4.Create Deformed Shape +print "Creating DeformedShape........" +scmap3 = DeformedShapeOnField(med_reader, EntityType.NODE, field_name, timestamp_id) +if scmap3 is None : + raise RuntimeError, "DeformedShapeOnField presentation is None!!!" +else: + print "OK" + +print "WIREFRAME sur scmap3" +scmap3.Representation = 'Wireframe' +time.sleep(sleep_delay) + +print "POINT sur scmap3" +scmap3.Representation = 'Points' +time.sleep(sleep_delay) + +print "SURFACEFRAME sur scmap3" +scmap3.Representation = 'Surface With Edges' +time.sleep(sleep_delay) + +scmap2.Input.ScaleFactor = 1.0 + +# show colored: +scmap3.ColorAttributeType = EntityType.get_pvtype(EntityType.NODE) +scmap3.ColorArrayName = field_name + +display_only(scmap3) +reset_view() + + + diff --git a/test/VisuPrs/dump_study/A0.py b/test/VisuPrs/dump_study/A0.py new file mode 100644 index 00000000..6c33915e --- /dev/null +++ b/test/VisuPrs/dump_study/A0.py @@ -0,0 +1,157 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A0 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal'} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. ScalarMap creation +med_field = "vitesse" + +scalarmap = ScalarMapOnField(med_reader, EntityType.NODE, med_field, 1) + +# apply settings +scalarmap.Position = settings["Offset"] +scalarmap.LookupTable.VectorMode = settings["ScalarMode"][0] +scalarmap.LookupTable.VectorComponent = settings["ScalarMode"][1] +scalarmap.LookupTable.Discretize = settings["Discretize"] +scalarmap.LookupTable.NumberOfTableValues = settings["NbColors"] +scalarmap.LookupTable.UseLogScale = settings["UseLogScale"] + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "ScalarMap.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(scalarmap) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_scalarmap = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_scalarmap.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_scalarmap.LookupTable.VectorMode +vector_component = recreated_scalarmap.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_scalarmap.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_scalarmap.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_scalarmap.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." + + + diff --git a/test/VisuPrs/dump_study/A1.py b/test/VisuPrs/dump_study/A1.py new file mode 100644 index 00000000..f0cc19ae --- /dev/null +++ b/test/VisuPrs/dump_study/A1.py @@ -0,0 +1,166 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A1 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal', "NbSurfaces": 444} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. IsoSurfaces creation +med_field = "vitesse" + +isosurfaces = IsoSurfacesOnField(med_reader, EntityType.NODE, med_field, 1) + +# apply settings +isosurfaces.Position = settings["Offset"] +isosurfaces.LookupTable.VectorMode = settings["ScalarMode"][0] +isosurfaces.LookupTable.VectorComponent = settings["ScalarMode"][1] +isosurfaces.LookupTable.Discretize = settings["Discretize"] +isosurfaces.LookupTable.NumberOfTableValues = settings["NbColors"] +isosurfaces.LookupTable.UseLogScale = settings["UseLogScale"] + +contour_filter = isosurfaces.Input +rgb_points = isosurfaces.LookupTable.RGBPoints +scalar_range = [rgb_points[0], rgb_points[4]] +surfaces = get_contours(scalar_range, settings["NbSurfaces"]) +contour_filter.Isosurfaces = surfaces + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "IsoSurfaces.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(isosurfaces) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_isosurfaces = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_isosurfaces.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_isosurfaces.LookupTable.VectorMode +vector_component = recreated_isosurfaces.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_isosurfaces.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_isosurfaces.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_isosurfaces.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +# NbSurfaces +nb_surfaces = len(recreated_isosurfaces.Input.Isosurfaces) +if nb_surfaces != settings["NbSurfaces"]: + print "ERROR!!! Number of surfaces of presentation is incorrect: ", nb_surfaces, " instead of ", settings["NbSurfaces"] + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A2.py b/test/VisuPrs/dump_study/A2.py new file mode 100644 index 00000000..f1088e83 --- /dev/null +++ b/test/VisuPrs/dump_study/A2.py @@ -0,0 +1,173 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A2 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal'} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. CutPlanes creation +med_field = "vitesse" + +cutplanes = CutPlanesOnField(med_reader, EntityType.NODE, med_field, 1) + +# apply settings +cutplanes.Position = settings["Offset"] +cutplanes.LookupTable.VectorMode = settings["ScalarMode"][0] +cutplanes.LookupTable.VectorComponent = settings["ScalarMode"][1] +cutplanes.LookupTable.Discretize = settings["Discretize"] +cutplanes.LookupTable.NumberOfTableValues = settings["NbColors"] +cutplanes.LookupTable.UseLogScale = settings["UseLogScale"] + +normal = get_normal_by_orientation(Orientation.YZ, radians(33), radians(44)) +bounds = get_bounds(med_reader) +pos = get_positions(2, normal, bounds, 0.1) +pos[1] = 0.5 +cutplanes.Input.SliceType.Normal = normal +cutplanes.Input.SliceOffsetValues = pos + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "CutPlanes.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(cutplanes) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_cutplanes = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_cutplanes.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_cutplanes.LookupTable.VectorMode +vector_component = recreated_cutplanes.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_cutplanes.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_cutplanes.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_cutplanes.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +# Normal +cur_normal = list(recreated_cutplanes.Input.SliceType.Normal) +if cur_normal != normal: + print "ERROR!!! Normal of cut planes is incorrect: ", cur_normal, " instead of ", normal + errors += 1 + +# Position +cur_pos = list(recreated_cutplanes.Input.SliceOffsetValues) +if cur_pos != pos: + print "ERROR!!! Positions of cut planes is incorrect: ", cur_pos, " instead of ", pos + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A3.py b/test/VisuPrs/dump_study/A3.py new file mode 100644 index 00000000..ffdb73eb --- /dev/null +++ b/test/VisuPrs/dump_study/A3.py @@ -0,0 +1,176 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A3 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal', "Scale": 0.333, "ColorArray": "", "ColorComponents": [0.111, 0.222, 0.333]} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. DeformedShape creation +med_field = "vitesse" + +deformedshape = DeformedShapeOnField(med_reader, EntityType.NODE, med_field, 1) + +# apply settings +deformedshape.Position = settings["Offset"] +deformedshape.LookupTable.VectorMode = settings["ScalarMode"][0] +deformedshape.LookupTable.VectorComponent = settings["ScalarMode"][1] +deformedshape.LookupTable.Discretize = settings["Discretize"] +deformedshape.LookupTable.NumberOfTableValues = settings["NbColors"] +deformedshape.LookupTable.UseLogScale = settings["UseLogScale"] + +deformedshape.Input.ScaleFactor = settings["Scale"] +deformedshape.ColorArrayName = '' +deformedshape.AmbientColor = settings["ColorComponents"] + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "DeformedShape.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(deformedshape) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_deformedshape = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_deformedshape.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_deformedshape.LookupTable.VectorMode +vector_component = recreated_deformedshape.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_deformedshape.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_deformedshape.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_deformedshape.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +# Scale factor +scale = recreated_deformedshape.Input.ScaleFactor +if abs(scale - settings["Scale"]) > tolerance: + print "ERROR!!! Scale of presentation is incorrect: ", scale, " instead of ", settings["Scale"] + errors += 1 + +# Color array name +array_name = recreated_deformedshape.ColorArrayName +if array_name != settings["ColorArray"]: + print "ERROR!!! Color array name of presentation is incorrect: ", array_name, " instead of ", settings["arrayName"] + errors += 1 + +# Color +color = list(recreated_deformedshape.AmbientColor) +if color != settings["ColorComponents"]: + print "ERROR!!! Color of presentation is incorrect: ", color, " instead of ", settings["ColorComponents"] + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A4.py b/test/VisuPrs/dump_study/A4.py new file mode 100644 index 00000000..ab50e6c1 --- /dev/null +++ b/test/VisuPrs/dump_study/A4.py @@ -0,0 +1,140 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A4 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 1), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation"} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. GaussPoints creation +med_field = "pression" + +gausspoints = GaussPointsOnField(med_reader, EntityType.CELL, med_field, 1) + +# apply settings +gausspoints.Position = settings["Offset"] +gausspoints.LookupTable.VectorMode = settings["ScalarMode"][0] +gausspoints.LookupTable.VectorComponent = settings["ScalarMode"][1] +gausspoints.LookupTable.Discretize = settings["Discretize"] +gausspoints.LookupTable.NumberOfTableValues = settings["NbColors"] + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "GaussPoints.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(gausspoints) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_gausspoints = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_gausspoints.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_gausspoints.LookupTable.VectorMode +vector_component = recreated_gausspoints.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_gausspoints.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_gausspoints.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A5.py b/test/VisuPrs/dump_study/A5.py new file mode 100644 index 00000000..a2578386 --- /dev/null +++ b/test/VisuPrs/dump_study/A5.py @@ -0,0 +1,194 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A5 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal', "ScaleFactor": 0.25, "NbContours": 4} + +# 1. TimeStamps.med import +file_path = datadir + "fra.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. Plot3D creation +med_field = "VITESSE" + +plot3d = Plot3DOnField(med_reader, EntityType.NODE, med_field, 1, is_contour=True) + +# apply settings +plot3d.Position = settings["Offset"] +plot3d.LookupTable.VectorMode = settings["ScalarMode"][0] +plot3d.LookupTable.VectorComponent = settings["ScalarMode"][1] +plot3d.LookupTable.Discretize = settings["Discretize"] +plot3d.LookupTable.NumberOfTableValues = settings["NbColors"] +plot3d.LookupTable.UseLogScale = settings["UseLogScale"] + +slice_filter = plot3d.Input.Input.Input.Input +normal = get_normal_by_orientation(Orientation.ZX, radians(22), radians(33)) +bounds = get_bounds(med_reader) +pos = get_positions(1, normal, bounds, 0.11) +slice_filter.SliceType.Normal = normal +slice_filter.SliceOffsetValues = pos + +plot3d.Input.Input.ScaleFactor = settings["ScaleFactor"] + +contour_filter = plot3d.Input +rgb_points = plot3d.LookupTable.RGBPoints +scalar_range = [rgb_points[0], rgb_points[4]] +surfaces = get_contours(scalar_range, settings["NbContours"]) +contour_filter.Isosurfaces = surfaces + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "Plot3D.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(plot3d) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_plot3d = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_plot3d.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_plot3d.LookupTable.VectorMode +vector_component = recreated_plot3d.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_plot3d.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_plot3d.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_plot3d.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +# Scale Factor +scale_factor = recreated_plot3d.Input.Input.ScaleFactor +if abs(scale_factor - settings["ScaleFactor"]) > tolerance: + print "ERROR!!! Scale factor of presentation is incorrect: ", scale_factor, " instead of ", settings["ScaleFactor"] + errors += 1 + +# Cutting plane +cur_slice_filter = recreated_plot3d.Input.Input.Input.Input + +cur_normal = list(cur_slice_filter.SliceType.Normal) +if cur_normal != normal: + print "ERROR!!! Normal of the cutting plane is incorrect: ", cur_normal, " instead of ", normal + errors += 1 + +cur_pos = list(cur_slice_filter.SliceOffsetValues) +if cur_pos != pos: + print "ERROR!!! Position of the cuttting plane is incorrect: ", cur_pos, " instead of ", pos + errors += 1 + +# Contours +cur_surfaces = list(recreated_plot3d.Input.Isosurfaces) +if cur_surfaces != surfaces: + print "ERROR!!! Contours is incorrect: ", cur_surfaces, " instead of ", surfaces + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A6.py b/test/VisuPrs/dump_study/A6.py new file mode 100644 index 00000000..eeda64aa --- /dev/null +++ b/test/VisuPrs/dump_study/A6.py @@ -0,0 +1,176 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A6 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal', "Scale": 0.12929} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None: + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. ScalarMapOnDeformedShape creation +med_field = "vitesse" + +prs = DeformedShapeAndScalarMapOnField(med_reader, EntityType.NODE, med_field, 1) + +# apply settings +prs.Position = settings["Offset"] +prs.LookupTable.VectorMode = settings["ScalarMode"][0] +prs.LookupTable.VectorComponent = settings["ScalarMode"][1] +prs.LookupTable.Discretize = settings["Discretize"] +prs.LookupTable.NumberOfTableValues = settings["NbColors"] +prs.LookupTable.UseLogScale = settings["UseLogScale"] + +prs.Input.ScaleFactor = settings["Scale"] +range_min = prs.LookupTable.RGBPoints[0] +range_max = prs.LookupTable.RGBPoints[4] + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "ScalarMapOnDeformedShape.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(prs) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_prs = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_prs.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_prs.LookupTable.VectorMode +vector_component = recreated_prs.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_prs.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_prs.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_prs.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +# Range +cur_range_min = recreated_prs.LookupTable.RGBPoints[0] +cur_range_max = recreated_prs.LookupTable.RGBPoints[4] + +if abs(cur_range_min - range_min) > tolerance: + print "ERROR!!! Minimum value of range of presentation is incorrect: ", cur_range_min, " instead of ", range_min + errors += 1 + +if abs(cur_range_max - range_max) > tolerance: + print "ERROR!!! Maximum value of range of presentation is incorrect: ", cur_range_max, " instead of ", range_max + errors += 1 + +# Scale factor +scale = recreated_prs.Input.ScaleFactor +if abs(scale - settings["Scale"]) > tolerance: + print "ERROR!!! Scale of presentation is incorrect: ", scale, " instead of ", settings["Scale"] + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A7.py b/test/VisuPrs/dump_study/A7.py new file mode 100644 index 00000000..6eb2f251 --- /dev/null +++ b/test/VisuPrs/dump_study/A7.py @@ -0,0 +1,171 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A7 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +# StreamLines settings +settings = {'name': 'myStreamLines', + 'IntegrationDirection': 'FORWARD', + 'InitialStepLength': 0.009, + 'IntegrationStepUnit': 'Length', + 'IntegratorType': 'Runge-Kutta 4-5', + 'MaximumError': 1.45e-06, + 'MinimumStepLength': 0.0079917, + 'MaximumStepLength': 0.008, + 'MaximumSteps': 475, + 'MaximumStreamlineLength': 1.185, + 'SeedType.Center': [0.1088, 0.03254, 0.431], + 'SeedType.NumberOfPoints': 33, + 'SeedType.Radius': 0.0035} + +# errors counter +errors = 0 + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. StreamLines creation +field_name = "vitesse" + +source = MergeBlocks(med_reader) +calc = get_add_component_calc(source, EntityType.NODE, field_name) +vector_array = calc.ResultArrayName +calc.UpdatePipeline() +source = calc +stream = pv.StreamTracer(source) + +# 3. Apply settings +RenameSource(settings['name'], stream) +stream.IntegrationDirection = settings['IntegrationDirection'] +stream.InitialStepLength = settings['InitialStepLength'] +stream.IntegrationStepUnit = settings['IntegrationStepUnit'] +stream.IntegratorType = settings['IntegratorType'] +stream.MaximumError = settings['MaximumError'] +stream.MinimumStepLength = settings['MinimumStepLength'] +stream.MaximumStepLength = settings['MaximumStepLength'] +stream.MaximumSteps = settings['MaximumSteps'] +stream.MaximumStreamlineLength = settings['MaximumStreamlineLength'] +stream.SeedType.Center = settings['SeedType.Center'] +stream.SeedType.NumberOfPoints = settings['SeedType.NumberOfPoints'] +stream.SeedType.Radius = settings['SeedType.Radius'] + +# 4. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "StreamLines.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects +delete_with_inputs(stream) + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Find the recreated StreamTracer object +recreated_stream = FindSource(settings['name']) +if recreated_stream is None: + raise RuntimeError, "There is no StreamLines in the study (must be created by executed python script)!!!" + +print settings['name'] + " was found!!!" + +# 7. Check settings + +# IntegrationDirection +param = stream.IntegrationDirection +if param != settings['IntegrationDirection']: + print "ERROR!!! IntegrationDirection of presentation is incorrect: ", param, " instead of ", settings["IntegrationDirection"] + errors += 1 + +# InitialStepLength +param = stream.InitialStepLength +if param != settings['InitialStepLength']: + print "ERROR!!! InitialStepLength of presentation is incorrect: ", param, " instead of ", settings["InitialStepLength"] + errors += 1 + +# IntegrationStepUnit +param = stream.IntegrationStepUnit +if param != settings['IntegrationStepUnit']: + print "ERROR!!! IntegrationStepUnit of presentation is incorrect: ", param, " instead of ", settings["IntegrationStepUnit"] + errors += 1 + +# IntegratorType +param = stream.IntegratorType +if param != settings['IntegratorType']: + print "ERROR!!! IntegratorType of presentation is incorrect: ", param, " instead of ", settings["IntegratorType"] + errors += 1 + +# MaximumError +param = stream.MaximumError +if param != settings['MaximumError']: + print "ERROR!!! MaximumError of presentation is incorrect: ", param, " instead of ", settings["MaximumError"] + errors += 1 + +# MinimumStepLength +param = stream.MinimumStepLength +if param != settings['MinimumStepLength']: + print "ERROR!!! MinimumStepLength of presentation is incorrect: ", param, " instead of ", settings["MinimumStepLength"] + errors += 1 + +# MaximumStepLength +param = stream.MaximumStepLength +if param != settings['MaximumStepLength']: + print "ERROR!!! MaximumStepLength of presentation is incorrect: ", param, " instead of ", settings["MaximumStepLength"] + errors += 1 + +# MaximumSteps +param = stream.MaximumSteps +if param != settings['MaximumSteps']: + print "ERROR!!! MaximumSteps of presentation is incorrect: ", param, " instead of ", settings["MaximumSteps"] + errors += 1 + +# MaximumStreamlineLength +param = stream.MaximumStreamlineLength +if param != settings['MaximumStreamlineLength']: + print "ERROR!!! MaximumStreamlineLength of presentation is incorrect: ", param, " instead of ", settings["MaximumStreamlineLength"] + errors += 1 + +# SeedType.Center +param = list(stream.SeedType.Center) +if param != settings['SeedType.Center']: + print "ERROR!!! SeedType.Center of presentation is incorrect: ", param, " instead of ", settings["SeedType.Center"] + errors += 1 + +# SeedType.NumberOfPoints +param = stream.SeedType.NumberOfPoints +if param != settings['SeedType.NumberOfPoints']: + print "ERROR!!! SeedType.NumberOfPoints of presentation is incorrect: ", param, " instead of ", settings["SeedType.NumberOfPoints"] + errors += 1 + +# SeedType.Radius +param = stream.SeedType.Radius +if param != settings['SeedType.Radius']: + print "ERROR!!! SeedType.Radius of presentation is incorrect: ", param, " instead of ", settings["SeedType.Radius"] + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A8.py b/test/VisuPrs/dump_study/A8.py new file mode 100644 index 00000000..807c58d4 --- /dev/null +++ b/test/VisuPrs/dump_study/A8.py @@ -0,0 +1,200 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A3 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal', "Scale": 0.333, "ColorArray": "", "ColorComponents": [0.111, 0.222, 0.333], "LineWidth": 2, "GlyphType": 'Cone', "GlyphPos": [-0.5, 0.0, 0.0]} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. Vectors creation +med_field = "vitesse" + +vectors = VectorsOnField(med_reader, EntityType.NODE, med_field, 1) + +# apply settings +vectors.Position = settings["Offset"] +vectors.LookupTable.VectorMode = settings["ScalarMode"][0] +vectors.LookupTable.VectorComponent = settings["ScalarMode"][1] +vectors.LookupTable.Discretize = settings["Discretize"] +vectors.LookupTable.NumberOfTableValues = settings["NbColors"] +vectors.LookupTable.UseLogScale = settings["UseLogScale"] + +vectors.Input.SetScaleFactor = settings["Scale"] +vectors.ColorArrayName = '' +vectors.AmbientColor = settings["ColorComponents"] + +vectors.LineWidth = settings["LineWidth"] +vectors.Input.GlyphType = settings["GlyphType"] +vectors.Input.GlyphType.Center = settings["GlyphPos"] + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +cone_glyth_type = type(vectors.Input.GlyphType) + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "Vectors.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(vectors) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_vectors = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_vectors.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_vectors.LookupTable.VectorMode +vector_component = recreated_vectors.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_vectors.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_vectors.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_vectors.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +# Scale factor +scale = recreated_vectors.Input.SetScaleFactor +if abs(scale - settings["Scale"]) > tolerance: + print "ERROR!!! Scale of presentation is incorrect: ", scale, " instead of ", settings["Scale"] + errors += 1 + +# Color array name +array_name = recreated_vectors.ColorArrayName +if array_name != settings["ColorArray"]: + print "ERROR!!! Color array name of presentation is incorrect: ", array_name, " instead of ", settings["arrayName"] + errors += 1 + +# Color +color = list(recreated_vectors.AmbientColor) +if color != settings["ColorComponents"]: + print "ERROR!!! Color of presentation is incorrect: ", color, " instead of ", settings["ColorComponents"] + errors += 1 + +# Line width +line_width = recreated_vectors.LineWidth +if abs(line_width - settings["LineWidth"]) > tolerance: + print "ERROR!!! Line width of presentation is incorrect: ", line_width, " instead of ", settings["LineWidth"] + errors += 1 + +# Glyph type +glyph_type = type(recreated_vectors.Input.GlyphType) +if glyph_type != cone_glyth_type: + print "ERROR!!! Glyph type is incorrect: ", glyph_type, " instead of ", cone_glyth_type + errors += 1 + +# Glyph position +glyph_position = list(recreated_vectors.Input.GlyphType.Center) +if glyph_position != settings["GlyphPos"]: + print "ERROR!!! Glyph position is incorrect: ", glyph_position, " instead of ", settings["GlyphPos"] + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/A9.py b/test/VisuPrs/dump_study/A9.py new file mode 100644 index 00000000..33ab8312 --- /dev/null +++ b/test/VisuPrs/dump_study/A9.py @@ -0,0 +1,195 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/A2 case + +from paravistest import datadir, delete_with_inputs +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +settings = {"Offset": [0.0001, 0.0002, 0], "ScalarMode": ("Component", 2), "Position": [0.1, 0.2], "Size": [0.15, 0.25], "Discretize": 1, "NbColors": 44, "NbLabels": 22, "Title": "My presentation", "UseLogScale": 1, "Orientation": 'Horizontal', "Orientation_BasePlane": [Orientation.ZX, 22, 33], "Orientation_CuttingPlanes": [Orientation.YZ, 44, 55], "Displacement": 0.1, "Displacement2": 0.2, "BasePlane_Position": 0.1, "NbLines": 3} + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. CutLines creation +med_field = "vitesse" + +nb_lines = settings["NbLines"] +orient1 = settings["Orientation_BasePlane"][0] +base_ang1 = settings["Orientation_BasePlane"][1] +base_ang2 = settings["Orientation_BasePlane"][2] +orient2 = settings["Orientation_CuttingPlanes"][0] +cut_ang1 = settings["Orientation_CuttingPlanes"][1] +cut_ang2 = settings["Orientation_CuttingPlanes"][2] +d1 = settings["Displacement"] +d2 = settings["Displacement2"] + +cutlines = CutLinesOnField(med_reader, EntityType.NODE, med_field, 1, nb_lines, orient1, base_ang1, base_ang2, orient2, cut_ang1, cut_ang2, d1, d2) + +# apply settings +cutlines.Position = settings["Offset"] +cutlines.LookupTable.VectorMode = settings["ScalarMode"][0] +cutlines.LookupTable.VectorComponent = settings["ScalarMode"][1] +cutlines.LookupTable.Discretize = settings["Discretize"] +cutlines.LookupTable.NumberOfTableValues = settings["NbColors"] +cutlines.LookupTable.UseLogScale = settings["UseLogScale"] + +cutlines.Input.Input.SliceOffsetValues[0] = settings["BasePlane_Position"] + +normal1 = list(cutlines.Input.Input.SliceType.Normal) +pos1 = list(cutlines.Input.Input.SliceOffsetValues) +normal2 = list(cutlines.Input.SliceType.Normal) +pos2 = list(cutlines.Input.SliceOffsetValues) + +bar = get_bar() +bar.Position = settings["Position"] +bar.Position2 = settings["Size"] +bar.NumberOfLabels = settings["NbLabels"] +bar.Title = settings["Title"] +bar.Orientation = settings["Orientation"] + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "CutLines.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +delete_with_inputs(cutlines) +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Checking of the settings done before dump +recreated_bar = view.Representations[0] +recreated_cutlines = view.Representations[1] + +errors = 0 +tolerance = 1e-05 + +# Offset +offset = recreated_cutlines.Position +for i in range(len(settings["Offset"])): + if abs(offset[i] - settings["Offset"][i]) > tolerance: + print "ERROR!!! Offset value with ", i, " index is incorrect: ", offset[i], " instead of ", settings["Offset"][i] + errors += 1 + +# Scalar mode +vector_mode = recreated_cutlines.LookupTable.VectorMode +vector_component = recreated_cutlines.LookupTable.VectorComponent + +if vector_mode != settings["ScalarMode"][0]: + print "ERROR!!! Vector mode value is incorrect: ", vector_mode, " instead of ", settings["ScalarMode"][0] + errors += 1 +if vector_component != settings["ScalarMode"][1]: + print "ERROR!!! Vector component value is incorrect: ", vector_component, " instead of ", settings["ScalarMode"][1] + errors += 1 + +# Position of scalar bar +pos_x = recreated_bar.Position[0] +pos_y = recreated_bar.Position[1] + +if abs(pos_x - settings["Position"][0]) > tolerance: + print "ERROR!!! X coordinate of position of scalar bar is incorrect: ", pos_x, " instead of ", settings["Position"][0] + errors += 1 +if abs(pos_y - settings["Position"][1]) > tolerance: + print "ERROR!!! Y coordinate of position of scalar bar is incorrect: ", pos_y, " instead of ", settings["Position"][1] + errors += 1 + +# Size of scalar bar +width = recreated_bar.Position2[0] +height = recreated_bar.Position2[1] + +if abs(width - settings["Size"][0]) > tolerance: + print "ERROR!!! Width of scalar bar is incorrect: ", width, " instead of ", settings["Size"][0] + errors += 1 +if abs(height - settings["Size"][1]) > tolerance: + print "ERROR!!! Height of scalar bar is incorrect: ", height, " instead of ", settings["Size"][1] + errors += 1 + +# Discretize +discretize = recreated_cutlines.LookupTable.Discretize +if discretize != settings["Discretize"]: + print "ERROR!!! Discretize property is incorrect: ", discretize, " instead of ", settings["Discretize"] + errors += 1 + +# Number of colors +nb_colors = recreated_cutlines.LookupTable.NumberOfTableValues +if nb_colors != settings["NbColors"]: + print "ERROR!!! Number of colors of scalar bar is incorrect: ", nb_colors, " instead of ", settings["NbColors"] + errors += 1 + +# Number of labels +nb_labels = recreated_bar.NumberOfLabels +if nb_labels != settings["NbLabels"]: + print "ERROR!!! Number of labels of scalar bar is incorrect: ", nb_labels, " instead of ", settings["NbLabels"] + errors += 1 + +# Title +title = recreated_bar.Title +if title != settings["Title"]: + print "ERROR!!! Title of presentation is incorrect: ", title, " instead of ", settings["Title"] + errors += 1 + +# Scaling +use_log_scale = recreated_cutlines.LookupTable.UseLogScale +if use_log_scale != settings["UseLogScale"]: + print "ERROR!!! Scaling of presentation is incorrect: ", use_log_scale, " instead of ", settings["UseLogScale"] + errors += 1 + +# Bar Orientation +orientation = recreated_bar.Orientation +if orientation != settings["Orientation"]: + print "ERROR!!! Orientation of scalar bar is incorrect: ", orientation, " instead of ", settings["Orientation"] + errors += 1 + +# Base Plane Normal +cur_normal = list(recreated_cutlines.Input.Input.SliceType.Normal) +if cur_normal != normal1: + print "ERROR!!! Normal of base plane is incorrect: ", cur_normal, " instead of ", normal1 + errors += 1 + +# Base Plane Position +cur_pos = list(recreated_cutlines.Input.Input.SliceOffsetValues) +if cur_pos != pos1: + print "ERROR!!! Position of base plane is incorrect: ", cur_pos, " instead of ", pos1 + errors += 1 + +# Base Plane Normal +cur_normal = list(recreated_cutlines.Input.SliceType.Normal) +if cur_normal != normal2: + print "ERROR!!! Normal of cutting planes is incorrect: ", cur_normal, " instead of ", normal2 + errors += 1 + +# Cutting Planes Position +cur_pos = list(recreated_cutlines.Input.SliceOffsetValues) +if cur_pos != pos2: + print "ERROR!!! Positions of cutting planes are incorrect: ", cur_pos, " instead of ", pos2 + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/B0.py b/test/VisuPrs/dump_study/B0.py new file mode 100644 index 00000000..9ea5c943 --- /dev/null +++ b/test/VisuPrs/dump_study/B0.py @@ -0,0 +1,84 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/B0 case + +from paravistest import datadir +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +# 1. TimeStamps.med import +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = GetActiveSource() +if med_reader is None : + raise RuntimeError, "TimeStamps.med wasn't imported..." + +# 2. Presentations creation +errors = 0 +prs_names = ["ScalarMap", "IsoSurfaces", "CutPlanes", "CutLines", "DeformedShape", "Vectors", "StreamLines", "Plot3D", "DeformedShapeAndScalarMap", "GaussPoints"] +prs_list = [] + +med_field = "vitesse" + +for name in prs_names: + print "Creation of ", name, " presentation..." + if name == "GaussPoints": + prs = GaussPointsOnField(med_reader, EntityType.CELL, "pression", 1) + pass + else: + prs = eval(name + "OnField(med_reader, EntityType.NODE, med_field, 1)") + if prs is None: + print "ERROR!!! ", name," presentation wasn't created..." + errors += 1 + else: + RenameSource(name, prs.Input) + prs_list.append(prs) + +# 3. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "AllPresentations.py") +SaveTrace( path_to_save ) + +# 4. Delete the created objects, recreate the view +source_list = GetSources().values() +for source in source_list: + Delete(source) + +Delete(GetActiveView()) +view = CreateRenderView() + +# 5. Execution of the created script +execfile(path_to_save) + +# 6. Check the restored objects +for name in prs_names: + source = FindSource(name) + if source is None: + print "There is no ", name, " in the study (must be created by executed python script)!!!" + errors += 1 + else: + print name + " was found..." + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." + + diff --git a/test/VisuPrs/dump_study/B1.py b/test/VisuPrs/dump_study/B1.py new file mode 100644 index 00000000..d2a1ac21 --- /dev/null +++ b/test/VisuPrs/dump_study/B1.py @@ -0,0 +1,72 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/B1 case + +from paravistest import tablesdir +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +# Import table from file +xls_file = tablesdir + "tables_test.xls" +table_reader = TableReader(FileName=xls_file) +if table_reader is None: + raise RuntimeError, "Table was not imported..." + +table_reader.UpdatePipeline() +RenameSource("tables_test.xls", table_reader) + +# 2. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "table.py") +SaveTrace(path_to_save) + +# 3. Delete the created objects +Delete(table_reader) + +# 4. Execution of the created script +execfile(path_to_save) + +# 5. Check the restored table +restored_obj = FindSource("tables_test.xls") +if restored_obj is None: + raise RuntimeError, "There is no tables_test.xls table in the study (must be created by executed python script)!!!" + +available_tables = restored_obj.GetPropertyValue("AvailableTables") + +tables = ["Table:0", "Table toto 1", "sinus"] +errors = 0 +count_not=0 + +for name in tables: + if name not in available_tables: + count_not += 1 + print "ERROR!!! Table with ", name, " name was not found" + errors += 1 + else: + print "\"" + name + "\" table was found..." + +if count_not > 0: + print "ERROR!!! "+str(count_not)+" table(s) was(were) not found!!!" + errors += 1 +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." + diff --git a/test/VisuPrs/dump_study/B3.py b/test/VisuPrs/dump_study/B3.py new file mode 100644 index 00000000..dca1a19b --- /dev/null +++ b/test/VisuPrs/dump_study/B3.py @@ -0,0 +1,95 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/B3 case + +import paravistest +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +# 1. Table creation +title = "My Table" +errors = 0 + +table_title = "My Table" + +# define script for table creation +table_script = """ +import math + + +# Get table output +table = self.GetTableOutput() + +# Create first column +col1 = vtk.vtkDoubleArray() +col1.SetName('First Column') +col1.InsertNextValue(1.11) +col1.InsertNextValue(4.44) +table.AddColumn(col1) + +# Create second column +col2 = vtk.vtkDoubleArray() +col2.SetName('Second Column') +col2.InsertNextValue(2.22) +col2.InsertNextValue(5.55) +table.AddColumn(col2) + +# Create third column +col3 = vtk.vtkDoubleArray() +col3.SetName('Third Column') +col3.InsertNextValue(3.33) +col3.InsertNextValue(6.66) +table.AddColumn(col3) +""" + +# creating programmable source for the table +table = ProgrammableSource() +table.OutputDataSetType = 'vtkTable' +table.Script = table_script +RenameSource(title, table) +table.UpdatePipeline() + +orig_script = table.Script + +# 2. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "table.py") +SaveTrace(path_to_save) + +# 3. Delete the table +Delete(table) + +# 4. Execution of the created script +execfile(path_to_save) + +# 5. Check the restored table +table = FindSource(title) +if table is None: + raise RuntimeError, "There is no table in the study (must be created by executed python script)!!!" + +if table.Script != orig_script: + print "ERROR!!! The script value is incorrect:" + print table.Script + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/B4.py b/test/VisuPrs/dump_study/B4.py new file mode 100644 index 00000000..81ce4221 --- /dev/null +++ b/test/VisuPrs/dump_study/B4.py @@ -0,0 +1,95 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/B4 case + +import paravistest +from presentations import * +import paravis +from pvsimple import * + +my_paravis = paravis.myParavis + +# 1. Table creation +title = "My Table" +errors = 0 + +table_title = "My Table" + +# define script for table creation +table_script = """ +import math + + +# Get table output +table = self.GetTableOutput() + +# Create first column +col1 = vtk.vtkIntArray() +col1.SetName('First Column') +col1.InsertNextValue(1) +col1.InsertNextValue(4) +table.AddColumn(col1) + +# Create second column +col2 = vtk.vtkDoubleArray() +col2.SetName('Second Column') +col2.InsertNextValue(2) +col2.InsertNextValue(5) +table.AddColumn(col2) + +# Create third column +col3 = vtk.vtkDoubleArray() +col3.SetName('Third Column') +col3.InsertNextValue(3) +col3.InsertNextValue(6) +table.AddColumn(col3) +""" + +# creating programmable source for the table +table = ProgrammableSource() +table.OutputDataSetType = 'vtkTable' +table.Script = table_script +RenameSource(title, table) +table.UpdatePipeline() + +orig_script = table.Script + +# 2. Dump Study +path_to_save = os.path.join(os.getenv("HOME"), "table.py") +SaveTrace(path_to_save) + +# 3. Delete the table +Delete(table) + +# 4. Execution of the created script +execfile(path_to_save) + +# 5. Check the restored table +table = FindSource(title) +if table is None: + raise RuntimeError, "There is no table in the study (must be created by executed python script)!!!" + +if table.Script != orig_script: + print "ERROR!!! The script value is incorrect:" + print table.Script + errors += 1 + +if errors > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/dump_study/B5.py b/test/VisuPrs/dump_study/B5.py new file mode 100644 index 00000000..c5e9ecd6 --- /dev/null +++ b/test/VisuPrs/dump_study/B5.py @@ -0,0 +1,66 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/dump_study/B5 case + +import os +import sys +import salome + +class SalomeSession(object): + def __init__(self): + import runSalome + import sys + sys.argv += ["--show-desktop=1"] + sys.argv += ["--splash=0"] + sys.argv += ["--modules=MED,VISU,PARAVIS"] + clt, d = runSalome.main() + port = d['port'] + self.port = port + return + pass + + +# 1. Opening saved study + +# run Salome +salome_session = SalomeSession() +salome.salome_init() + +file_name = os.path.join(os.path.dirname(sys.argv[0]), "test1.hdf") +opened_study = salome.myStudyManager.Open(file_name) +salome.myStudy = opened_study + +# 2. Load PARAVIS module +import paravis + +# 3. Find IsoSurfaces +from pvsimple import * +obj = FindSource('IsoSurfaces') +if obj is None: + print "FAILED: can't find IsoSurfaces!!!" + +# 4. Remove med reader object and all other sources +for obj in GetSources().values(): + Delete(obj) + +# 5. Check results +obj = FindSource('ScalarMap') +if obj is not None: + print "FAILED: ScalarMap was not deleted!!!" diff --git a/test/VisuPrs/dump_study/CMakeLists.txt b/test/VisuPrs/dump_study/CMakeLists.txt new file mode 100644 index 00000000..9a0c7ded --- /dev/null +++ b/test/VisuPrs/dump_study/CMakeLists.txt @@ -0,0 +1,42 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +IF (PYTHON_EXECUTABLE) + FOREACH ( tfile + A0 + A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + B0 + B1 + B3 + B4 + B5 + ) + SET(TIMEOUT 10000) + ADD_TEST(DUMPSTUDY_${tfile} ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/test/VisuPrs/Util/paravistesthelper.py ${TIMEOUT} ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}.py ${PARAVIS_TEST_OUTPUT_DIR}) + SET_TESTS_PROPERTIES(DUMPSTUDY_${tfile} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED" TIMEOUT ${TIMEOUT}) + ENDFOREACH( tfile ) +ENDIF (PYTHON_EXECUTABLE) diff --git a/test/VisuPrs/dump_study/test1.hdf b/test/VisuPrs/dump_study/test1.hdf new file mode 100644 index 0000000000000000000000000000000000000000..5820a745110b3ca184e2490e5f8ead2c14777e61 GIT binary patch literal 922911 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

|J*Hq%s)IR!5sV+b@h@*XC=Ky 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 literal 0 HcmV?d00001 diff --git a/test/VisuPrs/imps/A1.py b/test/VisuPrs/imps/A1.py new file mode 100644 index 00000000..17e8808e --- /dev/null +++ b/test/VisuPrs/imps/A1.py @@ -0,0 +1,115 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/A1 case + +import sys +import os +from paravistest import datadir, pictureext, get_picture_dir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +picturedir = get_picture_dir(sys.argv[1], "imps/A1") + + +def set_prs_colored(prs, proxy, entity, field_name, vector_mode, timestamp_nb): + # Get time value + time_value = get_time(proxy, timestamp_nb) + + # Check vector mode + nb_components = get_nb_components(proxy, entity, field_name) + check_vector_mode(vector_mode, nb_components) + + # Get lookup table + lookup_table = get_lookup_table(field_name, nb_components, vector_mode) + + # Set field range + data_range = get_data_range(proxy, entity, + field_name, vector_mode) + lookup_table.LockScalarRange = 1 + lookup_table.RGBPoints = [data_range[0], 0, 0, 1, data_range[1], 1, 0, 0] + + # Set properties + prs.ColorAttributeType = EntityType.get_pvtype(entity) + prs.ColorArrayName = field_name + prs.LookupTable = lookup_table + + # Add scalar bar + add_scalar_bar(field_name, nb_components, + vector_mode, lookup_table, time_value) + + +# 1. Import of the "Penta6.med" file +print 'Import "Penta6.med" file........', +file_path = datadir + "Penta6.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() +if med_reader is None: + raise RuntimeError, "Penta6.med was not imported!!!" +else: + print "OK" + +view = pvsimple.GetRenderView() + +# 2. Creation of "CutPlanes" presentation, based on time stamp of "scalar field" field +print 'Creation of "CutPlanes" presentation, based on time stamp of "scalar field" field....' +cutplanes = CutPlanesOnField(med_reader, EntityType.CELL, "scalar_field", 1) +if cutplanes is None : + raise RuntimeError, "Presentation is None!!!" +else: + print "OK" + +print "Setting of deformation:" +warp_vector = pvsimple.WarpByVector(cutplanes.Input) +warp_vector.Vectors = ["vectoriel_field"] +warp_vector.ScaleFactor = 5.0 + +print "Got scale : ", warp_vector.ScaleFactor +print "Got field name: ", warp_vector.Vectors + +presentation = pvsimple.GetRepresentation(warp_vector) +set_prs_colored(presentation, med_reader, EntityType.CELL, "scalar_field", 'Magnitude', 1) + +pic_path = os.path.join(picturedir, "deformed_cut_planes_scalar" + "." + pictureext) +process_prs_for_test(presentation, view, pic_path) + +# 3. Creation of "CutPlanes" presentation, based on time stamp of "vectoriel field" field +print 'Creation of "CutPlanes" presentation, based on time stamp of "vectoriel field" field....' +cutplanes = CutPlanesOnField(med_reader, EntityType.CELL, "vectoriel_field", 1) + +if cutplanes is None : + raise RuntimeError, "Presentation is None!!!" +else: + print "OK" + +print "Setting of deformation:" +warp_vector = pvsimple.WarpByVector(cutplanes.Input) +warp_vector.Vectors = ["vectoriel_field"] +warp_vector.ScaleFactor = 5.0 + +print "Got scale : ", warp_vector.ScaleFactor +print "Got field name: ", warp_vector.Vectors + +presentation = pvsimple.GetRepresentation(warp_vector) +set_prs_colored(presentation, med_reader, EntityType.CELL, "vectoriel_field", 'Magnitude', 1) + +pic_path = os.path.join(picturedir, "deformed_cut_planes_vectorial" + "." + pictureext) +process_prs_for_test(presentation, view, pic_path) diff --git a/test/VisuPrs/imps/A2.py b/test/VisuPrs/imps/A2.py new file mode 100644 index 00000000..38c3cc63 --- /dev/null +++ b/test/VisuPrs/imps/A2.py @@ -0,0 +1,80 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/A2 case + +import time +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +sleep_delay = 2 + +med_file = "pointe.med" +entity = EntityType.NODE +field_name = "fieldnodedouble"; +timestamp = 1 + +# 1. Import MED file +print 'Import "pointe.med"....................', +med_file_path = datadir + med_file +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Create Scalar Map +print "Build Scalar Map presentation" +scalar_map = ScalarMapOnField(med_reader, entity, field_name, timestamp) + +display_only(scalar_map) +reset_view() +time.sleep(sleep_delay) + +# 3. Set representation type to Point +print "Set representation type to Point" +scalar_map.Representation = 'Points' +pvsimple.Render() +time.sleep(sleep_delay) + +# 4. Set representation type to Point Sprite +print "Set Point Sprite representation" +scalar_map.Representation = 'Point Sprite' + +data_range = get_data_range(med_reader, entity, + field_name, 'Magnitude') +mult = abs(0.1 / data_range[1]) +scalar_map.RadiusScalarRange = data_range +scalar_map.RadiusTransferFunctionEnabled = 1 +scalar_map.RadiusMode = 'Scalar' +scalar_map.RadiusArray = ['POINTS', field_name] +scalar_map.RadiusTransferFunctionMode = 'Table' +scalar_map.RadiusScalarRange = data_range +scalar_map.RadiusUseScalarRange = 1 +scalar_map.RadiusIsProportional = 1 +scalar_map.RadiusProportionalFactor = mult + +pvsimple.Render() + + diff --git a/test/VisuPrs/imps/A3.py b/test/VisuPrs/imps/A3.py new file mode 100644 index 00000000..692f5a94 --- /dev/null +++ b/test/VisuPrs/imps/A3.py @@ -0,0 +1,56 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/A3 case + +from paravistest import datadir, compare_lists +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +error =0 + +# Import MED file +file_path = datadir + "fra.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "Error!!! med file is not imported" + error = error+1 + +# Create Scalar Map +scalarmap = ScalarMapOnField(med_reader, EntityType.NODE, 'TAUX_DE_VIDE', 1); +if scalarmap is None: + print "Error!!! ScalarMap is not created" + error = error+1 +display_only(scalarmap) + +# Check Scalar bar default properties +bar = get_bar() +if bar.Orientation != 'Vertical': + print "Error!!! Default Scalar Bar Orientation is wrong - not vertical but ", scalarmap.Orientation + error = error+1 + +error = error + compare_lists(bar.Position, [0.87, 0.25]) +error = error + compare_lists(bar.Position2, [0.13, 0.5]) + +if error > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/imps/A4.py b/test/VisuPrs/imps/A4.py new file mode 100644 index 00000000..05aa8f27 --- /dev/null +++ b/test/VisuPrs/imps/A4.py @@ -0,0 +1,67 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/A4 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +error = 0 + +# Import MED file +med_file_path = datadir + "fra.med" +my_paravis.ImportFile(med_file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "Error!!! med file is not imported" + error = error+1 + +# Create Mesh +mesh_name = 'LE_VOLUME' +cell_entity = EntityType.CELL +mesh = MeshOnEntity(med_reader, mesh_name, cell_entity) +if mesh is None: + print "Error!!! Mesh is not created" + error = error+1 + +mesh.Visibility = 1 +reset_view() + +# Use shrink filter +mesh_shrinked = pvsimple.Shrink(med_reader) +mesh_shrinked.ShrinkFactor = 0.75 +mesh_shrinked = pvsimple.GetRepresentation(mesh_shrinked) + +if mesh_shrinked is None: + print "Error!!! Mesh is not shrinked" + error = error+1 + +# Create Scalar Map +scalarmap = ScalarMapOnField(med_reader, EntityType.NODE, 'TAUX_DE_VIDE', 1); +if scalarmap is None: + print "Error!!! ScalarMap is not created" + error = error+1 +display_only(scalarmap) + +if error > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/imps/A6.py b/test/VisuPrs/imps/A6.py new file mode 100644 index 00000000..af83e6f9 --- /dev/null +++ b/test/VisuPrs/imps/A6.py @@ -0,0 +1,50 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/A6 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis +error =0 + +# Import MED file +file_path = datadir + "Bug891_Box.resu.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "Error!!! med file is not imported" + error = error+1 + +# Create Scalar Map +scalarmap = ScalarMapOnField(med_reader, EntityType.NODE, 'RESUMECAEQUI_ELGA_SIGM', 1) +if scalarmap is None: + print "Error!!! ScalarMap is not created" + error = error+1 + +scalarmap.Visibility = 1 +reset_view() + +if error > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." + diff --git a/test/VisuPrs/imps/A9.py b/test/VisuPrs/imps/A9.py new file mode 100644 index 00000000..8fbdb98c --- /dev/null +++ b/test/VisuPrs/imps/A9.py @@ -0,0 +1,40 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/A9 case + +from time import sleep + +from paravistest import tablesdir +from presentations import * +import paravis +import pvsimple + +# Import CSV table +file_path = tablesdir + "testCsvTable.csv" +table = pvsimple.CSVReader(FileName=file_path) + +# Show +view = pvsimple.CreateXYPlotView() + +xy_rep = pvsimple.Show(table) +xy_rep.AttributeType = 'Row Data' +xy_rep.UseIndexForXAxis = 0 +xy_rep.XArrayName = 'x' +xy_rep.SeriesVisibility = ['x', '0'] diff --git a/test/VisuPrs/imps/B1.py b/test/VisuPrs/imps/B1.py new file mode 100644 index 00000000..ee45176d --- /dev/null +++ b/test/VisuPrs/imps/B1.py @@ -0,0 +1,51 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/B1 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# Import MED file +file_path = datadir + "fra.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +entity = EntityType.NODE +field_name = "VITESSE" +timestamp_id = 1 + +# Create Scalar Map +scalarmap = ScalarMapOnField(med_reader, entity, field_name, timestamp_id) + +scalarmap.Visibility = 1 +reset_view() + +# Set representation type to Point Sprite +scalarmap.Representation = 'Point Sprite' + +# Set texture +scalarmap.RenderMode = 'Texture' +scalarmap.Texture = [os.path.join(datadir, "Textures", "texture1.dat")] + +pvsimple.Render() diff --git a/test/VisuPrs/imps/B2.py b/test/VisuPrs/imps/B2.py new file mode 100644 index 00000000..da7074ea --- /dev/null +++ b/test/VisuPrs/imps/B2.py @@ -0,0 +1,60 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/imps/B2 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +print 'Import "ResOK_0000.med"...............', + +file_path = datadir + "ResOK_0000.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + raise RuntimeError, "import failed" +else: + print "OK" + +# 2. Get some information on the MED file +fields_on_nodes = med_reader.PointArrays +print "Field names on NODE: ", fields_on_nodes +is_ok = len(fields_on_nodes) == 2 and ("temperature" in fields_on_nodes) and ("vitesse" in fields_on_nodes) +if not is_ok: + raise RuntimeError, "=> Error in PointArrays property" + +fields_on_cells = med_reader.CellArrays +print "Field names on CELL: ", fields_on_cells +is_ok = len(fields_on_cells) == 1 and ("pression" in fields_on_cells) +if not is_ok: + raise RuntimeError, "=> Error in CellArrays property" + +timestamps = med_reader.TimestepValues.GetData() +print "timestamps: ", timestamps +if timestamps != [17.030882013694594]: + raise RuntimeError, "=> Wrong TimestepValues property value" + + + diff --git a/test/VisuPrs/imps/CMakeLists.txt b/test/VisuPrs/imps/CMakeLists.txt new file mode 100644 index 00000000..14a99420 --- /dev/null +++ b/test/VisuPrs/imps/CMakeLists.txt @@ -0,0 +1,35 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +IF (PYTHON_EXECUTABLE) + FOREACH ( tfile + A1 + A2 + A3 + A4 + A6 + A9 + B1 + B2 + ) + SET(TIMEOUT 10000) + ADD_TEST(IMPS_${tfile} ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/test/VisuPrs/Util/paravistesthelper.py ${TIMEOUT} ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}.py ${PARAVIS_TEST_OUTPUT_DIR}) + SET_TESTS_PROPERTIES(IMPS_${tfile} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED" TIMEOUT ${TIMEOUT}) + ENDFOREACH( tfile ) +ENDIF (PYTHON_EXECUTABLE) diff --git a/test/VisuPrs/united/A1.py b/test/VisuPrs/united/A1.py new file mode 100644 index 00000000..a9b1bf39 --- /dev/null +++ b/test/VisuPrs/united/A1.py @@ -0,0 +1,204 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/united/A1 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +# 1. Import MED file +print "**** Step1: Import MED file" + +print 'Import "ResOK_0000.med"...', +file_path = datadir + "ResOK_0000.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +print 'Get view...................', +view = pvsimple.GetRenderView() +if view is None: + print "FAILED" +else: + reset_view(view) + print "OK" + +cell_entity = EntityType.CELL +node_entity = EntityType.NODE + +# 2. Displaying vector field +print "**** Step2: Displaying vector field" + +print "Creating Scalar Map.......", +scalarmap = ScalarMapOnField(med_reader, node_entity, 'vitesse', 1) +if scalarmap is None: + print "FAILED" +else: + bar = get_bar() + bar.Orientation = 'Horizontal' + bar.Position = [0.1, 0.1] + bar.Position2 = [0.1, 0.25] + bar.AspectRatio = 3 + + display_only(scalarmap, view) + print "OK" + +reset_view(view) + +print "Creating Stream Lines.....", +streamlines = StreamLinesOnField(med_reader, node_entity, 'vitesse', 1) +if streamlines is None: + print "FAILED" +else: + display_only(streamlines, view) + print "OK" + +print "Creating Vectors..........", +vectors = VectorsOnField(med_reader, node_entity, 'vitesse', 1) +if vectors is None: + print "FAILED" +else: + display_only(vectors, view) + print "OK" + +print "Creating Iso Surfaces.....", +isosurfaces = IsoSurfacesOnField(med_reader, node_entity, 'vitesse', 1) +contour_filter = pvsimple.GetActiveSource() +if isosurfaces is None: + print "FAILED" +else: + display_only(isosurfaces, view) + print "OK" + +print "Creating Cut Planes.......", +cutplanes = CutPlanesOnField(med_reader, node_entity, 'vitesse', 1, + nb_planes=30, orientation=Orientation.YZ) +if cutplanes is None: + print "FAILED" +else: + display_only(cutplanes, view) + print "OK" + +# 3. Another MED file import +print "**** Step3: Import another MED file" + +print 'Import "Fields_group3D.med"...............', +file_path = datadir + "Fields_group3D.med" +my_paravis.ImportFile(file_path) +med_reader1 = pvsimple.GetActiveSource() + +if med_reader1 is None: + print "FAILED" +else: + print "OK" + +# 4. Displaying scalar field +print "**** Step4: Displaying scalar field" + +print "Creating Scalar Map.......", +scalarmap1 = ScalarMapOnField(med_reader1, cell_entity, 'scalar_field', 1) +if scalarmap1 is None: + print "FAILED" +else: + display_only(scalarmap1, view) + print "OK" + +reset_view(view) + +print "Creating Iso Surfaces.....", +isosurfaces1 = IsoSurfacesOnField(med_reader1, cell_entity, 'scalar_field', 1) +if isosurfaces1 is None: + print "FAILED" +else: + display_only(isosurfaces1, view) + print "OK" + +print "Creating Cut Planes.......", +cutplanes1 = CutPlanesOnField(med_reader1, cell_entity, 'scalar_field', 1, + orientation=Orientation.YZ) +if cutplanes1 is None: + print "FAILED" +else: + slice_filter = pvsimple.GetActiveSource() + slice_filter.SliceType.Normal = [1.0, 0.0, 0.0] + display_only(cutplanes1, view) + print "OK" + +# 5. Object browser popup + +print "**** Step5: Object browser popup" + +mesh_name = 'mailles_MED' + +print "Creating mesh.............", +mesh = MeshOnEntity(med_reader1, mesh_name, cell_entity) +if mesh is None: + print "FAILED" +else: + display_only(mesh, view) + print "OK" + +print "Changing type of presentation of mesh:" +mesh.Representation = 'Wireframe' +pvsimple.Render() +prs_type = mesh.Representation +print "Presentation type..", prs_type + +mesh.Representation = 'Points' +pvsimple.Render() +prs_type = mesh.Representation +print "Presentation type..", prs_type + +mesh.Representation = 'Surface' +pvsimple.Render() +prs_type = mesh.Representation +print "Presentation type..", prs_type + +shrink = pvsimple.Shrink(med_reader1) +mesh_shrinked = pvsimple.GetRepresentation(shrink) +display_only(mesh_shrinked, view) + +print "Changing color of mesh....", +color = [0, 0, 1] +mesh.DiffuseColor = color +display_only(mesh, view) +print "OK" + +print "Changing first IsoSurfaces", +display_only(isosurfaces, view) +reset_view(view) +rgb_points = isosurfaces.LookupTable.RGBPoints +scalar_range = [rgb_points[0], rgb_points[4]] +surfaces = get_contours(scalar_range, 25) +contour_filter.Isosurfaces = surfaces +pvsimple.Render(view=view) +print "OK" + +print "Hide IsoSurfaces..........", +isosurfaces.Visibility = 0 +pvsimple.Render(view=view) +print "OK" diff --git a/test/VisuPrs/united/A2.py b/test/VisuPrs/united/A2.py new file mode 100644 index 00000000..e96c38c0 --- /dev/null +++ b/test/VisuPrs/united/A2.py @@ -0,0 +1,122 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/united/A2 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple +from math import radians + +my_paravis = paravis.myParavis + +cell_entity = EntityType.CELL +node_entity = EntityType.NODE + +# 1. Import MED file +print "**** Step1: Import MED file" + +print 'Import "fra.med"....................', +file_path = datadir + "fra.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +view = pvsimple.GetRenderView() + +field_name = 'VITESSE' +print "Creating Cut Planes.................", +orient = Orientation.YZ +cutplanes = CutPlanesOnField(med_reader, node_entity, field_name, 1, orientation=orient) +if cutplanes is None: + print "FAILED" +else: + display_only(cutplanes, view) + print "OK" + +slice_filter = pvsimple.GetActiveSource() + +# 2. Changing view +print "**** Step2: Changing view" + +print "Fit All.............................", +reset_view(view) +print "OK" + +print "Rotate..............................", +x_angle = 0 +y_angle = 0 + +nb_planes = len(slice_filter.SliceOffsetValues) + +for i in xrange(1, 50): + y_angle = y_angle + 0.05 + normal = get_normal_by_orientation(orient, x_angle, radians(y_angle)) + slice_filter.SliceType.Normal = normal + pvsimple.Render() + +for i in xrange(1,50): + y_angle = y_angle - 0.05 + normal = get_normal_by_orientation(orient, x_angle, radians(y_angle)) + slice_filter.SliceType.Normal = normal + pvsimple.Render() + +print "OK" + +print "View Point (FRONT)..................", +view.CameraViewUp = [0.0, 0.0, 1.0] +view.CameraPosition = [2.4453961849843453, 0.03425, 0.541] +pvsimple.Render() +print "OK" + +print "View Point (BACK)...................", +view.CameraPosition = [-2.0343961849843457, 0.03425, 0.541] +pvsimple.Render() +print "OK" + +print "View Point (TOP)....................", +view.CameraViewUp = [0.0, 1.0, 0.0] +view.CameraPosition = [0.2055, 0.03425, 2.7808961849843454] +pvsimple.Render() +print "OK" + +print "View Point (BOTTOM).................", +view.CameraPosition = [0.2055, 0.03425, -1.6988961849843456] +pvsimple.Render() +print "OK" + +print "View Point (LEFT)...................", +view.CameraViewUp = [0.0, 0.0, 1.0] +view.CameraPosition = [0.2055, -2.2056461849843454, 0.541] +pvsimple.Render() +print "OK" + +print "View Point (RIGHT) .................", +view.CameraPosition = [0.2055, 2.2741461849843456, 0.541] +pvsimple.Render() +print "OK" + +print "Restore View........................", +reset_view(view) +print "OK" diff --git a/test/VisuPrs/united/A4.py b/test/VisuPrs/united/A4.py new file mode 100644 index 00000000..cf369ab4 --- /dev/null +++ b/test/VisuPrs/united/A4.py @@ -0,0 +1,366 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/united/A4 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +cell_entity = EntityType.CELL +node_entity = EntityType.NODE + +# 1. Import MED file +print "**** Step1: Import MED file" + +print 'Import "Hexa8.med"....................', +file_path = datadir + "Hexa8.med" +my_paravis.ImportFile(file_path) +med_reader1 = pvsimple.GetActiveSource() + +if med_reader1 is None: + print "FAILED" +else: + print "OK" + +mesh_name1 = 'Maillage_MED_HEXA8' +scalar_field = 'scalar_field' +vectoriel_field = 'vectoriel_field' +view = pvsimple.GetRenderView() + +print "Creating Scalar Map...................", +scalarmap1 = ScalarMapOnField(med_reader1, cell_entity, scalar_field, 1) +if scalarmap1 is None: + print "FAILED" +else: + display_only(scalarmap1, view) + reset_view(view) + print "OK" + +print "Creating Vectors......................", +vectors1 = VectorsOnField(med_reader1, cell_entity, vectoriel_field, 1) +if vectors1 is None: + print "FAILED" +else: + print "OK" + +print "Creating Deformed Shape...............", +defshape1 = DeformedShapeOnField(med_reader1, cell_entity, vectoriel_field, 1) +if defshape1 is None: + print "FAILED" +else: + print "OK" + +print "Creating mesh.........................", +mesh1 = MeshOnEntity(med_reader1, mesh_name1, cell_entity) +if mesh1 is None: + print "FAILED" +else: + mesh1.Representation = 'Wireframe' + display_only(mesh1, view) + reset_view(view) + print "OK" + +print "Displaying vectors....................", +display_only(vectors1, view) +print "OK" + +print "Displaying Deformed Shape.............", +display_only(defshape1, view) +print "OK" + +print "Set scale factor of Deformed Shape...", +warp_vector = defshape1.Input +warp_vector.ScaleFactor = 10 +print "OK" + +print "Displaying changed Deformed Shape.....", +display_only(defshape1, view) +print "OK" + +print "Editing Vectors.......................", +glyph = vectors1.Input +glyph.SetScaleFactor = 2 +vectors1.LineWidth = 2 +glyph.GlyphType.Center = [0.5, 0.0, 0.0] # TAIL position +print "OK" + +print "Displaying changed Vectors............", +vectors1.Visibility = 1 +pvsimple.Render() +print "OK" + +hide_all(view) + +# 2. Second MED file import + +print 'Importing file "cube_hexa8_quad4.med".', +file_path = datadir + "cube_hexa8_quad4.med" +mesh_name2 = 'CUBE_EN_HEXA8_QUAD4' +my_paravis.ImportFile(file_path) +med_reader2 = pvsimple.GetActiveSource() + +if med_reader2 is None: + print "FAILED" +else: + print "OK" + +print "Creating mesh.........................", +mesh2 = MeshOnEntity(med_reader2, mesh_name2, cell_entity) +if mesh2 is None: + print "FAILED" +else: + display_only(mesh2, view) + print "OK" + +print "Setting wireframe repr. of mesh.......", +mesh2.Representation = 'Wireframe' +print "OK" + +print "Creating Vectors......................", +vectors2 = VectorsOnField(med_reader2, cell_entity, "fieldcelldouble", 1) +if vectors1 is None: + print "FAILED" +else: + glyph2 = vectors2.Input + glyph2.SetScaleFactor = 0.2 + vectors2.LineWidth = 2 + glyph2.GlyphType.Center = [0.5, 0.0, 0.0] # TAIL position + print "OK" + + + +print "Displaying Vectors (with mesh)........", +vectors2.Visibility = 1 +pvsimple.Render() +print "OK" + +hide_all(view) + +# 3. Third MED file import + +print 'Importing file "Penta6.med"...........', +file_path = datadir + "Penta6.med" +my_paravis.ImportFile(file_path) +med_reader3 = pvsimple.GetActiveSource() + +if med_reader3 is None: + print "FAILED" +else: + print "OK" + +print "Creating Cut Planes...................", +cutplanes1 = CutPlanesOnField(med_reader3, cell_entity, scalar_field, 1) +if cutplanes1 is None: + print "FAILED" +else: + display_only(cutplanes1, view) + reset_view(view) + print "OK" + +print "Creating Deformed Shape...............", +defshape2 = DeformedShapeOnField(med_reader3, cell_entity, vectoriel_field, 1) +if defshape2 is None: + print "FAILED" +else: + print "OK" + +print "Creating Vectors......................", +vectors3 = VectorsOnField(med_reader3, cell_entity, vectoriel_field, 1) +if vectors3 is None: + print "FAILED" +else: + print "OK" + +print "Creating Iso Surfaces.....", +isosurfaces1 = IsoSurfacesOnField(med_reader3, cell_entity, vectoriel_field, 1) +if isosurfaces1 is None: + print "FAILED" +else: + print "OK" + +print "Displaying Vectors (l.w.=2, s.f.=1.5).", +glyph3 = vectors3.Input +glyph3.SetScaleFactor = 1.5 +vectors3.LineWidth = 2 +display_only(vectors3, view) +print "OK" + +print "Displaying Deformed Shape.............", +defshape2.Visibility = 1 +pvsimple.Render() +print "OK" + +print "Displaying Iso Surfaces...............", +isosurfaces1.Visibility = 1 +pvsimple.Render() +print "OK" + +hide_all(view) + +# 4. Import Quad4,Tetra4 and Tria3 MED files + +print 'Importing "Quad4.med".................', +file_path = datadir + "Quad4.med" +my_paravis.ImportFile(file_path) +med_reader4 = pvsimple.GetActiveSource() + +if med_reader4 is None: + print "FAILED" +else: + print "OK" + +mesh_name4 = 'Maillage MED_QUAD4' + +print "Creating Iso Surfaces.................", +isosurfaces2 = IsoSurfacesOnField(med_reader4, cell_entity, scalar_field, 1) +if isosurfaces2 is None: + print "FAILED" +else: + print "OK" + +print "Creating Cut Planes...................", +cutplanes2 = CutPlanesOnField(med_reader4, cell_entity, scalar_field, 1, + orientation=Orientation.YZ) +if cutplanes2 is None: + print "FAILED" +else: + print "OK" + +print "Creating Deformed Shape...............", +defshape3 = DeformedShapeOnField(med_reader4, cell_entity, vectoriel_field, 1, scale_factor=10) +if defshape3 is None: + print "FAILED" +else: + print "OK" + +print "Creating Vectors......................", +vectors4 = VectorsOnField(med_reader4, cell_entity, vectoriel_field, 1) +if vectors4 is None: + print "FAILED" +else: + print "OK" + +print "Displaying Iso Surfaces, Def. Shape and Vectors.", +display_only(isosurfaces2, view) +defshape3.Visibility = 1 +vectors4.Visibility = 1 +pvsimple.Render() +print "OK" + +print 'Importing "Tetra4.med"................', +file_path = datadir + "Tetra4.med" +my_paravis.ImportFile(file_path) +med_reader5 = pvsimple.GetActiveSource() + +if med_reader5 is None: + print "FAILED" +else: + print "OK" + +mesh_name5 = 'Maillage MED_TETRA4' + +print "Creating Scalar Map...................", +scalarmap2 = ScalarMapOnField(med_reader5, cell_entity, scalar_field, 1) +if scalarmap2 is None: + print "FAILED" +else: + print "OK" + +print "Creating Vectors......................", +vectors5 = VectorsOnField(med_reader5, cell_entity, vectoriel_field, 1) +if vectors5 is None: + print "FAILED" +else: + print "OK" + +vectors5.LineWidth = 3 +vectors5.Input.SetScaleFactor = 2 + +print "Displaying Scalar Map and Vectoes.....", +hide_all(view) +display_only(scalarmap2, view) +vectors5.Visibility = 1 +reset_view(view) +print "OK" + +print 'Importing "Tria3.med".................', +file_path = datadir + "Tria3.med" +my_paravis.ImportFile(file_path) +med_reader6 = pvsimple.GetActiveSource() + +if med_reader6 is None: + print "FAILED" +else: + print "OK" + +mesh_name6 = 'Maillage MED_TRIA3' + +print "Creating Scalar Map...................", +scalarmap3 = ScalarMapOnField(med_reader6, cell_entity, scalar_field, 1) +if scalarmap3 is None: + print "FAILED" +else: + display_only(scalarmap3, view) + print "OK" + +reset_view(view) + +print "Creating Iso Surfaces.................", +isosurfaces3 = IsoSurfacesOnField(med_reader6, cell_entity, scalar_field, 1) +if isosurfaces3 is None: + print "FAILED" +else: + display_only(isosurfaces3, view) + print "OK" + +reset_view(view) + +print "Creating Deformed Shape...............", +defshape4 = DeformedShapeOnField(med_reader6, cell_entity, vectoriel_field, 1) +if defshape4 is None: + print "FAILED" +else: + display_only(defshape4, view) + print "OK" + +reset_view(view) + +print "Creating Vectors......................", +vectors6 = VectorsOnField(med_reader6, cell_entity, vectoriel_field, 1) +if vectors6 is None: + print "FAILED" +else: + glyph = vectors6.Input + glyph.GlyphType.Center = [0.5, 0.0, 0.0] # TAIL position + vectors6.LineWidth = 2 + glyph.SetScaleFactor = 1 + display_only(vectors6, view) + print "OK" + +reset_view(view) + +print "Displaying only Def. Shape and Vectors", +display_only(defshape4, view) +vectors6.Visibility = 1 +pvsimple.Render() +print "OK" diff --git a/test/VisuPrs/united/A5.py b/test/VisuPrs/united/A5.py new file mode 100644 index 00000000..559c2107 --- /dev/null +++ b/test/VisuPrs/united/A5.py @@ -0,0 +1,110 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/united/A5 case + +from paravistest import datadir +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +cell_entity = EntityType.CELL +node_entity = EntityType.NODE + +# 1. Import MED file +print "**** Step1: Import MED file" + +print 'Import "ResOK_0000.med"...............', +file_path = datadir + "ResOK_0000.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +mesh_name = 'dom' + +# 2. Creating mesh +print "**** Step2: Mesh creation" + +print "Creating mesh.............", +mesh = MeshOnEntity(med_reader, mesh_name, cell_entity) +if mesh is None: + print "FAILED" +else: + print "OK" + +# 3. Changing type of presentation of mesh +print "**** Step3: Changing type of presentation of mesh" + +view = pvsimple.GetRenderView() +display_only(mesh, view) +reset_view(view) + +mesh.Representation = 'Wireframe' +pvsimple.Render() +prs_type = mesh.Representation +print "Presentation type..", prs_type + +mesh.Representation = 'Points' +pvsimple.Render() +prs_type = mesh.Representation +print "Presentation type..", prs_type + +# make shrink, in PARAVIS it's not a representation type: use shrink filter +shrink = pvsimple.Shrink(med_reader) +mesh_shrinked = pvsimple.GetRepresentation(shrink) +display_only(mesh_shrinked, view) + +display_only(mesh, view) +mesh.Representation = 'Surface With Edges' +pvsimple.Render() +prs_type = mesh.Representation +print "Presentation type..", prs_type + +# 4. Changing Cell color of mesh +print "**** Step4: Changing Cell color of mesh" + +color = mesh.DiffuseColor +print "Mesh Cell color in RGB....(", color[0], ",", color[1], ",", color[2], ")" + +color = [0, 0, 1] +mesh.DiffuseColor = color +color = mesh.DiffuseColor +print "Mesh Cell color in RGB....(", color[0], ",", color[1], ",", color[2], ")" +pvsimple.Render() + +# 5. Changing Node color of mesh +print "**** Step4: Changing Node color of mesh" + +color = mesh.AmbientColor +print "Mesh Node color in RGB....(", color[0], ",", color[1], ",", color[2], ")" + +color = [0, 1, 0] +mesh.AmbientColor = color +color = mesh.AmbientColor +print "Mesh Node color in RGB....(", color[0], ",", color[1], ",", color[2], ")" +pvsimple.Render() + +## Note: no special property for edge color in PARAVIS; skip link color changing ( SetLinkColor()/GetLinkColor() methods ) + diff --git a/test/VisuPrs/united/B0.py b/test/VisuPrs/united/B0.py new file mode 100644 index 00000000..0b11337d --- /dev/null +++ b/test/VisuPrs/united/B0.py @@ -0,0 +1,107 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# This case corresponds to: /visu/united1/B0 case + +from paravistest import datadir, compare_lists +from presentations import * +import paravis +import pvsimple + +my_paravis = paravis.myParavis + +error=0 + +# 1. Import MED file +file_path = datadir + "TimeStamps.med" +my_paravis.ImportFile(file_path) +med_reader = pvsimple.GetActiveSource() + +if med_reader is None: + print "FAILED" +else: + print "OK" + +# 2. Create scalar map on deformed shape +smondefshape = DeformedShapeAndScalarMapOnField(med_reader, EntityType.NODE, 'vitesse', 1) +if smondefshape is None: + print "FAILED" +else: + print "OK" + +# 3. Make compare + +# Offset +smondefshape.Position = [0, 0, 0] +error = error + compare_lists(smondefshape.Position, [0,0,0]) + +# Scalar mode +smondefshape.LookupTable.VectorMode = 'Magnitude' +if smondefshape.LookupTable.VectorMode != 'Magnitude': + print "ScalarMode is wrong..." + error=error+1 + +# Scalar bar Position +bar = get_bar() +bar.Position = [0.01, 0.01] +error = error + compare_lists(bar.Position, [0.01, 0.01]) + +# Scalar bar size +bar.Position2 = [0.05, 0.5] +error = error + compare_lists(bar.Position2, [0.05, 0.5]) + +# Number of colors and labels +smondefshape.LookupTable.NumberOfTableValues = 4 +bar.NumberOfLabels = 5 + +nb_colors = smondefshape.LookupTable.NumberOfTableValues +nb_labels = bar.NumberOfLabels +error = error + compare_lists([nb_colors, nb_labels], [4, 5]) + +# Title +bar.Title = 'Pression, Pa' +bar.ComponentTitle = "Comp." + +if bar.Title != 'Pression, Pa': + print "Title is wrong..." + error=error+1 + +if bar.ComponentTitle!= 'Comp.': + print "Component title is wrong..." + error=error+1 + +# Scaling +smondefshape.LookupTable.UseLogScale = 0 +if smondefshape.LookupTable.UseLogScale != 0: + print "Error!!! Scaling is wrong" + error=error+1 + +# Bar orientation +bar.Orientation = 'Horizontal' +if bar.Orientation != 'Horizontal': + print "ERROR!!! Scalar Bar orientation is wrong..." + error=error+1 + +# Scale factor +smondefshape.Input.ScaleFactor = 0.15 +error = error + compare_lists([smondefshape.Input.ScaleFactor], [0.15]) + + +if error > 0: + raise RuntimeError, "There is(are) some error(s) was(were) found... For more info see ERRORs above..." diff --git a/test/VisuPrs/united/CMakeLists.txt b/test/VisuPrs/united/CMakeLists.txt new file mode 100644 index 00000000..ac9a7f98 --- /dev/null +++ b/test/VisuPrs/united/CMakeLists.txt @@ -0,0 +1,32 @@ +# Copyright (C) 2010-2013 CEA/DEN, EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +IF (PYTHON_EXECUTABLE) + FOREACH ( tfile + A1 + A2 + A4 + A5 + B0 + ) + SET(TIMEOUT 10000) + ADD_TEST(UNITED_${tfile} ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/test/VisuPrs/Util/paravistesthelper.py ${TIMEOUT} ${CMAKE_CURRENT_SOURCE_DIR}/${tfile}.py ${PARAVIS_TEST_OUTPUT_DIR}) + SET_TESTS_PROPERTIES(UNITED_${tfile} PROPERTIES FAIL_REGULAR_EXPRESSION "FAILED" TIMEOUT ${TIMEOUT}) + ENDFOREACH( tfile ) +ENDIF (PYTHON_EXECUTABLE) -- 2.39.2