From 4922083dfe43efd741e1b34d52a84546ab820802 Mon Sep 17 00:00:00 2001 From: vsr Date: Fri, 25 Jul 2008 12:25:54 +0000 Subject: [PATCH] Merge from V4_1_0_maintainance branch (from tag mergeto_BR_QT4_Dev_08Jul08) --- doc/salome/gui/VISU/images/cutplanes.png | Bin 30810 -> 18166 bytes doc/salome/gui/VISU/images/deformedshape.png | Bin 15815 -> 20975 bytes doc/salome/gui/VISU/images/smds1.png | Bin 15132 -> 24007 bytes doc/salome/gui/VISU/images/table.png | Bin 0 -> 9959 bytes doc/salome/gui/VISU/images/table3d.png | Bin 0 -> 21142 bytes doc/salome/gui/VISU/images/tablesn1.png | Bin 0 -> 6494 bytes doc/salome/gui/VISU/images/tablesn2.png | Bin 0 -> 12113 bytes .../input/calar_map_on_deformed_shape.doc | 22 +- doc/salome/gui/VISU/input/cut_planes.doc | 6 +- doc/salome/gui/VISU/input/index.doc | 1 + doc/salome/gui/VISU/input/table_3d.doc | 49 ++ .../gui/VISU/input/table_presentations.doc | 1 + doc/salome/gui/VISU/pics/smds1.png | Bin 15132 -> 24007 bytes .../VISU/visugenidl_doc/VISU__Gen_8idl.html | 2 +- ...rfaceVISU_1_1ScalarMapOnDeformedShape.html | 2 +- .../VISU/visugenidl_doc/namespaceVISU.html | 2 +- doc/salome/gui/VISU/whdata/whftdata0.htm | 2 +- doc/salome/gui/VISU/whdata/whtdata0.htm | 2 +- doc/salome/gui/VISU/whgdata/whlstt3.htm | 2 +- doc/salome/gui/VISU/whgdata/whlstt4.htm | 2 +- doc/salome/gui/VISU/whxdata/whftdata0.xml | 2 +- doc/salome/gui/VISU/whxdata/whtdata0.xml | 2 +- idl/VISU_Gen.idl | 138 ++++- src/CONVERTOR/Makefile.am | 2 + src/CONVERTOR/VISUConvertor.cxx | 6 +- src/CONVERTOR/VISU_AppendFilter.cxx | 6 +- src/CONVERTOR/VISU_AppendFilterUtilities.cxx | 23 +- src/CONVERTOR/VISU_ConvertorUtils.cxx | 17 + src/CONVERTOR/VISU_ConvertorUtils.hxx | 5 + src/CONVERTOR/VISU_Convertor_impl.cxx | 154 ++--- src/CONVERTOR/VISU_Convertor_impl.hxx | 37 +- src/CONVERTOR/VISU_ElnoMeshValue.hxx | 162 +++++ src/CONVERTOR/VISU_IDMapper.cxx | 8 +- src/CONVERTOR/VISU_IDMapper.hxx | 2 +- src/CONVERTOR/VISU_MedConvertor.cxx | 53 +- src/CONVERTOR/VISU_MedConvertor.hxx | 3 +- src/CONVERTOR/VISU_MergeFilterUtilities.cxx | 169 ++++++ src/CONVERTOR/VISU_MeshValue.cxx | 273 ++++++--- src/CONVERTOR/VISU_MeshValue.hxx | 3 + src/CONVERTOR/VISU_Structures.hxx | 4 - src/CONVERTOR/VISU_Structures_impl.cxx | 126 ++-- src/CONVERTOR/VISU_Structures_impl.hxx | 38 +- src/CONVERTOR/VISU_TypeList.hxx | 83 ++- src/CONVERTOR/VISU_VTKTypeList.hxx | 120 ++++ src/ENGINE/VISU_Engine_i.cc | 15 +- src/ENGINE/VISU_Engine_i.hh | 11 +- src/OBJECT/Makefile.am | 6 +- src/OBJECT/VISU_Actor.cxx | 47 +- src/OBJECT/VISU_ActorBase.cxx | 85 ++- src/OBJECT/VISU_ActorBase.h | 32 +- src/OBJECT/VISU_GaussPtsAct.cxx | 181 ++++-- src/OBJECT/VISU_GaussPtsAct.h | 25 +- src/OBJECT/VISU_GaussPtsSettings.cxx | 47 +- src/OBJECT/VISU_GaussPtsSettings.h | 5 - src/OBJECT/VISU_IsoSurfActor.cxx | 165 ++++++ src/OBJECT/VISU_IsoSurfActor.h | 88 +++ src/OBJECT/VISU_PointMap3dActor.cxx | 10 +- src/OBJECT/VISU_VectorsAct.cxx | 12 +- src/PIPELINE/Makefile.am | 16 +- src/PIPELINE/VISUPipeLine.cxx | 558 ++++++++--------- src/PIPELINE/VISU_ColoredPL.cxx | 3 +- src/PIPELINE/VISU_CutLinesPL.cxx | 6 + src/PIPELINE/VISU_CutLinesPL.hxx | 3 + src/PIPELINE/VISU_CutPlanesPL.cxx | 90 ++- src/PIPELINE/VISU_CutPlanesPL.hxx | 13 +- src/PIPELINE/VISU_DataSetMapperHolder.cxx | 26 +- src/PIPELINE/VISU_DataSetMapperHolder.hxx | 9 +- src/PIPELINE/VISU_DeformationPL.cxx | 163 +++++ src/PIPELINE/VISU_DeformationPL.hxx | 87 +++ src/PIPELINE/VISU_DeformedGridPL.cxx | 7 +- src/PIPELINE/VISU_DeformedGridPL.hxx | 1 + ...x => VISU_DeformedShapeAndScalarMapPL.cxx} | 72 +-- ...x => VISU_DeformedShapeAndScalarMapPL.hxx} | 21 +- src/PIPELINE/VISU_DeformedShapePL.cxx | 14 +- src/PIPELINE/VISU_DeformedShapePL.hxx | 1 + src/PIPELINE/VISU_ElnoAssembleFilter.cxx | 171 ++++++ src/PIPELINE/VISU_ElnoAssembleFilter.hxx | 47 ++ src/PIPELINE/VISU_ElnoDisassembleFilter.cxx | 400 +++++++++++++ src/PIPELINE/VISU_ElnoDisassembleFilter.hxx | 48 ++ src/PIPELINE/VISU_Extractor.cxx | 22 +- src/PIPELINE/VISU_IsoSurfacesPL.cxx | 13 + src/PIPELINE/VISU_IsoSurfacesPL.hxx | 2 + src/PIPELINE/VISU_LabelPointsFilter.cxx | 296 ++++++++++ src/PIPELINE/VISU_LabelPointsFilter.hxx | 76 +++ src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx | 11 +- src/PIPELINE/VISU_OptionalDeformationPL.cxx | 101 ++++ src/PIPELINE/VISU_OptionalDeformationPL.hxx | 59 ++ src/PIPELINE/VISU_PipeLineUtils.cxx | 1 + src/PIPELINE/VISU_Plot3DPL.cxx | 6 +- src/PIPELINE/VISU_Plot3DPL.hxx | 2 +- src/PIPELINE/VISU_ScalarMapPL.cxx | 20 +- src/PIPELINE/VISU_ScalarMapPL.hxx | 9 +- src/PIPELINE/VISU_VectorsPL.cxx | 99 ++-- src/PIPELINE/VISU_VectorsPL.hxx | 3 +- src/VISUGUI/Makefile.am | 4 +- src/VISUGUI/VISU_msg_en.ts | 76 ++- src/VISUGUI/VisuGUI.cxx | 559 +++++++++++------- src/VISUGUI/VisuGUI.h | 4 +- src/VISUGUI/VisuGUI_ActionsDef.h | 6 +- src/VISUGUI/VisuGUI_CutPlanesDlg.cxx | 184 +++++- src/VISUGUI/VisuGUI_CutPlanesDlg.h | 29 +- ... VisuGUI_DeformedShapeAndScalarMapDlg.cxx} | 187 +++--- ...=> VisuGUI_DeformedShapeAndScalarMapDlg.h} | 30 +- src/VISUGUI/VisuGUI_DeformedShapeDlg.cxx | 68 ++- src/VISUGUI/VisuGUI_DeformedShapeDlg.h | 3 +- src/VISUGUI/VisuGUI_Displayer.cxx | 17 +- src/VISUGUI/VisuGUI_GaussPointsDlg.cxx | 25 +- src/VISUGUI/VisuGUI_GaussPointsDlg.h | 1 + src/VISUGUI/VisuGUI_InputPane.cxx | 13 +- src/VISUGUI/VisuGUI_InputPane.h | 3 + src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx | 63 +- src/VISUGUI/VisuGUI_IsoSurfacesDlg.h | 28 +- src/VISUGUI/VisuGUI_OffsetDlg.cxx | 113 +++- src/VISUGUI/VisuGUI_OffsetDlg.h | 14 +- src/VISUGUI/VisuGUI_Plot3DDlg.cxx | 4 +- src/VISUGUI/VisuGUI_PopupTools.cxx | 56 +- src/VISUGUI/VisuGUI_Prs3dDlg.cxx | 16 +- src/VISUGUI/VisuGUI_Prs3dTools.h | 4 +- src/VISUGUI/VisuGUI_Selection.cxx | 21 +- src/VISUGUI/VisuGUI_Table3dDlg.cxx | 88 ++- src/VISUGUI/VisuGUI_Table3dDlg.h | 1 + src/VISUGUI/VisuGUI_TimeAnimation.cxx | 211 ++++++- src/VISUGUI/VisuGUI_TimeAnimation.h | 2 + src/VISUGUI/VisuGUI_Tools.cxx | 234 +++++--- src/VISUGUI/VisuGUI_Tools.h | 5 + src/VISUGUI/VisuGUI_TransparencyDlg.cxx | 5 + src/VISUGUI/VisuGUI_VectorsDlg.cxx | 21 +- src/VISU_I/Makefile.am | 11 +- src/VISU_I/VISUConfig.cc | 4 +- src/VISU_I/VISU_ColoredPrs3dCache_i.cc | 46 +- src/VISU_I/VISU_ColoredPrs3dFactory.cc | 6 +- src/VISU_I/VISU_ColoredPrs3dFactory.hh | 10 +- src/VISU_I/VISU_ColoredPrs3d_i.cc | 70 ++- src/VISU_I/VISU_ColoredPrs3d_i.hh | 12 +- src/VISU_I/VISU_CorbaMedConvertor.cxx | 8 +- src/VISU_I/VISU_CutLines_i.cc | 3 +- src/VISU_I/VISU_CutPlanes_i.cc | 21 +- src/VISU_I/VISU_CutPlanes_i.hh | 8 +- src/VISU_I/VISU_Deformation_i.cc | 166 ++++++ src/VISU_I/VISU_Deformation_i.hh | 103 ++++ ...cc => VISU_DeformedShapeAndScalarMap_i.cc} | 90 +-- ...hh => VISU_DeformedShapeAndScalarMap_i.hh} | 28 +- src/VISU_I/VISU_DeformedShape_i.cc | 87 +-- src/VISU_I/VISU_DeformedShape_i.hh | 31 +- src/VISU_I/VISU_DumpPython.cc | 146 ++++- src/VISU_I/VISU_GaussPoints_i.cc | 4 +- src/VISU_I/VISU_Gen_i.cc | 44 +- src/VISU_I/VISU_Gen_i.hh | 12 +- src/VISU_I/VISU_I.cxx | 2 +- src/VISU_I/VISU_IsoSurfaces_i.cc | 79 ++- src/VISU_I/VISU_IsoSurfaces_i.hh | 22 +- src/VISU_I/VISU_MonoColorPrs_i.cc | 186 ++++++ src/VISU_I/VISU_MonoColorPrs_i.hh | 83 +++ src/VISU_I/VISU_OptionalDeformation_i.cc | 110 ++++ src/VISU_I/VISU_OptionalDeformation_i.hh | 76 +++ src/VISU_I/VISU_PointMap3d_i.cc | 165 +++++- src/VISU_I/VISU_PointMap3d_i.hh | 29 +- src/VISU_I/VISU_Prs3d_i.cc | 10 +- src/VISU_I/VISU_Result_i.cc | 21 +- src/VISU_I/VISU_ScalarMap_i.cc | 4 +- src/VISU_I/VISU_StreamLines_i.cc | 2 +- src/VISU_I/VISU_StreamLines_i.hh | 8 +- src/VISU_I/VISU_Table_i.cc | 9 +- src/VISU_I/VISU_TimeAnimation.cxx | 62 +- src/VISU_I/VISU_TimeAnimation.h | 7 +- src/VISU_I/VISU_Vectors_i.cc | 1 + src/VISU_I/VISU_View_i.cc | 3 +- src/VISU_SWIG/VISU_Example_01.py | 4 +- src/VISU_SWIG/VISU_Example_07.py | 2 +- src/VISU_SWIG/visu.py | 8 +- src/VISU_SWIG/visu_cache.py | 3 +- src/VISU_SWIG/visu_pointmap3d.py | 57 ++ src/VVTK/VVTK_ImageWriter.cxx | 8 +- src/VVTK/VVTK_ImageWriterMgr.cxx | 13 +- src/VVTK/VVTK_PickingDlg.cxx | 83 +-- src/VVTK/VVTK_Recorder.cxx | 14 +- 176 files changed, 6871 insertions(+), 1939 deletions(-) create mode 100644 doc/salome/gui/VISU/images/table.png create mode 100644 doc/salome/gui/VISU/images/table3d.png create mode 100644 doc/salome/gui/VISU/images/tablesn1.png create mode 100644 doc/salome/gui/VISU/images/tablesn2.png create mode 100644 doc/salome/gui/VISU/input/table_3d.doc create mode 100644 src/CONVERTOR/VISU_ElnoMeshValue.hxx create mode 100644 src/CONVERTOR/VISU_VTKTypeList.hxx create mode 100644 src/OBJECT/VISU_IsoSurfActor.cxx create mode 100644 src/OBJECT/VISU_IsoSurfActor.h create mode 100755 src/PIPELINE/VISU_DeformationPL.cxx create mode 100755 src/PIPELINE/VISU_DeformationPL.hxx rename src/PIPELINE/{VISU_ScalarMapOnDeformedShapePL.cxx => VISU_DeformedShapeAndScalarMapPL.cxx} (85%) rename src/PIPELINE/{VISU_ScalarMapOnDeformedShapePL.hxx => VISU_DeformedShapeAndScalarMapPL.hxx} (81%) create mode 100644 src/PIPELINE/VISU_ElnoAssembleFilter.cxx create mode 100644 src/PIPELINE/VISU_ElnoAssembleFilter.hxx create mode 100644 src/PIPELINE/VISU_ElnoDisassembleFilter.cxx create mode 100644 src/PIPELINE/VISU_ElnoDisassembleFilter.hxx create mode 100644 src/PIPELINE/VISU_LabelPointsFilter.cxx create mode 100644 src/PIPELINE/VISU_LabelPointsFilter.hxx create mode 100755 src/PIPELINE/VISU_OptionalDeformationPL.cxx create mode 100755 src/PIPELINE/VISU_OptionalDeformationPL.hxx rename src/VISUGUI/{VisuGUI_ScalarMapOnDeformedShapeDlg.cxx => VisuGUI_DeformedShapeAndScalarMapDlg.cxx} (73%) rename src/VISUGUI/{VisuGUI_ScalarMapOnDeformedShapeDlg.h => VisuGUI_DeformedShapeAndScalarMapDlg.h} (82%) create mode 100755 src/VISU_I/VISU_Deformation_i.cc create mode 100755 src/VISU_I/VISU_Deformation_i.hh rename src/VISU_I/{VISU_ScalarMapOnDeformedShape_i.cc => VISU_DeformedShapeAndScalarMap_i.cc} (78%) rename src/VISU_I/{VISU_ScalarMapOnDeformedShape_i.hh => VISU_DeformedShapeAndScalarMap_i.hh} (82%) create mode 100644 src/VISU_I/VISU_MonoColorPrs_i.cc create mode 100644 src/VISU_I/VISU_MonoColorPrs_i.hh create mode 100755 src/VISU_I/VISU_OptionalDeformation_i.cc create mode 100755 src/VISU_I/VISU_OptionalDeformation_i.hh create mode 100755 src/VISU_SWIG/visu_pointmap3d.py diff --git a/doc/salome/gui/VISU/images/cutplanes.png b/doc/salome/gui/VISU/images/cutplanes.png index 579332ac1636616bb0d23db7a3cee842c1f08c98..03f972aa4fbe7195d375de55b126b8379fd5d4ec 100644 GIT binary patch literal 18166 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 diff --git a/doc/salome/gui/VISU/images/deformedshape.png b/doc/salome/gui/VISU/images/deformedshape.png index aea062713810177aa42c006703c59dd0357a5ed6..e196d395833d09ce64aa04563b5490e227cecd30 100644 GIT binary patch literal 20975 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 O41n}F@6K`y&io4$Qs_wl literal 15815 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 T97=!#+7Zktx093;en0*fjd`Cv literal 15132 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 diff --git a/doc/salome/gui/VISU/images/table.png b/doc/salome/gui/VISU/images/table.png new file mode 100644 index 0000000000000000000000000000000000000000..473aeff11c05c46f5a92f9cf6f25bde9351a67d7 GIT binary patch literal 9959 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/VISU/images/tablesn2.png b/doc/salome/gui/VISU/images/tablesn2.png new file mode 100644 index 0000000000000000000000000000000000000000..4b3b85d1d84a8ed85bee146c1ff313235d41ae6e GIT binary patch literal 12113 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 Iyk+?R0Y~%nE&u=k literal 0 HcmV?d00001 diff --git a/doc/salome/gui/VISU/input/calar_map_on_deformed_shape.doc b/doc/salome/gui/VISU/input/calar_map_on_deformed_shape.doc index 0ec95fb5..bc7ea730 100644 --- a/doc/salome/gui/VISU/input/calar_map_on_deformed_shape.doc +++ b/doc/salome/gui/VISU/input/calar_map_on_deformed_shape.doc @@ -1,30 +1,30 @@ /*! -\page scalar_map_on_deformed_shape_page Scalar Map on Deformed Shape presentation +\page scalar_map_on_deformed_shape_page Deformed Shape and Scalar Map presentation -\n Scalar Map on Deformed Shape presentation is a mix of the +\n Deformed Shape and Scalar Map presentation is a mix of the two: \ref scalar_map_page "Scalar Map" and \ref deformed_shape_page "Deformed Shape". In this presentation the Scalar Map is built on a Deformed Shape. -To create a Scalar Map on Deformed Shape presentation: +To create a Deformed Shape and Scalar Map presentation: \par – Right-click on one of the time stamps of the field in the -Object browser and from the pop-up menu choose Scalar Map on -Deformed Shape, or +Object browser and from the pop-up menu choose Deformed Shape and +Scalar Map, or \n – Click on one of the time stamps of the field in the Object -browser and select from the main menu Visualization > Scalar Map on -Deformed Shape, or click "Scalar Map on Deformed Shape" +browser and select from the main menu Visualization > Deformed Shape and +Scalar Map, or click "Deformed Shape and Scalar Map" icon in the Visualization Toolbar. \image html image40.gif -
"Scalar Map on Deformed Shape" icon
+
"Deformed Shape and Scalar Map" icon
\image html smds1.png \par -Scalar Map on Deformed Shape tab allows you to set additional -parameters of your Scalar Map on Deformed Shape presentation: +Deformed Shape and Scalar Map tab allows you to set additional +parameters of your Deformed Shape and Scalar Map presentation:
  • Scale Factor: visualization scaling of all vector values applied to the cells of the mesh.
  • @@ -43,7 +43,7 @@ Compare ordinary Scalar Map presentation: \image html smds-example1.png -with Scalar Map on Deformed Shape presentation: +with Deformed Shape and Scalar Map presentation: \image html smds-example.png diff --git a/doc/salome/gui/VISU/input/cut_planes.doc b/doc/salome/gui/VISU/input/cut_planes.doc index bb60f1fc..44e6f256 100644 --- a/doc/salome/gui/VISU/input/cut_planes.doc +++ b/doc/salome/gui/VISU/input/cut_planes.doc @@ -39,6 +39,10 @@ displacement of the planes into one or another side.
  • Show preview check box allows to edit the parameters of the presentation and simultaneously observe the preview of this presentation in the viewer.
  • +
  • Deformation allows to switch on/off deformation of the +planes.
  • +
  • Vectors allows to choose a vectorial field for deformation.
  • +
  • Scale Factor allows to set the scaling ratio for all vector values.
@@ -48,4 +52,4 @@ the viewer: \image html cutplpresent.png -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/VISU/input/index.doc b/doc/salome/gui/VISU/input/index.doc index e82b2bc7..402f3a69 100644 --- a/doc/salome/gui/VISU/input/index.doc +++ b/doc/salome/gui/VISU/input/index.doc @@ -51,6 +51,7 @@
  • \ref importing_exporting_tables_page
  • \ref displaying_tables_page
  • \ref creating_tables_from_cut_lines_page
  • +
  • \ref table_3d_page
  • \subpage xy_plots_page
    • diff --git a/doc/salome/gui/VISU/input/table_3d.doc b/doc/salome/gui/VISU/input/table_3d.doc new file mode 100644 index 00000000..15a36d2e --- /dev/null +++ b/doc/salome/gui/VISU/input/table_3d.doc @@ -0,0 +1,49 @@ +/*! + +\page table_3d_page Table 3D presentation + +\n Table 3D is a 3D graphic presentation of data contained in the table. +The relief and coloring of the resulting +presentation both correspond to the values contained in the table. The values from the first column of the +table define X-axis. The values from the second to the last columns define Z-axis. Y increases with a fixed step starting from Y=0. +To successfully produce a Table 3D presentation, the table should not contain empty fields. + +To create a Table 3D presentation: +\par +– Right-click on an XLS table in the +Object browser and from the context menu choose Show, or Show only + +\image html table.png + +The table will be immediately displayed in the Viewer. + +Choose Edit in the context menu if you wish to change the layout of the presentation. + +\image html table3d.png + +\par +
        +
      • Scale Factor - visualization scaling of all values of the table.
      • +
      • Presentation type:
      • +
          +
        • \b Surface - Plot 3D will be represented with a smooth surface.
        • + +\image html tablesn2.png + +
        • \b Contour - Plot 3D will be represented with a set of contours.
        • + +\image html tablesn1.png + +
        +
      • Number of contours - allows to define the number of +contours (active when Contour presentation type is selected).
      • +
      • Scalar Bar tab allows to define the parameters of the scalar +bar displayed with this presentation (\ref scalar_map_page "see also").
      • +
      + +It is also possible to choose \b Wireframe or \b Shading \b Representation type, change +such properties as \b Opacity and Line Width and Translate presentation from the context menu. + + + +*/ \ No newline at end of file diff --git a/doc/salome/gui/VISU/input/table_presentations.doc b/doc/salome/gui/VISU/input/table_presentations.doc index 9e6dc79f..3b28d878 100644 --- a/doc/salome/gui/VISU/input/table_presentations.doc +++ b/doc/salome/gui/VISU/input/table_presentations.doc @@ -7,6 +7,7 @@
    • \subpage importing_exporting_tables_page
    • \subpage displaying_tables_page
    • \subpage creating_tables_from_cut_lines_page
    • +
    • \subpage table_3d_page
    */ \ No newline at end of file diff --git a/doc/salome/gui/VISU/pics/smds1.png b/doc/salome/gui/VISU/pics/smds1.png index 24c5feda71d28271be6e63a1388b1b6aaa3cea20..f74008d4577b87ddc1a355c8e1ceacdf886d1df0 100755 GIT binary patch literal 24007 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 T97=!#+7Zktx093;en0*fjd`Cv literal 15132 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 diff --git a/doc/salome/gui/VISU/visugenidl_doc/VISU__Gen_8idl.html b/doc/salome/gui/VISU/visugenidl_doc/VISU__Gen_8idl.html index 5d34130d..25789b67 100644 --- a/doc/salome/gui/VISU/visugenidl_doc/VISU__Gen_8idl.html +++ b/doc/salome/gui/VISU/visugenidl_doc/VISU__Gen_8idl.html @@ -74,7 +74,7 @@ Include dependency graph for VISU_Gen.idl:

     Deformed shape presentation interface. More...
    interface  VISU.ScalarMapOnDeformedShape - Scalar Map on Deformed shape presentation interface. More...
    + Deformed shape and Scalar Map presentation interface. More...
    interface  VISU.Plot3D  Plot3D interface. More...
    diff --git a/doc/salome/gui/VISU/visugenidl_doc/interfaceVISU_1_1ScalarMapOnDeformedShape.html b/doc/salome/gui/VISU/visugenidl_doc/interfaceVISU_1_1ScalarMapOnDeformedShape.html index 878345b4..79095052 100644 --- a/doc/salome/gui/VISU/visugenidl_doc/interfaceVISU_1_1ScalarMapOnDeformedShape.html +++ b/doc/salome/gui/VISU/visugenidl_doc/interfaceVISU_1_1ScalarMapOnDeformedShape.html @@ -14,7 +14,7 @@ -

    VISU.ScalarMapOnDeformedShape Interface Reference

    Scalar Map on Deformed shape presentation interface. +

    VISU.ScalarMapOnDeformedShape Interface Reference

    Deformed shape and Scalar Map presentation interface. More...

    import "VISU_Gen.idl"; diff --git a/doc/salome/gui/VISU/visugenidl_doc/namespaceVISU.html b/doc/salome/gui/VISU/visugenidl_doc/namespaceVISU.html index 9543044b..8de0ca8a 100644 --- a/doc/salome/gui/VISU/visugenidl_doc/namespaceVISU.html +++ b/doc/salome/gui/VISU/visugenidl_doc/namespaceVISU.html @@ -60,7 +60,7 @@  Deformed shape presentation interface. More...
    interface  ScalarMapOnDeformedShape - Scalar Map on Deformed shape presentation interface. More...
    + Deformed shape and Scalar Map presentation interface. More...
    interface  Plot3D  Plot3D interface. More...
    diff --git a/doc/salome/gui/VISU/whdata/whftdata0.htm b/doc/salome/gui/VISU/whdata/whftdata0.htm index eae6a624..5acacd5e 100755 --- a/doc/salome/gui/VISU/whdata/whftdata0.htm +++ b/doc/salome/gui/VISU/whdata/whftdata0.htm @@ -49,7 +49,7 @@ aTE("Plot2D Viewer","plot2d_viewer.htm"); aTE("Plot 3D presentation","plot_3d_presentation.htm"); aTE("Primitive Types","primitive_types.htm"); aTE("Scalar Bar","scalar_bar.htm"); -aTE("Scalar Map on Deformed Shape presentation","scalar_map_on_deformed_shape_presentation.htm"); +aTE("Deformed Shape and Scalar Map presentation","scalar_map_on_deformed_shape_presentation.htm"); aTE("Segmentation","segmentation.htm"); aTE("Types of Gauss Points Presentations","types_of_gauss_points_presentations.htm"); aTE("VTK 3D Viewer","vtk_3d_viewer.htm"); diff --git a/doc/salome/gui/VISU/whdata/whtdata0.htm b/doc/salome/gui/VISU/whdata/whtdata0.htm index fe3b5c79..67da6bc2 100755 --- a/doc/salome/gui/VISU/whdata/whtdata0.htm +++ b/doc/salome/gui/VISU/whdata/whtdata0.htm @@ -24,7 +24,7 @@ aTE(2,0,"Deformed Shape presentation","files/deformed_shape_presentation.htm"); aTE(2,0,"Vectors Presentation","files/vectors_presentation.htm"); aTE(2,0,"Stream Lines presentation","files/stream_lines_presentation.htm"); - aTE(2,0,"Scalar Map on Deformed Shape presentation","scalar_map_on_deformed_shape_presentation.htm"); + aTE(2,0,"Deformed Shape and Scalar Map presentation","scalar_map_on_deformed_shape_presentation.htm"); aTE(2,0,"Plot 3D presentation","plot_3d_presentation.htm"); aTE(2,0,"Animating presentations","files/animating_presentations.htm"); aTE(1,9,"Gauss Points Presentations"); diff --git a/doc/salome/gui/VISU/whgdata/whlstt3.htm b/doc/salome/gui/VISU/whgdata/whlstt3.htm index d960e94d..56224cc4 100755 --- a/doc/salome/gui/VISU/whgdata/whlstt3.htm +++ b/doc/salome/gui/VISU/whgdata/whlstt3.htm @@ -53,7 +53,7 @@ img {vertial-align:middle;}           Deformed Shape presentation
              Vectors Presentation
              Stream Lines presentation
    -          Scalar Map on Deformed Shape presentation
    +          Deformed Shape and Scalar Map presentation
              Plot 3D presentation
              Animating presentations
              Gauss Points Presentations
    diff --git a/doc/salome/gui/VISU/whgdata/whlstt4.htm b/doc/salome/gui/VISU/whgdata/whlstt4.htm index 253afb61..49593c24 100755 --- a/doc/salome/gui/VISU/whgdata/whlstt4.htm +++ b/doc/salome/gui/VISU/whgdata/whlstt4.htm @@ -53,7 +53,7 @@ img {vertial-align:middle;}           Deformed Shape presentation
              Vectors Presentation
              Stream Lines presentation
    -          Scalar Map on Deformed Shape presentation
    +          Deformed Shape and Scalar Map presentation
              Plot 3D presentation
              Animating presentations
              Gauss Points Presentations
    diff --git a/doc/salome/gui/VISU/whxdata/whftdata0.xml b/doc/salome/gui/VISU/whxdata/whftdata0.xml index 18b3f31d..37c3d337 100755 --- a/doc/salome/gui/VISU/whxdata/whftdata0.xml +++ b/doc/salome/gui/VISU/whxdata/whftdata0.xml @@ -37,7 +37,7 @@ - + diff --git a/doc/salome/gui/VISU/whxdata/whtdata0.xml b/doc/salome/gui/VISU/whxdata/whtdata0.xml index 14a0dff2..13b3a715 100755 --- a/doc/salome/gui/VISU/whxdata/whtdata0.xml +++ b/doc/salome/gui/VISU/whxdata/whtdata0.xml @@ -16,7 +16,7 @@ - + diff --git a/idl/VISU_Gen.idl b/idl/VISU_Gen.idl index d1b5c73e..36b383b4 100644 --- a/idl/VISU_Gen.idl +++ b/idl/VISU_Gen.idl @@ -78,7 +78,8 @@ module VISU { TSCALARMAP, /*!< Scalarmap 3D presentation object */ TISOSURFACES, /*!< Iso surface 3D presentation object */ TDEFORMEDSHAPE, /*!< Deformed shape 3D presentation object */ - TSCALARMAPONDEFORMEDSHAPE, /*!< Scalar map on deformed shape 3D presentation object */ + TSCALARMAPONDEFORMEDSHAPE, /*!< Scalar map on deformed shape 3D presentation object. It is obsolete. Use TDEFORMEDSHAPEANDSCALARMAP instead */ + TDEFORMEDSHAPEANDSCALARMAP, /*!< Deformed shape and scalar map 3D presentation object */ TGAUSSPOINTS, /*!< Gauss Points 3D presentation object */ TPLOT3D, /*!< Plot3D 3D presentation object */ TPOINTMAP3D, /*!< 3D presentation for table object */ @@ -824,22 +825,12 @@ module VISU { long GetFaceLimit(); }; - /*! \brief Deformed shape presentation interface + + /*! \brief MonoColor presentation presentation interface * - * Presentation parameters of the deformed shape presentation. + * Presentation parameters of the MonoColor presentation. */ - interface DeformedShape : ScalarMap - { - /*! - * Sets the scale of the presentatable object. - * \param theScale Double value defining the scale of this presentable object. - */ - void SetScale(in double theScale); - - /*! - * Gets the scale of the presentatable object. - */ - double GetScale(); + interface MonoColorPrs : ScalarMap { /*! This boolean method returns True if this deformed shape presentation is colored. */ @@ -864,12 +855,87 @@ module VISU { }; + /*! \brief Deformed shape presentation interface + * + * Presentation parameters of the deformed shape presentation. + */ + interface DeformedShape : MonoColorPrs + { + /*! + * Sets the scale of the presentatable object. + * \param theScale Double value defining the scale of this presentable object. + */ + void SetScale(in double theScale); + + /*! + * Gets the scale of the presentatable object. + */ + double GetScale(); + + }; + + //------------------------------------------------------- + /*! \brief Deformation interface + * + * This is base interface for building of the deformed presentations + */ + interface Deformation{ + /*! + * Sets the scale of the presentatable object. + * \param theScale Double value defining the scale of this presentable object. + */ + void SetScale(in double theScale); + + /*! + * Gets the scale of the presentatable object. + */ + double GetScale(); + + /*! + * Sets the vectorial field + * \param theEntity - entity of vectorial field + * \param theFieldName - the name of vectorial field + */ + void SetVectorialField(in Entity theEntity, + in string theFieldName); + + /*! + * Get vectorial entity + */ + Entity GetVectorialFieldEntity(); + + /*! + * Get scalar field name + */ + string GetVectorialFieldName(); + + }; + + //------------------------------------------------------- + /*! \brief OptionalDeformation interface + * + * This is interface for switch on/off of the deformation of the presentation + */ + interface OptionalDeformation : Deformation{ + + /*! + * Sets the deformation flag of the presentatable object. + * \param theFlag Boolean value defining the deformation flag of this presentable object. + */ + void UseDeformation(in boolean theFlag); + + /*! + * Gets the deformation flag of the presentatable object. + */ + boolean IsDeformed(); + }; + //------------------------------------------------------- /*! \brief Scalar Map on Deformed shape presentation interface * * Presentation parameters of the scalar map on deformed shape presentation. */ - interface ScalarMapOnDeformedShape : ScalarMap { + interface DeformedShapeAndScalarMap : ScalarMap { /*! * Sets the scale of the presentatable object. @@ -1079,7 +1145,7 @@ module VISU { * consists of cutting your initial mesh by a definite number of planes. As the * result you will see these planes which will be cutted by the borders of the mesh. */ - interface CutPlanes : ScalarMap { + interface CutPlanes : ScalarMap, OptionalDeformation { /*! * This enumeration contains a set of elements defining the type of orientation in 3D space * of the cut planes. @@ -1342,7 +1408,7 @@ module VISU { * Streamlines are used to convey the structure of a vector field. * Usually streamlines are created to explore the most interesting features in the field. */ - interface StreamLines : DeformedShape { + interface StreamLines : MonoColorPrs { /*! This enumerations contains a set of elements necessary * for definition of direction of the stream lines. */ @@ -1412,7 +1478,7 @@ module VISU { * values on the cells and on the basis of them constructs * isobaric surfaces, which form this presentation. */ - interface IsoSurfaces : ScalarMap { + interface IsoSurfaces : MonoColorPrs { /*! * Sets the number of isometric surfaces. * \param theNb A long value defining the number of isometric surfaces @@ -1424,6 +1490,22 @@ module VISU { * Gets the number of isometric surfaces */ long GetNbSurfaces(); + + /*! + * Returns TRUE if labels with values are shown + */ + boolean IsLabeled(); + + /*! + * Set show or not value labels + */ + void ShowLabels(in boolean theShow, in long theNb); + + /*! + * Returns Nb of labels per surface + */ + long GetNbLabels(); + }; //------------------------------------------------------- @@ -1986,6 +2068,18 @@ module VISU { in Entity theEntity, in string theFieldName, in long theTimeStampNumber); + /*! + * Creates a deformed shape presentation. This function is obsolete. Use DeformedShapeAndScalarMapOnField instead. + * \param theResult Data generated in other sources. (MED object or file) + * \param theMeshName One of the meshes presented in MED file + * \param theEntity Type of entity where the field is defined + * \param theFieldName Group of data attributed to the %MESH. The data can be scalar or vector. + * \param theTimeStampNumber Number of iteration on the field + */ + DeformedShapeAndScalarMap ScalarMapOnDeformedShapeOnField(in Result theResult, in string theMeshName, + in Entity theEntity, in string theFieldName, + in long theTimeStampNumber); + /*! * Creates a deformed shape presentation. * \param theResult Data generated in other sources. (MED object or file) @@ -1994,9 +2088,9 @@ module VISU { * \param theFieldName Group of data attributed to the %MESH. The data can be scalar or vector. * \param theTimeStampNumber Number of iteration on the field */ - ScalarMapOnDeformedShape ScalarMapOnDeformedShapeOnField(in Result theResult, in string theMeshName, - in Entity theEntity, in string theFieldName, - in long theTimeStampNumber); + DeformedShapeAndScalarMap DeformedShapeAndScalarMapOnField(in Result theResult, in string theMeshName, + in Entity theEntity, in string theFieldName, + in long theTimeStampNumber); /*! * Creates a vector presentation. diff --git a/src/CONVERTOR/Makefile.am b/src/CONVERTOR/Makefile.am index 1f377fb6..3953664f 100644 --- a/src/CONVERTOR/Makefile.am +++ b/src/CONVERTOR/Makefile.am @@ -28,6 +28,7 @@ lib_LTLIBRARIES = libVisuConvertor.la salomeinclude_HEADERS= \ VISU_TypeList.hxx \ + VISU_VTKTypeList.hxx \ VISU_IDMapper.hxx \ VISU_ConvertorDef.hxx \ VISU_Structures.hxx \ @@ -35,6 +36,7 @@ salomeinclude_HEADERS= \ VISU_ConvertorDef_impl.hxx \ VISU_Structures_impl.hxx \ VISU_MeshValue.hxx \ + VISU_ElnoMeshValue.hxx \ VISU_PointCoords.hxx \ VISU_Convertor_impl.hxx \ VISU_ConvertorUtils.hxx \ diff --git a/src/CONVERTOR/VISUConvertor.cxx b/src/CONVERTOR/VISUConvertor.cxx index db268df7..c2b748e2 100644 --- a/src/CONVERTOR/VISUConvertor.cxx +++ b/src/CONVERTOR/VISUConvertor.cxx @@ -42,6 +42,8 @@ #include +#include "utilities.h" + using namespace std; #ifdef DEBUG @@ -102,7 +104,7 @@ void ParseMEDFile(const char* theFileName) vtkDataSet* aDataSet = aGaussMesh->GetOutput(); aDataSet->Update(); int aNbCells = aDataSet->GetNumberOfCells(); - cout<<"aNbCells = "<GetNodeVTKID(anObjID.first)<GetElemObjID(anCellId); aVTKID = anIDMapper->GetElemVTKID(anObjID); - cout< 1 || IsMergingInputs() || IsMappingInputs()) + if( IsMergingInputs() || IsMappingInputs() ) anIsExecuted = VISU::UnstructuredGridRequestData(theInputVector, - this->GetNumberOfInputConnections(0), + GetNumberOfInputConnections( 0 ), theOutputVector, GetSharedPointSet(), IsMergingInputs(), IsMappingInputs()); - if(!anIsExecuted) + if( !anIsExecuted ) anIsExecuted = Superclass::RequestData(theRequest, theInputVector, theOutputVector); diff --git a/src/CONVERTOR/VISU_AppendFilterUtilities.cxx b/src/CONVERTOR/VISU_AppendFilterUtilities.cxx index 3294684d..4ff6233c 100644 --- a/src/CONVERTOR/VISU_AppendFilterUtilities.cxx +++ b/src/CONVERTOR/VISU_AppendFilterUtilities.cxx @@ -191,14 +191,33 @@ namespace bool theIsMergingInputs, bool theIsMappingInputs) { - if(theSharedPointSet){ + if ( theNumberOfInputConnections == 1 ) { + // get the input and ouptut + vtkDataSet *anInput = VISU::GetInput( theInputVector, 0 ); + vtkDataSet* anOutput = VISU::GetOutput( theOutputVector ); + + if ( anInput->GetDataObjectType() != anOutput->GetDataObjectType() ) + return false; + + // This has to be here because it initialized all field datas. + anOutput->CopyStructure( anInput ); + + // Pass all. (data object's field data is passed by the + // superclass after this method) + anOutput->GetPointData()->PassData( anInput->GetPointData() ); + anOutput->GetCellData()->PassData( anInput->GetCellData() ); + + return true; + } + + if ( theSharedPointSet ) { vtkPoints* aPoints = theSharedPointSet->GetPoints(); if(aPoints->GetNumberOfPoints() < 1) return true; TDataSet* anOutput = TDataSet::SafeDownCast(VISU::GetOutput(theOutputVector)); vtkIdType anNbInputs = theNumberOfInputConnections; - if(theIsMergingInputs){ + if ( theIsMergingInputs ) { TCellIdMerger aFunctor(anNbInputs); ForEachInput(theInputVector, anNbInputs, aFunctor); diff --git a/src/CONVERTOR/VISU_ConvertorUtils.cxx b/src/CONVERTOR/VISU_ConvertorUtils.cxx index a4cee79f..9a2dd969 100644 --- a/src/CONVERTOR/VISU_ConvertorUtils.cxx +++ b/src/CONVERTOR/VISU_ConvertorUtils.cxx @@ -233,6 +233,23 @@ namespace VISU return aDataSetAttributes->GetArray("VISU_FIELD") != NULL; } + //--------------------------------------------------------------- + bool + IsElnoData(vtkDataSet* theDataSet) + { + theDataSet->Update(); + + if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetCellData() ) + if ( aDataSetAttributes->GetArray( "ELNO_FIELD" ) != NULL ) + return true; + + if ( vtkDataSetAttributes *aDataSetAttributes = theDataSet->GetPointData() ) + if ( aDataSetAttributes->GetArray( "ELNO_POINT_COORDS" ) != NULL ) + return true; + + return false; + } + //--------------------------------------------------------------- vtkIdType diff --git a/src/CONVERTOR/VISU_ConvertorUtils.hxx b/src/CONVERTOR/VISU_ConvertorUtils.hxx index 17c12fde..2c1bff92 100644 --- a/src/CONVERTOR/VISU_ConvertorUtils.hxx +++ b/src/CONVERTOR/VISU_ConvertorUtils.hxx @@ -90,6 +90,11 @@ namespace VISU bool IsDataOnCells(vtkDataSet* theDataSet); + //--------------------------------------------------------------- + VISU_CONVERTOR_EXPORT + bool + IsElnoData(vtkDataSet* theDataSet); + //--------------------------------------------------------------- VISU_CONVERTOR_EXPORT diff --git a/src/CONVERTOR/VISU_Convertor_impl.cxx b/src/CONVERTOR/VISU_Convertor_impl.cxx index 0e8a49a1..e35b3626 100644 --- a/src/CONVERTOR/VISU_Convertor_impl.cxx +++ b/src/CONVERTOR/VISU_Convertor_impl.cxx @@ -82,18 +82,12 @@ namespace //--------------------------------------------------------------- + inline void - PrintCells(int& theStartId, - vtkCellArray* theConnectivity, - const VISU::TConnect& theVector) + PrintCells( vtkCellArray* theConnectivity, + const VISU::TConnect& theVector) { - vtkIdList *anIdList = vtkIdList::New(); - int kEnd = theVector.size(); - anIdList->SetNumberOfIds(kEnd); - for(int k = 0; k < kEnd; k++) - anIdList->SetId(k,theVector[k]); - theConnectivity->InsertNextCell(anIdList); - anIdList->Delete(); + theConnectivity->InsertNextCell( theVector.size(), &theVector[ 0 ] ); } @@ -121,7 +115,7 @@ namespace aCellTypesArray->SetNumberOfTuples(aNbCells); for(vtkIdType anID = 0; anID < aNbCells; anID++){ - PrintCells(anID,aConnectivity,anArray[anID]); + PrintCells( aConnectivity, anArray[ anID ] ); aCellTypesArray->SetValue(anID,(unsigned char)theGeom); } @@ -216,7 +210,7 @@ namespace VISU::TSubMeshID::const_iterator aSubMeshIDIter = aSubMeshID.begin(); for(; aSubMeshIDIter != aSubMeshID.end(); aSubMeshIDIter++, aCellId++){ vtkIdType anID = *aSubMeshIDIter; - PrintCells(aCellId, aConnectivity, anArray[anID]); + PrintCells( aConnectivity, anArray[ anID ] ); aCellTypesArray->SetValue(aCellId, (unsigned char)aVGeom); vtkIdType anObjID = aSubMesh.GetElemObjID(anID); anElemObj2VTKID[anObjID] = aCellId; @@ -281,7 +275,7 @@ namespace VISU::TCell2Connect::const_iterator anIter = aCell2Connect.begin(); for(vtkIdType anId = 0, aConnId = 0; anIter != aCell2Connect.end(); anIter++){ const VISU::TConnect& anArray = aCell2Connect[anId]; - PrintCells(aConnId,aConnectivity,anArray); + PrintCells( aConnectivity, anArray ); aCellTypesArray->SetValue(anId,(unsigned char)aVGeom); aConnId += aNbNodes; anId++; @@ -291,7 +285,7 @@ namespace for(vtkIdType anId = 0, aConnId = 0; anIter != aSubMeshID.end(); anIter++){ vtkIdType aSubId = *anIter; const VISU::TConnect& anArray = aCell2Connect[aSubId]; - PrintCells(aConnId,aConnectivity,anArray); + PrintCells( aConnectivity, anArray ); aCellTypesArray->SetValue(anId,(unsigned char)aVGeom); aConnId += aNbNodes; anId++; @@ -844,81 +838,63 @@ VISU_Convertor_impl //--------------------------------------------------------------- vtkUnstructuredGrid* VISU_Convertor_impl -::GetTimeStampOnProfile(const VISU::PMeshImpl& theMesh, - const VISU::PMeshOnEntityImpl& theMeshOnEntity, - const VISU::PFieldImpl& theField, - const VISU::PValForTimeImpl& theValForTime, - const VISU::PUnstructuredGridIDMapperImpl& theUnstructuredGridIDMapper, - const VISU::PProfileImpl& theProfile, - const VISU::TEntity& theEntity) +::GetTimeStampOnProfile( const VISU::PMeshImpl& theMesh, + const VISU::PMeshOnEntityImpl& theMeshOnEntity, + const VISU::PFieldImpl& theField, + const VISU::PValForTimeImpl& theValForTime, + const VISU::PUnstructuredGridIDMapperImpl& theUnstructuredGridIDMapper, + const VISU::PProfileImpl& theProfile, + const VISU::TEntity& theEntity ) { - vtkUnstructuredGrid* anOutput = NULL; - - LoadMeshOnEntity(theMesh, theMeshOnEntity); - GetMeshOnEntity(theMeshOnEntity->myMeshName, theMeshOnEntity->myEntity); - GetMeshOnProfile(theMesh, theMeshOnEntity, theProfile); - - bool isNeedInCells = false; + LoadMeshOnEntity( theMesh, theMeshOnEntity ); + GetMeshOnEntity( theMeshOnEntity->myMeshName, theMeshOnEntity->myEntity ); + GetMeshOnProfile( theMesh, theMeshOnEntity, theProfile ); theUnstructuredGridIDMapper->myIDMapper = theProfile; - if(theMeshOnEntity->myEntity == VISU::NODE_ENTITY){ + + if ( theMeshOnEntity->myEntity == VISU::NODE_ENTITY ) { // add geometry elements to output, // if timestamp on NODE_ENTITY and // on profiles with status eAddPart - VISU::TGeom2SubProfile::const_iterator anIter = theProfile->myGeom2SubProfile.begin(); - for(; anIter != (theProfile->myGeom2SubProfile).end(); anIter++){ - const VISU::EGeometry aGeom = anIter->first; - const VISU::PSubProfileImpl aSubProfile = anIter->second; - if(aSubProfile->myStatus == VISU::eAddPart && aGeom == VISU::ePOINT1){ - isNeedInCells = true; - break; + const VISU::TGeom2SubProfile& aGeom2SubProfile = theProfile->myGeom2SubProfile; + VISU::TGeom2SubProfile::const_iterator aSubProfileIter = aGeom2SubProfile.begin(); + for ( ; aSubProfileIter != aGeom2SubProfile.end(); aSubProfileIter++ ) { + const VISU::EGeometry& aGeom = aSubProfileIter->first; + const VISU::PSubProfileImpl& aSubProfile = aSubProfileIter->second; + if ( aSubProfile->myStatus == VISU::eAddPart && aGeom == VISU::ePOINT1 ) { + const VISU::TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap; + VISU::TMeshOnEntityMap::const_reverse_iterator aMeshOnEntityIter = aMeshOnEntityMap.rbegin(); + for( ; aMeshOnEntityIter != aMeshOnEntityMap.rend(); aMeshOnEntityIter++ ) { + VISU::TEntity anEntity = aMeshOnEntityIter->first; + if ( anEntity == VISU::NODE_ENTITY ) + continue; + VISU::PNamedIDMapper aNamedIDMapper = GetMeshOnEntity( theMesh->myName, anEntity ); + if( aNamedIDMapper ) { + theUnstructuredGridIDMapper->SetReferencedMesh( aNamedIDMapper ); + VISU::PUnstructuredGrid aSource = theUnstructuredGridIDMapper->GetSource(); + VISU::GetTimeStampOnProfile( aSource, theField, theValForTime, theEntity ); + + return theUnstructuredGridIDMapper->GetUnstructuredGridOutput(); + } + } } } - if(isNeedInCells){ - theUnstructuredGridIDMapper->myIsSpecialKey = true; - GetTimeStampOnNodalProfile(theMesh,theUnstructuredGridIDMapper,theField,theValForTime,theEntity); - anOutput = theUnstructuredGridIDMapper->GetUnstructuredGridOutput(); - } } - if(!isNeedInCells){ - vtkUnstructuredGrid* anOutput = theUnstructuredGridIDMapper->GetUnstructuredGridOutput(); - const VISU::PUnstructuredGrid& aSource = theUnstructuredGridIDMapper->mySource.GetSource(); - VISU::GetTimeStampOnProfile(aSource, theField, theValForTime, theEntity); - } - return anOutput; -} -void -VISU_Convertor_impl -::GetTimeStampOnNodalProfile(const VISU::PMeshImpl& theMesh, - const VISU::PUnstructuredGridIDMapperImpl& theIDMapperFilter, - const VISU::PFieldImpl& theField, - const VISU::PValForTimeImpl& theValForTime, - const VISU::TEntity& theEntity) -{ - const VISU::TMeshOnEntityMap& aMeshOnEntityMap = theMesh->myMeshOnEntityMap; - VISU::TMeshOnEntityMap::const_iterator aIter = aMeshOnEntityMap.begin(); - for(;aIter!=aMeshOnEntityMap.end();aIter++){ - VISU::TEntity aEntity = aIter->first; - if(aEntity != VISU::NODE_ENTITY){ - VISU::PNamedIDMapper aMapper = GetMeshOnEntity(theMesh->myName,aEntity); - if(aMapper) - theIDMapperFilter->myMappers[aEntity] = aMapper; - } - } + VISU::PUnstructuredGrid aSource = theUnstructuredGridIDMapper->GetSource(); + VISU::GetTimeStampOnProfile( aSource, theField, theValForTime, theEntity ); - theIDMapperFilter->GetUnstructuredGridOutput(); - const VISU::PUnstructuredGrid& aSource = theIDMapperFilter->mySource.GetSource(); - VISU::GetTimeStampOnProfile(aSource,theField,theValForTime,theEntity); + return theUnstructuredGridIDMapper->GetUnstructuredGridOutput(); } + //--------------------------------------------------------------- VISU::PUnstructuredGridIDMapper VISU_Convertor_impl -::GetTimeStampOnMesh(const std::string& theMeshName, - const VISU::TEntity& theEntity, - const std::string& theFieldName, - int theStampsNum) +::GetTimeStampOnMesh( const std::string& theMeshName, + const VISU::TEntity& theEntity, + const std::string& theFieldName, + int theStampsNum ) { INITMSG(MYDEBUG,"GetTimeStampOnMesh"<< "; theMeshName = '"<myIDMapper = aGaussMesh; aGaussPtsIDFilter->myGaussPtsIDMapper = aGaussMesh; - vtkPolyData* anOutput = aGaussPtsIDFilter->GetPolyDataOutput(); - const VISU::PPolyData& aSource = aGaussPtsIDFilter->mySource.GetSource(); + VISU::PPolyData aSource = aGaussPtsIDFilter->GetSource(); VISU::GetTimeStampOnGaussMesh(aSource, aField, aValForTime); + vtkPolyData* anOutput = aGaussPtsIDFilter->GetPolyDataOutput(); aGaussPtsIDFilter->myIsVTKDone = true; @@ -1357,29 +1333,29 @@ VISU_Convertor_impl VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap; VISU::PMeshOnEntityImpl aVTKMeshOnEntity = aMeshOnEntity; - if(theEntity == VISU::NODE_ENTITY){ - if(aMeshOnEntityMap.find(VISU::CELL_ENTITY) != aMeshOnEntityMap.end()) - aVTKMeshOnEntity = aMeshOnEntityMap[VISU::CELL_ENTITY]; - else if(aMeshOnEntityMap.find(VISU::FACE_ENTITY) != aMeshOnEntityMap.end()) - aVTKMeshOnEntity = aMeshOnEntityMap[VISU::FACE_ENTITY]; - else if(aMeshOnEntityMap.find(VISU::EDGE_ENTITY) != aMeshOnEntityMap.end()) - aVTKMeshOnEntity = aMeshOnEntityMap[VISU::EDGE_ENTITY]; - else if(aMeshOnEntityMap.find(VISU::NODE_ENTITY) != aMeshOnEntityMap.end()) - aVTKMeshOnEntity = aMeshOnEntityMap[VISU::NODE_ENTITY]; + if ( theEntity == VISU::NODE_ENTITY ) { + if(aMeshOnEntityMap.find( VISU::CELL_ENTITY ) != aMeshOnEntityMap.end()) + aVTKMeshOnEntity = aMeshOnEntityMap[ VISU::CELL_ENTITY ]; + else if (aMeshOnEntityMap.find( VISU::FACE_ENTITY ) != aMeshOnEntityMap.end() ) + aVTKMeshOnEntity = aMeshOnEntityMap[ VISU::FACE_ENTITY ]; + else if (aMeshOnEntityMap.find( VISU::EDGE_ENTITY ) != aMeshOnEntityMap.end() ) + aVTKMeshOnEntity = aMeshOnEntityMap[ VISU::EDGE_ENTITY ]; + else if ( aMeshOnEntityMap.find( VISU::NODE_ENTITY ) != aMeshOnEntityMap.end() ) + aVTKMeshOnEntity = aMeshOnEntityMap[ VISU::NODE_ENTITY ]; }else aVTKMeshOnEntity = aMeshOnEntity; VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap; - VISU::TFieldMap::const_iterator aFieldIter= aFieldMap.find(theFieldName); + VISU::TFieldMap::const_iterator aFieldIter= aFieldMap.find( theFieldName ); if(aFieldIter == aFieldMap.end()) EXCEPTION(std::runtime_error,"FindField >> There is no field on the mesh!!!"); VISU::PFieldImpl aField = aFieldIter->second; - return TFindField(aMesh, - aMeshOnEntity, - aVTKMeshOnEntity, - aField); + return TFindField( aMesh, + aMeshOnEntity, + aVTKMeshOnEntity, + aField ); } diff --git a/src/CONVERTOR/VISU_Convertor_impl.hxx b/src/CONVERTOR/VISU_Convertor_impl.hxx index f6cffc0e..14beaf5e 100644 --- a/src/CONVERTOR/VISU_Convertor_impl.hxx +++ b/src/CONVERTOR/VISU_Convertor_impl.hxx @@ -120,10 +120,10 @@ public: //! Implemention of the VISU_Convertor::GetTimeStampOnMesh virtual VISU::PUnstructuredGridIDMapper - GetTimeStampOnMesh(const std::string& theMeshName, - const VISU::TEntity& theEntity, - const std::string& theFieldName, - int theTimeStampNumber); + GetTimeStampOnMesh( const std::string& theMeshName, + const VISU::TEntity& theEntity, + const std::string& theFieldName, + int theTimeStampNumber ); //! Get amount of memory to build vtkDataSet for corresponding MED TIMESTAMP on mesh virtual @@ -206,9 +206,9 @@ protected: VISU::PMeshOnEntityImpl, VISU::PFieldImpl> TFindField; TFindField - FindField(const std::string& theMeshName, - const VISU::TEntity& theEntity, - const std::string& theFieldName); + FindField( const std::string& theMeshName, + const VISU::TEntity& theEntity, + const std::string& theFieldName ); //! An utility method to find TTimeStamp by name of its parent mesh, corresponding entity, field name and its number typedef boost::tuple + + +/*! + \file VISU_ElnoMeshValue.hxx + \brief The file contains declarations for the acess to the specific ELNO MED data +*/ + +namespace VISU +{ + //--------------------------------------------------------------- + template< int elno_type > + struct TGetElnoNodeData + { + typedef typename TL::TEnum2VTKArrayType< elno_type >::TResult TVTKDataArray; + typedef typename TL::TEnum2VTKBasicType< elno_type >::TResult TDataType; + TVTKDataArray *myElnoDataArray; + vtkIntArray *myElnoDataMapper; + int myElemInfo[3]; + + + //---------------------------------------------------------------------------- + TGetElnoNodeData( vtkDataArray *theElnoDataArray, + vtkDataArray *theElnoDataMapper ) + : myElnoDataArray( TVTKDataArray::SafeDownCast( theElnoDataArray ) ) + , myElnoDataMapper( vtkIntArray::SafeDownCast( theElnoDataMapper ) ) + {} + + + //---------------------------------------------------------------------------- + TDataType* + operator () ( vtkIdType theCellId, vtkIdType theLocalPntId ) + { + myElnoDataMapper->GetTupleValue( theCellId, myElemInfo ); + + vtkIdType aPos = myElemInfo[ 0 ] + theLocalPntId * myElemInfo[ 1 ]; + + return myElnoDataArray->GetPointer( aPos ); + } + + + //---------------------------------------------------------------------------- + int + getNbComp() + { + myElnoDataMapper->GetTupleValue( 0, myElemInfo ); + + return myElemInfo[ 1 ]; + } + }; + + + //---------------------------------------------------------------------------------------------- + template< int elno_type > + struct TSetElnoNodeData + { + typedef typename TL::TEnum2VTKArrayType< elno_type >::TResult TVTKDataArray; + typedef typename TL::TEnum2VTKBasicType< elno_type >::TResult TDataType; + + //---------------------------------------------------------------------------------------------- + TSetElnoNodeData( vtkIdType theEffectNbComp, + vtkIdType theRealNbComp, + vtkIdType theNbTuples, + const char* theDataArrayName, + const char* theMapperArrayName ) + : myElnoDataArray( TVTKDataArray::New() ) + , myElnoDataMapper( vtkIntArray::New() ) + { + myElnoDataArray->SetNumberOfComponents( theEffectNbComp ); + myElnoDataArray->SetNumberOfTuples( theNbTuples ); + myElnoDataArray->SetName( theDataArrayName ); + + myElnoDataMapper->SetNumberOfComponents( 3 ); + myElnoDataMapper->Allocate( theNbTuples * 3 ); + myElnoDataMapper->SetName( theMapperArrayName ); + + myElemInfo[ 0 ] = 0; + myElemInfo[ 1 ] = theRealNbComp; + myElemInfo[ 2 ] = 0; + } + + + //---------------------------------------------------------------------------------------------- + ~TSetElnoNodeData() + { + myElnoDataArray->Delete(); + myElnoDataMapper->Delete(); + } + + + //---------------------------------------------------------------------------------------------- + int + AddNextPointData( TDataType* theDataPtr ) + { + vtkIdType aPos = myElemInfo[ 0 ] + myElemInfo[ 2 ] * myElemInfo[ 1 ]; + + TDataType* aDataPtr = myElnoDataArray->GetPointer( aPos ); + + for ( vtkIdType aCompId = 0; aCompId < myElemInfo[ 1 ]; aCompId++ ) + *aDataPtr++ = *theDataPtr++; + + return myElemInfo[ 2 ]++; + } + + + //---------------------------------------------------------------------------------------------- + void + InsertNextCellData() + { + myElnoDataMapper->InsertNextTupleValue( myElemInfo ); + myElemInfo[ 0 ] += myElemInfo[ 2 ] * myElemInfo[ 1 ]; + myElemInfo[ 2 ] = 0; + } + + + //---------------------------------------------------------------------------------------------- + void + AddData( vtkDataSetAttributes* theDataSetAttributes ) + { + theDataSetAttributes->AddArray( myElnoDataArray ); + theDataSetAttributes->AddArray( myElnoDataMapper ); + } + + protected: + TVTKDataArray *myElnoDataArray; + vtkIntArray *myElnoDataMapper; + int myElemInfo[ 3 ]; + }; + + + //--------------------------------------------------------------- +} + +#endif diff --git a/src/CONVERTOR/VISU_IDMapper.cxx b/src/CONVERTOR/VISU_IDMapper.cxx index bf1e8fca..55e2cc20 100644 --- a/src/CONVERTOR/VISU_IDMapper.cxx +++ b/src/CONVERTOR/VISU_IDMapper.cxx @@ -103,8 +103,8 @@ namespace VISU ::GetIndexesOfNode(vtkIdType theNodeId) { if ( IsStructured() ) { - TObj2StructuredId::const_iterator aIter = myObj2StructuredId->find( theNodeId ); - if ( aIter != myObj2StructuredId->end() ) + TObj2StructuredId::const_iterator aIter = myObj2StructuredId.find( theNodeId ); + if ( aIter != myObj2StructuredId.end() ) return aIter->second; } @@ -115,8 +115,8 @@ namespace VISU TStructured ::GetObjectIDByIndexes(TStructuredId theVec) { - TObj2StructuredId::const_iterator aIter = myObj2StructuredId->begin(); - for (; aIter != myObj2StructuredId->end(); aIter++ ) { + TObj2StructuredId::const_iterator aIter = myObj2StructuredId.begin(); + for (; aIter != myObj2StructuredId.end(); aIter++ ) { if ( theVec == aIter->second ) return aIter->first; } diff --git a/src/CONVERTOR/VISU_IDMapper.hxx b/src/CONVERTOR/VISU_IDMapper.hxx index 2657165c..4ef68e30 100644 --- a/src/CONVERTOR/VISU_IDMapper.hxx +++ b/src/CONVERTOR/VISU_IDMapper.hxx @@ -124,7 +124,7 @@ namespace VISU */ TStructuredId myGrilleStructure; - PObj2StructuredId myObj2StructuredId;//!< map of object id to i,j,k ids of structured grid nodes + TObj2StructuredId myObj2StructuredId;//!< map of object id to i,j,k ids of structured grid nodes }; //--------------------------------------------------------------- diff --git a/src/CONVERTOR/VISU_MedConvertor.cxx b/src/CONVERTOR/VISU_MedConvertor.cxx index df36b0c9..e86e2e16 100644 --- a/src/CONVERTOR/VISU_MedConvertor.cxx +++ b/src/CONVERTOR/VISU_MedConvertor.cxx @@ -138,15 +138,29 @@ namespace //--------------------------------------------------------------- VISU::TEntity - MEDEntityToVTK(MED::EEntiteMaillage theMEDEntity) + MEDEntityToVTK( MED::EEntiteMaillage theMEDEntity ) { + VISU::TEntity anEntity = VISU::TEntity( -1 ); + switch(theMEDEntity){ - case MED::eNOEUD: return VISU::NODE_ENTITY; - case MED::eARETE: return VISU::EDGE_ENTITY; - case MED::eFACE: return VISU::FACE_ENTITY; - case MED::eMAILLE: return VISU::CELL_ENTITY; + case MED::eNOEUD : + anEntity = VISU::NODE_ENTITY; + break; + case MED::eARETE : + anEntity = VISU::EDGE_ENTITY; + break; + case MED::eFACE : + anEntity = VISU::FACE_ENTITY; + break; + case MED::eMAILLE : + anEntity = VISU::CELL_ENTITY; + break; + case MED::eNOEUD_ELEMENT : + anEntity = VISU::CELL_ENTITY; + break; } - return VISU::TEntity(-1); + + return anEntity; } @@ -200,7 +214,7 @@ namespace MED::PPolygoneInfo aPolygoneInfo = theMEDWrapper->GetPPolygoneInfo(theMeshInfo,theMEntity,theMGeom); for(TInt anElemId = 0; anElemId < aNbElem ; anElemId++){ - TInt aNbConn = aPolygoneInfo->GetNbConn(anElemNum[anElemId]); + TInt aNbConn = aPolygoneInfo->GetNbConn( anElemNum[ anElemId ] - 1 ); aSubProfile->myCellsSize += aNbConn; } break; @@ -210,7 +224,7 @@ namespace theMEDWrapper->GetPPolyedreInfo(theMeshInfo,theMEntity,theMGeom); for(TInt anElemId = 0; anElemId < aNbElem ; anElemId++){ MED::TCConnSliceArr aConnSliceArr = - aPolyedreInfo->GetConnSliceArr(anElemNum[anElemId]); + aPolyedreInfo->GetConnSliceArr( anElemNum[ anElemId ] - 1 ); TInt aNbFaces = aConnSliceArr.size(); TInt aCellSize = 0; for(TInt iFace = 0; iFace < aNbFaces; iFace++){ @@ -754,9 +768,9 @@ namespace if(aNbTimeStamps < 1) continue; - VISU::TEntity aVEntity = MEDEntityToVTK(aMEntity); + VISU::TEntity aVEntity = MEDEntityToVTK( aMEntity ); vtkIdType aDataType = VTK_DOUBLE; - if(aFieldInfo->GetType() != MED::eFLOAT64){ + if ( aFieldInfo->GetType() != MED::eFLOAT64 ) { #if defined(HAVE_F77INT64) aDataType = VTK_LONG; #else @@ -772,7 +786,8 @@ namespace aField->myName = aFieldName; aField->myMeshName = aMeshName; aField->myDataSize = aMeshOnEntity->myNbCells * aNbComp; - + aField->myIsELNO = ( aMEntity == MED::eNOEUD_ELEMENT ); + INITMSG(MYDEBUG,"myName = '"<myName<<"'"<< "; myId = "<myId<< "; myEntity = "<myEntity<< @@ -813,9 +828,13 @@ namespace MED::TGeom2NbGauss::const_iterator anIter = aMGeom2NbGauss.begin(); for(; anIter != aMGeom2NbGauss.end(); anIter++){ const MED::EGeometrieElement& aMGeom = anIter->first; - VISU::EGeometry aEGeom = MEDGeom2VISU(aMGeom); + VISU::EGeometry aEGeom = MEDGeom2VISU( aMGeom ); TInt aNbGauss = anIter->second; - aVGeom2NbGauss[aEGeom] = aNbGauss; + aVGeom2NbGauss[ aEGeom ] = aNbGauss; + + // ELNO data should satisfy the following condition ( implicitly ) + vtkIdType aNbNodes = MEDGeom2NbNodes( aMGeom ); + aField->myIsELNO &= ( aNbGauss == aNbNodes ); } } } @@ -1238,8 +1257,7 @@ namespace VISU //--------------------------------------------------------------- vtkIdType TMEDGaussSubMesh - ::GetVTKID(const TGaussPointID& theID, - vtkIdType theStartID) const + ::GetVTKID( const TGaussPointID& theID ) const { vtkIdType aResult = -1; @@ -1253,9 +1271,9 @@ namespace VISU if ( myIsElemNum ) { aCellID = GetElemVTKID( aCellID ); } else - aCellID -= theStartID; + aCellID -= myStartID; - return aCellID * aNbPoints + aLocalPntID + theStartID; + return aCellID * aNbPoints + aLocalPntID + myStartID; } @@ -1277,6 +1295,7 @@ namespace VISU ::Init(const MED::PElemInfo& theElemInfo, MED::EVersion theVersion) { + myVersion = theVersion; myIsElemNum = theElemInfo->IsElemNum(); if(myIsElemNum) myElemNum = theElemInfo->myElemNum; diff --git a/src/CONVERTOR/VISU_MedConvertor.hxx b/src/CONVERTOR/VISU_MedConvertor.hxx index 4529ecb3..ec1f3cee 100644 --- a/src/CONVERTOR/VISU_MedConvertor.hxx +++ b/src/CONVERTOR/VISU_MedConvertor.hxx @@ -245,8 +245,7 @@ namespace VISU virtual vtkIdType - GetVTKID(const TGaussPointID& theID, - vtkIdType theStartID) const; + GetVTKID( const TGaussPointID& theID ) const; //! Gets memory size used by the instance (bytes). virtual diff --git a/src/CONVERTOR/VISU_MergeFilterUtilities.cxx b/src/CONVERTOR/VISU_MergeFilterUtilities.cxx index 48846369..2d1eafc2 100644 --- a/src/CONVERTOR/VISU_MergeFilterUtilities.cxx +++ b/src/CONVERTOR/VISU_MergeFilterUtilities.cxx @@ -81,6 +81,9 @@ namespace vtkCellData *anOutputCellData = theOutput->GetCellData(); anOutputCellData->CopyAllocate(aCellData); + if(theVectorsDataSet && theVectorsDataSet != theScalarsDataSet) + anOutputCellData->CopyVectorsOff(); + vtkIdType aNbTuples = anIntersection.size(); theOutput->Allocate(aNbTuples); vtkIdList *aCellIds = vtkIdList::New(); @@ -100,13 +103,68 @@ namespace aCellIds->Delete(); theOutput->SetPoints(theInput->GetPoints()); + }else{ theOutput->CopyStructure(theInput); theOutput->GetCellData()->ShallowCopy(theScalarsDataSet->GetCellData()); } theOutput->GetPointData()->ShallowCopy(theInput->GetPointData()); + + //If need, copy vectors data. + if(theVectorsDataSet && theVectorsDataSet != theScalarsDataSet){ + bool isVectorsOnCells = theVectorsDataSet->GetCellData()->GetVectors() != NULL; + bool isVectorsDataOnPoints = theVectorsDataSet->GetPointData()->GetVectors() != NULL; + if(isVectorsOnCells) { + CopyVectorsOnCells(theVectorsDataSet,theOutput); + } + else if(isVectorsDataOnPoints){ + CopyVectorsOnPoints(theVectorsDataSet,theOutput); + } + } } + void CopyVectorsOnCells(vtkDataSet *theVectorsDataSet, + vtkDataSet *theOutput) + { + vtkDataArray *anInputVectors = theVectorsDataSet->GetCellData()->GetVectors(); + vtkDataArray *anOutputVectors = vtkDataArray::CreateDataArray(anInputVectors->GetDataType()); + + //Clear output vector data + theOutput->GetCellData()->SetVectors(NULL); + + //Copy vectors data + vtkIntArray* anOutputIDMapper = GetIDMapper(theOutput, + TGetCellData(), + "VISU_CELLS_MAPPER"); + + vtkIntArray* anInputIDMapper = GetIDMapper(theVectorsDataSet, + TGetCellData(), + "VISU_CELLS_MAPPER"); + + TObjectIdArray anIntersection; + GetIntersection(anOutputIDMapper, + anInputIDMapper, + anIntersection); + + vtkIdType aNbTuples = anIntersection.size(); + anOutputVectors->SetNumberOfComponents(anInputVectors->GetNumberOfComponents()); + anOutputVectors->SetNumberOfTuples(aNbTuples); + theOutput->GetCellData()->SetVectors(anOutputVectors); + anOutputVectors->Delete(); + + TObjectId2TupleIdMap anOutputObjectId2TupleIdMap; + GetObjectId2TupleIdMap(anOutputIDMapper, anOutputObjectId2TupleIdMap); + + TObjectId2TupleIdMap anInputObjectId2TupleIdMap; + GetObjectId2TupleIdMap(anInputIDMapper, anInputObjectId2TupleIdMap); + + for(vtkIdType iTupleId = 0; iTupleId < aNbTuples; iTupleId++ ){ + TObjectId &anObjectId = anIntersection[iTupleId]; + vtkIdType anOutputCellId = anOutputObjectId2TupleIdMap[anObjectId]; + vtkIdType anInputCellId = anInputObjectId2TupleIdMap[anObjectId]; + anOutputVectors->SetTuple(anOutputCellId,anInputVectors->GetTuple(anInputCellId)); + } + } //--------------------------------------------------------------- template @@ -200,7 +258,118 @@ namespace theOutput->GetCellData()->ShallowCopy(theInput->GetCellData()); } theOutput->GetPointData()->ShallowCopy(theScalarsDataSet->GetPointData()); + + //If need, copy vectors data. + if(theVectorsDataSet && theVectorsDataSet != theScalarsDataSet){ + bool isVectorsOnCells = theVectorsDataSet->GetCellData()->GetVectors() != NULL; + bool isVectorsDataOnPoints = theVectorsDataSet->GetPointData()->GetVectors() != NULL; + + //Merge cells if need + //rnv + if(!IsDifferent(theGeometryPointMapper, theDataPointMapper)){ + vtkIntArray* theGeometryCellMapper = GetIDMapper(theVectorsDataSet, + TGetCellData(), + "VISU_CELLS_MAPPER"); + + vtkIntArray* theDataCellMapper = GetIDMapper(theScalarsDataSet, + TGetCellData(), + "VISU_CELLS_MAPPER"); + + + if(IsDifferent(theGeometryCellMapper, theDataCellMapper)){ + TObjectIdArray anIntersection; + + GetIntersection(theGeometryCellMapper, + theDataCellMapper, + anIntersection); + + TObjectId2TupleIdMap aGeomObjectId2TupleIdMap; + GetObjectId2TupleIdMap(theGeometryCellMapper, aGeomObjectId2TupleIdMap); + + TObjectId2TupleIdMap aDataObjectId2TupleIdMap; + GetObjectId2TupleIdMap(theDataCellMapper, aDataObjectId2TupleIdMap); + + vtkCellData *aCellData = theScalarsDataSet->GetCellData(); + vtkCellData *anOutputCellData = theOutput->GetCellData(); + anOutputCellData->CopyAllocate(aCellData); + + vtkIdType aNbTuples = anIntersection.size(); + theOutput->Allocate(aNbTuples); + vtkIdList *aCellIds = vtkIdList::New(); + for(int aTupleId = 0; aTupleId < aNbTuples; aTupleId++){ + TObjectId& anObjectId = anIntersection[aTupleId]; + vtkIdType aCellId = aGeomObjectId2TupleIdMap[anObjectId]; + vtkCell *aCell = theInput->GetCell(aCellId); + aCellIds->Reset(); + vtkIdType aNbPointIds = aCell->PointIds->GetNumberOfIds(); + for(vtkIdType anId = 0; anId < aNbPointIds; anId++) + aCellIds->InsertNextId(aCell->GetPointIds()->GetId(anId)); + vtkIdType aCellType = theInput->GetCellType(aCellId); + vtkIdType aNewCellId = theOutput->InsertNextCell(aCellType, aCellIds); + vtkIdType aDataCellId = aDataObjectId2TupleIdMap[anObjectId]; + anOutputCellData->CopyData(aCellData, aDataCellId, aNewCellId); + } + aCellIds->Delete(); + + } + } + + if(isVectorsOnCells) { + CopyVectorsOnCells(theVectorsDataSet,theOutput); + } + else if(isVectorsDataOnPoints){ + CopyVectorsOnPoints(theVectorsDataSet,theOutput); + } + } } + + void CopyVectorsOnPoints(vtkDataSet *theVectorsDataSet, + vtkDataSet *theOutput) + { + vtkDataArray *anInputVectors = theVectorsDataSet->GetPointData()->GetVectors(); + + //Clear output vector data + theOutput->GetPointData()->SetVectors(NULL); + + vtkDataArray *anOutputVectors = vtkDataArray::CreateDataArray(anInputVectors->GetDataType()); + + //Copy vectors data + vtkIntArray* anOutputIDMapper = GetIDMapper(theOutput, + TGetPointData(), + "VISU_POINTS_MAPPER"); + + vtkIntArray* anInputIDMapper = GetIDMapper(theVectorsDataSet, + TGetPointData(), + "VISU_POINTS_MAPPER"); + TObjectIdArray anIntersection; + + GetIntersection(anOutputIDMapper, + anInputIDMapper, + anIntersection); + + vtkIdType aNbTuples = anIntersection.size(); + anOutputVectors->SetNumberOfComponents(anInputVectors->GetNumberOfComponents()); + anOutputVectors->SetNumberOfTuples(aNbTuples); + + + + TObjectId2TupleIdMap anOutputObjectId2TupleIdMap; + GetObjectId2TupleIdMap(anOutputIDMapper, anOutputObjectId2TupleIdMap); + + TObjectId2TupleIdMap anInputObjectId2TupleIdMap; + GetObjectId2TupleIdMap(anInputIDMapper, anInputObjectId2TupleIdMap); + + for(vtkIdType iTupleId = 0; iTupleId < aNbTuples; iTupleId++ ){ + TObjectId& anObjectId = anIntersection[iTupleId]; + vtkIdType anOutputPointId = anOutputObjectId2TupleIdMap[anObjectId]; + vtkIdType anInputPointId = anInputObjectId2TupleIdMap[anObjectId]; + anOutputVectors->SetTuple(anOutputPointId,anInputVectors->GetTuple(anInputPointId)); + } + + theOutput->GetPointData()->SetVectors(anOutputVectors); + anOutputVectors->Delete(); + } + //--------------------------------------------------------------- typedef vtkDataArray* (vtkDataSetAttributes::* TGetAttribute)(); diff --git a/src/CONVERTOR/VISU_MeshValue.cxx b/src/CONVERTOR/VISU_MeshValue.cxx index 4b7a2785..b4b265ed 100644 --- a/src/CONVERTOR/VISU_MeshValue.cxx +++ b/src/CONVERTOR/VISU_MeshValue.cxx @@ -25,11 +25,12 @@ // Module : VISU #include "VISU_MeshValue.hxx" +#include "VISU_ElnoMeshValue.hxx" #include "VISU_Structures_impl.hxx" #include "VISU_ConvertorUtils.hxx" #include "VISU_PointCoords.hxx" -#include "VISU_TypeList.hxx" +#include "VISU_VTKTypeList.hxx" #include #include @@ -113,76 +114,6 @@ namespace VISU } - namespace TL - { - //---------------------------------------------------------------------------- - typedef TList > > > > > > > > > - TVTKBasicTypeList; - - - //---------------------------------------------------------------------------- - typedef TList > > > > > > > > > - TVTKArrayTypeList; - - - typedef TList, - TList, - TList, - TList, - TList, - TList, - TList, - TList, - TList, - TList, - TNullType> > > > > > > > > > - TVTKBasicEnumList; - - - //---------------------------------------------------------------------------- - template - struct TEnum2VTKBasicType - { - typedef typename TTypeAt >::value >::TResult TResult; - }; - - //---------------------------------------------------------------------------- - template - struct TEnum2VTKArrayType - { - typedef typename TTypeAt >::value >::TResult TResult; - }; - - //---------------------------------------------------------------------------- - template - struct TVTKBasicType2Enum - { - typedef typename TTypeAt::value >::TResult TResult; - }; - - } - - //---------------------------------------------------------------------------- template void @@ -349,7 +280,7 @@ namespace VISU std::string aFieldName = VISU::GenerateFieldName(theField, theValForTime); vtkDataSetAttributes* aDataSetAttributes; - switch(theEntity){ + switch ( theEntity ) { case VISU::NODE_ENTITY : aDataSetAttributes = theSource->GetPointData(); break; @@ -360,49 +291,51 @@ namespace VISU typedef typename TL::TEnum2VTKArrayType::TResult TVTKDataArray; TVTKDataArray *aSelectedDataArray = TVTKDataArray::New(); vtkIdType aNbComp = theField->myNbComp; - switch(aNbComp) { + + switch ( aNbComp ) { case 1: - aSelectedDataArray->SetNumberOfComponents(1); - aDataSetAttributes->SetScalars(aSelectedDataArray); + aSelectedDataArray->SetNumberOfComponents( 1 ); + aDataSetAttributes->SetScalars( aSelectedDataArray ); break; default: - aSelectedDataArray->SetNumberOfComponents(3); - aDataSetAttributes->SetVectors(aSelectedDataArray); + aSelectedDataArray->SetNumberOfComponents( 3 ); + aDataSetAttributes->SetVectors( aSelectedDataArray ); } - aSelectedDataArray->SetNumberOfTuples(aNbTuples); - aSelectedDataArray->SetName(aFieldName.c_str()); + aSelectedDataArray->SetNumberOfTuples( aNbTuples ); + aSelectedDataArray->SetName( aFieldName.c_str() ); TVTKDataArray *aFullDataArray = TVTKDataArray::New(); - aFullDataArray->SetNumberOfComponents(aNbComp); - aFullDataArray->SetNumberOfTuples(aNbTuples); - aFullDataArray->SetName("VISU_FIELD"); - aDataSetAttributes->AddArray(aFullDataArray); + aFullDataArray->SetNumberOfComponents( aNbComp ); + aFullDataArray->SetNumberOfTuples( aNbTuples ); + aFullDataArray->SetName( "VISU_FIELD" ); + aDataSetAttributes->AddArray( aFullDataArray ); INITMSG(MYDEBUG,"InitTimeStampOnProfile "<< "- theEntity = "<GetGeom2MeshValue(); - typedef typename TL::TEnum2VTKBasicType::TResult TVTKBasicType; - typedef TTMeshValue TMeshValue; - typedef MED::SharedPtr TMeshValuePtr; + typedef typename TL::TEnum2VTKBasicType< EDataType >::TResult TVTKBasicType; + typedef TTMeshValue< TVTKBasicType > TMeshValue; + typedef MED::SharedPtr< TMeshValue > TMeshValuePtr; - typedef TDataArrayHolder TTDataArrayHolder; - typedef MED::SharedPtr PDataArrayHolder; + typedef TDataArrayHolder< EDataType > TTDataArrayHolder; + typedef MED::SharedPtr< TTDataArrayHolder > PDataArrayHolder; TMeshValuePtr aMeshValue = theValForTime->GetFirstMeshValue(); - if(aGeom2MeshValue.size() == 1 && aMeshValue->GetNbGauss() == 1){ + if ( aGeom2MeshValue.size() == 1 && aMeshValue->GetNbGauss() == 1 ) { aFullDataArray->SetVoidArray(aMeshValue->GetPointer(), aMeshValue->size(), true); INITMSG(MYDEBUG,"InitTimeStampOnProfile - aFullDataArray->SetVoidArray()"<SetVoidArray(aMeshValue->GetPointer(), - aMeshValue->size(), - true); + if ( aNbComp == 1 ) { + aSelectedDataArray->SetVoidArray( aMeshValue->GetPointer(), + aMeshValue->size(), + true ); INITMSG(MYDEBUG,"InitTimeStampOnProfile - aSelectedDataArray->SetVoidArray()"<Delete(); aFullDataArray->Delete(); + + // Process the case for ELNO data + //------------------------------- + if ( theField->myIsELNO ) { + // To calculate effective number of components for the VTK compatibel ELNO data representation + vtkIdType aEffectNbTuples = 0; + TGeom2MeshValue::const_iterator anIter = aGeom2MeshValue.begin(); + for ( ; anIter != aGeom2MeshValue.end(); anIter++ ) { + const PMeshValue& aMeshValue = anIter->second; + aEffectNbTuples += aMeshValue->GetNbElem() * aMeshValue->GetNbGauss(); + } + + vtkIdType anEffectNbComp = ( aEffectNbTuples * aNbComp ) / aNbTuples + 1; + + // To create corresponding VTK representation for the ELNO data + TSetElnoNodeData< EDataType > aSetElnoNodeData( anEffectNbComp, + aNbComp, + aNbTuples, + "ELNO_FIELD", + "ELNO_COMPONENT_MAPPER" ); + + std::vector< TVTKBasicType > aDataValues( aNbComp ); // To reserve a temproary value holder + + // To initilize these VTK representation for the ELNO data from the MED + anIter = aGeom2MeshValue.begin(); + for ( ; anIter != aGeom2MeshValue.end(); anIter++ ) { + EGeometry aEGeom = anIter->first; + const TMeshValuePtr aMeshValue = anIter->second; + + vtkIdType aNbElem = aMeshValue->GetNbElem(); + vtkIdType aNbGauss = aMeshValue->GetNbGauss(); + + INITMSG(MYDEBUG, + "- aEGeom = "<AddField("VISU_CELLS_MAPPER",aDataSet); - aFilter->AddField("VISU_POINTS_MAPPER",aDataSet); - - myCommonCellsFilter->SetProfileUG(aFilter->GetUnstructuredGridOutput()); + aFilter->SetGeometry( aGeometry ); + aFilter->SetScalars( aDataSet ); + aFilter->SetVectors( aDataSet ); + aFilter->AddField( "VISU_FIELD", aDataSet ); + aFilter->AddField( "VISU_CELLS_MAPPER", aDataSet ); + aFilter->AddField( "ELNO_FIELD", aDataSet ); + aFilter->AddField( "ELNO_COMPONENT_MAPPER", aDataSet ); + aFilter->AddField( "VISU_POINTS_MAPPER", aDataSet ); + + myCommonCellsFilter->SetProfileUG( aFilter->GetUnstructuredGridOutput() ); } + } + + vtkUnstructuredGrid* + TUnstructuredGridIDMapperImpl + ::GetUnstructuredGridOutput() + { + Build(); return myCommonCellsFilter->GetOutput(); } @@ -733,17 +730,25 @@ namespace VISU return GetUnstructuredGridOutput(); } + PUnstructuredGrid + TUnstructuredGridIDMapperImpl + ::GetSource() + { + Build(); + return mySource.GetSource(); + } + unsigned long int TUnstructuredGridIDMapperImpl ::GetMemorySize() { size_t aSize = myIDMapper->GetMemorySize(); + aSize += mySource.GetMemorySize(); - if(vtkUnstructuredGrid* anOutput = myCommonCellsFilter->GetOutput()) + + if ( vtkUnstructuredGrid* anOutput = myCommonCellsFilter->GetOutput() ) aSize += anOutput->GetActualMemorySize() * 1024; - PNamedIDMapperMap::const_iterator aIter = myMappers.begin(); - for(;aIter!=myMappers.end();aIter++) - aSize += (aIter->second)->GetMemorySize(); + return aSize; } @@ -790,26 +795,33 @@ namespace VISU return myIDMapper->GetElemCell(theObjID); } - vtkPolyData* + void TPolyDataIDMapperImpl - ::GetPolyDataOutput() + ::Build() { - if(!myFilter.GetPointer()){ + if ( !myFilter.GetPointer() ) { const PAppendPolyData& anAppendFilter = myIDMapper->GetFilter(); vtkPolyData* aGeometry = anAppendFilter->GetOutput(); const PPolyData& aSource = mySource.GetSource(); vtkPolyData* aDataSet = aSource.GetPointer(); - aDataSet->ShallowCopy(aGeometry); + aDataSet->ShallowCopy( aGeometry ); const PMergeFilter& aFilter = GetFilter(); - aFilter->SetGeometry(aGeometry); - aFilter->SetScalars(aDataSet); - aFilter->SetVectors(aDataSet); - aFilter->AddField("VISU_FIELD",aDataSet); - aFilter->AddField("VISU_CELLS_MAPPER",aDataSet); - aFilter->AddField("VISU_POINTS_MAPPER",aDataSet); + aFilter->SetGeometry( aGeometry ); + aFilter->SetScalars( aDataSet ); + aFilter->SetVectors( aDataSet ); + aFilter->AddField( "VISU_FIELD", aDataSet ); + aFilter->AddField( "VISU_CELLS_MAPPER", aDataSet ); + aFilter->AddField( "VISU_POINTS_MAPPER", aDataSet ); } + } + + vtkPolyData* + TPolyDataIDMapperImpl + ::GetPolyDataOutput() + { + Build(); return myFilter->GetPolyDataOutput(); } @@ -820,6 +832,14 @@ namespace VISU return GetPolyDataOutput(); } + PPolyData + TPolyDataIDMapperImpl + ::GetSource() + { + Build(); + return mySource.GetSource(); + } + unsigned long int TPolyDataIDMapperImpl ::GetMemorySize() @@ -971,7 +991,6 @@ namespace VISU return aResult; size_t aSubMeshEnd = myGaussSubMeshArr.size(); - const PAppendFilter& anAppendFilter = GetFilter(); const PGaussSubMeshImpl& aGaussSubMesh = anIter->second; for ( size_t aSubMeshId = 0; aSubMeshId < aSubMeshEnd; aSubMeshId++ ) { const PGaussSubMeshImpl& aSubMesh = myGaussSubMeshArr[aSubMeshId]; @@ -1337,9 +1356,10 @@ namespace VISU //--------------------------------------------------------------- TFieldImpl - ::TFieldImpl(): - myDataSize(0), - myDataType(0) + ::TFieldImpl() + : myDataSize( 0 ) + , myDataType( 0 ) + , myIsELNO( false ) {} void diff --git a/src/CONVERTOR/VISU_Structures_impl.hxx b/src/CONVERTOR/VISU_Structures_impl.hxx index fbcabfef..8819f492 100644 --- a/src/CONVERTOR/VISU_Structures_impl.hxx +++ b/src/CONVERTOR/VISU_Structures_impl.hxx @@ -157,14 +157,6 @@ namespace VISU virtual unsigned long int GetMemorySize(); - - //! if false, TIDCommonCellsFilter - same as TIDMapperFilter - //! if true, TIDCommonCellsFilter - use VISU_CommonCellsFilter - bool myIsSpecialKey; - - //! Vector of id mappers, which consist of meshonentity in next sequence: - //! CELL_ENTITY,FACE_ENTITY,EDGE_ENTITY - PNamedIDMapperMap myMappers; }; //--------------------------------------------------------------- @@ -348,9 +340,8 @@ namespace VISU struct TUnstructuredGridIDMapperImpl: virtual TMergeFilterHolder, virtual TUnstructuredGridIDMapper { - PAppendFilterHolder myIDMapper; //!< Responsible for numbering - PCommonCellsFilter myCommonCellsFilter; - TUnstructuredGridHolder mySource; //!< Keeps assigned data + PAppendFilterHolder myIDMapper; //!< Responsible for numbering + PCommonCellsFilter myCommonCellsFilter; TUnstructuredGridIDMapperImpl(); @@ -399,13 +390,16 @@ namespace VISU unsigned long int GetMemorySize(); - //! if false, Not using CommonCellsFilter - //! if true, Using CommonCellsFilter - bool myIsSpecialKey; + void + SetReferencedMesh( const PNamedIDMapper& theNamedIDMapper ); + + PUnstructuredGrid + GetSource(); + + protected: + void Build(); - //! Vector of id mappers, which consist of meshonentity in next sequence: - //! CELL_ENTITY,FACE_ENTITY,EDGE_ENTITY - PNamedIDMapperMap myMappers; + TUnstructuredGridHolder mySource; //!< Keeps assigned data }; //--------------------------------------------------------------- @@ -414,7 +408,6 @@ namespace VISU virtual TPolyDataIDMapper { PAppendPolyDataHolder myIDMapper; //!< Responsible for numbering - TPolyDataHolder mySource; //!< Keeps assigned data //! Reimplement the TIDMapper::GetNodeObjID virtual @@ -460,6 +453,14 @@ namespace VISU virtual unsigned long int GetMemorySize(); + + PPolyData + GetSource(); + + protected: + void Build(); + + TPolyDataHolder mySource; //!< Keeps assigned data }; @@ -830,6 +831,7 @@ namespace VISU vtkIdType myDataSize; //!< Keeps size of the assigned data vtkIdType myDataType; //!< Keeps type idetificator of the mesh data TMinMaxArr myMinMaxArr; //!< Keeps min/max values for each component of the MED FIELD + bool myIsELNO; //!< Defines whether this field contains specific "ELNO" data or not }; diff --git a/src/CONVERTOR/VISU_TypeList.hxx b/src/CONVERTOR/VISU_TypeList.hxx index 1a09efc3..a2eda5b7 100644 --- a/src/CONVERTOR/VISU_TypeList.hxx +++ b/src/CONVERTOR/VISU_TypeList.hxx @@ -20,77 +20,122 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // -// File : VISU_ColoredPrs3dCache_i.hh +// File : VISU_TypeList.hxx // Author : Oleg UVAROV // Module : VISU #ifndef VISU_TypeList_HeaderFile #define VISU_TypeList_HeaderFile + +//---------------------------------------------------------------------------- namespace VISU { + //---------------------------------------------------------------------------- namespace TL { //---------------------------------------------------------------------------- - template + struct TNullType {}; + + + //---------------------------------------------------------------------------- + template < class T, class U > struct TList { typedef T THead; typedef U TTail; }; - template + template < int v > struct TInt2Type { enum { value = v }; }; - struct TNullType {}; - + //---------------------------------------------------------------------------- - template + template < class TypeList, unsigned int index > struct TTypeAt; - template - struct TTypeAt, 0> + template < class THead, class TTail > + struct TTypeAt< TList< THead, TTail >, 0 > { typedef THead TResult; }; - template - struct TTypeAt, index> + template < class THead, class TTail, unsigned int index > + struct TTypeAt< TList< THead, TTail >, index > { - typedef typename TTypeAt::TResult TResult; + typedef typename TTypeAt< TTail, index - 1 >::TResult TResult; }; + //---------------------------------------------------------------------------- - template + template < class TypeList, class T > struct TIndexOf; - template - struct TIndexOf + template < class T > + struct TIndexOf< TNullType, T > { enum { value = -1 }; }; - template - struct TIndexOf, T> + template < class T, class TTail > + struct TIndexOf< TList< T, TTail >, T > { enum { value = 0 }; }; - template - struct TIndexOf, T> + template < class THead, class TTail, class T > + struct TIndexOf< TList< THead, TTail >, T > { private: - enum { temp = TIndexOf::value }; + enum { temp = TIndexOf< TTail, T >::value }; public: enum { value = temp == -1? -1 : 1 + temp }; }; + + //---------------------------------------------------------------------------- + template + < + class T01 = TNullType, class T02 = TNullType, class T03 = TNullType, class T04 = TNullType, class T05 = TNullType, + class T06 = TNullType, class T07 = TNullType, class T08 = TNullType, class T09 = TNullType, class T10 = TNullType, + class T11 = TNullType, class T12 = TNullType, class T13 = TNullType, class T14 = TNullType, class T15 = TNullType, + class T16 = TNullType, class T17 = TNullType, class T18 = TNullType, class T19 = TNullType, class T20 = TNullType, + class T21 = TNullType, class T22 = TNullType, class T23 = TNullType, class T24 = TNullType, class T25 = TNullType, + class T26 = TNullType, class T27 = TNullType, class T28 = TNullType, class T29 = TNullType, class T30 = TNullType, + class T31 = TNullType, class T32 = TNullType, class T33 = TNullType, class T34 = TNullType, class T35 = TNullType, + class T36 = TNullType, class T37 = TNullType, class T38 = TNullType, class T39 = TNullType, class T40 = TNullType + > + struct TSequence + { + private: + typedef typename TSequence< T02, T03, T04, T05, T06, T07, T08, T09, T10, + T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, + T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, + T31, T32, T33, T34, T35, T36, T37, T38, T39, T40 + >::TResult + TailResult; + public: + typedef TList< T01, TailResult > TResult; + }; + + + //---------------------------------------------------------------------------- + template<> + struct TSequence<> + { + typedef TNullType TResult; + }; + + //---------------------------------------------------------------------------- } + + + //---------------------------------------------------------------------------- } #endif diff --git a/src/CONVERTOR/VISU_VTKTypeList.hxx b/src/CONVERTOR/VISU_VTKTypeList.hxx new file mode 100644 index 00000000..f210f652 --- /dev/null +++ b/src/CONVERTOR/VISU_VTKTypeList.hxx @@ -0,0 +1,120 @@ +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File : VISU_VTKTypeList.hxx +// Author : Oleg UVAROV +// Module : VISU + +#ifndef VISU_VTKTypeList_HeaderFile +#define VISU_VTKTypeList_HeaderFile + +#include "VISU_TypeList.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +//---------------------------------------------------------------------------- +namespace VISU +{ + //---------------------------------------------------------------------------- + namespace TL + { + //---------------------------------------------------------------------------- + typedef TSequence< char, + unsigned char, + short, + unsigned short, + int, + unsigned int, + long, + unsigned long, + float, + double >::TResult TVTKBasicTypeList; + + + //---------------------------------------------------------------------------- + typedef TSequence< vtkCharArray, + vtkUnsignedCharArray, + vtkShortArray, + vtkUnsignedShortArray, + vtkIntArray, + vtkUnsignedIntArray, + vtkLongArray, + vtkUnsignedLongArray, + vtkFloatArray, + vtkDoubleArray >::TResult TVTKArrayTypeList; + + + //---------------------------------------------------------------------------- + typedef TSequence< TInt2Type< VTK_CHAR >, + TInt2Type< VTK_UNSIGNED_CHAR >, + TInt2Type< VTK_SHORT >, + TInt2Type< VTK_UNSIGNED_SHORT >, + TInt2Type< VTK_INT >, + TInt2Type< VTK_UNSIGNED_INT >, + TInt2Type< VTK_LONG >, + TInt2Type< VTK_UNSIGNED_LONG >, + TInt2Type< VTK_FLOAT >, + TInt2Type< VTK_DOUBLE > >::TResult TVTKBasicEnumList; + + + //---------------------------------------------------------------------------- + template< unsigned int type_enum > + struct TEnum2VTKBasicType + { + typedef typename TTypeAt< TVTKBasicTypeList, TIndexOf< TVTKBasicEnumList, TInt2Type< type_enum > >::value >::TResult TResult; + }; + + + //---------------------------------------------------------------------------- + template< unsigned int type_enum > + struct TEnum2VTKArrayType + { + typedef typename TTypeAt< TVTKArrayTypeList, TIndexOf< TVTKBasicEnumList, TInt2Type< type_enum > >::value >::TResult TResult; + }; + + + //---------------------------------------------------------------------------- + template< class T > + struct TVTKBasicType2Enum + { + typedef typename TTypeAt< TVTKBasicEnumList, TIndexOf< TVTKBasicTypeList, T >::value >::TResult TResult; + }; + + + //---------------------------------------------------------------------------- + } + + + //---------------------------------------------------------------------------- +} + +#endif diff --git a/src/ENGINE/VISU_Engine_i.cc b/src/ENGINE/VISU_Engine_i.cc index 80b53607..d857f644 100644 --- a/src/ENGINE/VISU_Engine_i.cc +++ b/src/ENGINE/VISU_Engine_i.cc @@ -278,7 +278,7 @@ namespace VISU{ return myVisuGen->DeformedShapeOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } - ScalarMapOnDeformedShape_ptr + DeformedShapeAndScalarMap_ptr VISU_Gen_i ::ScalarMapOnDeformedShapeOnField(Result_ptr theResult, const char* theMeshName, @@ -286,7 +286,18 @@ namespace VISU{ const char* theFieldName, CORBA::Long theIteration) { - return myVisuGen->ScalarMapOnDeformedShapeOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); + return DeformedShapeAndScalarMapOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); + } + + DeformedShapeAndScalarMap_ptr + VISU_Gen_i + ::DeformedShapeAndScalarMapOnField(Result_ptr theResult, + const char* theMeshName, + VISU::Entity theEntity, + const char* theFieldName, + CORBA::Long theIteration) + { + return myVisuGen->DeformedShapeAndScalarMapOnField(theResult,theMeshName,theEntity,theFieldName,theIteration); } Vectors_ptr diff --git a/src/ENGINE/VISU_Engine_i.hh b/src/ENGINE/VISU_Engine_i.hh index 8c5964c6..247a1074 100644 --- a/src/ENGINE/VISU_Engine_i.hh +++ b/src/ENGINE/VISU_Engine_i.hh @@ -152,14 +152,23 @@ namespace VISU const char* theFieldName, CORBA::Long theIteration); + //This function is obsolete. Use DeformedShapeAndScalarMapOnField instead. virtual - ScalarMapOnDeformedShape_ptr + DeformedShapeAndScalarMap_ptr ScalarMapOnDeformedShapeOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, const char* theFieldName, CORBA::Long theIteration); + virtual + DeformedShapeAndScalarMap_ptr + DeformedShapeAndScalarMapOnField(Result_ptr theResult, + const char* theMeshName, + VISU::Entity theEntity, + const char* theFieldName, + CORBA::Long theIteration); + //Create Digital Presentation virtual Table_ptr CreateTable(const char* theTableEntry); virtual Curve_ptr CreateCurve(Table_ptr theTable, CORBA::Long theHRow, CORBA::Long theVRow); diff --git a/src/OBJECT/Makefile.am b/src/OBJECT/Makefile.am index 0f022b75..ff0a1471 100644 --- a/src/OBJECT/Makefile.am +++ b/src/OBJECT/Makefile.am @@ -41,7 +41,8 @@ salomeinclude_HEADERS = \ VISU_GaussPtsAct.h \ VISU_VectorsAct.h \ VISU_PointMap3dActor.h \ - VISU_ActorBase.h + VISU_ActorBase.h \ + VISU_IsoSurfActor.h dist_libVisuObject_la_SOURCES = \ VISU_Actor.cxx \ @@ -53,7 +54,8 @@ dist_libVisuObject_la_SOURCES = \ VISU_GaussPtsAct.cxx \ VISU_VectorsAct.cxx \ VISU_PointMap3dActor.cxx \ - VISU_ActorBase.cxx + VISU_ActorBase.cxx \ + VISU_IsoSurfActor.cxx libVisuObject_la_CPPFLAGS= \ $(QT_INCLUDES) \ diff --git a/src/OBJECT/VISU_Actor.cxx b/src/OBJECT/VISU_Actor.cxx index 43b6c761..f4d26b4e 100644 --- a/src/OBJECT/VISU_Actor.cxx +++ b/src/OBJECT/VISU_Actor.cxx @@ -167,43 +167,6 @@ VISU_Actor return myPrs3d; } -//---------------------------------------------------------------------------- -/*VISU::TActorFactory* -VISU_Actor -::GetFactory() -{ - return myActorFactory; -}*/ - -/*void -VISU_Actor -::SetFactory(VISU::TActorFactory* theActorFactory) -{ - using namespace VISU; - - if(myActorFactory == theActorFactory) - return; - - if(theActorFactory) - myDestroySignal.connect(boost::bind(&TActorFactory::RemoveActor, - theActorFactory, - _1)); - - myActorFactory = theActorFactory; -}*/ - -//---------------------------------------------------------------------------- -/*void -VISU_Actor -::UpdateFromFactory() -{ - if(myUpdateFromFactoryTime.GetMTime() < myActorFactory->GetMTime()){ - myUpdateFromFactoryTime.Modified(); - myActorFactory->UpdateActor(this); - Update(); - } -}*/ - void VISU_Actor ::RemoveFromRender() @@ -217,11 +180,11 @@ VISU_Actor ::SetPipeLine(VISU_PipeLine* thePipeLine) { myPipeLine = thePipeLine; - if(thePipeLine){ - if(vtkMapper *aMapper = myPipeLine->GetMapper()){ - if(vtkDataSet *aDataSet = aMapper->GetInput()){ - SetShrinkable(thePipeLine->IsShrinkable()); - SetMapperInput(aDataSet); + if ( thePipeLine ) { + if ( vtkMapper *aMapper = myPipeLine->GetMapper() ) { + if ( vtkDataSet *aDataSet = aMapper->GetInput() ) { + SetShrinkable( thePipeLine->IsShrinkable() ); + SetMapperInput( aDataSet ); } } } diff --git a/src/OBJECT/VISU_ActorBase.cxx b/src/OBJECT/VISU_ActorBase.cxx index 812f790d..c794a7d5 100644 --- a/src/OBJECT/VISU_ActorBase.cxx +++ b/src/OBJECT/VISU_ActorBase.cxx @@ -28,14 +28,31 @@ #include "VISU_ActorBase.h" #include "VISU_ActorFactory.h" +#include "VTKViewer_ShrinkFilter.h" #include +#include +#include +#include +#include +#include +#include + +#include "utilities.h" + #include VISU_ActorBase -::VISU_ActorBase() +::VISU_ActorBase() : + myIsShrinkable(true), + myIsShrunk(false), + myShrinkFilter(VTKViewer_ShrinkFilter::New()) { - + myShrinkFilter->Delete(); + + myStoreMapping = true; + + myShrinkFilter->SetStoreMapping(true); } VISU_ActorBase @@ -80,3 +97,67 @@ VISU_ActorBase } } +//-------------------------------------------------------------------------- + +void +VISU_ActorBase +::SetLineWidth(vtkFloatingPointType theLineWidth) +{ + GetProperty()->SetLineWidth(theLineWidth); +} + +vtkFloatingPointType +VISU_ActorBase +::GetLineWidth() +{ + return GetProperty()->GetLineWidth(); +} + +//-------------------------------------------------------------------------- +void +VISU_ActorBase +::SetRepresentation(int theMode) +{ + Superclass::SetRepresentation(theMode); + if(myRepresentation == VTK_POINTS) + UnShrink(); +} + +//---------------------------------------------------------------------------- +void VISU_ActorBase::SetShrink() +{ + if(!myIsShrinkable) + return; + if(vtkDataSet* aDataSet = myPassFilter[0]->GetOutput()){ + myShrinkFilter->SetInput(aDataSet); + myPassFilter[1]->SetInput(myShrinkFilter->GetOutput()); + myIsShrunk = true; + } +} + +void VISU_ActorBase::UnShrink() +{ + if(!myIsShrunk) + return; + if(vtkDataSet* aDataSet = myPassFilter[0]->GetOutput()){ + myPassFilter[1]->SetInput(aDataSet); + myPassFilter[1]->Modified(); + myIsShrunk = false; + Modified(); + } +} + +bool VISU_ActorBase::IsShrunk() +{ + return myIsShrunk; +} + +void VISU_ActorBase::SetShrinkable(bool theIsShrinkable) +{ + myIsShrinkable = theIsShrinkable; +} + +bool VISU_ActorBase::IsShrunkable() +{ + return myIsShrinkable; +} diff --git a/src/OBJECT/VISU_ActorBase.h b/src/OBJECT/VISU_ActorBase.h index 84909cbe..2b9e414d 100644 --- a/src/OBJECT/VISU_ActorBase.h +++ b/src/OBJECT/VISU_ActorBase.h @@ -32,6 +32,8 @@ #include "SALOME_Actor.h" #include "VISU_BoostSignals.h" +class VTKViewer_ShrinkFilter; + #ifdef _WIN32 #define VTKOCC_EXPORT __declspec (dllexport) #else @@ -54,18 +56,25 @@ class VTKOCC_EXPORT VISU_ActorBase: public SALOME_Actor, vtkTypeMacro(VISU_ActorBase, SALOME_Actor); //---------------------------------------------------------------------------- - VISU::TActorFactory* - GetFactory(); - - virtual - void - SetFactory(VISU::TActorFactory* theActorFactory); + VISU::TActorFactory* GetFactory(); + virtual void SetFactory(VISU::TActorFactory* theActorFactory); //---------------------------------------------------------------------------- - virtual - void - UpdateFromFactory(); + virtual void UpdateFromFactory(); + + //---------------------------------------------------------------------------- + + virtual void SetLineWidth(vtkFloatingPointType theLineWidth); + virtual vtkFloatingPointType GetLineWidth(); + + virtual void SetShrink(); + virtual void UnShrink(); + virtual bool IsShrunkable(); + virtual bool IsShrunk(); + virtual void SetShrinkable(bool theIsShrinkable); + virtual void SetRepresentation(int theMode); + protected: VISU_ActorBase(); virtual ~VISU_ActorBase(); @@ -73,6 +82,11 @@ class VTKOCC_EXPORT VISU_ActorBase: public SALOME_Actor, VISU::TActorFactory* myActorFactory; vtkTimeStamp myUpdateFromFactoryTime; boost::signal1 myDestroySignal; + + vtkSmartPointer myShrinkFilter; + + bool myIsShrinkable; + bool myIsShrunk; }; #endif //VISU_ACTOR_BASE_H diff --git a/src/OBJECT/VISU_GaussPtsAct.cxx b/src/OBJECT/VISU_GaussPtsAct.cxx index 8ca84bc9..04837dc4 100644 --- a/src/OBJECT/VISU_GaussPtsAct.cxx +++ b/src/OBJECT/VISU_GaussPtsAct.cxx @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -53,6 +54,7 @@ #include #include #include +#include #include #include @@ -154,7 +156,10 @@ VISU_GaussPtsAct myEventCallbackCommand->SetClientData(this); myEventCallbackCommand->SetCallback(VISU_GaussPtsAct::ProcessEvents); + vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); + myDeviceActor->SetProperty(GetProperty()); + myDeviceActor->SetUserMatrix(aMatrix); myDeviceActor->SetVisibility(true); myDeviceActor->SetPickable(false); @@ -174,6 +179,7 @@ VISU_GaussPtsAct myScalarBarCtrl->Delete(); myMapper->Delete(); + aMatrix->Delete(); } VISU_GaussPtsAct @@ -330,6 +336,7 @@ int VISU_GaussPtsAct ::RenderOpaqueGeometry(vtkViewport *viewport) { + GetMatrix(myDeviceActor->GetUserMatrix()); return 1; } @@ -337,6 +344,7 @@ int VISU_GaussPtsAct ::RenderTranslucentGeometry(vtkViewport *viewport) { + GetMatrix(myDeviceActor->GetUserMatrix()); return 1; } @@ -733,27 +741,47 @@ VISU_GaussPtsAct if(myIsPreselected){ anIsChanged = (myLastPreHighlightObjID != anObjId); if(anIsChanged){ - vtkFloatingPointType* aNodeCoord = GetNodeCoord(anObjId); + vtkFloatingPointType* aNodeCoord = GetNodeCoord(anObjId); + //Take into account translation + vtkFloatingPointType aLocalNodeCoord[3]; + this->Transform->Push(); + this->Transform->PostMultiply(); + this->Transform->Identity(); + + this->Transform->Translate(this->Position[0], + this->Position[1], + this->Position[2]); + double aPosition[3]; + this->Transform->GetPosition(aPosition); + + aLocalNodeCoord[0] = aNodeCoord[0] + aPosition[0]; + aLocalNodeCoord[1] = aNodeCoord[1] + aPosition[1]; + aLocalNodeCoord[2] = aNodeCoord[2] + aPosition[2]; + vtkDataSet* aDataSet = GetInput(); vtkPointData* aPointData = aDataSet->GetPointData(); if(vtkDataArray *aScalarArray = aPointData->GetScalars()){ - vtkFloatingPointType aPyramidHeight = myPickingSettings->GetPyramidHeight(); - aPyramidHeight = aPyramidHeight*myGaussPointsPL->GetMaxPointSize(); - //vtkFloatingPointType aColor[3] = myPreHighlightActor->GetProperty()->GetColor(); - vtkFloatingPointType aColor[3]; - theInteractorStyle->GetCurrentRenderer()->GetBackground( aColor ); - aColor[0] = 1. - aColor[0]; - aColor[1] = 1. - aColor[1]; - aColor[2] = 1. - aColor[2]; - - myCursorPyramid->Init(aPyramidHeight, - myPickingSettings->GetCursorSize(), - GetRadius(anObjId,aVtkId,aScalarArray), - GetMagnification(anObjId), - GetClamp(anObjId), - aNodeCoord, - aColor); + if ( myPickingSettings ){ + vtkFloatingPointType aPyramidHeight = myPickingSettings->GetPyramidHeight(); + aPyramidHeight = aPyramidHeight*myGaussPointsPL->GetMaxPointSize(); + //vtkFloatingPointType aColor[3] = myPreHighlightActor->GetProperty()->GetColor(); + vtkFloatingPointType aColor[3]; + theInteractorStyle->GetCurrentRenderer()->GetBackground( aColor ); + aColor[0] = 1. - aColor[0]; + aColor[1] = 1. - aColor[1]; + aColor[2] = 1. - aColor[2]; + + myCursorPyramid->Init(aPyramidHeight, + myPickingSettings->GetCursorSize(), + GetRadius(anObjId,aVtkId,aScalarArray), + GetMagnification(anObjId), + GetClamp(anObjId), + aLocalNodeCoord, + aColor); + } + } + this->Transform->Pop(); myLastPreHighlightObjID = anObjId; } myCursorPyramid->SetVisibility(true); @@ -776,7 +804,7 @@ ChangeZoom(VISU_PickingSettings *thePickingSettings, vtkIdType theInitialHasIndex, vtkIdType theCurrentHasIndex) { - if(theInitialHasIndex + theCurrentHasIndex == 1){ + if( (theInitialHasIndex + theCurrentHasIndex == 1) && thePickingSettings){ vtkCamera *aCamera = theRenderer->GetActiveCamera(); vtkFloatingPointType aZoomFactor = thePickingSettings->GetZoomFactor(); @@ -901,6 +929,13 @@ VISU_GaussPtsAct return false; } + + +void VISU_GaussPtsAct::SetPosition(double _arg[3]){ + Superclass::SetPosition(_arg); + Highlight(isHighlighted()); +} + //================================================================== // function : Highlight // purpose : @@ -912,6 +947,12 @@ VISU_GaussPtsAct if(!mySelector.GetPointer()) return; + if ( !myPickingSettings ) + { + Superclass::Highlight(theIsHighlight); + return; + } + Selection_Mode aSelectionMode = mySelector->SelectionMode(); bool anInitialHasIndex = isHighlighted() && mySelectionMode == GaussPointSelection; @@ -923,20 +964,9 @@ VISU_GaussPtsAct myOutlineActor->SetVisibility(false); myCursorPyramid->SetVisibility(false); - - myTextActor->SetVisibility(anIsVisible); - myCellActor->SetVisibility(anIsVisible); - GetScalarBarCtrl()->SetIsMarked(anIsVisible); - myCursorPyramidSelected->SetVisibility(anIsVisible); - //GetScalarBarCtrl()->Update(); - - myIsHighlighted = aCurrentHasIndex; - - // Zoom if necessary - ChangeZoom(myPickingSettings, - GetRenderer(), - anInitialHasIndex, - aCurrentHasIndex); + myTextActor->SetVisibility(false); + myCellActor->SetVisibility(false); + myCursorPyramidSelected->SetVisibility(false); if(!theIsHighlight) return; @@ -952,6 +982,20 @@ VISU_GaussPtsAct if ( !aCurrentHasIndex || !myBarVisibility ) return; + myTextActor->SetVisibility(anIsVisible); + myCellActor->SetVisibility(anIsVisible && myPickingSettings->GetDisplayParentMesh()); + GetScalarBarCtrl()->SetIsMarked(anIsVisible); + myCursorPyramidSelected->SetVisibility(anIsVisible); +//GetScalarBarCtrl()->Update(); + + myIsHighlighted = aCurrentHasIndex; + + // Zoom if necessary + ChangeZoom(myPickingSettings, + GetRenderer(), + anInitialHasIndex, + aCurrentHasIndex); + // TColStd_IndexedMapOfInteger aMapIndex; mySelector->GetIndex( getIO(), aMapIndex ); if(aMapIndex.Extent() != 1 || !myBarVisibility) { @@ -963,11 +1007,27 @@ VISU_GaussPtsAct int anObjId = aMapIndex(1); vtkFloatingPointType* aNodeCoord = GetNodeCoord(anObjId); + if ( !aNodeCoord ) + return; + //Take into account translation + vtkFloatingPointType aLocalNodeCoord[3]; + this->Transform->Push(); + this->Transform->PostMultiply(); + this->Transform->Identity(); + this->Transform->Translate(this->Position[0], + this->Position[1], + this->Position[2]); + double aPosition[3]; + this->Transform->GetPosition(aPosition); + aLocalNodeCoord[0] = aNodeCoord[0] + aPosition[0]; + aLocalNodeCoord[1] = aNodeCoord[1] + aPosition[1]; + aLocalNodeCoord[2] = aNodeCoord[2] + aPosition[2]; + this->Transform->Pop(); vtkFloatingPointType aFocalPnt[3]; aCamera->GetFocalPoint(aFocalPnt); - if ( !aNodeCoord || CheckIsSameVector( aNodeCoord, aFocalPnt, 3 ) ) + if ( CheckIsSameVector(aLocalNodeCoord, aFocalPnt, 3 ) ) return; // FlyTo @@ -977,11 +1037,11 @@ VISU_GaussPtsAct anInteractor->SetDolly(0.0); anInteractor->SetNumberOfFlyFrames(myPickingSettings->GetStepNumber()); - anInteractor->FlyTo(aRenderer, aNodeCoord); + anInteractor->FlyTo(aRenderer, aLocalNodeCoord); aRenderer->ResetCameraClippingRange(); anInteractor->SetDolly(aDollyWas); anInteractor->SetNumberOfFlyFrames(aNumberOfFlyFramesWas); - anInteractor->InvokeEvent(SVTK::ChangeRotationPoint, aNodeCoord); + anInteractor->InvokeEvent(SVTK::ChangeRotationPoint, aLocalNodeCoord); // std::ostringstream aStr; // int anObjId = aMapIndex(1); @@ -989,8 +1049,7 @@ VISU_GaussPtsAct // vtkIdType aVtkId = GetNodeVTKID(anObjId); if(aVtkId >= 0){ - vtkFloatingPointType *aNodeCoord = GetNodeCoord(anObjId); - vtkFloatingPointType aWorldCoord[4] = {aNodeCoord[0], aNodeCoord[1], aNodeCoord[2], 1.}; + vtkFloatingPointType aWorldCoord[4] = {aLocalNodeCoord[0], aLocalNodeCoord[1], aLocalNodeCoord[2], 1.}; // vtkDataSet* aDataSet = GetInput(); vtkPointData* aDataSetAttributes = aDataSet->GetPointData(); @@ -1009,7 +1068,7 @@ VISU_GaussPtsAct GetRadius(anObjId,aVtkId,aScalarArray), GetMagnification(anObjId), GetClamp(anObjId), - aNodeCoord, + aLocalNodeCoord, myHighlightActor->GetProperty()->GetColor()); myCursorPyramidSelected->SetVisibility(anIsVisible && theIsHighlight); // @@ -1071,6 +1130,8 @@ VISU_GaussPtsAct myCellActor->SetVisibility(anIsVisible && theIsHighlight); myCellActor->SetRepresentation(VTK_WIREFRAME); } + else + myCellActor->SetVisibility(false); } } @@ -1101,7 +1162,7 @@ void VISU_GaussPtsAct ::UpdatePickingSettings() { - if(!myPickingSettings || myPickingSettings->GetInitial()) + if(!myPickingSettings) return; myTextActor->SetModePosition(myPickingSettings->GetInfoWindowPosition()); @@ -1210,13 +1271,18 @@ VISU_GaussPtsAct1 myEventCallbackCommand->SetCallback(VISU_GaussPtsAct1::ProcessEvents); + vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); + myInsideDeviceActor->SetVisibility(false); myInsideDeviceActor->SetPickable(false); + myInsideDeviceActor->SetUserMatrix(aMatrix); myInsideDeviceActor->Delete(); myOutsideDeviceActor->SetVisibility(false); myOutsideDeviceActor->SetPickable(false); + myOutsideDeviceActor->SetUserMatrix(aMatrix); myOutsideDeviceActor->Delete(); + aMatrix->Delete(); } VISU_GaussPtsAct1 @@ -1273,6 +1339,28 @@ VISU_GaussPtsAct1 } +int +VISU_GaussPtsAct1 +::RenderOpaqueGeometry(vtkViewport *viewport) +{ + + Superclass::RenderOpaqueGeometry(viewport); + GetMatrix(myInsideDeviceActor->GetUserMatrix()); + GetMatrix(myOutsideDeviceActor->GetUserMatrix()); + return 1; +} + +int +VISU_GaussPtsAct1 +::RenderTranslucentGeometry(vtkViewport *viewport) +{ + Superclass::RenderTranslucentGeometry(viewport); + GetMatrix(myInsideDeviceActor->GetUserMatrix()); + GetMatrix(myOutsideDeviceActor->GetUserMatrix()); + + return 1; +} + //---------------------------------------------------------------------------- void VISU_GaussPtsAct1 @@ -1378,11 +1466,20 @@ VISU_GaussPtsAct1 //---------------------------------------------------------------- + +void +VISU_GaussPtsAct1::SetPosition(double _arg[3]){ + if(MYDEBUG1) MESSAGE("VISU_GaussPtsAct1::SetPosition - this = "< +#include #include #include +#include + //---------------------------------------------------------------- vtkStandardNewMacro( VISU_GaussPtsSettings ); vtkStandardNewMacro( VISU_InsideCursorSettings ); @@ -86,19 +90,38 @@ VISU_OutsideCursorSettings::~VISU_OutsideCursorSettings() //---------------------------------------------------------------- VISU_PickingSettings::VISU_PickingSettings() { - this->Initial = true; + float aCursorSize = 0.5; + float aPyramidHeight = 10.0; + float aPointTolerance = 0.1; + QColor aColor = Qt::yellow; + int anInfoWindowTransparency = 50; + int anInfoWindowPosition = VISU_PickingSettings::BelowPoint; + float aZoomFactor = 1.5; + int aStepNumber = 10; + bool aDisplayParentMesh = false; + + SUIT_ResourceMgr* aResourceMgr = SUIT_Session::session()->resourceMgr(); - this->PyramidHeight = -1; - this->CursorSize = -1; - this->PointTolerance = -1; - this->Color[0] = -1; - this->Color[1] = -1; - this->Color[2] = -1; - this->InfoWindowTransparency = -1; - this->InfoWindowPosition = -1; - this->ZoomFactor = -1; - this->StepNumber = -1; - this->DisplayParentMesh = false; + this->CursorSize = aResourceMgr->doubleValue( "VISU", "picking_cursor_size", aCursorSize ); + + this->PyramidHeight = aResourceMgr->doubleValue( "VISU", "picking_pyramid_height", aPyramidHeight ); + + this->PointTolerance = aResourceMgr->doubleValue( "VISU", "picking_point_tolerance", aPointTolerance ); + + aColor = aResourceMgr->colorValue( "VISU", "picking_selection_color", aColor ); + this->Color[0] = aColor.red() / 255.0; + this->Color[1] = aColor.green() / 255.0; + this->Color[2] = aColor.blue() / 255.0; + + this->InfoWindowTransparency = aResourceMgr->integerValue( "VISU", "picking_transparency", anInfoWindowTransparency ) / 100.0; + + this->InfoWindowPosition = aResourceMgr->integerValue( "VISU", "picking_position", anInfoWindowPosition ); + + this->ZoomFactor = aResourceMgr->doubleValue( "VISU", "picking_zoom_factor", aZoomFactor ); + + this->StepNumber = aResourceMgr->integerValue( "VISU", "picking_step_number", aStepNumber ); + + this->DisplayParentMesh = aResourceMgr->booleanValue( "VISU", "picking_display_parent_mesh", aDisplayParentMesh ); } VISU_PickingSettings::~VISU_PickingSettings() diff --git a/src/OBJECT/VISU_GaussPtsSettings.h b/src/OBJECT/VISU_GaussPtsSettings.h index 473ddd10..a34dbca6 100644 --- a/src/OBJECT/VISU_GaussPtsSettings.h +++ b/src/OBJECT/VISU_GaussPtsSettings.h @@ -186,9 +186,6 @@ class VTKOCC_EXPORT VISU_PickingSettings : public vtkObject VISU_PickingSettings* New(); - vtkSetMacro( Initial, bool ); - vtkGetMacro( Initial, bool ); - vtkSetMacro( PyramidHeight, vtkFloatingPointType ); vtkGetMacro( PyramidHeight, vtkFloatingPointType ); @@ -217,8 +214,6 @@ class VTKOCC_EXPORT VISU_PickingSettings : public vtkObject vtkGetMacro( DisplayParentMesh, bool ); private: - bool Initial; - vtkFloatingPointType PyramidHeight; vtkFloatingPointType CursorSize; vtkFloatingPointType PointTolerance; diff --git a/src/OBJECT/VISU_IsoSurfActor.cxx b/src/OBJECT/VISU_IsoSurfActor.cxx new file mode 100644 index 00000000..3c58fc47 --- /dev/null +++ b/src/OBJECT/VISU_IsoSurfActor.cxx @@ -0,0 +1,165 @@ +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// +// File : VISU_IsoSurfActor.cxx +// Author : Vitaly Smetannikov +// Module : VISU + + +#include "VISU_IsoSurfActor.h" +#include "VISU_PipeLine.hxx" +#include "VISU_LabelPointsFilter.hxx" + + +#include +#include +#include +#include +//#include +#include +#include +#include +#include +#include + + + +//---------------------------------------------------------------------------- +vtkStandardNewMacro(VISU_IsoSurfActor); + + +//---------------------------------------------------------------------------- +VISU_IsoSurfActor::VISU_IsoSurfActor(): + VISU_ScalarMapAct(), + myIsLinesLabeled(true) +{ + myLabelsDataSet = vtkPolyData::New(); + +// myMaskPoints = vtkMaskPoints::New(); +// myMaskPoints->SetInput(myLabelsDataSet); +// myMaskPoints->SetOnRatio(100); + + myMaskPoints = VISU_LabelPointsFilter::New(); + myMaskPoints->SetInput(myLabelsDataSet); + + myLabeledDataMapper = vtkLabeledDataMapper::New(); + myLabeledDataMapper->SetInput(myMaskPoints->GetOutput()); + //myLabeledDataMapper->SetLabelFormat("%e"); + myLabeledDataMapper->SetLabelModeToLabelScalars(); + + myLabels = vtkActor2D::New(); + myLabels->SetMapper(myLabeledDataMapper); + myLabels->GetProperty()->SetColor(1,1,1); + myLabels->SetVisibility(myIsLinesLabeled); +} + + +//---------------------------------------------------------------------------- +VISU_IsoSurfActor::~VISU_IsoSurfActor() +{ + myLabelsDataSet->Delete(); + myMaskPoints->Delete(); + myLabeledDataMapper->Delete(); + myLabels->Delete(); +} + +//---------------------------------------------------------------------------- +void VISU_IsoSurfActor::SetLinesLabeled(bool theIsLinesLabeled, int theNbLbl) +{ + myIsLinesLabeled = theIsLinesLabeled; + myMaskPoints->SetPointsNb(theNbLbl); + Modified(); +} + +//---------------------------------------------------------------------------- +int VISU_IsoSurfActor::GetNbLabels() const +{ + return myMaskPoints->GetPointsNb(); +} + + +//---------------------------------------------------------------------------- +void VISU_IsoSurfActor::UpdateLabels() +{ + if (myIsLinesLabeled) { + vtkDataSet* aDataSet = GetPipeLine()->GetOutput(); + if (aDataSet != NULL) { + unsigned long aTime = myLabelsDataSet->GetMTime(); + unsigned long anObjTime = GetMTime(); + if (aTime < anObjTime) { + myLabelsDataSet->ShallowCopy(aDataSet); + myLabelsDataSet->Modified(); + } + } + } + myLabels->SetVisibility(myIsLinesLabeled); +} + + +//---------------------------------------------------------------------------- +void VISU_IsoSurfActor::AddToRender(vtkRenderer* theRenderer) +{ + VISU_ScalarMapAct::AddToRender(theRenderer); + theRenderer->AddActor2D(myLabels); +} + +//---------------------------------------------------------------------------- +void VISU_IsoSurfActor::RemoveFromRender(vtkRenderer* theRenderer) +{ + VISU_ScalarMapAct::RemoveFromRender(theRenderer); + theRenderer->RemoveActor(myLabels); +} + +//From vtkFollower +int VISU_IsoSurfActor::RenderOpaqueGeometry(vtkViewport *vp) +{ + UpdateLabels(); + return VISU_ScalarMapAct::RenderOpaqueGeometry(vp); +} + + +int VISU_IsoSurfActor::RenderTranslucentGeometry(vtkViewport *vp) +{ + UpdateLabels(); + return VISU_ScalarMapAct::RenderTranslucentGeometry(vp); +} + +void VISU_IsoSurfActor::SetVisibility(int theMode){ + VISU_ScalarMapAct::SetVisibility(theMode); + if(GetVisibility()) + myLabels->VisibilityOn(); + else + myLabels->VisibilityOff(); + Modified(); +} + + +///!!!! For test purposes only +// void VISU_IsoSurfActor::SetMapperInput(vtkDataSet* theDataSet) +// { +// VISU_ScalarMapAct::SetMapperInput(theDataSet); + +// vtkFeatureEdges* aFilter = vtkFeatureEdges::New(); +// aFilter->SetInput(VISU_ScalarMapAct::GetInput()); +// SetInput(aFilter->GetOutput()); +// } diff --git a/src/OBJECT/VISU_IsoSurfActor.h b/src/OBJECT/VISU_IsoSurfActor.h new file mode 100644 index 00000000..0377ae6a --- /dev/null +++ b/src/OBJECT/VISU_IsoSurfActor.h @@ -0,0 +1,88 @@ +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// +// File : VISU_IsoSurfActor.h +// Author : Vitaly Smetannikov +// Module : VISU + + +#ifndef VISU_VectorsAct_HeaderFile +#define VISU_VectorsAct_HeaderFile + +#include "VISU_ScalarMapAct.h" + +class vtkActor2D; +//class vtkMaskPoints; +class vtkLabeledDataMapper; +class vtkPolyData; +class VISU_LabelPointsFilter; + + +class VTKOCC_EXPORT VISU_IsoSurfActor : public VISU_ScalarMapAct +{ + public: + vtkTypeMacro(VISU_IsoSurfActor, VISU_ScalarMapAct); + + static VISU_IsoSurfActor* New(); + + + //---------------------------------------------------------------------------- + virtual void AddToRender( vtkRenderer* ); + + virtual void RemoveFromRender( vtkRenderer* ); + + virtual int RenderOpaqueGeometry(vtkViewport *viewport); + virtual int RenderTranslucentGeometry(vtkViewport *viewport); + + //virtual void SetPipeLine(VISU_PipeLine* thePipeLine); + + void SetLinesLabeled(bool theIsLinesLabeled, int theNbLbl); + bool GetLinesLabeled() const { return myIsLinesLabeled;} + + int GetNbLabels() const; + + + //---------------------------------------------------------------------------- + //! Visibility management + virtual void SetVisibility( int ); + + + protected: + + VISU_IsoSurfActor(); + ~VISU_IsoSurfActor(); + + void UpdateLabels(); + + vtkActor2D *myLabels; + vtkLabeledDataMapper* myLabeledDataMapper; + //vtkMaskPoints* myMaskPoints; + VISU_LabelPointsFilter* myMaskPoints; + vtkPolyData* myLabelsDataSet; + + bool myIsLinesLabeled; + //int myNbLabels; +}; + + +#endif diff --git a/src/OBJECT/VISU_PointMap3dActor.cxx b/src/OBJECT/VISU_PointMap3dActor.cxx index 99e31230..933cf60b 100644 --- a/src/OBJECT/VISU_PointMap3dActor.cxx +++ b/src/OBJECT/VISU_PointMap3dActor.cxx @@ -33,10 +33,16 @@ #include +#include "utilities.h" #include #include -//using namespace std; +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + vtkStandardNewMacro(VISU_PointMap3dActor); //================================================================== @@ -47,6 +53,7 @@ vtkStandardNewMacro(VISU_PointMap3dActor); VISU_PointMap3dActor ::VISU_PointMap3dActor() { + if(MYDEBUG) MESSAGE("VISU_PointMap3dActor::VISU_PointMap3dActor - this = "< // VTK Includes #include @@ -58,8 +59,9 @@ void VISU_VectorsAct ::SetPipeLine(VISU_PipeLine* thePipeLine) { - myVectorsPL = dynamic_cast(thePipeLine); - VISU_Actor::SetPipeLine(myVectorsPL.GetPointer()); + myVectorsPL = dynamic_cast( thePipeLine ); + + Superclass::SetPipeLine( myVectorsPL.GetPointer() ); } @@ -77,8 +79,9 @@ void VISU_VectorsAct ::SetTransform(VTKViewer_Transform* theTransform) { - Superclass::SetTransform(theTransform); - myVectorsPL->SetTransform(theTransform); + // To perform only vector's specific action, + // there is nothing to be done for the Superclass + myVectorsPL->SetTransform( theTransform ); } @@ -101,6 +104,7 @@ VISU_VectorsAct else if(vtkPolyDataMapper* aMapper = dynamic_cast(theMapper)) aMapper->SetInput(myPassFilter[3]->GetPolyDataOutput()); } + vtkLODActor::SetMapper(theMapper); } diff --git a/src/PIPELINE/Makefile.am b/src/PIPELINE/Makefile.am index adb0d87b..425f955c 100644 --- a/src/PIPELINE/Makefile.am +++ b/src/PIPELINE/Makefile.am @@ -63,8 +63,13 @@ salomeinclude_HEADERS= \ VISU_PlanesWidget.hxx \ VISU_SphereWidget.hxx \ VISU_WidgetCtrl.hxx \ - VISU_ScalarMapOnDeformedShapePL.hxx \ - VISUPipeline.hxx + VISU_DeformedShapeAndScalarMapPL.hxx \ + VISUPipeline.hxx \ + VISU_LabelPointsFilter.hxx \ + VISU_ElnoDisassembleFilter.hxx \ + VISU_ElnoAssembleFilter.hxx \ + VISU_DeformationPL.hxx \ + VISU_OptionalDeformationPL.hxx dist_libVisuPipeLine_la_SOURCES= \ VISU_MapperHolder.cxx \ @@ -101,7 +106,12 @@ dist_libVisuPipeLine_la_SOURCES= \ VISU_SphereWidget.cxx \ VISU_WidgetCtrl.cxx \ VISU_ScalarBarCtrl.cxx \ - VISU_ScalarMapOnDeformedShapePL.cxx + VISU_DeformedShapeAndScalarMapPL.cxx \ + VISU_LabelPointsFilter.cxx \ + VISU_ElnoDisassembleFilter.cxx \ + VISU_ElnoAssembleFilter.cxx \ + VISU_DeformationPL.cxx \ + VISU_OptionalDeformationPL.cxx libVisuPipeLine_la_CPPFLAGS= \ $(VTK_INCLUDES) \ diff --git a/src/PIPELINE/VISUPipeLine.cxx b/src/PIPELINE/VISUPipeLine.cxx index 4b658ba1..291c457a 100644 --- a/src/PIPELINE/VISUPipeLine.cxx +++ b/src/PIPELINE/VISUPipeLine.cxx @@ -24,6 +24,11 @@ // Author: Alexey PETROV // Module : VISU + +// Salome includes +#include "VISU_Convertor.hxx" +#include "VISU_ConvertorUtils.hxx" + #include "VISU_MeshPL.hxx" #include "VISU_ScalarMapPL.hxx" #include "VISU_IsoSurfacesPL.hxx" @@ -33,354 +38,289 @@ #include "VISU_VectorsPL.hxx" #include "VISU_StreamLinesPL.hxx" #include "VISU_GaussPointsPL.hxx" -#include "VISU_ScalarMapOnDeformedShapePL.hxx" +#include "VISU_DeformedShapeAndScalarMapPL.hxx" #include "VISU_Plot3DPL.hxx" -#include "VISU_ScalarBarActor.hxx" - -#include "VISU_DeformedGridPL.hxx" +#include "VISU_ScalarBarActor.hxx" #include "VISU_OpenGLPointSpriteMapper.hxx" #include "VTKViewer_GeometryFilter.h" -#include -#include "VISU_Convertor.hxx" -#include "VISU_TableReader.hxx" -#include "VISU_ConvertorUtils.hxx" +#include "VISU_ElnoDisassembleFilter.hxx" +#include "VISU_ElnoAssembleFilter.hxx" -typedef VISU_StreamLinesPL TPresent; +typedef VISU_ScalarMapPL TPresent; +// VTK includes +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include - #include #include #include #include +#include #include #include #include #include - #include -#include - -#include - -//#define _DEBUG_ID_MAPPING_ - -//---------------------------------------------------------------------------- -template -VISU_ColoredPL* -CreateColoredPL(VISU_Convertor* theConvertor, - const std::string& theMeshName, - const VISU::TEntity& theEntity, - const std::string& theFieldName, - int theTimeStampNumber); - +#include "utilities.h" -//---------------------------------------------------------------------------- -template<> -VISU_ColoredPL* -CreateColoredPL(VISU_Convertor* theConvertor, - const std::string& theMeshName, - const VISU::TEntity& theEntity, - const std::string& theFieldName, - int theTimeStampNumber) -{ - VISU_GaussPointsPL* aPresent = VISU_GaussPointsPL::New(); - VISU::PGaussPtsIDMapper aGaussPtsIDMapper = - theConvertor->GetTimeStampOnGaussPts(theMeshName, - theEntity, - theFieldName, - theTimeStampNumber); - aPresent->SetGaussPtsIDMapper(aGaussPtsIDMapper); - - char aMainTexture[80]; - strcpy( aMainTexture, getenv( "VISU_ROOT_DIR" ) ); - strcat( aMainTexture, "/share/salome/resources/visu/sprite_texture.bmp" ); - - char anAlphaTexture[80]; - strcpy( anAlphaTexture, getenv( "VISU_ROOT_DIR" ) ); - strcat( anAlphaTexture, "/share/salome/resources/visu/sprite_alpha.bmp" ); - - vtkSmartPointer aTextureValue = - VISU_GaussPointsPL::MakeTexture( aMainTexture, anAlphaTexture ); - aPresent->SetImageData( aTextureValue.GetPointer() ); - - aPresent->Update(); - -#ifdef _DEBUG_ID_MAPPING_ - vtkDataSet* aDataSet = aPresent->GetOutput(); - aDataSet->Update(); - int aNbCells = aDataSet->GetNumberOfCells(); - cout<<"aNbCells = "<GetNodeObjID(anCellId); - vtkIdType aVtkID = aPresent->GetNodeVTKID(anObjID); - cout<GetNodeCoord(anObjID); - cout< -VISU_ColoredPL* -CreateColoredPL(VISU_Convertor* theConvertor, - const std::string& theMeshName, - const VISU::TEntity& theEntity, - const std::string& theFieldName, - int theTimeStampNumber) -{ - TPipeLine* aPresent = TPipeLine::New(); - VISU::PUnstructuredGridIDMapper anUnstructuredGridIDMapper = - theConvertor->GetTimeStampOnMesh(theMeshName, - theEntity, - theFieldName, - theTimeStampNumber); - aPresent->SetUnstructuredGridIDMapper(anUnstructuredGridIDMapper); - - //aPresent->ClearGeometry(); - //{ - // VISU::PUnstructuredGridIDMapper anIDMapper = - // theConvertor->GetMeshOnGroup(theMeshName, - // "groupe1"); - // aPresent->AddGeometry(anIDMapper->GetOutput()); - //} - //{ - // VISU::PUnstructuredGridIDMapper anIDMapper = - // theConvertor->GetMeshOnGroup(theMeshName, - // "TUBEH "); - // aPresent->AddGeometry(anIDMapper->GetOutput()); - //} - //{ - // VISU::PUnstructuredGridIDMapper anIDMapper = - // theConvertor->GetMeshOnGroup(theMeshName, - // "STRI "); - // aPresent->AddGeometry(anIDMapper->GetOutput()); - //} - aPresent->Update(); - return aPresent; +void PrintHelp(){ + MESSAGE_ADD(std::endl << " Usage: VISUPipeLine filename meshname fieldname [timestamp] [component] " << + std::endl << "filename - Name of the med file. " << + std::endl << "meshname - Name of the mesh in the med file. " << + std::endl << "fieldname - Name of the mesh field. " << + std::endl << "timestamp - Number of the time stamp in the field 1,2,3 ... (optionally)" << + std::endl << " by default used first time stamp. " << + std::endl << "component - Number of the component in the field 0,1,2,3 ...(optionally)" << + std::endl << " 0 - modulus, 1 - first component, 2 - second component, ... " << + std::endl << " by default used modulus. "); } - -//---------------------------------------------------------------------------- -struct TMEDSource -{ - std::auto_ptr myConvertor; - - TMEDSource(char** argv): myConvertor(CreateConvertor(argv[1])) - { - myConvertor->BuildEntities(); - } -}; - - -//---------------------------------------------------------------------------- -struct TMeshBulder: TMEDSource -{ - TMeshBulder(char** argv): TMEDSource(argv) - {} - - int Publish(vtkRenderer *theRenderer) const - { - const VISU::TMeshMap& aMeshMap = myConvertor->GetMeshMap(); - VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin(); - if(aMeshMapIter == aMeshMap.end()) - return 0; - - const std::string& aMeshName = aMeshMapIter->first; - const VISU::PMesh aMesh = aMeshMapIter->second; - const VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap; - VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter; - - VISU::TEntity anEntity = VISU::CELL_ENTITY; - aMeshOnEntityMapIter = aMeshOnEntityMap.find(anEntity); - - VISU::PNamedIDMapper anIDMapper = myConvertor->GetMeshOnEntity(aMeshName, anEntity); - - VISU_MeshPL* aPresent = VISU_MeshPL::New(); - aPresent->SetUnstructuredGridIDMapper(anIDMapper); - - vtkActor* anActor = vtkActor::New(); - anActor->SetMapper(aPresent->GetMapper()); - anActor->GetProperty()->SetRepresentation(VTK_WIREFRAME); - - theRenderer->AddActor(anActor); - anActor->Delete(); - - return 0; - } -}; +void PrintErr(){ + MESSAGE("***************************ERROR*****************************************"); +} //---------------------------------------------------------------------------- -struct TColoredPrsBulder: TMEDSource +int +main(int argc, char** argv) { - TColoredPrsBulder(char** argv): TMEDSource(argv) - {} - - int Publish(vtkRenderer *theRenderer) const - { - myConvertor->BuildGroups(); - myConvertor->BuildFields(); - myConvertor->BuildMinMax(); - const VISU::TMeshMap& aMeshMap = myConvertor->GetMeshMap(); - VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin(); - if(aMeshMapIter == aMeshMap.end()) - return 0; - - const std::string& aMeshName = aMeshMapIter->first; - const VISU::PMesh aMesh = aMeshMapIter->second; - const VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap; - VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter; - - //Import fields - aMeshOnEntityMapIter = aMeshOnEntityMap.begin(); - for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++) { - const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first; - const VISU::PMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second; - const VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap; - VISU::TFieldMap::const_iterator aFieldMapIter = aFieldMap.begin(); - for(; aFieldMapIter != aFieldMap.end(); aFieldMapIter++){ - const VISU::PField aField = aFieldMapIter->second; - //if(aField->myNbComp == 1) - // continue; - const std::string& aFieldName = aFieldMapIter->first; - const VISU::TValField& aValField = aField->myValField; - VISU::TValField::const_reverse_iterator aValFieldIter = aValField.rbegin(); - if(aValFieldIter == aValField.rend()) - return 0; - - int aTimeStamp = aValFieldIter->first; - - VISU_ColoredPL* aPresent = NULL; - if(anEntity != VISU::NODE_ENTITY){ - aPresent = CreateColoredPL(myConvertor.get(), - aMeshName, - anEntity, - aFieldName, - aTimeStamp); - - }else{ - continue; - aPresent = CreateColoredPL(myConvertor.get(), - aMeshName, - anEntity, - aFieldName, - aTimeStamp); - } - - vtkActor* anActor = vtkActor::New(); - anActor->SetMapper(aPresent->GetMapper()); - - VISU_ScalarBarActor * aScalarBar = VISU_ScalarBarActor::New(); - aScalarBar->SetLookupTable(aPresent->GetBarTable()); - - theRenderer->AddActor(anActor); - anActor->Delete(); - - theRenderer->AddActor2D(aScalarBar); - aScalarBar->Delete(); - } + try{ + if(argc == 1){ + PrintMissing(); + return 1; + } + if(argc == 2 && !strcmp(argv[1],"-h")) { + PrintHelp(); + return 1; } - return 0; - } -}; - - -//---------------------------------------------------------------------------- -struct TXLSSource -{ - VISU::TTableContainer myContainer; - - TXLSSource(char** argv) - { - VISU::ImportTables( argv[1], myContainer ); - } - - int Publish(vtkRenderer *theRenderer) const - { - if ( myContainer.empty() ) - return 0; - - VISU::PPolyDataIDMapper anIDMapper = myContainer[0]; - - VISU_DeformedGridPL* aPresent = VISU_DeformedGridPL::New(); - aPresent->SetPolyDataIDMapper(anIDMapper); - //aPresent->SetContourPrs( true ); - aPresent->Update(); - - vtkActor* anActor = vtkActor::New(); - anActor->SetMapper(aPresent->GetMapper()); - - theRenderer->AddActor(anActor); - anActor->Delete(); - VISU_ScalarBarActor * aScalarBar = VISU_ScalarBarActor::New(); - aScalarBar->SetLookupTable(aPresent->GetBarTable()); + char* aFileName =0; + char* aMeshName =0; + char* aFieldName =0; + int aTimeStampNumber = 1; + int aComponentNumber = 0; + bool allInit = false; + bool isMeshOk = false; + bool isFieldOk = false; + bool isTimeStampOk = false; + bool isComponentOk = false; + + if(argc == 4 ){ + aFileName = new char[static_cast(strlen(argv[1])) + 1]; + aMeshName = new char[static_cast(strlen(argv[2])) + 1]; + aFieldName = new char[static_cast(strlen(argv[3])) + 1]; + + strcpy(aFileName,argv[1]); + strcpy(aMeshName,argv[2]); + strcpy(aFieldName,argv[3]); + + allInit = true; + } + + if(argc == 5) { + aFileName = new char[static_cast(strlen(argv[1])) + 1]; + aMeshName = new char[static_cast(strlen(argv[2])) + 1]; + aFieldName = new char[static_cast(strlen(argv[3])) + 1]; + + strcpy(aFileName,argv[1]); + strcpy(aMeshName,argv[2]); + strcpy(aFieldName,argv[3]); + + aTimeStampNumber = atoi(argv[4]); + allInit = true; + } - theRenderer->AddActor2D(aScalarBar); - aScalarBar->Delete(); + if(argc == 6) { + aFileName = new char[static_cast(strlen(argv[1])) + 1]; + aMeshName = new char[static_cast(strlen(argv[2])) + 1]; + aFieldName = new char[static_cast(strlen(argv[3])) + 1]; + + strcpy(aFileName,argv[1]); + strcpy(aMeshName,argv[2]); + strcpy(aFieldName,argv[3]); + + aTimeStampNumber = atoi(argv[4]); + aComponentNumber = atoi(argv[5]); + allInit = true; + } - return 0; - } -}; - -//---------------------------------------------------------------------------- -template -int RenderPresentation(const TPrsBuilder& thePrsBuilder) -{ - vtkRenderWindow *aWindow = vtkRenderWindow::New(); - vtkRenderer *aRenderer = vtkRenderer::New(); - - aWindow->AddRenderer(aRenderer); - aRenderer->GetActiveCamera()->ParallelProjectionOn(); - - vtkRenderWindowInteractor *anInteractor = vtkRenderWindowInteractor::New(); - anInteractor->SetRenderWindow(aWindow); - aWindow->Delete(); - - vtkInteractorStyle* aStyle = vtkInteractorStyleTrackballCamera::New(); - anInteractor->SetInteractorStyle(aStyle); - aStyle->Delete(); - - int aRet = thePrsBuilder.Publish(aRenderer); - - aWindow->Render(); - anInteractor->Start(); - - return aRet; -} - -//---------------------------------------------------------------------------- -int -main(int argc, char** argv) -{ - try{ - if (argc > 1) { - QFileInfo aFileInfo( argv[1] ); - if ( aFileInfo.isFile() ) { - QString anExtension = aFileInfo.suffix(); - if ( anExtension == "med" ) { - //TMeshBulder aBuilder( argv ); - TColoredPrsBulder aBuilder( argv ); - return RenderPresentation( aBuilder ); - } else if ( anExtension == "xls" || anExtension == "txt" ) - return RenderPresentation( TXLSSource( argv ) ); + if(allInit){ + + vtkRenderWindow *aWindow = vtkRenderWindow::New(); + vtkRenderer *aRenderer = vtkRenderer::New(); + + aWindow->AddRenderer(aRenderer); + aRenderer->GetActiveCamera()->ParallelProjectionOn(); + + vtkRenderWindowInteractor *anInteractor = vtkRenderWindowInteractor::New(); + anInteractor->SetRenderWindow(aWindow); + aWindow->Delete(); + + vtkInteractorStyle* aStyle = vtkInteractorStyleTrackballCamera::New(); + anInteractor->SetInteractorStyle(aStyle); + aStyle->Delete(); + + VISU_Convertor* aConvertor = CreateConvertor(aFileName); + aConvertor->BuildEntities(); + aConvertor->BuildGroups(); + aConvertor->BuildFields(); + aConvertor->BuildMinMax(); + const VISU::TMeshMap& aMeshMap = aConvertor->GetMeshMap(); + VISU::TMeshMap::const_iterator aMeshMapIter = aMeshMap.begin(); + if(aMeshMapIter == aMeshMap.end()) return 0; + //Iterate by meshes + for (;aMeshMapIter != aMeshMap.end();aMeshMapIter++) { + + const std::string& theMeshName = aMeshMapIter->first; + if( strcmp(aMeshName, theMeshName.c_str()) ) + continue; + else + isMeshOk = true; + + const VISU::PMesh aMesh = aMeshMapIter->second; + const VISU::TMeshOnEntityMap& aMeshOnEntityMap = aMesh->myMeshOnEntityMap; + VISU::TMeshOnEntityMap::const_iterator aMeshOnEntityMapIter; + + aMeshOnEntityMapIter = aMeshOnEntityMap.begin(); + //Iterate by meshes on entity + for(; aMeshOnEntityMapIter != aMeshOnEntityMap.end(); aMeshOnEntityMapIter++) { + const VISU::TEntity& anEntity = aMeshOnEntityMapIter->first; + const VISU::PMeshOnEntity aMeshOnEntity = aMeshOnEntityMapIter->second; + + const VISU::TFieldMap& aFieldMap = aMeshOnEntity->myFieldMap; + VISU::TFieldMap::const_iterator aFieldMapIter = aFieldMap.begin(); + + //Iterate by field + for(; aFieldMapIter != aFieldMap.end(); aFieldMapIter++){ + const VISU::PField aField = aFieldMapIter->second; + const std::string& theFieldName = aFieldMapIter->first; + + if( strcmp(aFieldName, theFieldName.c_str()) ) + continue; + else + isFieldOk = true; + + if(aComponentNumber > aField->myNbComp) + continue; + else + isComponentOk = true; + + const VISU::TValField& aValField = aField->myValField; + VISU::TValField::const_iterator aValFieldIter = aValField.find(aTimeStampNumber); + if(aValFieldIter == aValField.end()) + continue; + else + isTimeStampOk = true; + + int aTimeStamp = aValFieldIter->first; + + vtkActor* anActor = vtkActor::New(); + + if(anEntity != VISU::NODE_ENTITY){ + VISU::PUnstructuredGridIDMapper anUnstructuredGridIDMapper = + aConvertor->GetTimeStampOnMesh(theMeshName, + anEntity, + theFieldName, + aTimeStamp); + + vtkUnstructuredGrid* anUnstructuredGrid = anUnstructuredGridIDMapper->GetUnstructuredGridOutput(); + VISU::WriteToFile( anUnstructuredGrid, "/data/apo/elno_from_id_mapper.vtk" ); + + VISU_ElnoDisassembleFilter* aDisassembleFilter = VISU_ElnoDisassembleFilter::New(); + aDisassembleFilter->SetInput( anUnstructuredGrid ); + aDisassembleFilter->SetShrinkFactor( 0.999 ); + VISU::WriteToFile( aDisassembleFilter->GetOutput(), "/data/apo/elno_from_disassemble.vtk" ); + + vtkCutter *aCutter = vtkCutter::New(); + + vtkPointLocator* aPointLocator = vtkPointLocator::New(); + aCutter->SetLocator( aPointLocator ); + aPointLocator->Delete(); + + TPresent* aPresent = TPresent::New(); + aPresent->SetUnstructuredGridIDMapper( anUnstructuredGridIDMapper ); + //aPresent->SetOrientation( VISU_CutPlanesPL::ZX, 0.0, 0.0, 0 ); + aPresent->Update(); + + aPresent->GetMapper()->InterpolateScalarsBeforeMappingOn(); + anActor->SetMapper( aPresent->GetMapper() ); + + vtkScalarBarActor* aScalarBar = vtkScalarBarActor::New(); + //aScalarBar->SetLookupTable( aMapperTable ); + aScalarBar->SetLookupTable( aPresent->GetBarTable() ); + + + vtkScalarBarWidget* aWidget = vtkScalarBarWidget::New(); + aWidget->SetScalarBarActor( aScalarBar ); + aWidget->SetInteractor( anInteractor ); + aWidget->SetEnabled( true ); + + aRenderer->AddActor(anActor); + aRenderer->AddActor2D(aScalarBar); + }else{ + continue; + } + + aWindow->Render(); + aRenderer->ResetCamera(); + + anInteractor->Start(); + return 0; + } + } } } + else{ + PrintMissing(); + return 1; + } + + if(!isMeshOk) { + PrintErr(); + MESSAGE("Can not find mesh with name `"<SetInput(myExtractor->GetOutput()); GetMapperHolder()->SetLookupTable(GetMapperTable()); - GetMapper()->SetUseLookupTableScalarRange(true); + //GetMapper()->InterpolateScalarsBeforeMappingOn(); + GetMapper()->SetUseLookupTableScalarRange( true ); GetMapper()->SetColorModeToMapScalars(); GetMapper()->ScalarVisibilityOn(); } diff --git a/src/PIPELINE/VISU_CutLinesPL.cxx b/src/PIPELINE/VISU_CutLinesPL.cxx index 3bad32d1..dbd2243a 100644 --- a/src/PIPELINE/VISU_CutLinesPL.cxx +++ b/src/PIPELINE/VISU_CutLinesPL.cxx @@ -100,6 +100,12 @@ VISU_CutLinesPL Modified(); } +vtkDataSet* +VISU_CutLinesPL +::InsertCustomPL() +{ + return myAppendPolyData->GetOutput(); +} //---------------------------------------------------------------------------- vtkFloatingPointType diff --git a/src/PIPELINE/VISU_CutLinesPL.hxx b/src/PIPELINE/VISU_CutLinesPL.hxx index 58116834..7ed0ecd8 100644 --- a/src/PIPELINE/VISU_CutLinesPL.hxx +++ b/src/PIPELINE/VISU_CutLinesPL.hxx @@ -64,6 +64,9 @@ public: void Init(); + vtkDataSet* + InsertCustomPL(); + virtual void Update(); diff --git a/src/PIPELINE/VISU_CutPlanesPL.cxx b/src/PIPELINE/VISU_CutPlanesPL.cxx index 22493a10..a8776eaf 100644 --- a/src/PIPELINE/VISU_CutPlanesPL.cxx +++ b/src/PIPELINE/VISU_CutPlanesPL.cxx @@ -29,13 +29,23 @@ #include "VISU_FieldTransform.hxx" #include "VISU_PipeLineUtils.hxx" #include "VTKViewer_GeometryFilter.h" +#include "VISU_MapperHolder.hxx" +#include "VISU_DeformationPL.hxx" #include #include #include +//#include + static vtkFloatingPointType EPS = 1.0E-3; +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + //---------------------------------------------------------------------------- vtkStandardNewMacro(VISU_CutPlanesPL); @@ -43,10 +53,15 @@ vtkStandardNewMacro(VISU_CutPlanesPL); //---------------------------------------------------------------------------- VISU_CutPlanesPL -::VISU_CutPlanesPL() +::VISU_CutPlanesPL(): + VISU_OptionalDeformationPL() { + if(MYDEBUG) MESSAGE("VISU_CutPlanesPL()::VISU_CutPlanesPL() - "<Delete(); myAppendPolyData = NULL; } @@ -76,7 +93,11 @@ VISU_CutPlanesPL ::GetMTime() { unsigned long int aTime = Superclass::GetMTime(); - + + if(IsDeformed()) { + aTime = std::max(aTime, VISU_OptionalDeformationPL::GetMTime()); + } + aTime = std::max(aTime, myAppendPolyData->GetMTime()); return aTime; @@ -113,11 +134,11 @@ VISU_CutPlanesPL ::Init() { Superclass::Init(); - SetNbParts(10); myBasePlane[0] = YZ; myDisplacement[0] = 0.5; myAng[0][0] = myAng[0][1] = myAng[0][2] = 0.0; + SetScale(VISU_DeformationPL::GetDefaultScaleFactor(this)); } @@ -126,7 +147,7 @@ vtkDataSet* VISU_CutPlanesPL ::InsertCustomPL() { - return myAppendPolyData->GetOutput(); + return GetWarpVectorOutput(); } @@ -137,18 +158,32 @@ VISU_CutPlanesPL { ClearAppendPolyData(myAppendPolyData); - SetPartPosition(); + if(!myVectorialField || !IsDeformed()){ + SetMergeFilterInput(GetMergedInput(),GetMergedInput()); + } + + + if(VISU::IsDataOnCells(GetMergedInput())) + GetMapper()->SetScalarModeToUseCellData(); + else + GetMapper()->SetScalarModeToUsePointData(); + + SetPartPosition(); + vtkFloatingPointType aDir[3]; GetDir(aDir, myAng[0], myBasePlane[0]); - + vtkFloatingPointType aBounds[6]; - GetMergedInput()->GetBounds(aBounds); + + vtkDataSet* aFilterOutput = GetMergeFilterOutput(); + + aFilterOutput->GetBounds(aBounds); CutWithPlanes(myAppendPolyData, - GetMergedInput(), + aFilterOutput, myNbParts, aDir, aBounds, @@ -156,6 +191,9 @@ VISU_CutPlanesPL myPartCondition, myDisplacement[0]); + + + SetWarpVectorInput(myAppendPolyData->GetOutput()); Superclass::Update(); } @@ -412,7 +450,11 @@ VISU_CutPlanesPL vtkFloatingPointType aPosition = myPartPosition[thePartNumber]; if(myPartCondition[thePartNumber]){ vtkFloatingPointType aDir[3], aBounds[6], aBoundPrj[3]; - GetMergedInput()->GetBounds(aBounds); + if(!IsDeformed()) + GetMergedInput()->GetBounds(aBounds); + else + GetMergeFilterOutput()->GetBounds(aBounds); + GetDir(aDir, myAng[theNum], @@ -564,3 +606,33 @@ VISU_CutPlanesPL //---------------------------------------------------------------------------- +void +VISU_CutPlanesPL::SetVectorialField(VISU::PUnstructuredGridIDMapper theMapper) +{ + if(myVectorialField == theMapper) + return; + + if(CheckCanDeformate(theMapper->GetOutput())){ + myVectorialField = theMapper; + + SetMergeFilterInput(GetMergedInput(),theMapper->GetOutput()); + } + else + UseDeformation(false); + + Modified(); +} + +//---------------------------------------------------------------------------- +VISU::PUnstructuredGridIDMapper VISU_CutPlanesPL:: +getVectorialField() +{ + return myVectorialField; +} + +//---------------------------------------------------------------------------- +void VISU_CutPlanesPL::SetMapScale(vtkFloatingPointType theMapScale){ + Superclass::SetMapScale(theMapScale); + if(IsDeformed()) + VISU_OptionalDeformationPL::SetMapScale(theMapScale); +} diff --git a/src/PIPELINE/VISU_CutPlanesPL.hxx b/src/PIPELINE/VISU_CutPlanesPL.hxx index 27d377fd..054b8761 100644 --- a/src/PIPELINE/VISU_CutPlanesPL.hxx +++ b/src/PIPELINE/VISU_CutPlanesPL.hxx @@ -29,6 +29,8 @@ #include "VISUPipeline.hxx" #include "VISU_ScalarMapPL.hxx" +#include "VISU_OptionalDeformationPL.hxx" +#include "VISU_MapperHolder.hxx" #include @@ -36,7 +38,8 @@ class vtkAppendPolyData; //---------------------------------------------------------------------------- -class VISU_PIPELINE_EXPORT VISU_CutPlanesPL : public VISU_ScalarMapPL +class VISU_PIPELINE_EXPORT VISU_CutPlanesPL : public VISU_ScalarMapPL, + public VISU_OptionalDeformationPL { public: vtkTypeMacro(VISU_CutPlanesPL, VISU_ScalarMapPL); @@ -182,6 +185,14 @@ public: const std::vector& thePlaneCondition, vtkFloatingPointType theDisplacement); + virtual void SetVectorialField(VISU::PUnstructuredGridIDMapper); + VISU::PUnstructuredGridIDMapper getVectorialField(); + + virtual + void + SetMapScale(vtkFloatingPointType theMapScale = 1.0); + + protected: VISU_CutPlanesPL(); diff --git a/src/PIPELINE/VISU_DataSetMapperHolder.cxx b/src/PIPELINE/VISU_DataSetMapperHolder.cxx index 313c6d68..4a9adf0a 100644 --- a/src/PIPELINE/VISU_DataSetMapperHolder.cxx +++ b/src/PIPELINE/VISU_DataSetMapperHolder.cxx @@ -28,6 +28,7 @@ #include "VISU_DataSetMapperHolder.hxx" #include "SALOME_ExtractGeometry.h" +#include "VISU_ElnoDisassembleFilter.hxx" #include "VISU_LookupTable.hxx" #include "VISU_PipeLineUtils.hxx" @@ -41,6 +42,8 @@ #include #include +#include + #ifdef _DEBUG_ static int MYDEBUG = 0; #else @@ -55,10 +58,13 @@ vtkStandardNewMacro(VISU_DataSetMapperHolder); //---------------------------------------------------------------------------- VISU_DataSetMapperHolder ::VISU_DataSetMapperHolder(): - myExtractGeometry(SALOME_ExtractGeometry::New()) + myElnoDisassembleFilter( VISU_ElnoDisassembleFilter::New() ), + myExtractGeometry( SALOME_ExtractGeometry::New() ) { if(MYDEBUG) MESSAGE("VISU_DataSetMapperHolder::VISU_DataSetMapperHolder - "<Delete(); + // Clipping functionality myExtractGeometry->Delete(); myExtractGeometry->SetStoreMapping(true); @@ -96,6 +102,19 @@ VISU_DataSetMapperHolder } +//---------------------------------------------------------------------------- +void +VISU_DataSetMapperHolder +::SetElnoDisassembleState( bool theIsShrunk ) +{ + vtkFloatingPointType aShrinkFactor = std::abs( myElnoDisassembleFilter->GetShrinkFactor() ); + if ( theIsShrunk ) + myElnoDisassembleFilter->SetShrinkFactor( aShrinkFactor ); + else + myElnoDisassembleFilter->SetShrinkFactor( -aShrinkFactor ); +} + + //---------------------------------------------------------------------------- unsigned long int VISU_DataSetMapperHolder @@ -116,9 +135,10 @@ void VISU_DataSetMapperHolder ::SetUnstructuredGridIDMapper(const VISU::PUnstructuredGridIDMapper& theIDMapper) { - myExtractGeometry->SetInput(theIDMapper->GetUnstructuredGridOutput()); + myElnoDisassembleFilter->SetInput( theIDMapper->GetUnstructuredGridOutput() ); + myExtractGeometry->SetInput( myElnoDisassembleFilter->GetOutput() ); myUnstructuredGridIDMapper = theIDMapper; - SetIDMapper(theIDMapper); + SetIDMapper( theIDMapper ); } diff --git a/src/PIPELINE/VISU_DataSetMapperHolder.hxx b/src/PIPELINE/VISU_DataSetMapperHolder.hxx index 45fa07fe..6588abd9 100644 --- a/src/PIPELINE/VISU_DataSetMapperHolder.hxx +++ b/src/PIPELINE/VISU_DataSetMapperHolder.hxx @@ -32,6 +32,7 @@ class vtkDataSetMapper; class vtkUnstructuredGrid; class SALOME_ExtractGeometry; +class VISU_ElnoDisassembleFilter; //---------------------------------------------------------------------------- @@ -50,6 +51,9 @@ public: ShallowCopy(VISU_MapperHolder *theMapperHolder, bool theIsCopyInput); + void + SetElnoDisassembleState( bool theIsShrunk ); + //! Gets memory size used by the instance (bytes). virtual unsigned long int @@ -158,8 +162,9 @@ protected: private: //---------------------------------------------------------------------------- VISU::PUnstructuredGridIDMapper myUnstructuredGridIDMapper; - vtkSmartPointer myDataSetMapper; - vtkSmartPointer myExtractGeometry; //!< Clipping + vtkSmartPointer< VISU_ElnoDisassembleFilter > myElnoDisassembleFilter; //!< Handling ELNO data + vtkSmartPointer< SALOME_ExtractGeometry > myExtractGeometry; //!< Clipping + vtkSmartPointer< vtkDataSetMapper > myDataSetMapper; }; #endif diff --git a/src/PIPELINE/VISU_DeformationPL.cxx b/src/PIPELINE/VISU_DeformationPL.cxx new file mode 100755 index 00000000..2189b228 --- /dev/null +++ b/src/PIPELINE/VISU_DeformationPL.cxx @@ -0,0 +1,163 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// +// File: VISU_ScalarMapPL.cxx +// Author: Roman NIKOLAEV +// Module : VISU + +//Salome includes +#include "VISU_DeformationPL.hxx" +#include "VISU_MergeFilter.hxx" +#include "VISU_DeformedShapePL.hxx" +#include "VISU_PipeLineUtils.hxx" + +//VTK includes +#include +#include +#include +#include +#include +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + + +//---------------------------------------------------------------------------- +VISU_DeformationPL::VISU_DeformationPL(): + myScaleFactor(1.0), + myMapScaleFactor(1.0) +{ + if(MYDEBUG) MESSAGE("VISU_DeformationPL()::VISU_DeformationPL() - "<SetScaleFactor(myScaleFactor); + + myVectorMergeFilter = VISU_MergeFilter::New(); + myVectorMergeFilter->SetMergingInputs(true); + myInputPassFilter = vtkPassThroughFilter::New(); + myOutputPassFiler = vtkPassThroughFilter::New(); + myCellDataToPointData = vtkCellDataToPointData::New(); + myCellDataToPointData->PassCellDataOn(); + + myInputPassFilter->SetInput(vtkUnstructuredGrid::New()); + + myCellDataToPointData->SetInput(myInputPassFilter->GetOutput()); + + myWarpVector->SetInput(myCellDataToPointData->GetOutput()); + + myOutputPassFiler->SetInput(myWarpVector->GetOutput()); +} + +//---------------------------------------------------------------------------- +VISU_DeformationPL::~VISU_DeformationPL() +{ + if(MYDEBUG) MESSAGE("VISU_DeformationPL()::~VISU_DeformationPL() - "<Delete(); + myVectorMergeFilter->Delete(); + myInputPassFilter->Delete(); + myOutputPassFiler->Delete(); + myCellDataToPointData->Delete(); +} + + +//---------------------------------------------------------------------------- +unsigned long int +VISU_DeformationPL::GetMTime(){ + unsigned long int aTime = std::max(myWarpVector->GetMTime(), + myVectorMergeFilter->GetMTime()); + + aTime = std::max(aTime,myInputPassFilter->GetMTime()); + aTime = std::max(aTime,myOutputPassFiler->GetMTime()); + aTime = std::max(aTime,myCellDataToPointData->GetMTime()); +} + +//---------------------------------------------------------------------------- +void VISU_DeformationPL::SetScale(vtkFloatingPointType theScaleFactor) +{ + if(myScaleFactor == theScaleFactor) + return; + myScaleFactor = theScaleFactor; + myWarpVector->SetScaleFactor(myScaleFactor*myMapScaleFactor); +} + +void VISU_DeformationPL::SetMapScale(vtkFloatingPointType theMapScaleFactor) +{ + if(myMapScaleFactor == theMapScaleFactor) + return; + myMapScaleFactor = theMapScaleFactor; + + myWarpVector->SetScaleFactor(myScaleFactor*myMapScaleFactor); +} + + +vtkFloatingPointType VISU_DeformationPL::GetScale() +{ + return myScaleFactor; +} + +//---------------------------------------------------------------------------- +void VISU_DeformationPL::SetWarpVectorInput(vtkDataSet *theInput) +{ + myInputPassFilter->SetInput(theInput); +} + +//---------------------------------------------------------------------------- +vtkDataSet* VISU_DeformationPL::GetWarpVectorOutput() +{ + return myOutputPassFiler->GetOutput(); +} + +//---------------------------------------------------------------------------- +void VISU_DeformationPL::SetMergeFilterInput(vtkDataSet* ScalarInput, + vtkDataSet* VectorialInput) +{ + myVectorMergeFilter->SetScalars(ScalarInput); + myVectorMergeFilter->AddField("VISU_CELLS_MAPPER",ScalarInput); + myVectorMergeFilter->AddField("VISU_POINTS_MAPPER",ScalarInput); + + myVectorMergeFilter->SetGeometry(VectorialInput); + myVectorMergeFilter->SetVectors(VectorialInput); +} + +//---------------------------------------------------------------------------- +vtkDataSet* VISU_DeformationPL::GetMergeFilterOutput(){ + return myVectorMergeFilter->GetOutput(); +} + +//---------------------------------------------------------------------------- +vtkFloatingPointType VISU_DeformationPL::GetDefaultScaleFactor(VISU_DeformationPL *thePipeLine) +{ + if(!thePipeLine || !thePipeLine->GetMergeFilterOutput()) + return 0.0; + + vtkFloatingPointType aSourceRange[2]; + thePipeLine->GetMergeFilterOutput()->GetScalarRange(aSourceRange); + + static vtkFloatingPointType EPS = 1.0 / VTK_LARGE_FLOAT; + if(fabs(aSourceRange[1]) > EPS){ + vtkDataSet* aDataSet = thePipeLine->GetMergeFilterOutput(); + vtkFloatingPointType aScaleFactor = VISU_DeformedShapePL::GetScaleFactor(aDataSet); + return aScaleFactor / aSourceRange[1]; + } + return 0.0; +} + diff --git a/src/PIPELINE/VISU_DeformationPL.hxx b/src/PIPELINE/VISU_DeformationPL.hxx new file mode 100755 index 00000000..e18f43e3 --- /dev/null +++ b/src/PIPELINE/VISU_DeformationPL.hxx @@ -0,0 +1,87 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// +// File : VISU_DeformationPL.hxx +// Author : +// Module : SALOME + +#ifndef VISU_DeformationPL_HeaderFile +#define VISU_DeformationPL_HeaderFile + +#include "VISUPipeline.hxx" +#include "VISU_MapperHolder.hxx" +#include + +class vtkDataSet; +class VISU_MergeFilter; +class vtkPassThroughFilter; +class vtkWarpVector; +class vtkCellDataToPointData; + +class VISU_PIPELINE_EXPORT VISU_DeformationPL { + +public: + VISU_DeformationPL(); + virtual ~VISU_DeformationPL(); + + //----------------------------------------------------------- + virtual void SetScale(vtkFloatingPointType theScaleFactor); + virtual void SetMapScale(vtkFloatingPointType theMapScaleFactor); + virtual vtkFloatingPointType GetScale(); + + //----------------------------------------------------------- + virtual void SetVectorialField(VISU::PUnstructuredGridIDMapper theIdMapper) = 0; + virtual VISU::PUnstructuredGridIDMapper getVectorialField() = 0; + + + //----------------------------------------------------------- + virtual + unsigned + long int + GetMTime(); + + static vtkFloatingPointType GetDefaultScaleFactor(VISU_DeformationPL *thePipeLine); + + void SetWarpVectorInput(vtkDataSet *theInput); + vtkDataSet* GetWarpVectorOutput(); + + //----------------------------------------------------------- + void SetMergeFilterInput(vtkDataSet* ScalarInput, + vtkDataSet* VectorialInput); + + vtkDataSet* GetMergeFilterOutput(); + +protected: + + VISU::PUnstructuredGridIDMapper myVectorialField; + vtkWarpVector *myWarpVector; + vtkSmartPointer myVectorMergeFilter; + vtkPassThroughFilter *myInputPassFilter; + vtkPassThroughFilter *myOutputPassFiler; + vtkCellDataToPointData *myCellDataToPointData; + +private: + vtkFloatingPointType myScaleFactor; + vtkFloatingPointType myMapScaleFactor; + +}; + +#endif diff --git a/src/PIPELINE/VISU_DeformedGridPL.cxx b/src/PIPELINE/VISU_DeformedGridPL.cxx index e9068b9a..72f40c58 100644 --- a/src/PIPELINE/VISU_DeformedGridPL.cxx +++ b/src/PIPELINE/VISU_DeformedGridPL.cxx @@ -46,7 +46,8 @@ VISU_DeformedGridPL myContourFilter(vtkContourFilter::New()), myWarpScalar(vtkWarpScalar::New()), myIsContour(false), - myScaleFactor(1.0) + myScaleFactor(1.0), + myMapScaleFactor(1.0) { SetIsShrinkable(false); SetNumberOfContours(32); @@ -180,8 +181,9 @@ VISU_DeformedGridPL { if ( VISU::CheckIsSameValue( myWarpScalar->GetScaleFactor(), theScaleFactor ) ) return; + myScaleFactor = theScaleFactor; - myWarpScalar->SetScaleFactor(theScaleFactor); + myWarpScalar->SetScaleFactor(theScaleFactor*myMapScaleFactor); } @@ -222,6 +224,7 @@ VISU_DeformedGridPL ::SetMapScale(vtkFloatingPointType theMapScale) { Superclass::SetMapScale(theMapScale); + myMapScaleFactor = theMapScale; if ( myIsContour ) { vtkFloatingPointType aSourceRange[2]; diff --git a/src/PIPELINE/VISU_DeformedGridPL.hxx b/src/PIPELINE/VISU_DeformedGridPL.hxx index 840059a7..4f325949 100644 --- a/src/PIPELINE/VISU_DeformedGridPL.hxx +++ b/src/PIPELINE/VISU_DeformedGridPL.hxx @@ -108,6 +108,7 @@ private: void operator=(const VISU_DeformedGridPL&); // Not implemented. vtkFloatingPointType myScaleFactor; + vtkFloatingPointType myMapScaleFactor; vtkContourFilter* myContourFilter; vtkWarpScalar *myWarpScalar; bool myIsContour; diff --git a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.cxx b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.cxx similarity index 85% rename from src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.cxx rename to src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.cxx index 54ff4f87..b807671e 100644 --- a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.cxx +++ b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.cxx @@ -1,4 +1,4 @@ -// VISU ScalarMapOnDeformedShapePL +// VISU DeformedShapeAndScalarMapPL // // Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS @@ -20,11 +20,11 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // -// File: VISU_ScalarMapOnDeformedShapePL.cxx +// File: VISU_DeformedShapeAndScalarMapPL.cxx // Author: Eugeny Nikolaev // Module : VISU -#include "VISU_ScalarMapOnDeformedShapePL.hxx" +#include "VISU_DeformedShapeAndScalarMapPL.hxx" #include "VISU_FieldTransform.hxx" #include "VISU_Extractor.hxx" #include "VISU_LookupTable.hxx" @@ -32,7 +32,7 @@ #include "VTKViewer_TransformFilter.h" #include "VTKViewer_Transform.h" #include "VISU_MergeFilter.hxx" - +#include "VISU_ElnoDisassembleFilter.hxx" #include "VISU_PipeLineUtils.hxx" #include @@ -42,7 +42,7 @@ //---------------------------------------------------------------------------- -vtkStandardNewMacro(VISU_ScalarMapOnDeformedShapePL) +vtkStandardNewMacro(VISU_DeformedShapeAndScalarMapPL) //---------------------------------------------------------------------------- /*! @@ -53,9 +53,10 @@ vtkStandardNewMacro(VISU_ScalarMapOnDeformedShapePL) * Merge filter which unify the deformation and scalars * \li myScalars is vtk shared pointer to vtkUnstructuredGrid - scalars data */ -VISU_ScalarMapOnDeformedShapePL -::VISU_ScalarMapOnDeformedShapePL(): - myScaleFactor(0.0) +VISU_DeformedShapeAndScalarMapPL +::VISU_DeformedShapeAndScalarMapPL(): + myScaleFactor(1.0), + myMapScaleFactor(1.0) { myWarpVector = vtkWarpVector::New(); @@ -67,6 +68,7 @@ VISU_ScalarMapOnDeformedShapePL myScalarsFieldTransform = VISU_FieldTransform::New(); myCellDataToPointData = vtkCellDataToPointData::New(); + myScalarsElnoDisassembleFilter = VISU_ElnoDisassembleFilter::New(); } //---------------------------------------------------------------------------- @@ -74,8 +76,8 @@ VISU_ScalarMapOnDeformedShapePL * Destructor. * Delete all fields. */ -VISU_ScalarMapOnDeformedShapePL -::~VISU_ScalarMapOnDeformedShapePL() +VISU_DeformedShapeAndScalarMapPL +::~VISU_DeformedShapeAndScalarMapPL() { myWarpVector->Delete(); @@ -93,7 +95,7 @@ VISU_ScalarMapOnDeformedShapePL * Initial method */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::Init() { Superclass::Init(); @@ -107,7 +109,7 @@ VISU_ScalarMapOnDeformedShapePL * Building of deformation and puts result to merge filter. */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::Build() { Superclass::Build(); @@ -116,7 +118,7 @@ VISU_ScalarMapOnDeformedShapePL //---------------------------------------------------------------------------- vtkDataSet* -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::InsertCustomPL() { GetMapper()->SetColorModeToMapScalars(); @@ -149,7 +151,7 @@ VISU_ScalarMapOnDeformedShapePL * Update method */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::Update() { Superclass::Update(); @@ -169,7 +171,7 @@ VISU_ScalarMapOnDeformedShapePL //---------------------------------------------------------------------------- unsigned long int -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::GetMemorySize() { unsigned long int aSize = Superclass::GetMemorySize(); @@ -196,13 +198,14 @@ VISU_ScalarMapOnDeformedShapePL * Put scalars to merge filter. */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::UpdateScalars() { vtkDataSet* aScalars = GetScalars(); - myScalarsExtractor->SetInput(aScalars); + myScalarsElnoDisassembleFilter->SetInput(aScalars); + myScalarsExtractor->SetInput(myScalarsElnoDisassembleFilter->GetOutput()); - if(VISU::IsDataOnCells(aScalars)) + if(VISU::IsDataOnCells(myScalarsElnoDisassembleFilter->GetOutput())) GetMapper()->SetScalarModeToUseCellData(); else GetMapper()->SetScalarModeToUsePointData(); @@ -214,13 +217,13 @@ VISU_ScalarMapOnDeformedShapePL * Copy scale and scalars. */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::DoShallowCopy(VISU_PipeLine *thePipeLine, bool theIsCopyInput) { Superclass::DoShallowCopy(thePipeLine, theIsCopyInput); - if(VISU_ScalarMapOnDeformedShapePL *aPipeLine = dynamic_cast(thePipeLine)){ + if(VISU_DeformedShapeAndScalarMapPL *aPipeLine = dynamic_cast(thePipeLine)){ SetScale(aPipeLine->GetScale()); SetScalars(aPipeLine->GetScalars()); } @@ -232,12 +235,12 @@ VISU_ScalarMapOnDeformedShapePL * Sets vtkDataSet with scalars values to VISU_Extractor filter for scalars extraction. */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::SetScalars(vtkDataSet *theScalars) { if(GetScalars() == theScalars) return; - + myScalars = theScalars; UpdateScalars(); } @@ -247,7 +250,7 @@ VISU_ScalarMapOnDeformedShapePL * Get pointer to input scalars. */ vtkDataSet* -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::GetScalars() { return myScalars.GetPointer(); @@ -258,14 +261,14 @@ VISU_ScalarMapOnDeformedShapePL * Sets scale for deformed shape */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::SetScale(vtkFloatingPointType theScale) { if(VISU::CheckIsSameValue(myScaleFactor, theScale)) return; - myWarpVector->SetScaleFactor(theScale); myScaleFactor = theScale; + myWarpVector->SetScaleFactor(theScale*myMapScaleFactor); } //---------------------------------------------------------------------------- @@ -273,10 +276,10 @@ VISU_ScalarMapOnDeformedShapePL * Gets scale of deformed shape. */ vtkFloatingPointType -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::GetScale() { - return myWarpVector->GetScaleFactor(); + return myScaleFactor; } //---------------------------------------------------------------------------- @@ -284,9 +287,10 @@ VISU_ScalarMapOnDeformedShapePL * Set scale factor of deformation. */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::SetMapScale(vtkFloatingPointType theMapScale) { + myMapScaleFactor = theMapScale; Superclass::SetMapScale(theMapScale); myWarpVector->SetScaleFactor(myScaleFactor*theMapScale); } @@ -296,7 +300,7 @@ VISU_ScalarMapOnDeformedShapePL * Gets scalar mode. */ int -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::GetScalarMode() { return myScalarsExtractor->GetScalarMode(); @@ -307,7 +311,7 @@ VISU_ScalarMapOnDeformedShapePL * Sets scalar mode. */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::SetScalarMode(int theScalarMode) { VISU_ScalarMapPL::SetScalarMode(theScalarMode, GetScalars(), myScalarsExtractor); @@ -315,7 +319,7 @@ VISU_ScalarMapOnDeformedShapePL //---------------------------------------------------------------------------- void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::SetScaling(int theScaling) { if(GetScaling() == theScaling) @@ -332,7 +336,7 @@ VISU_ScalarMapOnDeformedShapePL //---------------------------------------------------------------------------- void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::SetScalarRange(vtkFloatingPointType theRange[2]) { if(VISU::CheckIsSameRange(theRange, GetScalarRange())) @@ -345,7 +349,7 @@ VISU_ScalarMapOnDeformedShapePL //---------------------------------------------------------------------------- vtkFloatingPointType* -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::GetScalarRange() { return myScalarsFieldTransform->GetScalarRange(); @@ -360,7 +364,7 @@ VISU_ScalarMapOnDeformedShapePL * \li theRange[1] - maximum value */ void -VISU_ScalarMapOnDeformedShapePL +VISU_DeformedShapeAndScalarMapPL ::GetSourceRange(vtkFloatingPointType theRange[2]) { myScalarsExtractor->Update(); diff --git a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.hxx b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.hxx similarity index 81% rename from src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.hxx rename to src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.hxx index 041a37d2..b3d454a2 100644 --- a/src/PIPELINE/VISU_ScalarMapOnDeformedShapePL.hxx +++ b/src/PIPELINE/VISU_DeformedShapeAndScalarMapPL.hxx @@ -20,12 +20,12 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // -// File: VISU_ScalarMapOnDeformedShapePL.hxx +// File: VISU_DeformedShapeAndScalarMapPL.hxx // Author: Eugeny Nikolaev // Module : VISU -#ifndef VISU_ScalarMapOnDeformedShapePL_HeaderFile -#define VISU_ScalarMapOnDeformedShapePL_HeaderFile +#ifndef VISU_DeformedShapeAndScalarMapPL_HeaderFile +#define VISU_DeformedShapeAndScalarMapPL_HeaderFile #include "VISUPipeline.hxx" #include "VISU_ScalarMapPL.hxx" @@ -35,16 +35,17 @@ class vtkWarpVector; class vtkUnstructuredGrid; class vtkCellDataToPointData; class vtkPointDataToCellData; +class VISU_ElnoDisassembleFilter; //---------------------------------------------------------------------------- -class VISU_PIPELINE_EXPORT VISU_ScalarMapOnDeformedShapePL : public VISU_ScalarMapPL +class VISU_PIPELINE_EXPORT VISU_DeformedShapeAndScalarMapPL : public VISU_ScalarMapPL { public: - vtkTypeMacro(VISU_ScalarMapOnDeformedShapePL, VISU_ScalarMapPL); + vtkTypeMacro(VISU_DeformedShapeAndScalarMapPL, VISU_ScalarMapPL); static - VISU_ScalarMapOnDeformedShapePL* + VISU_DeformedShapeAndScalarMapPL* New(); virtual @@ -117,10 +118,10 @@ public: SetMapScale(vtkFloatingPointType theMapScale = 1.0); protected: - VISU_ScalarMapOnDeformedShapePL(); + VISU_DeformedShapeAndScalarMapPL(); virtual - ~VISU_ScalarMapOnDeformedShapePL(); + ~VISU_DeformedShapeAndScalarMapPL(); virtual vtkDataSet* @@ -132,15 +133,17 @@ protected: bool theIsCopyInput); private: - VISU_ScalarMapOnDeformedShapePL(const VISU_ScalarMapOnDeformedShapePL&); + VISU_DeformedShapeAndScalarMapPL(const VISU_DeformedShapeAndScalarMapPL&); vtkFloatingPointType myScaleFactor; + vtkFloatingPointType myMapScaleFactor; vtkWarpVector *myWarpVector; VISU_MergeFilter *myScalarsMergeFilter; vtkSmartPointer myScalars; vtkCellDataToPointData* myCellDataToPointData; VISU_FieldTransform* myScalarsFieldTransform; VISU_Extractor* myScalarsExtractor; + VISU_ElnoDisassembleFilter* myScalarsElnoDisassembleFilter; }; #endif diff --git a/src/PIPELINE/VISU_DeformedShapePL.cxx b/src/PIPELINE/VISU_DeformedShapePL.cxx index 6631af08..2a7f2c6a 100644 --- a/src/PIPELINE/VISU_DeformedShapePL.cxx +++ b/src/PIPELINE/VISU_DeformedShapePL.cxx @@ -39,7 +39,8 @@ vtkStandardNewMacro(VISU_DeformedShapePL); //---------------------------------------------------------------------------- VISU_DeformedShapePL ::VISU_DeformedShapePL(): - myScaleFactor(0.0) + myScaleFactor(0.0), + myMapScaleFactor(1.0) { SetIsShrinkable(true); @@ -139,8 +140,8 @@ VISU_DeformedShapePL { if(VISU::CheckIsSameValue(myWarpVector->GetScaleFactor(), theScale)) return; - - myWarpVector->SetScaleFactor(theScale); + + myWarpVector->SetScaleFactor(theScale*myMapScaleFactor); myScaleFactor = theScale; } @@ -215,9 +216,14 @@ void VISU_DeformedShapePL ::SetMapScale(vtkFloatingPointType theMapScale) { + myMapScaleFactor = theMapScale; Superclass::SetMapScale(theMapScale); - myWarpVector->SetScaleFactor(myScaleFactor*theMapScale); + vtkFloatingPointType aMapScale = myScaleFactor * theMapScale; + if(VISU::CheckIsSameValue(myWarpVector->GetScaleFactor(), aMapScale)) + return; + + myWarpVector->SetScaleFactor( aMapScale ); } diff --git a/src/PIPELINE/VISU_DeformedShapePL.hxx b/src/PIPELINE/VISU_DeformedShapePL.hxx index 6011e501..b3283bea 100644 --- a/src/PIPELINE/VISU_DeformedShapePL.hxx +++ b/src/PIPELINE/VISU_DeformedShapePL.hxx @@ -99,6 +99,7 @@ protected: bool theIsCopyInput); vtkFloatingPointType myScaleFactor; + vtkFloatingPointType myMapScaleFactor; vtkWarpVector *myWarpVector; vtkCellDataToPointData* myCellDataToPointData; diff --git a/src/PIPELINE/VISU_ElnoAssembleFilter.cxx b/src/PIPELINE/VISU_ElnoAssembleFilter.cxx new file mode 100644 index 00000000..be843ed3 --- /dev/null +++ b/src/PIPELINE/VISU_ElnoAssembleFilter.cxx @@ -0,0 +1,171 @@ +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 + +#include "VISU_ElnoAssembleFilter.hxx" +#include "VISU_PipeLineUtils.hxx" +#include "VISU_ElnoMeshValue.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include + + +//---------------------------------------------------------------------------- +vtkStandardNewMacro( VISU_ElnoAssembleFilter ); + + +//---------------------------------------------------------------------------- +VISU_ElnoAssembleFilter::VISU_ElnoAssembleFilter() +{ + this->SetInputArrayToProcess( 0, // idx + 0, // port + 0, // connection + vtkDataObject::FIELD_ASSOCIATION_POINTS, // field association + "ELNO_POINT_COORDS" ); // name + + this->myIsRestorePoints = false; +} + + +//---------------------------------------------------------------------------- +VISU_ElnoAssembleFilter::~VISU_ElnoAssembleFilter() +{} + + +//---------------------------------------------------------------------------- +void VISU_ElnoAssembleFilter::SetElnoAssembleState( bool theIsRestorePoints ) +{ + if ( myIsRestorePoints == theIsRestorePoints ) + return; + + myIsRestorePoints = theIsRestorePoints; + this->Modified(); +} + +//---------------------------------------------------------------------------- +namespace +{ + //---------------------------------------------------------------------------- + template < int points_type, int elno_type > + int Execute2( vtkPointSet *theInput, + vtkPointSet *theOutput, + vtkDataArray *theElnoPointCoords ) + { + theOutput->CopyStructure( theInput ); + + vtkCellData *aCellData = theOutput->GetCellData(); + aCellData->PassData( theInput->GetCellData() ); + + vtkPointData *aPointData = theOutput->GetPointData(); + aPointData->PassData( theInput->GetPointData() ); + + vtkPoints *anInputPoints = theInput->GetPoints(); + vtkPoints *aPoints = anInputPoints->New( elno_type ); + vtkIdType aNbPoints = theInput->GetNumberOfPoints(); + aPoints->SetNumberOfPoints( aNbPoints ); + + typedef typename VISU::TL::TEnum2VTKArrayType< elno_type >::TResult TPointsDataArray; + typedef typename VISU::TL::TEnum2VTKBasicType< elno_type >::TResult TPointsDataType; + TPointsDataArray* anOutputPointsArray = TPointsDataArray::SafeDownCast( aPoints->GetData() ); + + TPointsDataArray* anElnoPointCoords = TPointsDataArray::SafeDownCast( theElnoPointCoords ); + + for ( vtkIdType aPointId = 0; aPointId < aNbPoints; aPointId++ ) { + TPointsDataType aCoords[ 3 ]; + anElnoPointCoords->GetTupleValue( aPointId, aCoords ); + anOutputPointsArray->SetTupleValue( aPointId, aCoords ); + } + + theOutput->SetPoints( aPoints ); + + return 1; + } + + + //---------------------------------------------------------------------------- + template < int points_type > + int Execute( vtkPointSet *theInput, + vtkPointSet *theOutput, + vtkDataArray *theElnoPointCoords ) + { + switch( theElnoPointCoords->GetDataType() ){ + case VTK_DOUBLE: + return Execute2< points_type, VTK_DOUBLE >( theInput, theOutput, theElnoPointCoords ); + case VTK_FLOAT: + return Execute2< points_type, VTK_FLOAT >( theInput, theOutput, theElnoPointCoords ); + case VTK_INT: + return Execute2< points_type, VTK_INT >( theInput, theOutput, theElnoPointCoords ); + case VTK_LONG: + return Execute2< points_type, VTK_LONG >( theInput, theOutput, theElnoPointCoords ); + default: + break; + } + + return 0; + } + + + //---------------------------------------------------------------------------- +} + + +//---------------------------------------------------------------------------- +int VISU_ElnoAssembleFilter::RequestData( vtkInformation *vtkNotUsed(request), + vtkInformationVector **inputVector, + vtkInformationVector *outputVector ) +{ + // get the info objects + vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation *outInfo = outputVector->GetInformationObject(0); + + // get the input and ouptut + vtkPointSet *anInput = vtkPointSet::SafeDownCast( inInfo->Get( vtkDataObject::DATA_OBJECT() ) ); + vtkPointSet *anOutput = vtkPointSet::SafeDownCast( outInfo->Get( vtkDataObject::DATA_OBJECT() ) ); + + vtkDataArray *anElnoPointCoords = this->GetInputArrayToProcess( 0, inputVector ); + + if ( !myIsRestorePoints || !anElnoPointCoords ) { + anOutput->ShallowCopy( anInput ); + return 1; + } + + vtkPoints *aPoints = anInput->GetPoints(); + switch( aPoints->GetDataType() ){ + case VTK_DOUBLE: + return ::Execute< VTK_DOUBLE >( anInput, anOutput, anElnoPointCoords ); + case VTK_FLOAT: + return ::Execute< VTK_FLOAT >( anInput, anOutput, anElnoPointCoords ); + case VTK_INT: + return ::Execute< VTK_INT >( anInput, anOutput, anElnoPointCoords ); + case VTK_LONG: + return ::Execute< VTK_LONG >( anInput, anOutput, anElnoPointCoords ); + default: + break; + } + + return 0; +} + + +//---------------------------------------------------------------------------- diff --git a/src/PIPELINE/VISU_ElnoAssembleFilter.hxx b/src/PIPELINE/VISU_ElnoAssembleFilter.hxx new file mode 100644 index 00000000..8f586c66 --- /dev/null +++ b/src/PIPELINE/VISU_ElnoAssembleFilter.hxx @@ -0,0 +1,47 @@ +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 + +#ifndef VISU_ElnoAssembleFilter_H +#define VISU_ElnoAssembleFilter_H + +#include + +class VISU_ElnoAssembleFilter : public vtkPointSetAlgorithm +{ +public: + typedef vtkPointSetAlgorithm Superclass; + + static VISU_ElnoAssembleFilter *New(); + + void SetElnoAssembleState( bool theIsRestorePoints ); + +protected: + VISU_ElnoAssembleFilter(); + ~VISU_ElnoAssembleFilter(); + + int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *); + + bool myIsRestorePoints; + +private: + VISU_ElnoAssembleFilter(const VISU_ElnoAssembleFilter&); // Not implemented. + void operator=(const VISU_ElnoAssembleFilter&); // Not implemented. +}; + +#endif diff --git a/src/PIPELINE/VISU_ElnoDisassembleFilter.cxx b/src/PIPELINE/VISU_ElnoDisassembleFilter.cxx new file mode 100644 index 00000000..eb84ca41 --- /dev/null +++ b/src/PIPELINE/VISU_ElnoDisassembleFilter.cxx @@ -0,0 +1,400 @@ +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 + +#include "VISU_ElnoDisassembleFilter.hxx" +#include "VISU_PipeLineUtils.hxx" +#include "VISU_ElnoMeshValue.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include + + +//---------------------------------------------------------------------------- +vtkStandardNewMacro( VISU_ElnoDisassembleFilter ); + + +//---------------------------------------------------------------------------- +VISU_ElnoDisassembleFilter::VISU_ElnoDisassembleFilter() +{ + this->SetInputArrayToProcess( 0, // idx + 0, // port + 0, // connection + vtkDataObject::FIELD_ASSOCIATION_CELLS, // field association + "ELNO_FIELD" ); // name + + this->SetInputArrayToProcess( 1, // idx + 0, // port + 0, // connection + vtkDataObject::FIELD_ASSOCIATION_CELLS, // field association + "ELNO_COMPONENT_MAPPER" ); // name + + this->myShrinkFactor = -0.999; +} + + +//---------------------------------------------------------------------------- +VISU_ElnoDisassembleFilter::~VISU_ElnoDisassembleFilter() +{} + + +//---------------------------------------------------------------------------- +void VISU_ElnoDisassembleFilter::SetShrinkFactor( vtkFloatingPointType theValue ) +{ + if ( VISU::CheckIsSameValue( theValue, myShrinkFactor ) ) + return; + + myShrinkFactor = theValue; + this->Modified(); +} + + +//---------------------------------------------------------------------------- +vtkFloatingPointType VISU_ElnoDisassembleFilter::GetShrinkFactor() +{ + return myShrinkFactor; +} + + +//---------------------------------------------------------------------------- +namespace +{ + //---------------------------------------------------------------------------- + template < int points_type, int elno_type > + struct TExecute2 + { + vtkUnstructuredGrid *myInput; + vtkUnstructuredGrid *myOutput; + vtkDataArray *myElnoDataArray; + vtkDataArray *myElnoDataMapper; + vtkFloatingPointType myShrinkFactor; + + typedef typename VISU::TL::TEnum2VTKArrayType< points_type >::TResult TPointsDataArray; + typedef typename VISU::TL::TEnum2VTKBasicType< points_type >::TResult TPointsDataType; + + typedef typename VISU::TL::TEnum2VTKArrayType< elno_type >::TResult TElnoDataArray; + typedef typename VISU::TL::TEnum2VTKBasicType< elno_type >::TResult TElnoDataType; + + VISU::TGetElnoNodeData< elno_type > myGetElnoNodeData; + vtkCellArray *myConnectivity; + vtkPointData *myInputPointData; + vtkPointData *myOutputPointData; + TPointsDataArray *myInputPointsArray; + TPointsDataArray *myOutputPointsArray; + TElnoDataArray* myElnoFullDataArray; + TElnoDataArray* myElnoPartialDataArray; + TPointsDataArray *myElnoPointCoords; + vtkIntArray* myInputPointsMapper; + vtkIntArray* myOutputPointsMapper; + + //---------------------------------------------------------------------------- + TExecute2( vtkUnstructuredGrid *theInput, + vtkUnstructuredGrid *theOutput, + vtkDataArray *theElnoDataArray, + vtkDataArray *theElnoDataMapper, + vtkFloatingPointType theShrinkFactor ) + : myGetElnoNodeData( theElnoDataArray, theElnoDataMapper ) + , myInput( theInput ) + , myOutput( theOutput ) + , myElnoDataArray( theElnoDataArray ) + , myElnoDataMapper( theElnoDataMapper ) + , myShrinkFactor( theShrinkFactor ) + { + myConnectivity = vtkCellArray::New(); + myConnectivity->DeepCopy( theInput->GetCells() ); + + vtkPoints *anInputPoints = theInput->GetPoints(); + vtkPoints *aPoints = anInputPoints->New( anInputPoints->GetDataType() ); + vtkIdType aNbCells = myConnectivity->GetNumberOfCells(); + vtkIdType aNbPoints = myConnectivity->GetNumberOfConnectivityEntries() - aNbCells; + aPoints->Allocate( aNbPoints ); + + myInputPointsArray = TPointsDataArray::SafeDownCast( anInputPoints->GetData() ); + myOutputPointsArray = TPointsDataArray::SafeDownCast( aPoints->GetData() ); + + myInputPointData = theInput->GetPointData(); + myOutputPointData = theOutput->GetPointData(); + myOutputPointData->Allocate( aNbPoints ); + + vtkCellData *anInputCellData = theInput->GetCellData(); + + // To create a new copy of initial data for output + myElnoFullDataArray = TElnoDataArray::New(); + myElnoFullDataArray->SetName( "VISU_FIELD" ); + myElnoFullDataArray->SetNumberOfComponents( myGetElnoNodeData.getNbComp() ); + myElnoFullDataArray->SetNumberOfTuples( aNbPoints ); + + // To create a new copy of partial initial data for output + myElnoPartialDataArray = TElnoDataArray::New(); + // This partial data can be represented as in terms of vectors as scalars + if ( anInputCellData->GetVectors() != NULL ) + myElnoPartialDataArray->SetNumberOfComponents( 3 ); + else + myElnoPartialDataArray->SetNumberOfComponents( 1 ); + myElnoPartialDataArray->SetNumberOfTuples( aNbPoints ); + + myElnoPointCoords = TPointsDataArray::New(); + myElnoPointCoords->SetName( "ELNO_POINT_COORDS" ); + myElnoPointCoords->SetNumberOfComponents( 3 ); + myElnoPointCoords->SetNumberOfTuples( aNbPoints ); + + vtkDataArray* anArray = myInputPointData->GetArray( "VISU_POINTS_MAPPER" ); + myInputPointsMapper = vtkIntArray::SafeDownCast( anArray ); + + myOutputPointsMapper = vtkIntArray::New(); + myOutputPointsMapper->SetName( myInputPointsMapper->GetName() ); + myOutputPointsMapper->SetNumberOfComponents( myInputPointsMapper->GetNumberOfComponents() ); + myOutputPointsMapper->SetNumberOfTuples( aNbPoints ); + + if ( theShrinkFactor > 0.0 ) + this->ShrinkExecute(); + else + this->SimpleExecute(); + + theOutput->SetPoints( aPoints ); + + theOutput->SetCells( theInput->GetCellTypesArray(), + theInput->GetCellLocationsArray(), + myConnectivity ); + + myConnectivity->Delete(); + + vtkCellData *anOutputCellData = theOutput->GetCellData(); + anOutputCellData->PassData( anInputCellData ); + + anOutputCellData->RemoveArray( "ELNO_COMPONENT_MAPPER" ); + anOutputCellData->RemoveArray( "ELNO_FIELD" ); + anOutputCellData->RemoveArray( "VISU_FIELD" ); + anOutputCellData->SetVectors( NULL ); + + //anOutputPointData->PassData( anInputPointData ); + + myOutputPointData->AddArray( myElnoFullDataArray ); + myElnoFullDataArray->Delete(); + + if ( anInputCellData->GetVectors() != NULL ) + myOutputPointData->SetVectors( myElnoPartialDataArray ); + else + myOutputPointData->SetScalars( myElnoPartialDataArray ); + myElnoPartialDataArray->Delete(); + + myOutputPointData->AddArray( myElnoPointCoords ); + myElnoPointCoords->Delete(); + + myOutputPointData->AddArray( myOutputPointsMapper ); + myOutputPointsMapper->Delete(); + } + + //---------------------------------------------------------------------------- + void SimpleExecute() + { + // To reserve a temproary value holder + vtkIdType aNbComp = std::max( 3, myGetElnoNodeData.getNbComp() ); + std::vector< TElnoDataType > anElnoDataValues( aNbComp ); + + std::vector< int > anPointsMapperValues( myInputPointsMapper->GetNumberOfComponents() ); + + myConnectivity->InitTraversal(); + vtkIdType aNbPts = 0, *aPts = 0; + for ( vtkIdType aCellId = 0; myConnectivity->GetNextCell( aNbPts, aPts ); aCellId++ ) { + for ( vtkIdType aPntId = 0; aPntId < aNbPts; aPntId++ ) { + TPointsDataType aCoords[ 3 ]; + vtkIdType aCurrentPntId = aPts[ aPntId ]; + myInputPointsArray->GetTupleValue( aCurrentPntId, aCoords ); + + aPts[ aPntId ] = myOutputPointsArray->InsertNextTupleValue( aCoords ); + vtkIdType aNewPntId = aPts[ aPntId ]; + + myElnoPointCoords->SetTupleValue( aNewPntId, aCoords ); + + myOutputPointData->CopyData( myInputPointData, aCurrentPntId, aNewPntId ); + + TElnoDataType* anElnoData = myGetElnoNodeData( aCellId, aPntId ); + myElnoFullDataArray->SetTupleValue( aNewPntId, anElnoData ); + + myElnoFullDataArray->GetTupleValue( aNewPntId, &anElnoDataValues[ 0 ] ); + myElnoPartialDataArray->SetTupleValue( aNewPntId, &anElnoDataValues[ 0 ] ); + + myInputPointsMapper->GetTupleValue( aCurrentPntId, &anPointsMapperValues[ 0 ] ); + myOutputPointsMapper->SetTupleValue( aNewPntId, &anPointsMapperValues[ 0 ] ); + } + } + } + + //---------------------------------------------------------------------------- + void ShrinkExecute() + { + // To reserve a temproary value holder + vtkIdType aNbComp = std::max( 3, myGetElnoNodeData.getNbComp() ); + std::vector< TElnoDataType > anElnoDataValues( aNbComp ); + + std::vector< int > anPointsMapperValues( myInputPointsMapper->GetNumberOfComponents() ); + + myConnectivity->InitTraversal(); + vtkIdType aNbPts = 0, *aPts = 0; + for ( vtkIdType aCellId = 0; myConnectivity->GetNextCell( aNbPts, aPts ); aCellId++ ) { + + TPointsDataType aCenter[ 3 ] = { TPointsDataType(), TPointsDataType(), TPointsDataType() }; + + for ( vtkIdType aPntId = 0; aPntId < aNbPts; aPntId++ ) { + TPointsDataType aCoords[ 3 ]; + myInputPointsArray->GetTupleValue( aPts[ aPntId ], aCoords ); + + aCenter[ 0 ] += aCoords[ 0 ]; + aCenter[ 1 ] += aCoords[ 1 ]; + aCenter[ 2 ] += aCoords[ 2 ]; + } + + aCenter[ 0 ] /= aNbPts; + aCenter[ 1 ] /= aNbPts; + aCenter[ 2 ] /= aNbPts; + + for ( vtkIdType aPntId = 0; aPntId < aNbPts; aPntId++ ) { + TPointsDataType aCoords[ 3 ]; + vtkIdType aCurrentPntId = aPts[ aPntId ]; + myInputPointsArray->GetTupleValue( aCurrentPntId, aCoords ); + + TPointsDataType aNewCoords[ 3 ]; + + aNewCoords[ 0 ] = aCenter[ 0 ] + + TPointsDataType( myShrinkFactor * ( aCoords[ 0 ] - aCenter[ 0 ] ) ); + aNewCoords[ 1 ] = aCenter[ 1 ] + + TPointsDataType( myShrinkFactor * ( aCoords[ 1 ] - aCenter[ 1 ] ) ); + aNewCoords[ 2 ] = aCenter[ 2 ] + + TPointsDataType( myShrinkFactor * ( aCoords[ 2 ] - aCenter[ 2 ] ) ); + + aPts[ aPntId ] = myOutputPointsArray->InsertNextTupleValue( aNewCoords ); + vtkIdType aNewPntId = aPts[ aPntId ]; + + myElnoPointCoords->SetTupleValue( aNewPntId, aCoords ); + + myOutputPointData->CopyData( myInputPointData, aCurrentPntId, aNewPntId ); + + TElnoDataType* anElnoData = myGetElnoNodeData( aCellId, aPntId ); + myElnoFullDataArray->SetTupleValue( aNewPntId, anElnoData ); + + myElnoFullDataArray->GetTupleValue( aNewPntId, &anElnoDataValues[ 0 ] ); + myElnoPartialDataArray->SetTupleValue( aNewPntId, &anElnoDataValues[ 0 ] ); + + myInputPointsMapper->GetTupleValue( aCurrentPntId, &anPointsMapperValues[ 0 ] ); + myOutputPointsMapper->SetTupleValue( aNewPntId, &anPointsMapperValues[ 0 ] ); + } + } + } + }; + + + //---------------------------------------------------------------------------- + template < int points_type, int elno_type > + int Execute2( vtkUnstructuredGrid *theInput, + vtkUnstructuredGrid *theOutput, + vtkDataArray *theElnoDataArray, + vtkDataArray *theElnoDataMapper, + vtkFloatingPointType theShrinkFactor ) + { + TExecute2< points_type, elno_type >( theInput, + theOutput, + theElnoDataArray, + theElnoDataMapper, + theShrinkFactor ); + + return 1; + } + + + //---------------------------------------------------------------------------- + template < int points_type > + int Execute( vtkUnstructuredGrid *theInput, + vtkUnstructuredGrid *theOutput, + vtkDataArray *theElnoDataArray, + vtkDataArray *theElnoDataMapper, + vtkFloatingPointType theShrinkFactor ) + { + switch( theElnoDataArray->GetDataType() ){ + case VTK_DOUBLE: + return Execute2< points_type, VTK_DOUBLE > + ( theInput, theOutput, theElnoDataArray, theElnoDataMapper, theShrinkFactor ); + case VTK_FLOAT: + return Execute2< points_type, VTK_FLOAT > + ( theInput, theOutput, theElnoDataArray, theElnoDataMapper, theShrinkFactor ); + case VTK_INT: + return Execute2< points_type, VTK_INT > + ( theInput, theOutput, theElnoDataArray, theElnoDataMapper, theShrinkFactor ); + case VTK_LONG: + return Execute2< points_type, VTK_LONG > + ( theInput, theOutput, theElnoDataArray, theElnoDataMapper, theShrinkFactor ); + default: + break; + } + + return 0; + } + + + //---------------------------------------------------------------------------- +} + + +//---------------------------------------------------------------------------- +int VISU_ElnoDisassembleFilter::RequestData( vtkInformation *vtkNotUsed(request), + vtkInformationVector **inputVector, + vtkInformationVector *outputVector ) +{ + // get the info objects + vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation *outInfo = outputVector->GetInformationObject(0); + + // get the input and ouptut + vtkUnstructuredGrid *anInput = + vtkUnstructuredGrid::SafeDownCast( inInfo->Get( vtkDataObject::DATA_OBJECT() ) ); + vtkUnstructuredGrid *anOutput = + vtkUnstructuredGrid::SafeDownCast( outInfo->Get( vtkDataObject::DATA_OBJECT() ) ); + + vtkDataArray *anElnoDataArray = this->GetInputArrayToProcess( 0, inputVector ); + vtkDataArray *anElnoDataMapper = this->GetInputArrayToProcess( 1, inputVector ); + + if ( !anElnoDataArray ) { + anOutput->ShallowCopy( anInput ); + return 1; + } + + vtkPoints *aPoints = anInput->GetPoints(); + switch( aPoints->GetDataType() ){ + case VTK_DOUBLE: + return ::Execute< VTK_DOUBLE >( anInput, anOutput, anElnoDataArray, anElnoDataMapper, myShrinkFactor ); + case VTK_FLOAT: + return ::Execute< VTK_FLOAT >( anInput, anOutput, anElnoDataArray, anElnoDataMapper, myShrinkFactor ); + case VTK_INT: + return ::Execute< VTK_INT >( anInput, anOutput, anElnoDataArray, anElnoDataMapper, myShrinkFactor ); + case VTK_LONG: + return ::Execute< VTK_LONG >( anInput, anOutput, anElnoDataArray, anElnoDataMapper, myShrinkFactor ); + default: + break; + } + + return 0; +} + + +//---------------------------------------------------------------------------- diff --git a/src/PIPELINE/VISU_ElnoDisassembleFilter.hxx b/src/PIPELINE/VISU_ElnoDisassembleFilter.hxx new file mode 100644 index 00000000..0053c13e --- /dev/null +++ b/src/PIPELINE/VISU_ElnoDisassembleFilter.hxx @@ -0,0 +1,48 @@ +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 + +#ifndef VISU_ElnoDisassembleFilter_H +#define VISU_ElnoDisassembleFilter_H + +#include + +class VISU_ElnoDisassembleFilter : public vtkUnstructuredGridAlgorithm +{ +public: + typedef vtkUnstructuredGridAlgorithm Superclass; + + static VISU_ElnoDisassembleFilter *New(); + + void SetShrinkFactor( vtkFloatingPointType theValue ); + vtkFloatingPointType GetShrinkFactor(); + +protected: + VISU_ElnoDisassembleFilter(); + ~VISU_ElnoDisassembleFilter(); + + int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *); + + vtkFloatingPointType myShrinkFactor; + +private: + VISU_ElnoDisassembleFilter(const VISU_ElnoDisassembleFilter&); // Not implemented. + void operator=(const VISU_ElnoDisassembleFilter&); // Not implemented. +}; + +#endif diff --git a/src/PIPELINE/VISU_Extractor.cxx b/src/PIPELINE/VISU_Extractor.cxx index e44145e3..eb078e3a 100644 --- a/src/PIPELINE/VISU_Extractor.cxx +++ b/src/PIPELINE/VISU_Extractor.cxx @@ -168,27 +168,27 @@ VISU_Extractor vtkInformationVector **theInputVector, vtkInformationVector *theOutputVector) { - vtkDataSet *anInput = VISU::GetInput(theInputVector, 0); - vtkDataSet *anOutput = VISU::GetOutput(theOutputVector); + vtkDataSet *anInput = VISU::GetInput( theInputVector, 0 ); + vtkDataSet *anOutput = VISU::GetOutput( theOutputVector ); - anOutput->CopyStructure(anInput); + anOutput->CopyStructure( anInput ); vtkPointData *anInputPointData = anInput->GetPointData(); vtkPointData *anOutputPointData = anOutput->GetPointData(); - anOutputPointData->PassData(anInputPointData); - if(VISU::IsDataOnPoints(anInput)){ + anOutputPointData->PassData( anInputPointData ); + if ( VISU::IsDataOnPoints( anInput ) ) { int aNbElems = anInput->GetNumberOfPoints(); - if(anInputPointData->GetAttribute(vtkDataSetAttributes::VECTORS)) - ExecuteScalars(aNbElems, myScalarMode, anInputPointData, anOutputPointData); + if ( anInputPointData->GetAttribute( vtkDataSetAttributes::VECTORS ) ) + ExecuteScalars( aNbElems, myScalarMode, anInputPointData, anOutputPointData ); } vtkCellData *anInputCellData = anInput->GetCellData(); vtkCellData *anOutputCellData = anOutput->GetCellData(); - anOutputCellData->PassData(anInputCellData); - if(VISU::IsDataOnCells(anInput)){ + anOutputCellData->PassData( anInputCellData ); + if ( VISU::IsDataOnCells( anInput ) ) { int aNbElems = anInput->GetNumberOfCells(); - if(anInputCellData->GetAttribute(vtkDataSetAttributes::VECTORS)) - ExecuteScalars(aNbElems, myScalarMode, anInputCellData, anOutputCellData); + if ( anInputCellData->GetAttribute( vtkDataSetAttributes::VECTORS ) ) + ExecuteScalars( aNbElems, myScalarMode, anInputCellData, anOutputCellData ); } return 1; diff --git a/src/PIPELINE/VISU_IsoSurfacesPL.cxx b/src/PIPELINE/VISU_IsoSurfacesPL.cxx index bea9854f..88359963 100644 --- a/src/PIPELINE/VISU_IsoSurfacesPL.cxx +++ b/src/PIPELINE/VISU_IsoSurfacesPL.cxx @@ -30,10 +30,12 @@ #include "VISU_LookupTable.hxx" #include "VISU_PipeLineUtils.hxx" +#include "VISU_LabelPointsFilter.hxx" #include + //---------------------------------------------------------------------------- vtkStandardNewMacro(VISU_IsoSurfacesPL); @@ -44,6 +46,8 @@ VISU_IsoSurfacesPL { SetIsShrinkable(false); + SetElnoDisassembleState( true ); + myContourFilter = vtkContourFilter::New(); myCellDataToPointData = vtkCellDataToPointData::New(); @@ -100,6 +104,14 @@ VISU_IsoSurfacesPL return myContourFilter->GetNumberOfContours(); } +//---------------------------------------------------------------------------- +vtkFloatingPointType +VISU_IsoSurfacesPL +::GetValue(int i) +{ + return myContourFilter->GetValue(i); +} + //---------------------------------------------------------------------------- void @@ -181,6 +193,7 @@ VISU_IsoSurfacesPL VISU::CellDataToPoint(myContourFilter, myCellDataToPointData, GetMergedInput()); + } diff --git a/src/PIPELINE/VISU_IsoSurfacesPL.hxx b/src/PIPELINE/VISU_IsoSurfacesPL.hxx index 83a646dd..73aec61e 100644 --- a/src/PIPELINE/VISU_IsoSurfacesPL.hxx +++ b/src/PIPELINE/VISU_IsoSurfacesPL.hxx @@ -53,6 +53,8 @@ public: int GetNbParts(); + virtual vtkFloatingPointType GetValue(int i); + virtual void SetNbParts(int theNb = 10); diff --git a/src/PIPELINE/VISU_LabelPointsFilter.cxx b/src/PIPELINE/VISU_LabelPointsFilter.cxx new file mode 100644 index 00000000..040d6a23 --- /dev/null +++ b/src/PIPELINE/VISU_LabelPointsFilter.cxx @@ -0,0 +1,296 @@ +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// +// File: VISU_LabelPointsFilter.cxx +// Author: Vitaly Smetannikov +// Module : VISU + + + +#include "VISU_LabelPointsFilter.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + + +#define CONTAINS(SET, PT) (SET.find(PT) != SET.end()) + +struct ltIdType +{ + bool operator()(const vtkIdType a1, const vtkIdType a2) const + { + return a1 < a2; + } +}; + + + +//---------------------------------------------------------------------------- +vtkStandardNewMacro(VISU_LabelPointsFilter); + + +//---------------------------------------------------------------------------- +void VISU_LabelPointsFilter::SetPointsNb(int theNb) +{ + if (myPointsNb == theNb) return; + myPointsNb = (theNb < 1)? 1:theNb; + Modified(); +} + +//---------------------------------------------------------------------------- +VISU_LabelPointsFilter::VISU_LabelPointsFilter(): + vtkPolyDataAlgorithm(), + myPointsNb(3) +{ +} + +//---------------------------------------------------------------------------- +VISU_LabelPointsFilter::~VISU_LabelPointsFilter() +{} + + + +//---------------------------------------------------------------------------- +int VISU_LabelPointsFilter::RequestData(vtkInformation* vtkNotUsed(request), + vtkInformationVector** inputVector, + vtkInformationVector* outputVector) +{ + // get the info objects + vtkInformation* inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation* outInfo = outputVector->GetInformationObject(0); + + // get the input and ouptut + vtkPolyData* input = vtkPolyData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkPolyData* output = vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT())); + + GetRegions(input, output); + + return 1; +} + +int VISU_LabelPointsFilter::RequestUpdateExtent(vtkInformation* vtkNotUsed(request), + vtkInformationVector** inputVector, + vtkInformationVector* outputVector) +{ + // get the info objects + vtkInformation *inInfo = inputVector[0]->GetInformationObject(0); + vtkInformation *outInfo = outputVector->GetInformationObject(0); + + vtkPolyData* input = vtkPolyData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT())); + vtkPolyData* output = vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT())); + + GetRegions(input, output); + return 1; +} + + + +int VISU_LabelPointsFilter::GetRegions(vtkPolyData* theInput, + vtkPolyData* theOutput) +{ + vtkIdType cellId, i; + vtkIdType numPts, numCells; + vtkPoints *inPts; + + vtkPointData *aInpPD=theInput->GetPointData(), *aOutPD=theOutput->GetPointData(); + vtkCellData *aInpCD=theInput->GetCellData(), *aOutCD=theOutput->GetCellData(); + + // Check input/allocate storage + // + inPts = theInput->GetPoints(); + + if (inPts == NULL) + return 1; + + numPts = inPts->GetNumberOfPoints(); + numCells = theInput->GetNumberOfCells(); + + if ( numPts < 1 || numCells < 1 ) + return 1; + + // Build cell structure + // + vtkPolyData* aMesh = vtkPolyData::New(); + aMesh->CopyStructure(theInput); + aMesh->BuildLinks(); + + // Initialize. Keep track of points and cells visited. + // + vtkIdTypeArray* aRegionSizes = vtkIdTypeArray::New(); + int* aVisited = new int[numCells]; + for ( i=0; i < numCells; i++ ) + aVisited[i] = -1; + + vtkIdType* aPointMap = new vtkIdType[numPts]; + for ( i=0; i < numPts; i++ ) + aPointMap[i] = -1; + + vtkPoints* newPts = vtkPoints::New(); + newPts->Allocate(numPts); + + // Traverse all cells marking those visited. Each new search + // starts a new connected region. Connected region grows + // using a connected wave propagation. + // + vtkIdList* aWave = vtkIdList::New(); + aWave->Allocate(numPts/4+1,numPts); + vtkIdList* aWave2 = vtkIdList::New(); + aWave2->Allocate(numPts/4+1,numPts); + + vtkIdType aPointNumber = 0; + int aRegionNumber = 0; + + vtkIdList* aCellIds = vtkIdList::New(); + aCellIds->Allocate(8, VTK_CELL_SIZE); + vtkIdList* aPointIds = vtkIdList::New(); + aPointIds->Allocate(8, VTK_CELL_SIZE); + + // vtkIdType aNumCellsInRegion; + + aOutPD->CopyAllocate(aInpPD); + aOutCD->CopyAllocate(aInpCD); + + //visit all cells marking with region number + for (cellId=0; cellId < numCells; cellId++) { + if ( aVisited[cellId] < 0 ) { + aWave->InsertNextId(cellId); + aPointNumber = 0; + TraverseAndMark(aWave, aWave2, aVisited, aPointMap, + aRegionNumber, aPointNumber, aMesh); + + if (aPointNumber >= myPointsNb) { + std::set aIdxSet; + for (i=0; i < numPts; i++) { + if ( aPointMap[i] > -1 ) { + aIdxSet.insert(i); + aPointMap[i] = -1; + } + } + std::vector aIdx(aIdxSet.begin(), aIdxSet.end()); + int aActualPts = aIdx.size(); + int aNewId; + if (myPointsNb > 2) { + int k = aActualPts/(myPointsNb - 1); + int count; + for (i=0, count = 0; i < aActualPts; i+=k, count++) { + aNewId = newPts->InsertNextPoint(inPts->GetPoint(aIdx[i])); + aOutPD->CopyData(aInpPD, aIdx[i], aNewId); + } + if (count < myPointsNb) { + aNewId = newPts->InsertNextPoint(inPts->GetPoint(aIdx[aActualPts - 1])); + aOutPD->CopyData(aInpPD, aIdx[aActualPts - 1], aNewId); + } + } else { + aNewId = newPts->InsertNextPoint(inPts->GetPoint(aIdx[0])); + aOutPD->CopyData(aInpPD, aIdx[0], aNewId); + if (myPointsNb == 2) { + aNewId = newPts->InsertNextPoint(inPts->GetPoint(aIdx[aActualPts - 1])); + aOutPD->CopyData(aInpPD, aIdx[aActualPts - 1], aNewId); + } + } + } + aWave->Reset(); + aWave2->Reset(); + } + } + + aWave->Delete(); + aWave2->Delete(); + + theOutput->SetPoints(newPts); + newPts->Delete(); + + + delete [] aVisited; + delete [] aPointMap; + aMesh->Delete(); + theOutput->Squeeze(); + aCellIds->Delete(); + aPointIds->Delete(); + + return aRegionSizes->GetMaxId() + 1; +} + + +// Mark current cell as visited and assign region number. Note: +// traversal occurs across shared vertices. +// +void VISU_LabelPointsFilter::TraverseAndMark (vtkIdList* theWave, + vtkIdList* theWave2, + int* theVisited, + vtkIdType* thePointMap, + int& theRegionNumber, + vtkIdType& thePointNumber, + vtkPolyData* theMesh) +{ + vtkIdType cellId, ptId, numIds, i; + int j, k; + vtkIdType *pts, *cells, npts; + vtkIdList *tmpWave; + unsigned short ncells; + vtkIdList* aNeighborCellPointIds = vtkIdList::New(); + + + while ( (numIds=theWave->GetNumberOfIds()) > 0 ) { + for ( i=0; i < numIds; i++ ) { + cellId = theWave->GetId(i); + if ( theVisited[cellId] < 0 ) { + theVisited[cellId] = theRegionNumber; + theMesh->GetCellPoints(cellId, npts, pts); + + for (j=0; j < npts; j++) { + if ( thePointMap[ptId=pts[j]] < 0 ) { + thePointMap[ptId] = thePointNumber++; + } + theMesh->GetPointCells(ptId,ncells,cells); + + // check connectivity criterion (geometric + scalar) + for (k=0; k < ncells; k++) { + cellId = cells[k]; + theWave2->InsertNextId(cellId); + // } + }//for all cells using this point + }//for all points of this cell + }//if cell not yet visited + }//for all cells in this wave + + tmpWave = theWave; + theWave = theWave2; + theWave2 = tmpWave; + tmpWave->Reset(); + } //while wave is not empty +} diff --git a/src/PIPELINE/VISU_LabelPointsFilter.hxx b/src/PIPELINE/VISU_LabelPointsFilter.hxx new file mode 100644 index 00000000..46fa1c44 --- /dev/null +++ b/src/PIPELINE/VISU_LabelPointsFilter.hxx @@ -0,0 +1,76 @@ +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File: VISU_LabelPointsFilter.hxx +// Author: Vitaly Smetannikov +// Module : VISU + +#ifndef VISU_LabelPointsFilter_HeaderFile +#define VISU_LabelPointsFilter_HeaderFile + +#include "VISUPipeline.hxx" +#include + +class vtkPolyData; + +class VISU_PIPELINE_EXPORT VISU_LabelPointsFilter : public vtkPolyDataAlgorithm +{ +public: + vtkTypeMacro(VISU_LabelPointsFilter, vtkPolyDataAlgorithm); + + static VISU_LabelPointsFilter* New(); + + void SetPointsNb(int theNb); + + int GetPointsNb() const { return myPointsNb; } + +protected: + VISU_LabelPointsFilter(); + + virtual ~VISU_LabelPointsFilter(); + + virtual int RequestData(vtkInformation* request, + vtkInformationVector** inputVector, + vtkInformationVector* outputVector); + + virtual int RequestUpdateExtent(vtkInformation*, + vtkInformationVector**, + vtkInformationVector*); + + + void TraverseAndMark (vtkIdList* theWave, + vtkIdList* theWave2, + int* theVisited, + vtkIdType* thePointMap, + int& theRegionNumber, + vtkIdType& thePointNumber, + vtkPolyData* theMesh); + + int GetRegions(vtkPolyData* theInput, + vtkPolyData* theOutput); + + int myPointsNb; + +}; + + +#endif diff --git a/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx b/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx index 85184e78..8713339f 100755 --- a/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx +++ b/src/PIPELINE/VISU_OpenGLPointSpriteMapper.cxx @@ -49,6 +49,8 @@ #include #include +#include "utilities.h" + #ifndef WNT # ifndef GLX_GLXEXT_LEGACY # define GLX_GLXEXT_LEGACY @@ -557,11 +559,10 @@ void VISU_OpenGLPointSpriteMapper::RenderPiece(vtkRenderer *ren, vtkActor *act) { #ifdef _DEBUG_RENDERING_PERFORMANCE_ // To control when the mapper is recalculated - cout<<"VISU_OpenGLPointSpriteMapper::RenderPiece - " - <<(this->GetMTime() > this->BuildTime)<<"; " - <<(input->GetMTime() > this->BuildTime)<<"; " - <<(act->GetProperty()->GetMTime() > this->BuildTime)<<"; " - <GetMTime() > this->BuildTime)<<"; " + <<(input->GetMTime() > this->BuildTime)<<"; " + <<(act->GetProperty()->GetMTime() > this->BuildTime)<<"; "); #endif // sets this->Colors as side effect this->MapScalars( act->GetProperty()->GetOpacity() ); diff --git a/src/PIPELINE/VISU_OptionalDeformationPL.cxx b/src/PIPELINE/VISU_OptionalDeformationPL.cxx new file mode 100755 index 00000000..a4bc4555 --- /dev/null +++ b/src/PIPELINE/VISU_OptionalDeformationPL.cxx @@ -0,0 +1,101 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// +// File: VISU_ScalarMapPL.cxx +// Author: Roman NIKOLAEV +// Module : VISU + +//Salome includes +#include "VISU_OptionalDeformationPL.hxx" +#include "VISU_PipeLineUtils.hxx" + +//VTK includes +#include +#include +#include +#include +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + +//---------------------------------------------------------------------------- +VISU_OptionalDeformationPL::VISU_OptionalDeformationPL(): + VISU_DeformationPL(), + myIsDeformed(true) +{ + if(MYDEBUG) MESSAGE("VISU_OptionalDeformationPL()::VISU_OptionalDeformationPL() - "<SetInput(myInputPassFilter->GetOutput()); + myWarpVector->SetInput(myCellDataToPointData->GetOutput()); + myOutputPassFiler->SetInput(myWarpVector->GetOutput()); +} + +//---------------------------------------------------------------------------- +void VISU_OptionalDeformationPL::OffDeformation(){ + myOutputPassFiler->SetInput(myInputPassFilter->GetOutput()); +} + + + +bool VISU_OptionalDeformationPL::CheckCanDeformate(vtkDataSet* theInput){ + if(theInput) { + if(VISU::IsDataOnCells(theInput)) + return theInput->GetCellData()->GetVectors() != NULL; + else if(VISU::IsDataOnPoints(theInput)) + return theInput->GetPointData()->GetVectors() != NULL; + } + return false; +} diff --git a/src/PIPELINE/VISU_OptionalDeformationPL.hxx b/src/PIPELINE/VISU_OptionalDeformationPL.hxx new file mode 100755 index 00000000..333da0cc --- /dev/null +++ b/src/PIPELINE/VISU_OptionalDeformationPL.hxx @@ -0,0 +1,59 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// +// File : VISU_OptionalDeformationPL.hxx +// Author : +// Module : SALOME + +#ifndef VISU_OptionalDeformationPL_HeaderFile +#define VISU_OptionalDeformationPL_HeaderFile + +#include "VISUPipeline.hxx" +#include "VISU_DeformationPL.hxx" + +class VISU_PIPELINE_EXPORT VISU_OptionalDeformationPL: public VISU_DeformationPL +{ +public: + VISU_OptionalDeformationPL(); + virtual ~VISU_OptionalDeformationPL(); + + typedef VISU_DeformationPL Superclass; + + void UseDeformation(bool flag); + bool IsDeformed(); + + virtual + unsigned + long int + GetMTime(); + +protected: + bool CheckCanDeformate(vtkDataSet* theInput); + +private: + void OnDeformation(); + void OffDeformation(); + +private: + bool myIsDeformed; +}; + +#endif diff --git a/src/PIPELINE/VISU_PipeLineUtils.cxx b/src/PIPELINE/VISU_PipeLineUtils.cxx index 6c31a356..26e7290e 100644 --- a/src/PIPELINE/VISU_PipeLineUtils.cxx +++ b/src/PIPELINE/VISU_PipeLineUtils.cxx @@ -95,6 +95,7 @@ namespace VISU theTarget->SetScalarMode(theSource->GetScalarMode()); theTarget->SetImmediateModeRendering(theSource->GetImmediateModeRendering()); theTarget->SetUseLookupTableScalarRange(theSource->GetUseLookupTableScalarRange()); + theTarget->SetInterpolateScalarsBeforeMapping(theSource->GetInterpolateScalarsBeforeMapping()); if(theSource->GetArrayAccessMode() == VTK_GET_ARRAY_BY_ID) theTarget->ColorByArrayComponent(theSource->GetArrayId(), theSource->GetArrayComponent()); else diff --git a/src/PIPELINE/VISU_Plot3DPL.cxx b/src/PIPELINE/VISU_Plot3DPL.cxx index c53afe9d..ed3750fc 100644 --- a/src/PIPELINE/VISU_Plot3DPL.cxx +++ b/src/PIPELINE/VISU_Plot3DPL.cxx @@ -56,7 +56,8 @@ VISU_Plot3DPL myIsRelative(true), myIsContour(false), myPosition(0.5), - myScaleFactor(1.0) + myScaleFactor(1.0), + myMapScaleFactor(1.0) { SetIsShrinkable(false); @@ -315,7 +316,7 @@ VISU_Plot3DPL ::SetScaleFactor(vtkFloatingPointType theScaleFactor) { myScaleFactor = theScaleFactor; - myWarpScalar->SetScaleFactor(theScaleFactor); + myWarpScalar->SetScaleFactor(theScaleFactor*myMapScaleFactor); } @@ -524,6 +525,7 @@ void VISU_Plot3DPL ::SetMapScale(vtkFloatingPointType theMapScale) { + myMapScaleFactor = theMapScale; Superclass::SetMapScale(theMapScale); if ( myIsContour ) { diff --git a/src/PIPELINE/VISU_Plot3DPL.hxx b/src/PIPELINE/VISU_Plot3DPL.hxx index 8585fb8b..7ec96d88 100644 --- a/src/PIPELINE/VISU_Plot3DPL.hxx +++ b/src/PIPELINE/VISU_Plot3DPL.hxx @@ -146,7 +146,7 @@ protected: vtkFloatingPointType myAngle[3]; bool myIsRelative, myIsContour; - vtkFloatingPointType myPosition, myScaleFactor; + vtkFloatingPointType myPosition, myScaleFactor, myMapScaleFactor; VISU_CutPlanesPL::PlaneOrientation myOrientation; vtkSmartPointer myCellDataToPointData; diff --git a/src/PIPELINE/VISU_ScalarMapPL.cxx b/src/PIPELINE/VISU_ScalarMapPL.cxx index d7149129..ad739773 100644 --- a/src/PIPELINE/VISU_ScalarMapPL.cxx +++ b/src/PIPELINE/VISU_ScalarMapPL.cxx @@ -28,6 +28,7 @@ #include "VISU_ScalarMapPL.hxx" #include "VISU_DataSetMapperHolder.hxx" +#include "VISU_ElnoAssembleFilter.hxx" #include "VISU_FieldTransform.hxx" #include "VISU_AppendFilter.hxx" @@ -50,11 +51,16 @@ vtkStandardNewMacro(VISU_ScalarMapPL); VISU_ScalarMapPL ::VISU_ScalarMapPL(): VISU_UnstructuredGridPL(this), + myElnoAssembleFilter( VISU_ElnoAssembleFilter::New() ), myAppendFilter(VISU_AppendFilter::New()), myMergeFilter(VISU_MergeFilter::New()) { SetIsShrinkable(true); + SetElnoDisassembleState( false ); + + myElnoAssembleFilter->Delete(); + myAppendFilter->SetMergingInputs(true); myAppendFilter->Delete(); @@ -111,8 +117,11 @@ VISU_ScalarMapPL myMergeFilter->AddField("VISU_FIELD", aDataSet); myMergeFilter->AddField("VISU_CELLS_MAPPER", aDataSet); myMergeFilter->AddField("VISU_POINTS_MAPPER", aDataSet); + myMergeFilter->AddField("ELNO_POINT_COORDS", aDataSet); + + myElnoAssembleFilter->SetInput( InsertCustomPL() ); - GetDataSetMapper()->SetInput(InsertCustomPL()); + GetDataSetMapper()->SetInput( myElnoAssembleFilter->GetOutput() ); } @@ -148,6 +157,15 @@ VISU_ScalarMapPL } +//---------------------------------------------------------------------------- +void +VISU_ScalarMapPL +::SetElnoDisassembleState( bool theIsShrunk ) +{ + GetDataSetMapperHolder()->SetElnoDisassembleState( theIsShrunk ); + myElnoAssembleFilter->SetElnoAssembleState( theIsShrunk ); +} + //---------------------------------------------------------------------------- void VISU_ScalarMapPL diff --git a/src/PIPELINE/VISU_ScalarMapPL.hxx b/src/PIPELINE/VISU_ScalarMapPL.hxx index dff91d39..fdb4ef94 100644 --- a/src/PIPELINE/VISU_ScalarMapPL.hxx +++ b/src/PIPELINE/VISU_ScalarMapPL.hxx @@ -34,6 +34,7 @@ #include "VISU_UnstructuredGridPL.hxx" class VISU_DataSetMapperHolder; +class VISU_ElnoAssembleFilter; class VISU_AppendFilter; class VISU_MergeFilter; @@ -111,12 +112,16 @@ protected: DoShallowCopy(VISU_PipeLine *thePipeLine, bool theIsCopyInput); + void + SetElnoDisassembleState( bool theIsShrunk ); + private: VISU_ScalarMapPL(const VISU_ScalarMapPL&); // Not implemented. void operator=(const VISU_ScalarMapPL&); // Not implemented. - vtkSmartPointer myAppendFilter; - vtkSmartPointer myMergeFilter; + vtkSmartPointer< VISU_ElnoAssembleFilter > myElnoAssembleFilter; + vtkSmartPointer< VISU_AppendFilter > myAppendFilter; + vtkSmartPointer< VISU_MergeFilter > myMergeFilter; }; #endif diff --git a/src/PIPELINE/VISU_VectorsPL.cxx b/src/PIPELINE/VISU_VectorsPL.cxx index 5192eefb..1c3257b9 100644 --- a/src/PIPELINE/VISU_VectorsPL.cxx +++ b/src/PIPELINE/VISU_VectorsPL.cxx @@ -44,18 +44,18 @@ vtkStandardNewMacro(VISU_VectorsPL); //---------------------------------------------------------------------------- template -void ToCellCenters(TOutputFilter *theOutputFilter, - vtkCellCenters *theCellCenters, - vtkDataSet* theDataSet, - VISU_UsedPointsFilter* theUsedPointsFilter) +void ToCellCenters( TOutputFilter *theOutputFilter, + vtkCellCenters *theCellCenters, + vtkDataSet* theDataSet, + VISU_UsedPointsFilter* theUsedPointsFilter ) { - if(VISU::IsDataOnCells(theDataSet)){ - theCellCenters->SetInput(theDataSet); + if ( VISU::IsDataOnCells( theDataSet ) ) { + theCellCenters->SetInput( theDataSet ); theCellCenters->VertexCellsOn(); - theOutputFilter->SetInput(theCellCenters->GetOutput()); + theOutputFilter->SetInput( theCellCenters->GetOutput() ); }else { - theUsedPointsFilter->SetInput(theDataSet); - theOutputFilter->SetInput(theUsedPointsFilter->GetOutput()); + theUsedPointsFilter->SetInput( theDataSet ); + theOutputFilter->SetInput( theUsedPointsFilter->GetOutput() ); } } @@ -63,10 +63,9 @@ void ToCellCenters(TOutputFilter *theOutputFilter, VISU_VectorsPL ::VISU_VectorsPL() { - SetIsShrinkable(false); + SetIsShrinkable( false ); - myBaseGlyph = vtkGlyph3D::New(); - myTransformedGlyph = vtkGlyph3D::New(); + myGlyph = vtkGlyph3D::New(); myGlyphSource = vtkGlyphSource2D::New(); myConeSource = vtkConeSource::New(); @@ -83,8 +82,7 @@ VISU_VectorsPL VISU_VectorsPL ::~VISU_VectorsPL() { - myBaseGlyph->Delete(); - myTransformedGlyph->Delete(); + myGlyph->Delete(); myCenters->Delete(); @@ -107,8 +105,7 @@ VISU_VectorsPL { unsigned long int aTime = Superclass::GetMTime(); - aTime = std::max(aTime, myBaseGlyph->GetMTime()); - aTime = std::max(aTime, myTransformedGlyph->GetMTime()); + aTime = std::max(aTime, myGlyph->GetMTime()); aTime = std::max(aTime, myCenters->GetMTime()); aTime = std::max(aTime, myGlyphSource->GetMTime()); aTime = std::max(aTime, myConeSource->GetMTime()); @@ -137,10 +134,9 @@ VISU_VectorsPL //---------------------------------------------------------------------------- void VISU_VectorsPL -::SetTransform(VTKViewer_Transform* theTransform) +::SetTransform( VTKViewer_Transform* theTransform ) { - GetFieldTransformFilter()->SetSpaceTransform(theTransform); - myTransformFilter->SetTransform(theTransform); + myTransformFilter->SetTransform( theTransform ); myTransformFilter->Modified(); } @@ -150,7 +146,7 @@ VTKViewer_Transform* VISU_VectorsPL ::GetTransform() { - return GetFieldTransformFilter()->GetSpaceTransform(); + return static_cast< VTKViewer_Transform* >( myTransformFilter->GetTransform() ); } @@ -159,13 +155,12 @@ void VISU_VectorsPL ::SetScale(vtkFloatingPointType theScale) { - if(myScaleFactor == theScale) + if ( VISU::CheckIsSameValue( myScaleFactor, theScale ) ) return; - myScaleFactor = theScale; + myGlyph->SetScaleFactor( theScale ); - myBaseGlyph->SetScaleFactor(myScaleFactor); - myTransformedGlyph->SetScaleFactor(myScaleFactor); + myScaleFactor = theScale; Modified(); } @@ -176,7 +171,7 @@ vtkFloatingPointType VISU_VectorsPL ::GetScale() { - return myTransformedGlyph->GetScaleFactor(); + return myGlyph->GetScaleFactor(); } @@ -243,22 +238,15 @@ VISU_VectorsPL { Superclass::Build(); - ToCellCenters(myBaseGlyph, - myCenters, - GetMergedInput(), - myUsedPointsFilter); - myBaseGlyph->SetVectorModeToUseVector(); - myBaseGlyph->SetScaleModeToScaleByVector(); - myBaseGlyph->SetColorModeToColorByScalar(); - - ToCellCenters(myTransformFilter, - myCenters, - GetMergedInput(), - myUsedPointsFilter); - myTransformedGlyph->SetInput(myTransformFilter->GetOutput()); - myTransformedGlyph->SetVectorModeToUseVector(); - myTransformedGlyph->SetScaleModeToScaleByVector(); - myTransformedGlyph->SetColorModeToColorByScalar(); + ToCellCenters( myTransformFilter, + myCenters, + GetMergedInput(), + myUsedPointsFilter ); + + myGlyph->SetInput( myTransformFilter->GetOutput() ); + myGlyph->SetVectorModeToUseVector(); + myGlyph->SetScaleModeToScaleByVector(); + myGlyph->SetColorModeToColorByScalar(); } @@ -267,7 +255,7 @@ vtkDataSet* VISU_VectorsPL ::InsertCustomPL() { - return myTransformedGlyph->GetOutput(); + return myGlyph->GetOutput(); } @@ -290,8 +278,7 @@ VISU_VectorsPL case CENTER: myGlyphSource->SetCenter(0.0, 0.0, 0.0); } - myBaseGlyph->SetSource(myGlyphSource->GetOutput()); - myTransformedGlyph->SetSource(myGlyphSource->GetOutput()); + myGlyph->SetSource(myGlyphSource->GetOutput()); } break; case CONE2: @@ -313,14 +300,12 @@ VISU_VectorsPL case CENTER: myConeSource->SetCenter(0.0, 0.0, 0.0); } - myBaseGlyph->SetSource(myConeSource->GetOutput()); - myTransformedGlyph->SetSource(myConeSource->GetOutput()); + myGlyph->SetSource(myConeSource->GetOutput()); } break; case NONE: default: { - myBaseGlyph->SetSource(myLineSource->GetOutput()); - myTransformedGlyph->SetSource(myLineSource->GetOutput()); + myGlyph->SetSource(myLineSource->GetOutput()); } } @@ -335,19 +320,12 @@ VISU_VectorsPL { unsigned long int aSize = Superclass::GetMemorySize(); - if(vtkDataSet* aDataSet = myBaseGlyph->GetOutput()) - aSize += aDataSet->GetActualMemorySize() * 1024; - - if(vtkDataSet* aDataSet = myTransformedGlyph->GetOutput()) + if(vtkDataSet* aDataSet = myGlyph->GetOutput()) aSize += aDataSet->GetActualMemorySize() * 1024; if(vtkDataSet* aDataSet = myCenters->GetOutput()) aSize += aDataSet->GetActualMemorySize() * 1024; - if(myCellDataToPointData->GetInput()) - if(vtkDataSet* aDataSet = myCellDataToPointData->GetOutput()) - aSize += aDataSet->GetActualMemorySize() * 1024; - return aSize; } @@ -357,8 +335,9 @@ vtkDataSet* VISU_VectorsPL ::GetOutput() { - myBaseGlyph->Update(); - return myBaseGlyph->GetOutput(); + myGlyph->Update(); + + return myGlyph->GetOutput(); } @@ -368,9 +347,9 @@ VISU_VectorsPL ::SetMapScale(vtkFloatingPointType theMapScale) { VISU_ScalarMapPL::SetMapScale(theMapScale); + myMapScaleFactor = theMapScale; - myBaseGlyph->SetScaleFactor(myScaleFactor*theMapScale); - myTransformedGlyph->SetScaleFactor(myScaleFactor*theMapScale); + myGlyph->SetScaleFactor( myScaleFactor*theMapScale ); Modified(); } diff --git a/src/PIPELINE/VISU_VectorsPL.hxx b/src/PIPELINE/VISU_VectorsPL.hxx index 09fe54cb..0befbd6e 100644 --- a/src/PIPELINE/VISU_VectorsPL.hxx +++ b/src/PIPELINE/VISU_VectorsPL.hxx @@ -135,8 +135,7 @@ protected: GlyphType myTypeGlyph; GlyphPos myPosGlyph; - vtkGlyph3D *myBaseGlyph; - vtkGlyph3D *myTransformedGlyph; + vtkGlyph3D *myGlyph; vtkGlyphSource2D *myGlyphSource; vtkLineSource *myLineSource; diff --git a/src/VISUGUI/Makefile.am b/src/VISUGUI/Makefile.am index 1f20a5b4..e3a86336 100644 --- a/src/VISUGUI/Makefile.am +++ b/src/VISUGUI/Makefile.am @@ -63,7 +63,7 @@ dist_libVISU_la_SOURCES= \ VisuGUI_StreamLinesDlg.cxx \ VisuGUI_VectorsDlg.cxx \ VisuGUI_Displayer.cxx \ - VisuGUI_ScalarMapOnDeformedShapeDlg.cxx \ + VisuGUI_DeformedShapeAndScalarMapDlg.cxx \ VisuGUI_SetupPlot2dDlg.cxx \ VisuGUI_BuildProgressDlg.cxx \ VisuGUI_Table3dDlg.cxx \ @@ -97,7 +97,7 @@ MOC_FILES= \ VisuGUI_CutPlanesDlg_moc.cxx \ VisuGUI_StreamLinesDlg_moc.cxx \ VisuGUI_VectorsDlg_moc.cxx \ - VisuGUI_ScalarMapOnDeformedShapeDlg_moc.cxx \ + VisuGUI_DeformedShapeAndScalarMapDlg_moc.cxx \ VisuGUI_SetupPlot2dDlg_moc.cxx \ VisuGUI_BuildProgressDlg_moc.cxx \ VisuGUI_Table3dDlg_moc.cxx \ diff --git a/src/VISUGUI/VISU_msg_en.ts b/src/VISUGUI/VISU_msg_en.ts index 2125dcc0..b24996d2 100644 --- a/src/VISUGUI/VISU_msg_en.ts +++ b/src/VISUGUI/VISU_msg_en.ts @@ -397,6 +397,26 @@ Do you want to enlarge the cache? VISU_BAR_HEIGHT Bar height (%): + + VISU_AUTOMATIC_FIT_ALL + Automatic Fit All + + + VISU_DEFORMED_SHAPE_AND_SCALAR_MAP + Def. Shape and Scalar Map + + + VISU_FLOATING_POINT_PRECISION + Floating Point Precision + + + VISU_REALLY_DELETE + Do you really want to delete this %1 object(s): %2 + + + WRN_NO_APPROPRIATE_SELECTION + No appropriate objects selected + VVTK_MainWindow @@ -1105,8 +1125,8 @@ Please, refer to the documentation. Scalar Map - MEN_SCALAR_MAP_ON_DEFORMED_SHAPE - Scalar Map on Deformed Shape + MEN_DEFORMED_SHAPE_AND_SCALAR_MAP + Deformed Shape and Scalar Map MEN_SCALING @@ -1208,6 +1228,26 @@ Please, refer to the documentation. MEN_FILE_INFO MED File information + + ERR_ERROR_IN_THE_FILE + Error in the file + + + ERR_FILE_NOT_EXISTS + File does not exist + + + IMPORT_ERRORS + Import operation has finished with errors: + + + TLT_IMPORT_TABLE + Import table + + + UNKNOWN_IMPORT_ERROR + Unknown error + VisuGUI_AxisWg @@ -1664,6 +1704,18 @@ Please, provide non-empty resulting presentation. TXT_ORIENTATION Orientation + + LBL_DEFORMATION + Deformation + + + LBL_DEFROMATION_SCALE + Scale Factor : + + + LBL_DEFROMATION_VECT + Vectors : + VisuGUI_DeformedShapeDlg @@ -1980,6 +2032,18 @@ Please, provide non-empty resulting presentation. NB_SURFACES Number of surfaces: + + MAGNITUDE_COLORING_CHK + Magnitude coloring + + + SEL_COLOR_BTN + Select Color + + + SHOW_VALUES_CHK + Show values (nb per surface) + VisuGUI_IsoSurfacesDlg @@ -2717,7 +2781,7 @@ Please, provide non-empty resulting presentation. - VisuGUI_ScalarMapOnDeformedShapeDlg + VisuGUI_DeformedShapeAndScalarMapDlg &Cancel @@ -2728,7 +2792,7 @@ Please, provide non-empty resulting presentation. DLG_TITLE - Scalar Map on Deformed Shape + Deformed Shape and Scalar Map FIELD_ITEM @@ -2743,8 +2807,8 @@ Please, provide non-empty resulting presentation. Scalar Bar - SCALAR_MAP_ON_DEFORMED_SHAPE_TAB - Scalar Map on Deformed Shape + DEFORMED_SHAPE_AND_SCALAR_MAP_TAB + Deformed Shape and Scalar Map SCALE_FACTOR diff --git a/src/VISUGUI/VisuGUI.cxx b/src/VISUGUI/VisuGUI.cxx index 810aeb27..109c8242 100644 --- a/src/VISUGUI/VisuGUI.cxx +++ b/src/VISUGUI/VisuGUI.cxx @@ -56,6 +56,7 @@ #include "SUIT_ViewManager.h" #include "SUIT_Desktop.h" #include "SUIT_DataBrowser.h" +#include "SUIT_OverrideCursor.h" #include "CAM_Module.h" @@ -122,8 +123,8 @@ #include "VISU_DeformedShape_i.hh" #include "VisuGUI_DeformedShapeDlg.h" -#include "VISU_ScalarMapOnDeformedShape_i.hh" -#include "VisuGUI_ScalarMapOnDeformedShapeDlg.h" +#include "VISU_DeformedShapeAndScalarMap_i.hh" +#include "VisuGUI_DeformedShapeAndScalarMapDlg.h" #include "VISU_IsoSurfaces_i.hh" #include "VisuGUI_IsoSurfacesDlg.h" @@ -193,7 +194,7 @@ VisuGUI SUIT_ResourceMgr* aResourceMgr = GetResourceMgr(); - // Get file name + // Get file name(s) QStringList aFilter; aFilter.append( tr( "FLT_MED_FILES" ) ); aFilter.append( tr( "FLT_DISTRIBUTED_MED_FILES" ) ); @@ -201,57 +202,85 @@ VisuGUI bool toUseBuildProgress = aResourceMgr->booleanValue("VISU", "use_build_progress", false); - SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg( GetDesktop(this), true, tr("USE_BUILD_PROGRESS") ); - fd->setWindowTitle( tr( "IMPORT_FROM_FILE" ) ); - fd->setFilters( aFilter ); - fd->SetChecked( toUseBuildProgress ); - if( !fd->exec() ) - return; + SalomeApp_CheckFileDlg fd( GetDesktop(this), true, tr("USE_BUILD_PROGRESS") ); + fd.setWindowTitle( tr( "IMPORT_FROM_FILE" ) ); + fd.setFileMode( SalomeApp_CheckFileDlg::ExistingFiles ); + fd.setFilters( aFilter ); + fd.SetChecked( toUseBuildProgress ); + if ( SalomeApp_CheckFileDlg::getLastVisitedPath().isEmpty() ) + fd.setDirectory( QDir::currentPath() ); - QFileInfo aFileInfo( fd->selectedFile() ); - toUseBuildProgress = fd->IsChecked(); - delete fd; + QStringList fileNames; + if ( !fd.exec() ) + return; // cancelled, return - // Check the file name - if ( !aFileInfo.exists() ) - return; + fileNames = fd.selectedFiles(); + toUseBuildProgress = fd.IsChecked(); - if ( !toUseBuildProgress ) - { - bool toBuildFields = aResourceMgr->booleanValue( "VISU", "build_fields", true ); - bool toBuildMinMax = aResourceMgr->booleanValue( "VISU", "build_min_max", true ); - bool toBuildGroups = aResourceMgr->booleanValue( "VISU", "build_groups", true ); - bool toBuildAll = aResourceMgr->booleanValue( "VISU", "full_med_loading", false ); - bool toBuildAtOnce = aResourceMgr->booleanValue( "VISU", "build_at_once", false ); - - QString anInfo("Importing From File " + aFileInfo.absoluteFilePath() + "..." ); - application()->putInfo( anInfo ); - - QApplication::setOverrideCursor(Qt::WaitCursor); - VISU::Result_var aResult = GetVisuGen(this)->CreateResult( aFileInfo.filePath().toLatin1().data() ); - - if (CORBA::is_nil(aResult.in())) { - SUIT_MessageBox::warning(GetDesktop(this), - tr("WRN_VISU"), - VisuGUI_BuildProgressDlg::tr("ERR_ERROR_IN_THE_FILE") ); - QApplication::restoreOverrideCursor(); - }else{ - aResult->SetBuildFields( toBuildFields, toBuildMinMax ); - aResult->SetBuildGroups( toBuildGroups ); - aResult->Build( toBuildAll, toBuildAtOnce ); - - UpdateObjBrowser(this); - application()->putInfo( anInfo + tr("INF_DONE")); - QApplication::restoreOverrideCursor(); - } - } - else - { - VisuGUI_BuildProgressDlg* aBuildProgressDlg = new VisuGUI_BuildProgressDlg( GetDesktop(this) ); - aBuildProgressDlg->setFileName( aFileInfo.filePath() ); - aBuildProgressDlg->setGenerator( GetVisuGen(this) ); - aBuildProgressDlg->show(); + if ( fileNames.count() == 0 ) + return; // nothing selected, return + + SUIT_OverrideCursor wc; + QStringList errors; + + for ( QStringList::ConstIterator it = fileNames.begin(); it != fileNames.end(); ++it ) { + QFileInfo aFileInfo( *it ); + + if ( !aFileInfo.exists() ) { + // file not exist + errors.append( QString( "%1 :\n\t%2" ).arg( aFileInfo.filePath() ). + arg( tr( "ERR_FILE_NOT_EXISTS" ) ) ); } + else { + try { + if ( !toUseBuildProgress ) { + // build progress is not used, use build flags from settings + bool toBuildFields = aResourceMgr->booleanValue( "VISU", "build_fields", true ); + bool toBuildMinMax = aResourceMgr->booleanValue( "VISU", "build_min_max", true ); + bool toBuildGroups = aResourceMgr->booleanValue( "VISU", "build_groups", true ); + bool toBuildAll = aResourceMgr->booleanValue( "VISU", "full_med_loading", false ); + bool toBuildAtOnce = aResourceMgr->booleanValue( "VISU", "build_at_once", false ); + + QString anInfo( tr( "IMPORT_FROM_FILE" ) + " " + aFileInfo.filePath() + " ... " ); + application()->putInfo( anInfo ); + + VISU::Result_var aResult = GetVisuGen( this )->CreateResult( aFileInfo.filePath().toLatin1().constData() ); + + if ( CORBA::is_nil( aResult.in() ) ) { + errors.append( QString( "%1 :\n\t%2" ).arg( aFileInfo.filePath() ). + arg( tr( "ERR_ERROR_IN_THE_FILE" ) ) ); + } + else { + aResult->SetBuildFields( toBuildFields, toBuildMinMax ); + aResult->SetBuildGroups( toBuildGroups ); + aResult->Build( toBuildAll, toBuildAtOnce ); + application()->putInfo( anInfo + tr("INF_DONE") ); + } + } // if ( !toUseBuildProgress ) + else { + // use build progress + wc.suspend(); + VisuGUI_BuildProgressDlg* aBuildProgressDlg = new VisuGUI_BuildProgressDlg( GetDesktop(this) ); + aBuildProgressDlg->setFileName( aFileInfo.filePath() ); + aBuildProgressDlg->setGenerator( GetVisuGen(this) ); + aBuildProgressDlg->exec(); + wc.resume(); + } + } // try + catch(...) { + errors.append( QString( "%1 :\n\t%2" ).arg( aFileInfo.filePath() ).arg( tr( "UNKNOWN_IMPORT_ERROR" ) ) ); + } + } // else // if ( !aFileInfo.exists() ) + } // for (...) + + if ( errors.count() > 0 ) { + SUIT_MessageBox::critical( GetDesktop(this), + tr("ERR_ERROR"), + tr("IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) ); + } + else { + UpdateObjBrowser(this); + } } void @@ -266,26 +295,54 @@ VisuGUI aFilter.append( tr("FLT_TABLE_FILES") ); aFilter.append( tr("FLT_ALL_FILES") ); - QFileInfo aFileInfo = - SUIT_FileDlg::getFileName(GetDesktop(this), - "", - aFilter, - tr("MEN_IMPORT_TABLE"), - true); - if (aFileInfo.exists()) { - application()->putInfo( tr("MEN_IMPORT_TABLE") + " " + aFileInfo.absoluteFilePath() + " ..." ); - - CORBA::Object_var anObject = GetVisuGen(this)->ImportTables((const char*)aFileInfo.absoluteFilePath().toLatin1()); - - if (CORBA::is_nil(anObject.in())) { - SUIT_MessageBox::warning( GetDesktop(this), - tr("WRN_VISU"), - tr("ERR_ERROR_IN_THE_FILE") ); - } else { - application()->putInfo(aFileInfo.absoluteFilePath()+tr("INF_DONE")); - UpdateObjBrowser(this); + QString anInitialPath = ""; + if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) + anInitialPath = QDir::currentPath(); + + QStringList aFiles = SUIT_FileDlg::getOpenFileNames(GetDesktop(this), + anInitialPath, + aFilter, + tr("TLT_IMPORT_TABLE")); + if ( aFiles.count() == 0 ) + return; // nothing selected + + QStringList errors; + for ( QStringList::ConstIterator it = aFiles.begin(); it != aFiles.end(); ++it ) { + QFileInfo aFileInfo( *it ); + + if ( !aFileInfo.exists() ) { + errors.append( QString( "%1 :\n\t%2" ).arg( aFileInfo.filePath() ). + arg( tr( "ERR_FILE_NOT_EXISTS" ) ) ); + } + else { + try { + QString anInfo( tr("TLT_IMPORT_TABLE") + " " + aFileInfo.filePath() + " ..." ); + application()->putInfo( anInfo ); + + CORBA::Object_var anObject = GetVisuGen(this)->ImportTables(aFileInfo.filePath().toLatin1().constData()); + + if (CORBA::is_nil(anObject.in())) { + errors.append( QString( "%1 :\n\t%2" ).arg( aFileInfo.filePath() ). + arg( tr( "ERR_ERROR_IN_THE_FILE" ) ) ); + } + else { + application()->putInfo( anInfo + tr("INF_DONE") ); + } + } + catch(...) { + errors.append( QString( "%1 :\n\t%2" ).arg( aFileInfo.filePath() ).arg( tr( "UNKNOWN_IMPORT_ERROR" ) ) ); + } } } + + if ( errors.count() > 0 ) { + SUIT_MessageBox::critical( GetDesktop(this), + tr("ERR_ERROR"), + tr("IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) ); + } + else { + UpdateObjBrowser(this); + } } void @@ -667,15 +724,14 @@ void VisuGUI ::OnCreateDeformedShape() { - // CreatePrs3d(this); - VisuGUI_DeformedShapeDlg::CreatePrs3d(this); + CreatePrs3d(this); } void VisuGUI -::OnCreateScalarMapOnDeformedShape() +::OnCreateDeformedShapeAndScalarMap() { - CreatePrs3d(this); + CreatePrs3d(this); } void @@ -776,7 +832,8 @@ VisuGUI aViewWindow->getRenderer()->ResetCameraClippingRange(); aViewWindow->Repaint(); } - }} + } + } } } @@ -880,11 +937,11 @@ VisuGUI //---------------------------------------------------------------------------- void VisuGUI -::OnEditScalarMapOnDeformedShape() +::OnEditDeformedShapeAndScalarMap() { Handle(SALOME_InteractiveObject) anIO; if (VISU::Prs3d_i* aPrs3d = GetPrsToModify(this, anIO)) - EditPrs3d(this, anIO, aPrs3d); + EditPrs3d(this, anIO, aPrs3d); } //---------------------------------------------------------------------------- @@ -1142,12 +1199,6 @@ void VisuGUI ::OnChangeOpacity() { - VISU_Actor* anActor = NULL; - VISU::Prs3d_i* aPrs3d = NULL; - SVTK_ViewWindow* aViewWindow = NULL; - if(!GetPrs3dSelectionInfo(this, aPrs3d, aViewWindow, anActor)) - return; - VisuGUI_TransparencyDlg* aDialog = new VisuGUI_TransparencyDlg( this ); aDialog->show(); } @@ -1158,10 +1209,24 @@ VisuGUI ::OnChangeLines() { VISU_Actor* anActor = NULL; + VISU_ActorBase* anActorBase = NULL; VISU::Prs3d_i* aPrs3d = NULL; SVTK_ViewWindow* aViewWindow = NULL; - if(!GetPrs3dSelectionInfo(this, aPrs3d, aViewWindow, anActor)) - return; + float oldlwid; + bool isPrs3d = false; + + if (GetPrs3dSelectionInfo(this, aPrs3d, aViewWindow, anActor)) { + isPrs3d = true; + } + else { + aViewWindow = GetActiveViewWindow(this); + VISU::TSelectionInfo aSelectionInfo = VISU::GetSelectedObjects(this); + VISU::TSelectionItem aSelectionItem = aSelectionInfo.front(); + VISU::PointMap3d_i* aTable = dynamic_cast(aSelectionItem.myObjectInfo.myBase); + anActorBase = VISU::FindActorBase(aViewWindow, aTable); + oldlwid = anActorBase->GetLineWidth(); + } + VisuGUI_CursorDlg* CursorDlg = new VisuGUI_CursorDlg (GetDesktop(this), (const char*)tr("DLG_LINEWIDTH_TITLE").toLatin1(), TRUE); @@ -1172,7 +1237,6 @@ VisuGUI CursorDlg->SpinBox1->setMinimum(1); CursorDlg->SpinBox1->setMaximum(10); - float oldlwid = anActor->GetLineWidth(); int intlwid = int(oldlwid); CursorDlg->SpinBox1->setValue(intlwid); @@ -1180,7 +1244,10 @@ VisuGUI if (ret == 1) { intlwid = CursorDlg->SpinBox1->value(); float newlwid = intlwid; - anActor->SetLineWidth(newlwid); + if (isPrs3d) + anActor->SetLineWidth(newlwid); + else + anActorBase->SetLineWidth(newlwid); } delete CursorDlg; } @@ -1272,15 +1339,30 @@ VisuGUI int i = 0, nbSelected = aList.Extent(); if (nbSelected < 1) return; - std::vector anEntries(nbSelected); + std::vector anEntries (nbSelected); + QString aNameList; Handle(SALOME_InteractiveObject) anIO; for (SALOME_ListIteratorOfListIO it (aList); it.More(); it.Next()) { anIO = it.Value(); - if (anIO->hasEntry()) - anEntries[i++] = anIO->getEntry(); + aNameList.append("\n - "); + aNameList.append(anIO->getName()); + if (anIO->hasEntry()) { + if (IsRemovable(anIO->getEntry(), this)) + anEntries[i++] = anIO->getEntry(); + } } nbSelected = i; - if (nbSelected < 1) return; + if (nbSelected < 1) { + SUIT_MessageBox::warning(GetDesktop(this), + QObject::tr("WRN_VISU"), + QObject::tr("WRN_NO_APPROPRIATE_SELECTION")); + } + + if ( SUIT_MessageBox::question( GetDesktop(this), + QObject::tr( "WRN_VISU" ), + QObject::tr( "VISU_REALLY_DELETE" ).arg( nbSelected ).arg( aNameList ), + SUIT_MessageBox::Yes | SUIT_MessageBox::No ) != SUIT_MessageBox::Yes ) + return; // There is a transaction _PTR(StudyBuilder) aStudyBuilder = aCStudy->NewBuilder(); @@ -1313,7 +1395,8 @@ VisuGUI } } } - }else{ + } + else{ DeleteSObject(this, aCStudy, aSObject); UpdateObjBrowser(this, true, aSObject); } @@ -1621,68 +1704,97 @@ VisuGUI return; VISU::TSelectionInfo aSelectionInfo = VISU::GetSelectedObjects(this); - if(aSelectionInfo.empty()) + if (aSelectionInfo.empty()) return; - VISU::TSelectionItem aSelectionItem = aSelectionInfo.front(); - _PTR(SObject) aSObject = aSelectionItem.myObjectInfo.mySObject; - if(!aSObject) - return; + VisuGUI_Selection aSel (this); + aSel.init("", getApp()->selectionMgr()); + if (aSel.count() < 1) return; - //TEST DU PARENT == VISU - _PTR(StudyBuilder) aBuilder = aCStudy->NewBuilder(); - _PTR(GenericAttribute) anAttr = aBuilder->FindOrCreateAttribute(aSObject, "AttributeName"); - if (anAttr) { - _PTR(AttributeName) aName (anAttr); - QString Name = VisuGUI_NameDlg::getName( GetDesktop( this ), aName->Value().c_str() ); - if (!Name.isEmpty()) { - QApplication::setOverrideCursor(Qt::WaitCursor); - - // rename specific objects - if(VISU::Base_i* aBase = aSelectionItem.myObjectInfo.myBase){ - switch(aBase->GetType()){ - case VISU::TCURVE: { // Curve object - if(VISU::Curve_i* aCurve = dynamic_cast(aBase)) - aCurve->SetName((const char*)Name.toLatin1(), true); - break; - } - case VISU::TTABLE: { // Table object - if(VISU::Table_i* aTable = dynamic_cast(aBase)) - aTable->SetName((const char*)Name.toLatin1(), true); - break; - } - case VISU::TCONTAINER: { // Container object - if(VISU::Container_i* aContainer = dynamic_cast(aBase)) - aContainer->SetName((const char*)Name.toLatin1(), true); - break; - } - default: { - }} - } - } + bool isAny = false; // is there any appropriate object selected + for (int i = 0; i < aSelectionInfo.size(); i++) { + VISU::TSelectionItem aSelectionItem = aSelectionInfo[i]; + VISU::TObjectInfo anObjectInfo = aSelectionItem.myObjectInfo; - if (!Name.isEmpty()) { - // rename the study object - Handle(SALOME_InteractiveObject) anIO = aSelectionItem.myIO; - aName->SetValue((const char*)Name.toLatin1()); // rename the SObject - anIO->setName((const char*)Name.toLatin1()); // rename the InteractiveObject - - ViewManagerList aViewManagerList; - ViewManagerList::Iterator anIt; - getApp()->viewManagers(SPlot2d_Viewer::Type(), aViewManagerList); - anIt = aViewManagerList.begin(); - for(; anIt != aViewManagerList.end(); anIt++ ) - { - if(Plot2d_ViewManager* aManager = dynamic_cast(*anIt)){ - if(SPlot2d_Viewer* aViewer = dynamic_cast(aManager->getViewModel())) - aViewer->renameAll( anIO, (const char*)Name.toLatin1() ); - } - } + _PTR(SObject) aSObject = anObjectInfo.mySObject; + if (!aSObject) + continue; - UpdateObjBrowser(this, false); + // Check, if the selected object can be renamed + QString aStr = aSel.parameter(i, "type" ).toString(); + if (aStr == "VISU::TSCALARMAP" || aStr == "VISU::TISOSURFACES" || + aStr == "VISU::TDEFORMEDSHAPE" || aStr == "VISU::TCUTPLANES" || + aStr == "VISU::TCUTLINES" || aStr == "VISU::TVECTORS" || + aStr == "VISU::TSTREAMLINES" || aStr == "VISU::TPLOT3D" || + aStr == "VISU::TSCALARMAPONDEFORMEDSHAPE" || aStr == "VISU::TCOLOREDPRS3DHOLDER" || + aStr == "VISU::TTABLE" || aStr == "VISU::TCURVE" || aStr == "VISU::TCONTAINER" || + aStr == "VISU::POINTMAP3D" || aStr == "VISU::TVIEW3D" || + aStr == "VISU::TMESH" || aStr == "VISU::TPOINTMAP3D") + { + _PTR(GenericAttribute) anAttr; + if (aSObject->FindAttribute(anAttr, "AttributeName")) { + isAny = true; + _PTR(AttributeName) aName (anAttr); + QString Name = VisuGUI_NameDlg::getName( GetDesktop( this ), aName->Value().c_str() ); + if (!Name.isEmpty()) { + QApplication::setOverrideCursor(Qt::WaitCursor); + + // rename specific objects + if (VISU::Base_i* aBase = anObjectInfo.myBase) { + switch (aBase->GetType()) { + case VISU::TCURVE: { // Curve object + if (VISU::Curve_i* aCurve = dynamic_cast(aBase)) + aCurve->SetName(Name.toLatin1().constData(), true); + break; + } + case VISU::TTABLE: { // Table object + if (VISU::Table_i* aTable = dynamic_cast(aBase)) + aTable->SetName(Name.toLatin1().constData(), true); + break; + } + case VISU::TPOINTMAP3D: { // Table object + if (VISU::PointMap3d_i* aTable3d = dynamic_cast(aBase)) { + aTable3d->SetTitle(Name.toLatin1().constData()); + aTable3d->UpdateActors(); + } + break; + } + case VISU::TCONTAINER: { // Container object + if (VISU::Container_i* aContainer = dynamic_cast(aBase)) + aContainer->SetName(Name.toLatin1().constData(), true); + break; + } + default: { + }} + } + + // rename the study object + Handle(SALOME_InteractiveObject) anIO = aSelectionItem.myIO; + aName->SetValue(Name.toLatin1().constData()); // rename the SObject + anIO->setName(Name.toLatin1().constData()); // rename the InteractiveObject + + ViewManagerList aViewManagerList; + getApp()->viewManagers(SPlot2d_Viewer::Type(), aViewManagerList); + SUIT_ViewManager* aViewManager; + foreach( aViewManager, aViewManagerList ) { + if (Plot2d_ViewManager* aManager = dynamic_cast(aViewManager)) { + if (SPlot2d_Viewer* aViewer = dynamic_cast(aManager->getViewModel())) + aViewer->renameAll( anIO, Name.toLatin1().constData() ); + } + } + + UpdateObjBrowser(this, false); + + QApplication::restoreOverrideCursor(); + } + } } + } // for - QApplication::restoreOverrideCursor(); + if (!isAny) { + SUIT_MessageBox::warning(GetDesktop(this), + QObject::tr("WRN_VISU"), + QObject::tr("WRN_NO_APPROPRIATE_SELECTION")); } } @@ -1748,6 +1860,7 @@ VisuGUI aScalarMap->SetMapScale(aPercents); aScalarMap->UpdateActor(anActor); aViewWindow->getRenderWindow()->Render(); + aViewWindow->Repaint(); usleep(aTemp); } catch (std::exception& exc) { INFOS("Follow exception was occured :\n" << exc.what()); @@ -1869,7 +1982,8 @@ VisuGUI TSameAsFactory().Create(aColoredPrs3d, ColoredPrs3d_i::EPublishUnderTimeStamp, false); break; case VISU::TSCALARMAPONDEFORMEDSHAPE: - TSameAsFactory().Create(aColoredPrs3d, ColoredPrs3d_i::EPublishUnderTimeStamp, false); + case VISU::TDEFORMEDSHAPEANDSCALARMAP: + TSameAsFactory().Create(aColoredPrs3d, ColoredPrs3d_i::EPublishUnderTimeStamp, false); break; case VISU::TCUTPLANES: TSameAsFactory().Create(aColoredPrs3d, ColoredPrs3d_i::EPublishUnderTimeStamp, false); @@ -2014,26 +2128,7 @@ VisuGUI { if(MYDEBUG) MESSAGE("VisuGUI::OnTranslatePrs"); VisuGUI_OffsetDlg* aDlg = new VisuGUI_OffsetDlg (this); - - LightApp_SelectionMgr* aSelectionMgr = GetSelectionMgr(this); - SALOME_ListIO aListIO; - aSelectionMgr->selectedObjects(aListIO); - - SalomeApp_Study* aStudy = GetAppStudy(this); - SALOME_ListIteratorOfListIO anIter(aListIO); - for (; anIter.More(); anIter.Next()) { - Handle(SALOME_InteractiveObject) anIO = anIter.Value(); - if (anIO->hasEntry()) { - QString anEntry(anIO->getEntry()); - VISU::TObjectInfo anObjectInfo = VISU::GetObjectByEntry(aStudy, (const char*)anEntry.toLatin1()); - if(VISU::Prs3d_i* aPrsObject = VISU::GetPrs3dFromBase(anObjectInfo.myBase)) - aDlg->addPresentation(aPrsObject); - } - } - if (aDlg->getPrsCount() > 0) - aDlg->show(); - else - delete aDlg; + aDlg->exec(); } void @@ -2069,9 +2164,6 @@ VisuGUI SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); // Create actions - //createAction( VISU_IMPORT_FROM_FILE, "", QIcon(), - // tr("MEN_IMPORT_FROM_FILE"), "", (CTRL + Key_I), aParent, false, - // this, SLOT(OnImportFromFile())); aPixmap = aResourceMgr->loadPixmap("VISU",tr("ICON_IMPORT_MED")); createAction( VISU_IMPORT_FROM_FILE, tr("IMPORT_FROM_FILE"), QIcon(aPixmap), @@ -2093,9 +2185,9 @@ VisuGUI this, SLOT(OnCreateDeformedShape())); aPixmap = aResourceMgr->loadPixmap("VISU",tr("ICON_SCALAR_MAP_ON_DEFORMED_SHAPE")); - createAction( VISU_SCALAR_MAP_ON_DEFORMED_SHAPE, tr("MEN_SCALAR_MAP_ON_DEFORMED_SHAPE"), QIcon(aPixmap), - tr("MEN_SCALAR_MAP_ON_DEFORMED_SHAPE"), "", 0, aParent, false, - this, SLOT(OnCreateScalarMapOnDeformedShape())); + createAction( VISU_DEFORMED_SHAPE_AND_SCALAR_MAP, tr("MEN_DEFORMED_SHAPE_AND_SCALAR_MAP"), QIcon(aPixmap), + tr("MEN_DEFORMED_SHAPE_AND_SCALAR_MAP"), "", 0, aParent, false, + this, SLOT(OnCreateDeformedShapeAndScalarMap())); aPixmap = aResourceMgr->loadPixmap("VISU",tr("ICON_VECTORS")); createAction( VISU_VECTORS, tr("MEN_VECTORS"), QIcon(aPixmap), @@ -2140,7 +2232,7 @@ VisuGUI tr("MEN_SHOW_TABLE"), "", 0, aParent, false, this, SLOT(OnShowTable())); - createAction( VISU_SHOW_TABLE_PLOT, tr("MEN_EDIT_PRS"), QIcon(), + createAction( VISU_EDIT_POINTMAP3D, tr("MEN_EDIT_PRS"), QIcon(), tr("MEN_EDIT_PRS"), "", 0, aParent, false, this, SLOT(OnShowTablePlot())); @@ -2331,10 +2423,9 @@ VisuGUI tr("MEN_EDIT_PRS"), "", 0, aParent, false, this, SLOT(OnEditPlot3D())); - createAction( VISU_EDIT_SCALARMAPONDEFORMEDSHAPE, tr("MEN_EDIT_PRS"), QIcon(), + createAction( VISU_EDIT_DEFORMEDSHAPEANDSCALARMAP, tr("MEN_EDIT_PRS"), QIcon(), tr("MEN_EDIT_PRS"), "", 0, aParent, false, - this, SLOT(OnEditScalarMapOnDeformedShape())); - + this, SLOT(OnEditDeformedShapeAndScalarMap())); createAction( VISU_CREATE_TABLE, tr("MEN_CREATE_TABLE"), QIcon(), tr("MEN_CREATE_TABLE"), "", 0, aParent, false, @@ -2438,7 +2529,7 @@ VisuGUI createMenu( VISU_CUT_LINES, aMenuId, 10 ); // cut lines createMenu( VISU_STREAM_LINES, aMenuId, 10 ); // stream lines createMenu( VISU_PLOT_3D, aMenuId, 10 ); // Plot3d - createMenu( VISU_SCALAR_MAP_ON_DEFORMED_SHAPE, aMenuId, 10 ); // scalar map on deformed shape + createMenu( VISU_DEFORMED_SHAPE_AND_SCALAR_MAP, aMenuId, 10 ); // scalar map on deformed shape aMenuId = createMenu( tr( "MEN_SELECTION" ), -1, -1, 30 ); createMenu( VISU_SELECTION_INFO, aMenuId, 10 ); // selection info @@ -2470,7 +2561,7 @@ VisuGUI createTool( VISU_CUT_LINES, aToolId ); createTool( VISU_STREAM_LINES, aToolId ); createTool( VISU_PLOT_3D, aToolId ); - createTool( VISU_SCALAR_MAP_ON_DEFORMED_SHAPE, aToolId ); + createTool( VISU_DEFORMED_SHAPE_AND_SCALAR_MAP, aToolId ); aToolId = createTool(tr("TOOL_REPRESENTATION")); createTool( VISU_POINTS, aToolId ); @@ -2504,7 +2595,7 @@ VisuGUI mgr->insert( action( VISU_VECTORS ), -1, -1, -1 ); // vectors mgr->insert( action( VISU_STREAM_LINES ), -1, -1, -1 ); // stream lines mgr->insert( action( VISU_PLOT_3D ), -1, -1, -1 ); // Plot3d - mgr->insert( action( VISU_SCALAR_MAP_ON_DEFORMED_SHAPE ), -1, -1, -1 ); // scalar map on deformed shape + mgr->insert( action( VISU_DEFORMED_SHAPE_AND_SCALAR_MAP ), -1, -1, -1 ); // scalar map on deformed shape mgr->insert( action( VISU_CREATE_PRS ), -1, -1, -1 ); // create presentation mgr->insert( action( VISU_CREATE_MANY_PRS ), -1, -1, -1 ); // create presentations @@ -2520,8 +2611,9 @@ VisuGUI mgr->insert( action( VISU_EDIT_VECTORS ), -1, -1, -1 ); mgr->insert( action( VISU_EDIT_STREAMLINES ), -1, -1, -1 ); mgr->insert( action( VISU_EDIT_PLOT3D ), -1, -1, -1 ); - mgr->insert( action( VISU_EDIT_SCALARMAPONDEFORMEDSHAPE ), -1, -1, -1 ); + mgr->insert( action( VISU_EDIT_DEFORMEDSHAPEANDSCALARMAP ), -1, -1, -1 ); mgr->insert( action( VISU_EDIT_CONTAINER ), -1, -1, -1 ); + mgr->insert( action( VISU_EDIT_POINTMAP3D ), -1, -1, -1 ); // rename mgr->insert( action( VISU_RENAME ), -1, -1, -1 ); @@ -2533,9 +2625,9 @@ VisuGUI mgr->insert( action( VISU_CLEAR_CONTAINER ), -1, -1, -1 ); // table commands - //mgr->insert( action( VISU_SHOW_TABLE ), -1, -1, -1 ); // show table - //mgr->insert( action( VISU_CREATE_CURVES ), -1, -1, -1 ); // create curves - //mgr->insert( action( VISU_EXPORT_TABLE ), -1, -1, -1 ); // export table + mgr->insert( action( VISU_SHOW_TABLE ), -1, -1, -1 ); // show table + mgr->insert( action( VISU_CREATE_CURVES ), -1, -1, -1 ); // create curves + mgr->insert( action( VISU_EXPORT_TABLE ), -1, -1, -1 ); // export table mgr->insert( separator(), -1, -1, -1 ); @@ -2602,7 +2694,7 @@ VisuGUI QString aPrsAll ("'VISU::TSCALARMAP' 'VISU::TISOSURFACES' 'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' " "'VISU::TCUTLINES' 'VISU::TVECTORS' 'VISU::TSTREAMLINES' 'VISU::TPLOT3D' " - "'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TCOLOREDPRS3DHOLDER'"); + "'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP' 'VISU::TCOLOREDPRS3DHOLDER'"); // VISU root commands QString aRule = "client='ObjectBrowser' and selcount=1 and type='VISU::TVISUGEN'"; @@ -2621,24 +2713,24 @@ VisuGUI mgr->setRule( action( VISU_DEFORMED_SHAPE ), aRule ); mgr->setRule( action( VISU_VECTORS ), aRule ); mgr->setRule( action( VISU_STREAM_LINES ), aRule ); - mgr->setRule( action( VISU_SCALAR_MAP_ON_DEFORMED_SHAPE ), aRule ); + mgr->setRule( action( VISU_DEFORMED_SHAPE_AND_SCALAR_MAP ), aRule ); // display/erase commands QString andInvisible = " and (((not isVisible) and isActiveView) or (not isActiveView))"; QString aTableOrCont = "(type='VISU::TTABLE' and nbChildren>0) or type='VISU::TCONTAINER'"; QString orCurveVisible = "or (type='VISU::TCURVE' and isVisible)"; QString orCurveInvisible = "or (type='VISU::TCURVE'" + andInvisible + ")"; - QString aPrsVisible = "(($type in {'VISU::TMESH' " + aPrsAll + "}) and isVisible)"; - QString aPrsInvisible = "(($type in {'VISU::TMESH' " + aPrsAll + "})" + andInvisible + ")"; + QString aPrsVisible = "(($type in {'VISU::TMESH' 'VISU::TPOINTMAP3D'" + aPrsAll + "}) and isVisible)"; + QString aPrsInvisible = "(($type in {'VISU::TMESH' 'VISU::TPOINTMAP3D'" + aPrsAll + "})" + andInvisible + ")"; QString aComponent = "( selcount=1 and canBeDisplayed and isVisuComponent )"; QString anEraseRule = "( selcount>0 and ({true} in $canBeDisplayed) and (" + aPrsVisible + " or (client='ObjectBrowser' and (" + aTableOrCont + orCurveVisible + "))) ) or " + aComponent; QString aDisplayRule = "( selcount>0 and ({true} in $canBeDisplayed) and (" + aPrsInvisible + - " or (client='ObjectBrowser' and (" + aTableOrCont + orCurveInvisible + "))) ) or" + aComponent; + " or (client='ObjectBrowser' and (" + aTableOrCont + orCurveInvisible + "))) ) or " + aComponent; - QString aDOnlyRule = "( selcount>0 and ({true} in $canBeDisplayed) and (($type in {'VISU::TMESH' " + aPrsAll + "})" + QString aDOnlyRule = "( selcount>0 and ({true} in $canBeDisplayed) and (($type in {'VISU::TMESH' 'VISU::TPOINTMAP3D'" + aPrsAll + "})" " or (client='ObjectBrowser' and ((type='VISU::TTABLE' and nbChildren>0) or" " ($type in {'VISU::TCURVE' 'VISU::TCONTAINER'})))) ) or" + aComponent; @@ -2646,7 +2738,7 @@ VisuGUI mgr->setRule( action( VISU_DISPLAY ), aDisplayRule ); mgr->setRule( action( VISU_DISPLAY_ONLY ), aDOnlyRule ); - aRule = "selcount>0 and $type in {'VISU::TMESH' " + aPrsAll + "}"; + aRule = "selcount>0 and $type in {'VISU::TMESH' 'VISU::TPOINTMAP3D' 'VISU::TGAUSSPOINTS'" + aPrsAll + "}"; mgr->setRule( action( VISU_TRANSLATE_PRS ), aRule ); aRule = "selcount>1 and $type in {'VISU::TMESH' " + aPrsAll + "}"; @@ -2663,14 +2755,15 @@ VisuGUI mgr->setRule( action( VISU_ARRANGE_ACTORS ), "$client in {'VTKViewer' 'VVTK'} and selcount=0" ); // 3D presentations commands - QString aPrsType = " and $type in {'VISU::TMESH' " + aPrsAll + "}"; - QString anInsideType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE'}"; - QString aSurfFrameType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP''VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE'}"; + QString aPrsType = " and $type in {'VISU::TMESH'" + aPrsAll + "}"; + QString aPrsType2 = " and $type in {'VISU::TMESH' 'VISU::TPOINTMAP3D'" + aPrsAll + "}"; + QString anInsideType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP'}"; + QString aSurfFrameType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP''VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP'}"; QString aSurfType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TSCALARMAP' 'VISU::TISOSURFACES' 'VISU::TDEFORMEDSHAPE' 'VISU::TCUTPLANES' " - " 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE'}"; - QString aShrinkType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE'}"; + " 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP' 'VISU::TPOINTMAP3D'}"; + QString aShrinkType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TDEFORMEDSHAPE' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP' 'VISU::TPOINTMAP3D'}"; QString aLineType = " and $type in {'VISU::TMESH' 'VISU::TSCALARMAP' 'VISU::TSCALARMAP' 'VISU::TISOSURFACES' 'VISU::TDEFORMEDSHAPE' " - "'VISU::TCUTPLANES' 'VISU::TCUTLINES' 'VISU::TSTREAMLINES' 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE' }"; + "'VISU::TCUTPLANES' 'VISU::TCUTLINES' 'VISU::TSTREAMLINES' 'VISU::TPLOT3D' 'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP' 'VISU::TPOINTMAP3D'}"; aRule = "selcount=1"; mgr->setRule( action( VISU_CLIPPING ), aRule + aPrsType ); @@ -2683,7 +2776,7 @@ VisuGUI QString aNotSurffr = " and $representation in {'VISU::POINT' 'VISU::WIREFRAME' 'VISU::SHADED' 'VISU::INSIDEFRAME'}"; mgr->setRule( action( VISU_POINTS ) , aRule + aPrsType + aNotPoints ); - mgr->setRule( action( VISU_WIREFRAME ) , aRule + aPrsType + aNotWirefr ); + mgr->setRule( action( VISU_WIREFRAME ) , aRule + aPrsType2 + aNotWirefr ); mgr->setRule( action( VISU_SURFACE ) , aRule + aSurfType + aNotSurfac ); mgr->setRule( action( VISU_INSIDEFRAME ) , aRule + anInsideType + aNotInside ); mgr->setRule( action( VISU_SURFACEFRAME ), aRule + aSurfFrameType + aNotSurffr ); @@ -2704,19 +2797,25 @@ VisuGUI mgr->setRule( action( VISU_LINE_WIDTH ), aRule + aLineType + " and hasActor=1" ); // rename command - QString aCurveAll = "'VISU::TTABLE' 'VISU::TCURVE' 'VISU::TCONTAINER'"; + QString aCurveAll = "'VISU::TTABLE' 'VISU::TCURVE' 'VISU::TCONTAINER' 'VISU::POINTMAP3D'"; - aRule = "selcount=1 and ($type in {'VISU::TVIEW3D' 'VISU::TMESH' " + aCurveAll + " " + aPrsAll + "})"; + aRule = "selcount=1 and ($type in {'VISU::TVIEW3D' 'VISU::TMESH' 'VISU::TPOINTMAP3D' " + aCurveAll + " " + aPrsAll + "})"; mgr->setRule( action( VISU_RENAME ), aRule ); // copy presentation command aRule = "selcount=1 and ($type in {" + aPrsAll + "})"; mgr->setRule( action( VISU_COPY_PRS ), aRule ); - // curve commands + // Curve commands aRule = "selcount=1 and type='VISU::TCURVE'"; mgr->setRule( action( VISU_CURVE_PROPS ), aRule ); + // Table Commands + aRule = "selcount=1 and ( type='VISU::TPOINTMAP3D' or type='VISU::TTABLE')"; + mgr->setRule( action( VISU_SHOW_TABLE ), aRule ); + mgr->setRule( action( VISU_CREATE_CURVES ), aRule ); + mgr->setRule( action( VISU_EXPORT_TABLE ), aRule ); + // curve container commands aRule = "client='ObjectBrowser' and selcount=1 and type='VISU::TCONTAINER'"; mgr->setRule( action( VISU_EDIT_CONTAINER ), aRule ); @@ -2726,8 +2825,8 @@ VisuGUI "selcount=1 and type='VISU::TSCALARMAP'" ); mgr->setRule( action( VISU_EDIT_DEFORMEDSHAPE ), "selcount=1 and type='VISU::TDEFORMEDSHAPE'" ); - mgr->setRule( action( VISU_EDIT_SCALARMAPONDEFORMEDSHAPE ), - "selcount=1 and type='VISU::TSCALARMAPONDEFORMEDSHAPE'" ); + mgr->setRule( action( VISU_EDIT_DEFORMEDSHAPEANDSCALARMAP ), + "selcount=1 and $type in {'VISU::TSCALARMAPONDEFORMEDSHAPE' 'VISU::TDEFORMEDSHAPEANDSCALARMAP'}" ); mgr->setRule( action( VISU_EDIT_CUTPLANES ), "selcount=1 and type='VISU::TCUTPLANES'" ); mgr->setRule( action( VISU_EDIT_CUTLINES ), @@ -2740,6 +2839,8 @@ VisuGUI "selcount=1 and type='VISU::TSTREAMLINES'" ); mgr->setRule( action( VISU_EDIT_PLOT3D ), "selcount=1 and type='VISU::TPLOT3D'" ); + mgr->setRule( action( VISU_EDIT_POINTMAP3D ), + "selcount=1 and type='VISU::TPOINTMAP3D'" ); aRule = "selcount=1 and type='VISU::TCUTLINES' and nbNamedChildren=0"; mgr->setRule( action( VISU_CREATE_TABLE ), aRule ); @@ -2820,6 +2921,14 @@ void VisuGUI::contextMenuPopup( const QString& theClient, QMenu* theMenu, QStrin _PTR(SObject) aSObject = aCStudy->FindObjectID(anIO->getEntry()); if ( !aSObject ) continue; + + if ( !isOBClient ) { + QString aName = QString( aSObject->GetName().c_str() ); + while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of popup + aName.remove( (aName.length() - 1), 1 ); + theTitle = aName; + } + CORBA::Object_var aCORBAObject = VISU::ClientSObjectToObject(aSObject); if (CORBA::is_nil(aCORBAObject)) { VISU::VISUType aType = VISU::Storable::SObject2Type( aSObject ); @@ -2916,21 +3025,11 @@ void VisuGUI::contextMenuPopup( const QString& theClient, QMenu* theMenu, QStrin theMenu->addAction( action( VISU_SHOW_ANIMATION ) ); } else if (isOBClient) { if (IsSObjectTable(aSObject)) { - theMenu->removeAction( action( VISU_DELETE_OBJS ) ); - if (aType == VISU::TPOINTMAP3D) { - theMenu->addAction( action( VISU_SHOW_TABLE_PLOT ) ); - theMenu->addSeparator(); - theMenu->addAction( action( VISU_ERASE ) ); - theMenu->addAction( action( myEraseAll ) ); - theMenu->addAction( action( VISU_DISPLAY ) ); - theMenu->addAction( action( VISU_DISPLAY_ONLY ) ); - theMenu->addSeparator(); - } - theMenu->addAction( action( VISU_SHOW_TABLE ) ); + /* action( VISU_SHOW_TABLE )->addTo(theMenu); theMenu->addAction( action( VISU_CREATE_CURVES ) ); theMenu->addAction( action( VISU_EXPORT_TABLE ) ); theMenu->addSeparator(); - theMenu->addAction( action( VISU_DELETE_OBJS ) ); + action( VISU_DELETE_OBJS )->addTo(theMenu);*/// dmv - code was moved up } else { if (!CORBA::is_nil(anObject)) { SALOME_MED::MED_var aMED = SALOME_MED::MED::_narrow(anObject); @@ -2952,17 +3051,6 @@ void VisuGUI::contextMenuPopup( const QString& theClient, QMenu* theMenu, QStrin } } } - } else { - if (aType == VISU::TPOINTMAP3D) { - theMenu->removeAction( action( myEraseAll ) ); - theMenu->addAction( action( VISU_SHOW_TABLE_PLOT ) ); - theMenu->addSeparator(); - theMenu->addAction( action( VISU_ERASE ) ); - theMenu->addAction( action( myEraseAll ) ); - theMenu->addAction( action( VISU_DISPLAY ) ); - theMenu->addAction( action( VISU_DISPLAY_ONLY ) ); - theMenu->addSeparator(); - } } } @@ -3015,6 +3103,9 @@ VisuGUI shortcuts.append( QKeySequence(Qt::CTRL + Qt::Key_I) ); action(VISU_IMPORT_FROM_FILE)->setShortcuts(shortcuts); + action(VISU_DELETE_OBJS)->setEnabled(true); // Delete: Key_Delete + action(VISU_RENAME )->setEnabled(true); // Rename: Key_F2 + return true; } @@ -3027,7 +3118,10 @@ VisuGUI setToolShown( false ); // Unset actions accelerator keys - action(VISU_IMPORT_FROM_FILE)->setShortcuts(QKeySequence::UnknownKey); + action(VISU_IMPORT_FROM_FILE)->setShortcuts(QKeySequence::UnknownKey); // Import: CTRL + Key_I + + action(VISU_DELETE_OBJS)->setEnabled(false); // Delete: Key_Delete + action(VISU_RENAME )->setEnabled(false); // Rename: Key_F2 SalomeApp_Module::deactivateModule( theStudy ); return true; @@ -3452,17 +3546,28 @@ void VisuGUI::createPreferences() setPreferenceProperty( sp, "hstretch", 0 ); setPreferenceProperty( sp, "vstretch", 0 ); - int scalar_def_represent = addPreference( tr( "VISU_SCALAR_MAP_ON_DEFORMED_SHAPE" ), representGr, LightApp_Preferences::Selector, "VISU", "scalar_def_represent" ); + int scalar_def_represent = addPreference( tr( "VISU_DEFORMED_SHAPE_AND_SCALAR_MAP" ), representGr, LightApp_Preferences::Selector, "VISU", "scalar_def_represent" ); setPreferenceProperty( scalar_def_represent, "strings", modes1 ); setPreferenceProperty( scalar_def_represent, "indexes", indices1 ); addPreference( tr( "VISU_SHRINK" ), representGr, LightApp_Preferences::Bool, "VISU", "scalar_def_shrink" ); + int point_precision = addPreference( tr( "VISU_FLOATING_POINT_PRECISION" ), representGr, + LightApp_Preferences::IntSpin, "VISU", "floating_point_precision" ); + setPreferenceProperty( point_precision, "min", 1 ); + setPreferenceProperty( point_precision, "max", 16 ); + setPreferenceProperty( point_precision, "step", 1 ); + addPreference( "", representGr, LightApp_Preferences::Space ); + addPreference( tr( "VISU_USE_SHADING" ), representGr, LightApp_Preferences::Bool, "VISU", "represent_shading" ); sp = addPreference( "", representGr, LightApp_Preferences::Space ); setPreferenceProperty( sp, "hstretch", 0 ); setPreferenceProperty( sp, "vstretch", 0 ); addPreference( tr( "VISU_DISP_ONLY" ), representGr, LightApp_Preferences::Bool, "VISU", "display_only" ); + addPreference( "", representGr, LightApp_Preferences::Space ); + + addPreference( tr( "VISU_AUTOMATIC_FIT_ALL" ), representGr, + LightApp_Preferences::Bool, "VISU", "automatic_fit_all" ); // TAB: 3D Cache ; group: "Cache properties" int cacheTab = addPreference( tr( "3D Cache" ) ); diff --git a/src/VISUGUI/VisuGUI.h b/src/VISUGUI/VisuGUI.h index a4f00aac..f2d18169 100644 --- a/src/VISUGUI/VisuGUI.h +++ b/src/VISUGUI/VisuGUI.h @@ -106,7 +106,7 @@ protected slots: void OnCreatePlot3D(); void OnCreateManyMesh(); void OnCreatePlot2dView(); - void OnCreateScalarMapOnDeformedShape(); + void OnCreateDeformedShapeAndScalarMap(); void OnEditScalarMap(); void OnEditDeformedShape(); @@ -116,7 +116,7 @@ protected slots: void OnEditVectors(); void OnEditStreamLines(); void OnEditPlot3D(); - void OnEditScalarMapOnDeformedShape(); + void OnEditDeformedShapeAndScalarMap(); virtual void OnDisplayPrs(); virtual void OnDisplayOnlyPrs(); diff --git a/src/VISUGUI/VisuGUI_ActionsDef.h b/src/VISUGUI/VisuGUI_ActionsDef.h index aab3df54..5c1083fa 100644 --- a/src/VISUGUI/VisuGUI_ActionsDef.h +++ b/src/VISUGUI/VisuGUI_ActionsDef.h @@ -39,13 +39,13 @@ #define VISU_CUT_LINES 4017 #define VISU_PLOT2D 4018 #define VISU_PLOT_3D 4019 -#define VISU_SCALAR_MAP_ON_DEFORMED_SHAPE 40110 +#define VISU_DEFORMED_SHAPE_AND_SCALAR_MAP 40110 //#define VISU_DELETE 4021 #define VISU_DELETE_OBJS 4022 #define VISU_SHOW_TABLE 4023 -#define VISU_SHOW_TABLE_PLOT 4029 +#define VISU_EDIT_POINTMAP3D 4029 #define VISU_CREATE_CURVES 4024 #define VISU_EXPORT_TABLE 4025 @@ -92,7 +92,7 @@ #define VISU_EDIT_VECTORS 40625 #define VISU_EDIT_STREAMLINES 40626 #define VISU_EDIT_PLOT3D 40627 -#define VISU_EDIT_SCALARMAPONDEFORMEDSHAPE 40628 +#define VISU_EDIT_DEFORMEDSHAPEANDSCALARMAP 40628 #define VISU_EDIT_PRS 4062 #define VISU_CREATE_TABLE 4063 diff --git a/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx b/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx index e99b70e5..6eef1a49 100644 --- a/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx +++ b/src/VISUGUI/VisuGUI_CutPlanesDlg.cxx @@ -37,6 +37,7 @@ #include "VISU_ColoredPrs3dFactory.hh" #include "VISU_CutPlanes_i.hh" +#include "VISU_Result_i.hh" #include "VISU_CutPlanesPL.hxx" //#include "OB_Browser.h" @@ -70,11 +71,13 @@ #include #include #include +#include #include #include #include #include +#include using namespace std; @@ -166,6 +169,34 @@ VisuGUI_CutPlanesPane::VisuGUI_CutPlanesPane (QWidget* theParent) QLabel* aPosLbl = new QLabel(tr( "LBL_POS" ), this); myPosSpn = new QtxDoubleSpinBox( 0, 1, 0.1, this ); + GDeformation = new QGroupBox(tr("LBL_DEFORMATION"), this); + GDeformation->setCheckable(true); + GDeformation->setChecked(false); + QGridLayout* GDeformationLayout = new QGridLayout( GDeformation ); + GDeformationLayout->setSpacing( 6 ); + GDeformationLayout->setMargin( 11 ); + connect(GDeformation, SIGNAL(toggled(bool)), this, SLOT(onDeformationCheck(bool))); + + QLabel* LabelDeformation1 = new QLabel (tr("LBL_DEFROMATION_VECT"), GDeformation); + GDeformationLayout->addWidget( LabelDeformation1, 0, 0 ); + + myVectorialFieldCombo = new QComboBox (GDeformation); + GDeformationLayout->addWidget( myVectorialFieldCombo, 0, 1 ); + + QLabel* LabelDeformation2 = new QLabel (tr("LBL_DEFROMATION_SCALE"), GDeformation); + GDeformationLayout->addWidget( LabelDeformation2, 1, 0 ); + myScaleSpn = new QtxDoubleSpinBox (0.0, 1.0E+38, 0.1, GDeformation); + myScaleSpn->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); + GDeformationLayout->addWidget( myScaleSpn, 1, 1 ); + connect(myVectorialFieldCombo, SIGNAL(activated(int)), this, SLOT(onVectorialFieldChanged(int))); + connect(myScaleSpn, SIGNAL(valueChanged(double)), this, SLOT(onScaleFactorChanged(double))); + + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + int aPrecision = aResourceMgr->integerValue( "VISU", "floating_point_precision", 0 ); + + myScaleSpn->setDecimals( aPrecision*(-1) ); + myScaleSpn->setValue(0.1); + myPreviewCheck = new QCheckBox(tr("LBL_SHOW_PREVIEW"), this); myPreviewCheck->setChecked(false); connect( myPreviewCheck, SIGNAL( toggled( bool )), this, SLOT( onPreviewCheck( bool ) ) ); @@ -178,7 +209,8 @@ VisuGUI_CutPlanesPane::VisuGUI_CutPlanesPane (QWidget* theParent) TopLayout->setRowStretch ( 3, 3 ); TopLayout->addWidget(aPosLbl, 4, 0 ); TopLayout->addWidget(myPosSpn, 4, 1 ); - TopLayout->addWidget( myPreviewCheck, 5, 0, 1, 2 ); + TopLayout->addWidget( GDeformation, 5, 0, 1, 2 ); + TopLayout->addWidget( myPreviewCheck, 6, 0, 1, 2 ); // signals and slots connections connect( SelPlane, SIGNAL( buttonClicked( int )), this, SLOT( orientationChanged( int ) ) ); @@ -208,6 +240,24 @@ void VisuGUI_CutPlanesPane::initFromPrsObject (VISU::CutPlanes_i* thePrs) setRotation(thePrs->GetRotateX()*180./PI, thePrs->GetRotateY()*180./PI); setPlanePos(thePrs->GetOrientationType()); myPosSpn->setValue(thePrs->GetDisplacement()); + InitEntity2VectorialFieldsMap(thePrs); + InsertAllVectorialFields(); + setScaleFactor(thePrs->GetScale()); + if(myEntity2VectorialFields.size() < 1) + GDeformation->setDisabled(true); + else{ + if(thePrs->IsDeformed()){ + GDeformation->setChecked(true); + int idx = myVectorialFieldCombo->findText(thePrs->GetVectorialFieldName()); + if (idx >= 0) + myVectorialFieldCombo->setCurrentIndex(idx); + else { + myVectorialFieldCombo->addItem(thePrs->GetVectorialFieldName()); + myVectorialFieldCombo->setCurrentIndex(myVectorialFieldCombo->count()-1); + } + } + } + hasInit = true; // init table myCutPlanes = VISU::TSameAsFactory().Create(thePrs, VISU::ColoredPrs3d_i::EDoNotPublish); @@ -220,19 +270,76 @@ void VisuGUI_CutPlanesPane::initFromPrsObject (VISU::CutPlanes_i* thePrs) } } +void VisuGUI_CutPlanesPane::InitEntity2VectorialFieldsMap(VISU::ColoredPrs3d_i* thePrs){ + + VISU::Result_var theResult = thePrs->GetResultObject(); + VISU::Result_i* aResult = dynamic_cast(GetServant(theResult).in()); + VISU::Result::Entities_var aEntities = aResult->GetEntities(thePrs->GetMeshName()); + VISU::Result::TimeStampNumbers_var aScalarTimeStamp = aResult->GetTimeStampNumbers(thePrs->GetMeshName(), + thePrs->GetEntity(), + thePrs->GetFieldName()); + CORBA::Long aTimeStampNumber = aScalarTimeStamp->length(); + + for(size_t iEntity = 0; iEntity < aEntities->length(); iEntity++){ + VISU::Entity aEntity = aEntities[iEntity]; + VISU::Result::EntityNames_var aFields = aResult->GetFields(thePrs->GetMeshName(),aEntity); + for(size_t iField = 0; iField < aFields->length(); iField++){ + + TVectorialFieldsList aVectorialFields; + VISU::Result::TimeStampNumbers_var aTimeStamps = aResult->GetTimeStampNumbers(thePrs->GetMeshName(),aEntity,aFields[iField] ); + + if((aResult->GetNumberOfComponents(thePrs->GetMeshName(),aEntity,aFields[iField] ) > 1) && + (aTimeStamps->length() >= aTimeStampNumber)){ + aVectorialFields.push_back(QString(aFields[iField].in())); + } + if(aVectorialFields.size() > 0){ + myEntity2VectorialFields.insert(TEntVectPair(aEntity,aVectorialFields)); + } + } + } +} + +void VisuGUI_CutPlanesPane::InsertAllVectorialFields(){ + TEntity2VectorialFields::const_iterator aFieldIter = myEntity2VectorialFields.begin(); + for( ;aFieldIter != myEntity2VectorialFields.end();aFieldIter++ ){ + TVectorialFieldsList aVectorialFields = aFieldIter->second; + for(size_t iField = 0;iField < aVectorialFields.size(); iField++) + myVectorialFieldCombo->addItem(aVectorialFields[iField]); + } +} + +double VisuGUI_CutPlanesPane::getScaleFactor(){ + return myScaleSpn->value(); +} + +void VisuGUI_CutPlanesPane::setScaleFactor(double theFactor){ + double i=0.1; + while (1) { // Calculate Step & Precission + if ( int (theFactor/i) >= 0) + break; + else { + i = i*0.1; + } + } + + myScaleSpn->setSingleStep(i); + myScaleSpn->setValue(theFactor); + +} + void VisuGUI_CutPlanesPane::createPlanes() { if (VISU::GetActiveViewWindow() == NULL) return; if (!myCutPlanes) return; if (myPreviewActor != 0) return; - vtkAppendPolyData* aPolyData = myCutPlanes->GetSpecificPL()->GetAppendPolyData(); - if (!aPolyData->GetOutput()->GetNumberOfCells()) { + vtkDataSet* aDataSet = myCutPlanes->GetSpecificPL()->GetWarpVectorOutput(); + if (!aDataSet->GetNumberOfCells()) { onPreviewCheck(false); return; } vtkDataSetMapper* aPlaneMapper = vtkDataSetMapper::New(); - aPlaneMapper->SetInput(aPolyData->GetOutput()); + aPlaneMapper->SetInput(aDataSet); aPlaneMapper->ScalarVisibilityOff(); myPreviewActor = SALOME_Actor::New(); @@ -256,6 +363,31 @@ int VisuGUI_CutPlanesPane::storeToPrsObject (VISU::CutPlanes_i* thePrs) else thePrs->SetDefault(i); } + + thePrs->UseDeformation(GDeformation->isChecked()); + + if(GDeformation->isChecked()){ + TEntity2VectorialFields::const_iterator anIter = myEntity2VectorialFields.begin(); + VISU::Entity anEntity; + QString aFieldName; + bool isInited = false; + for(;anIter != myEntity2VectorialFields.end();anIter++){ + TVectorialFieldsList aFields = anIter->second; + for(int it = 0;it < aFields.size();it++) + if(!QString::compare(aFields[it], myVectorialFieldCombo->currentText ())){ + anEntity = anIter->first; + aFieldName = aFields[it]; + isInited = true; + break; + } + if(isInited) + break; + } + if(isInited) + thePrs->SetVectorialField(anEntity,aFieldName.toLatin1().constData()); + + thePrs->SetScale(myScaleSpn->value()); + } return 1; } @@ -324,6 +456,45 @@ void VisuGUI_CutPlanesPane::setRotation (const double r1, const double r2) Rot2->setValue( r2 ); } +void VisuGUI_CutPlanesPane::onScaleFactorChanged(double theFactor){ + DrawTable(); +} + +void VisuGUI_CutPlanesPane::onVectorialFieldChanged(int pos){ + InitVectorialField(); + DrawTable(); +} + +void VisuGUI_CutPlanesPane::onDeformationCheck(bool Flag){ + if(!myCutPlanes || !hasInit) return; + myCutPlanes->UseDeformation(Flag); + InitVectorialField(); + DrawTable(); +} + +void VisuGUI_CutPlanesPane::InitVectorialField(){ + if(myCutPlanes->IsDeformed()){ + TEntity2VectorialFields::const_iterator anIter = myEntity2VectorialFields.begin(); + VISU::Entity anEntity; + QString aFieldName; + bool isInited = false; + for(;anIter != myEntity2VectorialFields.end();anIter++){ + TVectorialFieldsList aFields = anIter->second; + for(int it = 0;it < aFields.size();it++) + if(!QString::compare(aFields[it], myVectorialFieldCombo->currentText ())){ + anEntity = anIter->first; + aFieldName = aFields[it]; + isInited = true; + break; + } + if(isInited) + break; + } + if(isInited) + myCutPlanes->SetVectorialField(anEntity,aFieldName.toLatin1().constData()); + } +} + /*! Draw the table of planes positions */ @@ -338,6 +509,7 @@ void VisuGUI_CutPlanesPane::DrawTable() myCutPlanes->SetOrientation(getOrientaion(),getRotation1()*PI/180.,getRotation2()*PI/180.); myCutPlanes->SetNbPlanes(aNbPlanes); myCutPlanes->SetDisplacement(myPosSpn->value()); + myCutPlanes->SetScale(getScaleFactor()); if (aNbRows>0) for (int i = 0; i < aNbRows; ++i) { QTableWidgetItem* aItem = myPosTable->item( i, 1 ); @@ -571,7 +743,9 @@ void VisuGUI_CutPlanesPane::onPreviewCheck (bool thePreview) storeToPrsObject(myCutPlanes); myCutPlanes->GetPipeLine()->Update(); createPlanes(); - vf->onFitAll(); + if(VISU::GetResourceMgr()->booleanValue("VISU","automatic_fit_all",false)) { + vf->onFitAll(); + } } else { deletePlanes(); vf->Repaint(); diff --git a/src/VISUGUI/VisuGUI_CutPlanesDlg.h b/src/VISUGUI/VisuGUI_CutPlanesDlg.h index 064a457d..a3b0b7e5 100644 --- a/src/VISUGUI/VisuGUI_CutPlanesDlg.h +++ b/src/VISUGUI/VisuGUI_CutPlanesDlg.h @@ -42,15 +42,18 @@ class QRadioButton; class QTabWidget; class QTableWidget; class QCheckBox; - - +class QComboBox; #include "SALOMEconfig.h" #include CORBA_CLIENT_HEADER(VISU_Gen) +#include +#include + namespace VISU { class CutPlanes_i; + class Result_i; }; class SUIT_ViewWindow; @@ -74,15 +77,28 @@ public: double getRotation1() {return Rot1->value();} double getRotation2() {return Rot2->value();} - void initFromPrsObject(VISU::CutPlanes_i* thePrs); - int storeToPrsObject(VISU::CutPlanes_i* thePrs); + double getScaleFactor(); + void setScaleFactor(double factor); + + void initFromPrsObject(VISU::CutPlanes_i* thePrs); + int storeToPrsObject(VISU::CutPlanes_i* thePrs); private: + typedef std::vector TVectorialFieldsList; + typedef std::map TEntity2VectorialFields; + typedef std::pair TEntVectPair; + TEntity2VectorialFields myEntity2VectorialFields; + void createPlanes(); void deletePlanes(); + void InitEntity2VectorialFieldsMap(VISU::ColoredPrs3d_i* thePrs); + void InsertAllVectorialFields(); + void InitVectorialField(); + QLabel* LabelRot1; QLabel* LabelRot2; + QGroupBox* GDeformation; QSpinBox* nbPlan; QtxDoubleSpinBox* Rot1; QtxDoubleSpinBox* Rot2; @@ -93,6 +109,8 @@ private: QTableWidget* myPosTable; SALOME::GenericObjPtr myCutPlanes; QCheckBox* myPreviewCheck; + QComboBox* myVectorialFieldCombo; + QtxDoubleSpinBox* myScaleSpn; double X1, X2; double Y1, Y2; double Z1, Z2; @@ -107,6 +125,9 @@ private slots: void onValueChanged(int theRow, int theCol); void onRotation(double theValue); void onPreviewCheck(bool thePreview); + void onScaleFactorChanged(double); + void onDeformationCheck(bool); + void onVectorialFieldChanged(int); }; diff --git a/src/VISUGUI/VisuGUI_ScalarMapOnDeformedShapeDlg.cxx b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx similarity index 73% rename from src/VISUGUI/VisuGUI_ScalarMapOnDeformedShapeDlg.cxx rename to src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx index 069710ee..67c3871d 100644 --- a/src/VISUGUI/VisuGUI_ScalarMapOnDeformedShapeDlg.cxx +++ b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.cxx @@ -21,63 +21,59 @@ // // // -// File : VisuGUI_ScalarMapOnDeformedShapeDlg.cxx +// File : VisuGUI_DeformedShapeAndScalarMapDlg.cxx // Author : Eugeny Nikolaev // Module : VISU -#include "VisuGUI_ScalarMapOnDeformedShapeDlg.h" +#include "VisuGUI_DeformedShapeAndScalarMapDlg.h" #include "VisuGUI_Tools.h" #include "VisuGUI_InputPane.h" #include "VISU_Result_i.hh" -#include "VISU_ScalarMapOnDeformedShape_i.hh" +#include "VISU_DeformedShapeAndScalarMap_i.hh" #include "VISU_ColoredPrs3dFactory.hh" #include "VISU_ScalarMapPL.hxx" -#include "VISU_ScalarMapOnDeformedShapePL.hxx" +#include "VISU_DeformedShapeAndScalarMapPL.hxx" #include "VISU_Convertor.hxx" -#include "SalomeApp_Module.h" -#include "LightApp_Application.h" -#include "LightApp_SelectionMgr.h" -#include "SUIT_Desktop.h" -#include "SUIT_ResourceMgr.h" -#include "SUIT_Session.h" -#include "SUIT_MessageBox.h" +#include +#include +#include +#include +#include +#include +#include +#include -#include "SALOME_ListIO.hxx" +#include -#include "SALOMEDSClient_AttributeString.hxx" -#include "SALOMEDSClient_AttributeName.hxx" +#include +#include -#include +#include +#include +#include #include -#include -#include #include -#include #include -#include -#include - - -using namespace std; +#include #define MYDEBUG 0 /*! * Constructor */ -VisuGUI_ScalarMapOnDeformedShapeDlg::VisuGUI_ScalarMapOnDeformedShapeDlg (SalomeApp_Module* theModule) +VisuGUI_DeformedShapeAndScalarMapDlg::VisuGUI_DeformedShapeAndScalarMapDlg (SalomeApp_Module* theModule) : VisuGUI_ScalarBarBaseDlg(theModule), myIsAnimation(false), myUpdateScalars(true), myVisuGUI(theModule) { setWindowTitle(tr("DLG_TITLE")); - setSizeGripEnabled(TRUE); + setSizeGripEnabled(true); QVBoxLayout* TopLayout = new QVBoxLayout (this); TopLayout->setSpacing(6); @@ -90,11 +86,10 @@ VisuGUI_ScalarMapOnDeformedShapeDlg::VisuGUI_ScalarMapOnDeformedShapeDlg (Salome QVBoxLayout* aVBLay = new QVBoxLayout( aBox ); aVBLay->setMargin(11); QFrame* TopGroup = new QFrame (aBox); - aVBLay->addWidget( TopGroup ); + aVBLay->addWidget(TopGroup); TopGroup->setFrameStyle(QFrame::Box | QFrame::Sunken); TopGroup->setLineWidth(1); QGridLayout* TopGroupLayout = new QGridLayout (TopGroup); - TopGroupLayout->setAlignment(Qt::AlignTop | Qt::AlignCenter); TopGroupLayout->setSpacing(6); TopGroupLayout->setMargin(11); @@ -104,13 +99,17 @@ VisuGUI_ScalarMapOnDeformedShapeDlg::VisuGUI_ScalarMapOnDeformedShapeDlg (Salome ScalFact = new QtxDoubleSpinBox (0.0, 1.0E+38, 0.1, TopGroup); ScalFact->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - ScalFact->setDecimals(38); + + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + int aPrecision = aResourceMgr->integerValue( "VISU", "floating_point_precision", 0 ); + + ScalFact->setDecimals( aPrecision*(-1) ); ScalFact->setValue(0.1); TopGroupLayout->addWidget(ScalFact, 0, 1); // Fields combo box QLabel* FieldLabel = new QLabel (tr("FIELD_ITEM"), TopGroup); - myFieldsCombo = new QComboBox (TopGroup ); + myFieldsCombo = new QComboBox (TopGroup); TopGroupLayout->addWidget(FieldLabel, 1, 0); TopGroupLayout->addWidget(myFieldsCombo,1,1); @@ -121,42 +120,36 @@ VisuGUI_ScalarMapOnDeformedShapeDlg::VisuGUI_ScalarMapOnDeformedShapeDlg (Salome TopGroupLayout->addWidget(TimeStampLabel, 2, 0); TopGroupLayout->addWidget(myTimeStampsCombo,2,1); + TopGroupLayout->setRowStretch(3,5); // - myTabBox->addTab(aBox, tr("SCALAR_MAP_ON_DEFORMED_SHAPE_TAB")); + myTabBox->addTab(aBox, tr("DEFORMED_SHAPE_AND_SCALAR_MAP_TAB")); // Scalar bar pane - myInputPane = new VisuGUI_InputPane(VISU::TSCALARMAPONDEFORMEDSHAPE, theModule, this); + myInputPane = new VisuGUI_InputPane(VISU::TDEFORMEDSHAPEANDSCALARMAP, theModule, this); myTabBox->addTab(GetScalarPane(), tr("SCALAR_BAR_TAB")); myTabBox->addTab(myInputPane, tr("INPUT_TAB")); // Buttons QGroupBox* GroupButtons = new QGroupBox (this); - GroupButtons->setGeometry(QRect(10, 10, 281, 48)); - //GroupButtons->setColumnLayout(0, Qt::Vertical); - //GroupButtons->layout()->setSpacing(0); - //GroupButtons->layout()->setMargin(0); - QGridLayout* GroupButtonsLayout = new QGridLayout (GroupButtons); - GroupButtonsLayout->setAlignment(Qt::AlignTop); + QHBoxLayout* GroupButtonsLayout = new QHBoxLayout(GroupButtons); GroupButtonsLayout->setSpacing(6); GroupButtonsLayout->setMargin(11); - QPushButton* buttonOk = new QPushButton (tr("BUT_OK"), GroupButtons); - buttonOk->setAutoDefault(TRUE); - buttonOk->setDefault(TRUE); - GroupButtonsLayout->addWidget(buttonOk, 0, 0); - - GroupButtonsLayout->addItem(new QSpacerItem (5, 5, QSizePolicy::Expanding, - QSizePolicy::Minimum), 0, 1); + QPushButton* buttonOk = new QPushButton (tr("&OK"), GroupButtons); + buttonOk->setAutoDefault(true); + buttonOk->setDefault(true); + QPushButton* buttonCancel = new QPushButton (tr("&Cancel") , GroupButtons); + buttonCancel->setAutoDefault(true); + QPushButton* buttonHelp = new QPushButton (tr("&Help") , GroupButtons); + buttonHelp->setAutoDefault(true); - QPushButton* buttonCancel = new QPushButton (tr("BUT_CANCEL") , GroupButtons); - buttonCancel->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonCancel, 0, 2); - - QPushButton* buttonHelp = new QPushButton (tr("BUT_HELP") , GroupButtons); - buttonHelp->setAutoDefault(TRUE); - GroupButtonsLayout->addWidget(buttonHelp, 0, 3); + GroupButtonsLayout->addWidget(buttonOk); + GroupButtonsLayout->addSpacing(10); + GroupButtonsLayout->addStretch(); + GroupButtonsLayout->addWidget(buttonCancel); + GroupButtonsLayout->addWidget(buttonHelp); // Add Tab box and Buttons to the top layout TopLayout->addWidget(myTabBox); @@ -170,15 +163,15 @@ VisuGUI_ScalarMapOnDeformedShapeDlg::VisuGUI_ScalarMapOnDeformedShapeDlg (Salome connect(myTimeStampsCombo, SIGNAL(activated(int)), this, SLOT(onTimeStampChanged(int))); } -VisuGUI_ScalarMapOnDeformedShapeDlg::~VisuGUI_ScalarMapOnDeformedShapeDlg() -{} +VisuGUI_DeformedShapeAndScalarMapDlg::~VisuGUI_DeformedShapeAndScalarMapDlg() +{ +} -void VisuGUI_ScalarMapOnDeformedShapeDlg::initFromPrsObject( VISU::ColoredPrs3d_i* thePrs, - bool theInit ) +void VisuGUI_DeformedShapeAndScalarMapDlg::initFromPrsObject( VISU::ColoredPrs3d_i* thePrs, + bool theInit ) { if( theInit ) - myPrsCopy = VISU::TSameAsFactory().Create(thePrs, VISU::ColoredPrs3d_i::EDoNotPublish); - + myPrsCopy = VISU::TSameAsFactory().Create(thePrs, VISU::ColoredPrs3d_i::EDoNotPublish); setFactor(myPrsCopy->GetScale()); myTimeStampsCombo->setDisabled(myIsAnimation); @@ -223,7 +216,7 @@ void VisuGUI_ScalarMapOnDeformedShapeDlg::initFromPrsObject( VISU::ColoredPrs3d_ } break; }} - + aSObject = aSObject->GetFather(); aSObject = aSObject->GetFather(); @@ -262,7 +255,7 @@ void VisuGUI_ScalarMapOnDeformedShapeDlg::initFromPrsObject( VISU::ColoredPrs3d_ TTimeStampNumber2Time& aTimeStampNumber2Time = aFieldName2TimeStamps[aFieldName]; aTimeStampNumber2Time[aTimeIter.toInt()] = GetFloatValueOfTimeStamp(anEntity, - aFieldName.toLatin1().data(), + aFieldName.toLatin1().constData(), aTimeIter.toInt()); } } @@ -270,9 +263,21 @@ void VisuGUI_ScalarMapOnDeformedShapeDlg::initFromPrsObject( VISU::ColoredPrs3d_ } AddAllFieldNames(); } - myFieldsCombo->setCurrentIndex(myFieldsCombo->findText(aFieldName.in())); + int idx = myFieldsCombo->findText(aFieldName.in()); + if (idx >= 0) + myFieldsCombo->setCurrentIndex(idx); + else { + myFieldsCombo->addItem(aFieldName.in()); + myFieldsCombo->setCurrentIndex(myFieldsCombo->count()-1); + } AddAllTimes(myFieldsCombo->currentText()); - myTimeStampsCombo->setCurrentIndex(myTimeStampsCombo->findText(aIteration)); + idx = myTimeStampsCombo->findText(aIteration); + if (idx >= 0) + myTimeStampsCombo->setCurrentIndex(idx); + else { + myTimeStampsCombo->addItem(aIteration); + myTimeStampsCombo->setCurrentIndex(myTimeStampsCombo->count()-1); + } SetScalarField( false ); VisuGUI_ScalarBarBaseDlg::initFromPrsObject(myPrsCopy, theInit); @@ -284,8 +289,29 @@ void VisuGUI_ScalarMapOnDeformedShapeDlg::initFromPrsObject( VISU::ColoredPrs3d_ myTabBox->setCurrentIndex( 0 ); } +double VisuGUI_DeformedShapeAndScalarMapDlg::getFactor() const +{ + return ScalFact->value(); +} + +void VisuGUI_DeformedShapeAndScalarMapDlg::setFactor(double theFactor) +{ + double i=0.1; + while (1) { // Calculate Step & Precission + if ( int (theFactor/i) > 0) + break; + else { + i = i*0.1; + } + } + + ScalFact->setSingleStep(i); + + ScalFact->setValue(theFactor); +} + int -VisuGUI_ScalarMapOnDeformedShapeDlg +VisuGUI_DeformedShapeAndScalarMapDlg ::storeToPrsObject(VISU::ColoredPrs3d_i* thePrs) { if(!myInputPane->check() || !GetScalarPane()->check()) @@ -297,32 +323,31 @@ VisuGUI_ScalarMapOnDeformedShapeDlg myPrsCopy->SetScale(getFactor()); myPrsCopy->SetScalarField(myPrsCopy->GetScalarEntity(), - getCurrentScalarFieldName().toLatin1().data(), + getCurrentScalarFieldName().toLatin1().constData(), myTimeStampID[ myTimeStampsCombo->currentIndex() ]); - if(myUpdateScalars) SetScalarField( false ); - VISU::TSameAsFactory().Copy(myPrsCopy, thePrs); + VISU::TSameAsFactory().Copy(myPrsCopy, thePrs); return anIsOk; } -int VisuGUI_ScalarMapOnDeformedShapeDlg::getCurrentScalarFieldNamePos(){ +int VisuGUI_DeformedShapeAndScalarMapDlg::getCurrentScalarFieldNamePos(){ return myFieldsCombo->currentIndex(); } -QString VisuGUI_ScalarMapOnDeformedShapeDlg::getCurrentScalarFieldName(){ +QString VisuGUI_DeformedShapeAndScalarMapDlg::getCurrentScalarFieldName(){ return myFieldsCombo->currentText(); } -int VisuGUI_ScalarMapOnDeformedShapeDlg::getCurrentScalarNbIterations(){ +int VisuGUI_DeformedShapeAndScalarMapDlg::getCurrentScalarNbIterations(){ return myTimeStampsCombo->count(); } VISU::Entity -VisuGUI_ScalarMapOnDeformedShapeDlg +VisuGUI_DeformedShapeAndScalarMapDlg ::getCurrentScalarEntity() { VISU::Entity anEntity = VISU::Entity(-1); @@ -341,12 +366,12 @@ VisuGUI_ScalarMapOnDeformedShapeDlg return anEntity; } -void VisuGUI_ScalarMapOnDeformedShapeDlg::SetScalarField( const bool save_scalar_pane ){ +void VisuGUI_DeformedShapeAndScalarMapDlg::SetScalarField( const bool save_scalar_pane ){ SetScalarField( myTimeStampID[ myTimeStampsCombo->currentIndex() ], "", save_scalar_pane ); } void -VisuGUI_ScalarMapOnDeformedShapeDlg +VisuGUI_DeformedShapeAndScalarMapDlg ::SetScalarField(int theIter, QString theFieldName, const bool save_scalar_pane ) @@ -366,7 +391,7 @@ VisuGUI_ScalarMapOnDeformedShapeDlg VISU::Entity anEntity = getCurrentScalarEntity(); myPrsCopy->SetScalarField(anEntity, - aFieldName.toLatin1().data(), + aFieldName.toLatin1().constData(), theIter); if( save_scalar_pane ) @@ -375,22 +400,22 @@ VisuGUI_ScalarMapOnDeformedShapeDlg QApplication::restoreOverrideCursor(); } -void VisuGUI_ScalarMapOnDeformedShapeDlg::accept() +void VisuGUI_DeformedShapeAndScalarMapDlg::accept() { VisuGUI_ScalarBarBaseDlg::accept(); } -void VisuGUI_ScalarMapOnDeformedShapeDlg::reject() +void VisuGUI_DeformedShapeAndScalarMapDlg::reject() { VisuGUI_ScalarBarBaseDlg::reject(); } -QString VisuGUI_ScalarMapOnDeformedShapeDlg::GetContextHelpFilePath() +QString VisuGUI_DeformedShapeAndScalarMapDlg::GetContextHelpFilePath() { return "scalar_map_on_deformed_shape_page.html"; } -void VisuGUI_ScalarMapOnDeformedShapeDlg::AddAllFieldNames(){ +void VisuGUI_DeformedShapeAndScalarMapDlg::AddAllFieldNames(){ TEntity2Fields::const_iterator anIter = myEntity2Fields.begin(); for(; anIter != myEntity2Fields.end(); anIter++){ const TFieldName2TimeStamps& aFieldName2TimeStamps = anIter->second; @@ -402,7 +427,7 @@ void VisuGUI_ScalarMapOnDeformedShapeDlg::AddAllFieldNames(){ } } -void VisuGUI_ScalarMapOnDeformedShapeDlg::AddAllTimes(const QString& theFieldName){ +void VisuGUI_DeformedShapeAndScalarMapDlg::AddAllTimes(const QString& theFieldName){ TEntity2Fields::const_iterator anIter = myEntity2Fields.begin(); for(; anIter != myEntity2Fields.end(); anIter++){ const TFieldName2TimeStamps& aFieldName2TimeStamps = anIter->second; @@ -429,23 +454,23 @@ void VisuGUI_ScalarMapOnDeformedShapeDlg::AddAllTimes(const QString& theFieldNam } } -void VisuGUI_ScalarMapOnDeformedShapeDlg::onFieldChanged(int){ +void VisuGUI_DeformedShapeAndScalarMapDlg::onFieldChanged(int){ AddAllTimes(myFieldsCombo->currentText()); SetScalarField(); UpdateScalarField(); } -void VisuGUI_ScalarMapOnDeformedShapeDlg::onTimeStampChanged(int){ +void VisuGUI_DeformedShapeAndScalarMapDlg::onTimeStampChanged(int){ SetScalarField(); UpdateScalarField(); } -void VisuGUI_ScalarMapOnDeformedShapeDlg::UpdateScalarField(){ +void VisuGUI_DeformedShapeAndScalarMapDlg::UpdateScalarField(){ GetScalarPane()->initFromPrsObject(myPrsCopy); } QString -VisuGUI_ScalarMapOnDeformedShapeDlg +VisuGUI_DeformedShapeAndScalarMapDlg ::GetFloatValueOfTimeStamp(VISU::Entity theEntity, const std::string& theFieldName, int theTimeStampNumber) diff --git a/src/VISUGUI/VisuGUI_ScalarMapOnDeformedShapeDlg.h b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.h similarity index 82% rename from src/VISUGUI/VisuGUI_ScalarMapOnDeformedShapeDlg.h rename to src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.h index 6eec691a..9daf4a58 100644 --- a/src/VISUGUI/VisuGUI_ScalarMapOnDeformedShapeDlg.h +++ b/src/VISUGUI/VisuGUI_DeformedShapeAndScalarMapDlg.h @@ -21,45 +21,43 @@ // // // -// File : VisuGUI_ScalarMapOnDeformedShapeDlg.h +// File : VisuGUI_DeformedShapeAndScalarMapDlg.h // Author : Eugeny Nikolaev // Module : VISU -#ifndef VISUGUI_SCALARMAPONDEFORMEDSHAPEDLS_H -#define VISUGUI_SCALARMAPONDEFORMEDSHAPEDLS_H +#ifndef VISUGUI_DEFORMEDSHAPEANDSCALARMAPDLS_H +#define VISUGUI_DEFORMEDSHAPEANDSCALARMAPDLS_H #include "VisuGUI_Prs3dDlg.h" #include "VISUConfig.hh" -#include "QtxDoubleSpinBox.h" - -class QComboBox; -class QTabWidget; +#include #include #include class SalomeApp_Module; class VisuGUI_InputPane; +class QtxDoubleSpinBox; +class QComboBox; +class QTabWidget; namespace VISU { - class ScalarMapOnDeformedShape_i; + class DeformedShapeAndScalarMap_i; } -class VisuGUI_ScalarMapOnDeformedShapeDlg : public VisuGUI_ScalarBarBaseDlg +class VisuGUI_DeformedShapeAndScalarMapDlg : public VisuGUI_ScalarBarBaseDlg { Q_OBJECT public: - VisuGUI_ScalarMapOnDeformedShapeDlg (SalomeApp_Module* theModule); - ~VisuGUI_ScalarMapOnDeformedShapeDlg(); + VisuGUI_DeformedShapeAndScalarMapDlg (SalomeApp_Module* theModule); + ~VisuGUI_DeformedShapeAndScalarMapDlg(); - double getFactor() - { return ScalFact->value(); } - void setFactor(double theFactor) - { ScalFact->setValue(theFactor); } + double getFactor() const; + void setFactor(double theFactor); virtual void initFromPrsObject( VISU::ColoredPrs3d_i* thePrs, bool theInit ); @@ -102,7 +100,7 @@ private: std::vector myTimeStampID; _PTR(SObject) mySelectionObj; - SALOME::GenericObjPtr myPrsCopy; + SALOME::GenericObjPtr myPrsCopy; SalomeApp_Module* myVisuGUI; protected: diff --git a/src/VISUGUI/VisuGUI_DeformedShapeDlg.cxx b/src/VISUGUI/VisuGUI_DeformedShapeDlg.cxx index e9b26850..6e677fc8 100644 --- a/src/VISUGUI/VisuGUI_DeformedShapeDlg.cxx +++ b/src/VISUGUI/VisuGUI_DeformedShapeDlg.cxx @@ -91,7 +91,11 @@ VisuGUI_DeformedShapeDlg::VisuGUI_DeformedShapeDlg (SalomeApp_Module* theModule) ScalFact = new QtxDoubleSpinBox (0.0, 1.0E+38, 0.1, TopGroup); ScalFact->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed)); - ScalFact->setDecimals(38); + + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + int aPrecision = aResourceMgr->integerValue( "VISU", "floating_point_precision", 0 ); + + ScalFact->setDecimals( aPrecision*(-1) ); // ScalFact->setDecimals(38); ScalFact->setValue(0.1); TopGroupLayout->addWidget(ScalFact, 0, 1); @@ -119,7 +123,7 @@ VisuGUI_DeformedShapeDlg::VisuGUI_DeformedShapeDlg (SalomeApp_Module* theModule) GroupButtonsLayout->setSpacing(6); GroupButtonsLayout->setMargin(11); - QPushButton* buttonOk = new QPushButton (tr("BUT_OK"), GroupButtons); + QPushButton* buttonOk = new QPushButton (tr("A&pply and Close"), GroupButtons); buttonOk->setAutoDefault(TRUE); buttonOk->setDefault(TRUE); GroupButtonsLayout->addWidget(buttonOk, 0, 0); @@ -169,6 +173,22 @@ void VisuGUI_DeformedShapeDlg::initFromPrsObject (VISU::ColoredPrs3d_i* thePrs, myTabBox->setCurrentIndex(0); } +void VisuGUI_DeformedShapeDlg::setFactor(double theFactor) +{ + double i=0.1; + while (1) { // Calculate Step & Precission + if ( int (theFactor/i) > 0) + break; + else { + i = i*0.1; + } + } + + ScalFact->setSingleStep(i); + + ScalFact->setValue(theFactor); +} + int VisuGUI_DeformedShapeDlg::storeToPrsObject(VISU::ColoredPrs3d_i* thePrs) { if( !isValid() ) @@ -191,7 +211,8 @@ void VisuGUI_DeformedShapeDlg::updatePrsCopy() VisuGUI* aVisuGUI = dynamic_cast (myModule); if ( myPrsCopy->GetNumberOfActors() == 0 ) { PublishInView(aVisuGUI, myPrsCopy, aViewWindow); - aViewWindow->onFitAll(); + if(VISU::GetResourceMgr()->booleanValue("VISU","automatic_fit_all",false)) + aViewWindow->onFitAll(); int aPos = VISU::GetFreePositionOfDefaultScalarBar(aVisuGUI, aViewWindow); VISU::AddScalarBarPosition(aVisuGUI, aViewWindow, myPrsCopy, aPos); } else { @@ -270,26 +291,29 @@ void VisuGUI_DeformedShapeDlg::CreatePrs3d(VisuGUI* theModule) aFieldName.toLatin1().data(), aTimeStampId.toInt(), aPublishInStudyMode); - - VisuGUI_DeformedShapeDlg* aDlg = new VisuGUI_DeformedShapeDlg (theModule); - aDlg->initFromPrsObject(aPrs3d, true); - aDlg->UseMagn->setChecked(true); - VisuGUI_DialogRunner r(aDlg); - int dlgResult = r.run( false ); - - if ( dlgResult == 0 ) - aPrs3d->RemoveFromStudy(); - else { - aDlg->storeToPrsObject( aPrs3d ); - SVTK_ViewWindow* aViewWindow = VISU::GetActiveViewWindow(); - PublishInView(theModule, aPrs3d, aViewWindow); - aViewWindow->onFitAll(); - int aPos = VISU::GetFreePositionOfDefaultScalarBar(theModule, aViewWindow); - VISU::AddScalarBarPosition(theModule, aViewWindow, aPrs3d, aPos); + + if (aPrs3d) { + VisuGUI_DeformedShapeDlg* aDlg = new VisuGUI_DeformedShapeDlg (theModule); + aDlg->initFromPrsObject(aPrs3d, true); + aDlg->UseMagn->setChecked(true); + VisuGUI_DialogRunner r(aDlg); + int dlgResult = r.run( false ); + + if ( dlgResult == 0 ) + DeletePrs3d(theModule,aPrs3d); + else { + aDlg->storeToPrsObject( aPrs3d ); + SVTK_ViewWindow* aViewWindow = VISU::GetActiveViewWindow(); + PublishInView(theModule, aPrs3d, aViewWindow); + if(VISU::GetResourceMgr()->booleanValue("VISU","automatic_fit_all",false)) + aViewWindow->onFitAll(); + int aPos = VISU::GetFreePositionOfDefaultScalarBar(theModule, aViewWindow); + VISU::AddScalarBarPosition(theModule, aViewWindow, aPrs3d, aPos); + } + + VISU::UpdateObjBrowser(theModule, true, aTimeStamp); + delete aDlg; } - - VISU::UpdateObjBrowser(theModule, true, aTimeStamp); - delete aDlg; } } } diff --git a/src/VISUGUI/VisuGUI_DeformedShapeDlg.h b/src/VISUGUI/VisuGUI_DeformedShapeDlg.h index 099fc006..1449af50 100644 --- a/src/VISUGUI/VisuGUI_DeformedShapeDlg.h +++ b/src/VISUGUI/VisuGUI_DeformedShapeDlg.h @@ -60,8 +60,7 @@ public: double getFactor() { return ScalFact->value(); } - void setFactor(double theFactor) - { ScalFact->setValue(theFactor); } + void setFactor(double theFactor); bool isColored() { return UseMagn->isChecked(); } diff --git a/src/VISUGUI/VisuGUI_Displayer.cxx b/src/VISUGUI/VisuGUI_Displayer.cxx index 7b8daf94..62e7f6c7 100644 --- a/src/VISUGUI/VisuGUI_Displayer.cxx +++ b/src/VISUGUI/VisuGUI_Displayer.cxx @@ -94,11 +94,19 @@ SALOME_Prs* VisuGUI_Displayer::buildPresentation( const QString& theEntry, SALOM aPrs3d = dynamic_cast(VISU::GetServant(aColoredPrs3d).in()); }else if (aType == VISU::TPOINTMAP3D) { VISU::PointMap3d_i* aTable3d = dynamic_cast(aBaseServant); - VISU_PointMap3dActor* aPointMap3dActor = aTable3d->CreateActor(); - if (aPointMap3dActor) { - aViewWindow->AddActor(aPointMap3dActor); + VISU_ActorBase* anActorBase = VISU::FindActorBase(aViewWindow, aTable3d); + if (anActorBase) { + anActorBase->SetVisibility(true); aViewWindow->Repaint(); } + else { + VISU_PointMap3dActor* aPointMap3dActor = aTable3d->CreateActor(); + if (aPointMap3dActor) { + aViewWindow->AddActor(aPointMap3dActor); + aPointMap3dActor->SetVisibility(true); + aViewWindow->Repaint(); + } + } } else aPrs3d = dynamic_cast(aBaseServant); @@ -283,6 +291,9 @@ bool VisuGUI_Displayer::canBeDisplayed( const QString& entry, const QString& vie if(aBase->GetType() == VISU::TCOLOREDPRS3DHOLDER) return true; + if(aBase->GetType() == VISU::TPOINTMAP3D) + return dynamic_cast(aBase); + return dynamic_cast(aBase); } else if( viewer_type==SPlot2d_Viewer::Type() ) diff --git a/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx b/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx index c8fa4f7e..14826a2f 100644 --- a/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx +++ b/src/VISUGUI/VisuGUI_GaussPointsDlg.cxx @@ -43,6 +43,7 @@ #include "LightApp_Application.h" #include "SalomeApp_Module.h" +#include "LightApp_SelectionMgr.h" #include "SUIT_Desktop.h" #include "SUIT_ResourceMgr.h" #include "SUIT_Session.h" @@ -551,7 +552,7 @@ void VisuGUI_GaussScalarBarPane::initFromPrsObject(VISU::GaussPoints_i* thePrs, myTextDlg->setTitleText(QString(thePrs->GetTitle())); vtkFloatingPointType R, G, B; - thePrs->GetTitleColor(&R, &G, &B); + thePrs->GetTitleColor(R, G, B); myBarDlg->setLabelsFormat(thePrs->GetLabelsFormat()); myBarDlg->setUnitsVisible(thePrs->IsUnitsVisible()); @@ -563,7 +564,7 @@ void VisuGUI_GaussScalarBarPane::initFromPrsObject(VISU::GaussPoints_i* thePrs, thePrs->IsShadowTitle()); // "Labels" - thePrs->GetLabelColor(&R, &G, &B); + thePrs->GetLabelColor(R, G, B); myTextDlg->myLabelFont->SetData(QColor((int)(R*255.), (int)(G*255.), (int)(B*255.)), thePrs->GetLblFontType(), @@ -772,6 +773,7 @@ void VisuGUI_GaussScalarBarPane::onBarPref() * Constructor */ VisuGUI_GaussPointsDlg::VisuGUI_GaussPointsDlg(SalomeApp_Module* theModule): + myModule(theModule), VisuGUI_Prs3dDlg(theModule) { //setName("VisuGUI_GaussPointsDlg"); @@ -844,6 +846,7 @@ VisuGUI_GaussPointsDlg::VisuGUI_GaussPointsDlg(SalomeApp_Module* theModule): // Input pane myInputPane = new VisuGUI_InputPane(VISU::TGAUSSPOINTS, theModule, this); + myInputPane->SetRestoreInitialSelection(false); connect( myResultsButton, SIGNAL( clicked() ), mySizeBox, SLOT( onToggleResults() ) ); connect( myResultsButton, SIGNAL( toggled( bool ) ), myScalarPane, SLOT( setEnabled( bool ) ) ); @@ -979,8 +982,22 @@ int VisuGUI_GaussPointsDlg::storeToPrsObject( VISU::ColoredPrs3d_i* thePrs ) myPrsCopy->SetMagnification( mySizeBox->getMagnification() ); myPrsCopy->SetMagnificationIncrement( mySizeBox->getIncrement() ); - VISU::TSameAsFactory().Copy(myPrsCopy, thePrs); - + VISU::TSameAsFactory().Copy(myPrsCopy, thePrs); + + //Set created Gauss points presentation selected, + //Issue 0019874(EDF 746 VISU: Picking alphanumeric Gauss) + if(thePrs){ + SALOME_ListIO aListIO; + LightApp_SelectionMgr* aSelectionMgr = VISU::GetSelectionMgr(myModule); + Handle(SALOME_InteractiveObject) anIO = thePrs->GetIO(); + if(anIO && anIO->hasEntry()) { + aListIO.Append(anIO); + VISU::UpdateObjBrowser(myModule,true); + aSelectionMgr->setSelectedObjects(aListIO); + } + else + myInputPane->SetRestoreInitialSelection(true); + } return anIsOk; } diff --git a/src/VISUGUI/VisuGUI_GaussPointsDlg.h b/src/VISUGUI/VisuGUI_GaussPointsDlg.h index 756e2dec..e23b9a1e 100644 --- a/src/VISUGUI/VisuGUI_GaussPointsDlg.h +++ b/src/VISUGUI/VisuGUI_GaussPointsDlg.h @@ -165,6 +165,7 @@ private: QtxDoubleSpinBox* myScaleSpinBox; SALOME::GenericObjPtr myPrsCopy; + SalomeApp_Module* myModule; }; #endif // VISUGUI_GAUSSPOINTSDLS_H diff --git a/src/VISUGUI/VisuGUI_InputPane.cxx b/src/VISUGUI/VisuGUI_InputPane.cxx index d1aafe52..21bab673 100644 --- a/src/VISUGUI/VisuGUI_InputPane.cxx +++ b/src/VISUGUI/VisuGUI_InputPane.cxx @@ -82,7 +82,8 @@ VisuGUI_InputPane::VisuGUI_InputPane( VISU::VISUType theType, QGroupBox( theDialog ), myModule( theModule ), myDialog( theDialog ), - myPrs( NULL ) + myPrs( NULL ), + isRestoreInitialSelection(true) { //setFrameStyle( QFrame::NoFrame ); @@ -243,9 +244,17 @@ VisuGUI_InputPane::~VisuGUI_InputPane() } // Restore initial selection - aSelectionMgr->setSelectedObjects(mySavedSelection); + if(isRestoreInitialSelection) + aSelectionMgr->setSelectedObjects(mySavedSelection); } +void VisuGUI_InputPane::SetRestoreInitialSelection(bool on){ + isRestoreInitialSelection = on; +} + +bool VisuGUI_InputPane::GetRestoreInitialSelection(){ + return isRestoreInitialSelection; +} //--------------------------------------------------------------- /*! diff --git a/src/VISUGUI/VisuGUI_InputPane.h b/src/VISUGUI/VisuGUI_InputPane.h index 9190dde8..408d257b 100644 --- a/src/VISUGUI/VisuGUI_InputPane.h +++ b/src/VISUGUI/VisuGUI_InputPane.h @@ -71,6 +71,8 @@ public: int storeToPrsObject( VISU::ColoredPrs3d_i* ); bool eventFilter (QObject* object, QEvent* event); + void SetRestoreInitialSelection(bool on); + bool GetRestoreInitialSelection(); public slots: virtual void onSelectionChanged(); @@ -104,6 +106,7 @@ private: VISU::Result_var myResult; int myEntity; + bool isRestoreInitialSelection; VisuGUI_FieldFilter* myFieldFilter; SALOME_ListIO mySavedSelection; diff --git a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx index f0ebd544..fe3d30ba 100644 --- a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx +++ b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.cxx @@ -53,12 +53,10 @@ #include #include #include - - +#include using namespace std; - VisuGUI_IsoSurfPane::VisuGUI_IsoSurfPane (QWidget* parent, VisuGUI_ScalarBarPane* theScalarPane) : QWidget(parent), @@ -105,8 +103,32 @@ VisuGUI_IsoSurfPane::VisuGUI_IsoSurfPane (QWidget* parent, LabelMax->setBuddy(MaxIso); TopGroupLayout->addWidget( MaxIso, 2, 1 ); + myUseMagnitude = new QCheckBox(tr("MAGNITUDE_COLORING_CHK"), TopGroup); + myUseMagnitude->setChecked(true); + TopGroupLayout->addWidget( myUseMagnitude, 3, 0 ); + mySelColor = new QPushButton(tr("SEL_COLOR_BTN"), TopGroup); + QPalette pal = mySelColor->palette(); + pal.setColor(mySelColor->backgroundRole(), Qt::black); + pal.setColor(mySelColor->foregroundRole(), Qt::gray); + mySelColor->setPalette(pal); + mySelColor->setDisabled(true); + TopGroupLayout->addWidget( mySelColor, 3, 1 ); + connect( mySelColor, SIGNAL( clicked() ), this, SLOT( setColor() ) ); + connect( myUseMagnitude, SIGNAL( toggled(bool) ), mySelColor, SLOT( setDisabled(bool) ) ); + + myUseLabels = new QCheckBox(tr("SHOW_VALUES_CHK"), TopGroup); + myUseLabels->setChecked(false); + TopGroupLayout->addWidget( myUseLabels, 4, 0 ); + myNbLabels = new QSpinBox( TopGroup ); + myNbLabels->setMinimum(1); + myNbLabels->setMaximum(100); + myNbLabels->setSingleStep(1); + myNbLabels->setEnabled(false); + TopGroupLayout->addWidget( myNbLabels, 4, 1 ); + connect( myUseLabels, SIGNAL( toggled(bool) ), myNbLabels, SLOT( setEnabled(bool) ) ); + QPushButton* aUpdateBtn = new QPushButton( "Update scalar bar range with these values", TopGroup); - TopGroupLayout->addWidget( aUpdateBtn, 3, 0, 1, 2); + TopGroupLayout->addWidget( aUpdateBtn, 5, 0, 1, 2); connect( aUpdateBtn, SIGNAL( clicked() ), this, SLOT(onCBUpdate() ) ); } @@ -115,12 +137,29 @@ void VisuGUI_IsoSurfPane::initFromPrsObject (VISU::IsoSurfaces_i* thePrs) NbrIso->setValue(thePrs->GetNbSurfaces()); MinIso->setText(QString::number(thePrs->GetSubMin())); MaxIso->setText(QString::number(thePrs->GetSubMax())); + myUseMagnitude->setChecked(thePrs->IsColored()); + SALOMEDS::Color anOldColor = thePrs->GetColor(); + QColor aColor = QColor(int(255*anOldColor.R),int(255*anOldColor.G),int(255*anOldColor.B)); + setColor(aColor); + + myUseLabels->setChecked(thePrs->IsLabeled()); + myNbLabels->setValue(thePrs->GetNbLabels()); } int VisuGUI_IsoSurfPane::storeToPrsObject (VISU::IsoSurfaces_i* thePrs) { thePrs->SetNbSurfaces(NbrIso->value()); thePrs->SetSubRange(MinIso->text().toDouble(), MaxIso->text().toDouble()); + thePrs->ShowLabels(myUseLabels->isChecked(), myNbLabels->value()); + thePrs->ShowColored(myUseMagnitude->isChecked()); + if(!thePrs->IsColored()){ + QColor aQColor = color(); + SALOMEDS::Color aColor; + aColor.R = aQColor.red()/255.; + aColor.G = aQColor.green()/255.; + aColor.B = aQColor.blue()/255.; + thePrs->SetColor(aColor); + } return 1; } @@ -141,8 +180,24 @@ bool VisuGUI_IsoSurfPane::check() return true; } +void VisuGUI_IsoSurfPane::setColor() +{ + QColor cnew = QColorDialog::getColor( color(), this ); + if ( cnew.isValid() ) + setColor(cnew); +} +void VisuGUI_IsoSurfPane::setColor(const QColor& theColor) +{ + QPalette pal = mySelColor->palette(); + pal.setColor(mySelColor->backgroundRole(), theColor); + mySelColor->setPalette(pal); +} +QColor VisuGUI_IsoSurfPane::color() const +{ + return mySelColor->palette().color(mySelColor->backgroundRole()); +} /*! diff --git a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h index 94dc47e3..4410e819 100644 --- a/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h +++ b/src/VISUGUI/VisuGUI_IsoSurfacesDlg.h @@ -47,7 +47,7 @@ class VisuGUI_IsoSurfPane : public QWidget { Q_OBJECT; - public: +public: VisuGUI_IsoSurfPane (QWidget* parent, VisuGUI_ScalarBarPane* theScalarPane); ~VisuGUI_IsoSurfPane() {}; @@ -57,13 +57,21 @@ class VisuGUI_IsoSurfPane : public QWidget bool check(); - protected slots: - void onCBUpdate(); + void setColor(const QColor& theColor); + QColor color() const; - private: - QLineEdit* MinIso; - QLineEdit* MaxIso; - QSpinBox* NbrIso; +protected slots: + void onCBUpdate(); + void setColor(); + +private: + QLineEdit* MinIso; + QLineEdit* MaxIso; + QSpinBox* NbrIso; + QCheckBox* myUseMagnitude; + QPushButton* mySelColor; + QCheckBox* myUseLabels; + QSpinBox* myNbLabels; VisuGUI_ScalarBarPane* myScalarPane; }; @@ -72,7 +80,7 @@ class VisuGUI_IsoSurfacesDlg : public VisuGUI_ScalarBarBaseDlg { Q_OBJECT; - public: +public: VisuGUI_IsoSurfacesDlg (SalomeApp_Module* theModule); ~VisuGUI_IsoSurfacesDlg(); @@ -81,13 +89,13 @@ class VisuGUI_IsoSurfacesDlg : public VisuGUI_ScalarBarBaseDlg virtual int storeToPrsObject(VISU::ColoredPrs3d_i* thePrs); - protected: +protected: virtual QString GetContextHelpFilePath(); protected slots: void accept(); - private: +private: QTabWidget* myTabBox; VisuGUI_IsoSurfPane* myIsoPane; VisuGUI_InputPane* myInputPane; diff --git a/src/VISUGUI/VisuGUI_OffsetDlg.cxx b/src/VISUGUI/VisuGUI_OffsetDlg.cxx index 04928275..b40b30d1 100644 --- a/src/VISUGUI/VisuGUI_OffsetDlg.cxx +++ b/src/VISUGUI/VisuGUI_OffsetDlg.cxx @@ -27,6 +27,8 @@ #include "VISU_Actor.h" #include "LightApp_Application.h" +#include "LightApp_SelectionMgr.h" +#include "SALOME_ListIteratorOfListIO.hxx" #include "SalomeApp_Application.h" #include "SVTK_ViewWindow.h" #include "SVTK_ViewModel.h" @@ -55,9 +57,11 @@ VisuGUI_OffsetDlg::VisuGUI_OffsetDlg (VisuGUI* theModule) : QDialog(VISU::GetDesktop(theModule), Qt::WindowTitleHint | Qt::WindowSystemMenuHint ), - myModule(theModule) + myModule(theModule), + mySelectionMgr(VISU::GetSelectionMgr(theModule)) { //myPrsList.setAutoDelete(false); + //myPointMapList.setAutoDelete(false); setWindowTitle(tr("TIT_OFFSETDLG")); setSizeGripEnabled(TRUE); @@ -132,6 +136,50 @@ VisuGUI_OffsetDlg::VisuGUI_OffsetDlg (VisuGUI* theModule) connect(buttonApply, SIGNAL(clicked()), this, SLOT(onApply())); connect(buttonCancel, SIGNAL(clicked()), this, SLOT(reject())); connect(buttonHelp, SIGNAL(clicked()), this, SLOT(onHelp())); + connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onSelectionChanged())); + + onSelectionChanged(); + show(); +} + +void VisuGUI_OffsetDlg::setVisible(bool show){ + if ( show && getPrsCount() > 0 ) + QDialog::setVisible( show ); + else + QDialog::setVisible( show ); +} + +void VisuGUI_OffsetDlg::onSelectionChanged(){ + if(!mySelectionMgr) + return; + + //Clear old selection + clearPresentations(); + + SALOME_ListIO aListIO; + mySelectionMgr->selectedObjects(aListIO); + + SalomeApp_Study* aStudy = VISU::GetAppStudy(myModule); + SALOME_ListIteratorOfListIO anIter(aListIO); + for (; anIter.More(); anIter.Next()) { + Handle(SALOME_InteractiveObject) anIO = anIter.Value(); + if (anIO->hasEntry()) { + QString anEntry(anIO->getEntry()); + VISU::TObjectInfo anObjectInfo = VISU::GetObjectByEntry(aStudy, anEntry.toLatin1().constData()); + if(VISU::Prs3d_i* aPrsObject = VISU::GetPrs3dFromBase(anObjectInfo.myBase)) + addPresentation(aPrsObject); + else if (VISU::PointMap3d_i* aPrs = dynamic_cast(anObjectInfo.myBase)) { + addPointMapPresentation(aPrs); + } + } + } +} + +void VisuGUI_OffsetDlg::clearPresentations(){ + myPrsList.clear(); + myPointMapList.clear(); + myOldOffsets.clear(); + myOldPointMapOffsets.clear(); } void VisuGUI_OffsetDlg::addPresentation (VISU::Prs3d_i* thePrs) @@ -149,6 +197,22 @@ void VisuGUI_OffsetDlg::addPresentation (VISU::Prs3d_i* thePrs) } } +void VisuGUI_OffsetDlg::addPointMapPresentation (VISU::PointMap3d_i* thePrs) +{ + myPointMapList.append(thePrs); + + CORBA::Float anOffset[3]; + thePrs->GetOffset(anOffset[0],anOffset[1],anOffset[2]); + OffsetStruct anOffs(anOffset[0],anOffset[1],anOffset[2]); + myOldPointMapOffsets.append(anOffs); + if (myPointMapList.count() == 1) { + setOffset(anOffs.myOffset); + } else if (myPointMapList.count() == 2) { + OffsetStruct anOffs; + setOffset(anOffs.myOffset); + } +} + void VisuGUI_OffsetDlg::setOffset (const vtkFloatingPointType* theOffset) { myDxEdt->setValue(theOffset[0]); @@ -183,8 +247,11 @@ void VisuGUI_OffsetDlg::updateOffset (VISU::Prs3d_i* thePrs, vtkFloatingPointTyp if (myPrsList.count() == 0) return; - if (isToSave()) + if (isToSave()) { thePrs->SetOffset(theOffset[0],theOffset[1],theOffset[2]); + thePrs->UpdateActors(); + return; + } ViewManagerList aViewManagerList; SalomeApp_Application* anApp = myModule->getApp(); @@ -195,8 +262,38 @@ void VisuGUI_OffsetDlg::updateOffset (VISU::Prs3d_i* thePrs, vtkFloatingPointTyp for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) { if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { if (SVTK_ViewWindow* vw = dynamic_cast(aViewWindow)) { - vw->onAdjustTrihedron(); if (VISU_Actor* anActor = VISU::FindActor(vw, thePrs)) { + anActor->SetPosition(theOffset); + vw->onAdjustTrihedron(); + vw->getRenderer()->ResetCameraClippingRange(); + vw->Repaint(); + } + } + } + } + } +} + +void VisuGUI_OffsetDlg::updatePointMapOffset (VISU::PointMap3d_i* thePrs, vtkFloatingPointType* theOffset) +{ + if (myPointMapList.count() == 0) + return; + + if (isToSave()) + thePrs->SetOffset(theOffset[0],theOffset[1],theOffset[2]); + + ViewManagerList aViewManagerList; + SalomeApp_Application* anApp = myModule->getApp(); + anApp->viewManagers(aViewManagerList); + SUIT_ViewManager* aViewManager; + foreach( aViewManager, aViewManagerList ) { + QVector aViews = aViewManager->getViews(); + for (int i = 0, iEnd = aViews.size(); i < iEnd; i++) { + if (SUIT_ViewWindow* aViewWindow = aViews.at(i)) { + if (SVTK_ViewWindow* vw = dynamic_cast(aViewWindow)) { + vw->onAdjustTrihedron(); + + if (VISU_ActorBase* anActor = VISU::FindActorBase(vw, thePrs)) { anActor->SetPosition(theOffset); vw->highlight(thePrs->GetIO(), 1); vw->getRenderer()->ResetCameraClippingRange(); @@ -215,6 +312,9 @@ void VisuGUI_OffsetDlg::accept() for (int i = 0; i < myPrsList.count(); i++) { updateOffset(myPrsList.at(i), anOffset); } + for (int i = 0; i < myPointMapList.count(); i++) { + updatePointMapOffset(myPointMapList.at(i), anOffset); + } QDialog::accept(); } @@ -223,6 +323,9 @@ void VisuGUI_OffsetDlg::reject() for (int i = 0; i < myPrsList.count(); i++) { updateOffset(myPrsList.at(i), myOldOffsets[i].myOffset); } + for (int i = 0; i < myPointMapList.count(); i++) { + updatePointMapOffset(myPointMapList.at(i), myOldOffsets[i].myOffset); + } QDialog::reject(); } @@ -230,9 +333,13 @@ void VisuGUI_OffsetDlg::onApply() { vtkFloatingPointType anOffset[3]; getOffset(anOffset); + for (int i = 0; i < myPrsList.count(); i++) { updateOffset(myPrsList.at(i), anOffset); } + for (int i = 0; i < myPointMapList.count(); i++) { + updatePointMapOffset(myPointMapList.at(i), anOffset); + } } void VisuGUI_OffsetDlg::onHelp() diff --git a/src/VISUGUI/VisuGUI_OffsetDlg.h b/src/VISUGUI/VisuGUI_OffsetDlg.h index 217c8399..f8dc7eec 100644 --- a/src/VISUGUI/VisuGUI_OffsetDlg.h +++ b/src/VISUGUI/VisuGUI_OffsetDlg.h @@ -23,6 +23,7 @@ #include "VTKViewer.h" #include "VISU_Prs3d_i.hh" +#include "VISU_PointMap3d_i.hh" // QT Includes #include @@ -31,6 +32,7 @@ class QCheckBox; class QtxDoubleSpinBox; class VisuGUI; +class LightApp_SelectionMgr; struct OffsetStruct { @@ -58,8 +60,12 @@ class VisuGUI_OffsetDlg: public QDialog VisuGUI_OffsetDlg (VisuGUI* theModule); ~VisuGUI_OffsetDlg() {}; + virtual void setVisible(bool); + void addPresentation (VISU::Prs3d_i* thePrs); - int getPrsCount() const { return myPrsList.count(); } + void addPointMapPresentation (VISU::PointMap3d_i* thePrs); + int getPrsCount() const { return myPrsList.count() + myPointMapList.count(); } + void clearPresentations(); void setOffset (const vtkFloatingPointType* theOffset); void getOffset (vtkFloatingPointType* theOffset) const; @@ -76,11 +82,14 @@ class VisuGUI_OffsetDlg: public QDialog virtual void reject(); void onApply(); void onHelp(); + void onSelectionChanged(); private: void updateOffset (VISU::Prs3d_i* thePrs, vtkFloatingPointType* theOffset); + void updatePointMapOffset (VISU::PointMap3d_i* thePrs, vtkFloatingPointType* theOffset); VisuGUI * myModule; + LightApp_SelectionMgr* mySelectionMgr; QtxDoubleSpinBox * myDxEdt; QtxDoubleSpinBox * myDyEdt; @@ -89,6 +98,9 @@ class VisuGUI_OffsetDlg: public QDialog QList myPrsList; QList myOldOffsets; + + QList myPointMapList; + QList myOldPointMapOffsets; }; #endif // DIALOGBOX_OFFSET_H diff --git a/src/VISUGUI/VisuGUI_Plot3DDlg.cxx b/src/VISUGUI/VisuGUI_Plot3DDlg.cxx index a4fcd799..263b40de 100644 --- a/src/VISUGUI/VisuGUI_Plot3DDlg.cxx +++ b/src/VISUGUI/VisuGUI_Plot3DDlg.cxx @@ -81,7 +81,7 @@ using namespace std; static void renderViewFrame (SVTK_ViewWindow* vw) { if (vw) { - vw->getRenderer()->ResetCameraClippingRange(); +// vw->getRenderer()->ResetCameraClippingRange(); vw->Repaint(); } } @@ -425,7 +425,7 @@ void VisuGUI_Plot3DPane::updatePreview() renderViewFrame(myViewWindow); - if (fitall) { + if (fitall && VISU::GetResourceMgr()->booleanValue("VISU","automatic_fit_all",false)) { myPreviewActor->SetInfinitive(false); myViewWindow->onFitAll(); myPreviewActor->SetInfinitive(true); diff --git a/src/VISUGUI/VisuGUI_PopupTools.cxx b/src/VISUGUI/VisuGUI_PopupTools.cxx index 26105e76..9fd9793d 100644 --- a/src/VISUGUI/VisuGUI_PopupTools.cxx +++ b/src/VISUGUI/VisuGUI_PopupTools.cxx @@ -111,12 +111,14 @@ QString VisuGUI_Selection::type( const int ind ) const ENUM2STRING( aResStr, VISU::TISOSURFACES ); ENUM2STRING( aResStr, VISU::TDEFORMEDSHAPE ); ENUM2STRING( aResStr, VISU::TSCALARMAPONDEFORMEDSHAPE ); + ENUM2STRING( aResStr, VISU::TDEFORMEDSHAPEANDSCALARMAP ); ENUM2STRING( aResStr, VISU::TCUTPLANES ); ENUM2STRING( aResStr, VISU::TCUTLINES ); ENUM2STRING( aResStr, VISU::TVECTORS ); ENUM2STRING( aResStr, VISU::TSTREAMLINES ); ENUM2STRING( aResStr, VISU::TPLOT3D ); ENUM2STRING( aResStr, VISU::TANIMATION ); + ENUM2STRING( aResStr, VISU::TPOINTMAP3D ); } } @@ -381,11 +383,21 @@ struct TViewFunctor { VISU_Actor* anActor = NULL; VISU::Prs3d_i* aPrs3d = NULL; + VISU_ActorBase* anActorBase = NULL; + VISU::PointMap3d_i* aPointMap3d = NULL; SVTK_ViewWindow* aViewWindow = NULL; - if(!GetPrs3dSelectionInfo(theModule, theEntry, aPrs3d, aViewWindow, anActor)) - return QString(); - - return get(aPrs3d, aViewWindow, anActor); + if(GetPrs3dSelectionInfo(theModule, theEntry, aPrs3d, aViewWindow, anActor)) { + return get(aPrs3d, aViewWindow, anActor); + } else { + aViewWindow = GetActiveViewWindow(theModule); + VISU::TSelectionInfo aSelectionInfo = VISU::GetSelectedObjects(theModule); + if ( aSelectionInfo.empty() ) + return QString(); + VISU::TSelectionItem aSelectionItem = aSelectionInfo.front(); + aPointMap3d = dynamic_cast(aSelectionItem.myObjectInfo.myBase); + anActorBase = VISU::FindActorBase(aViewWindow, aPointMap3d); + return getPointMap(aPointMap3d, aViewWindow, anActorBase); + } } QString @@ -396,6 +408,15 @@ struct TViewFunctor { return QString(); } + + QString + virtual + getPointMap(VISU::PointMap3d_i* thePrs3d, + SVTK_ViewWindow* theViewWindow, + VISU_ActorBase* theActor) + { + return QString(); + } }; @@ -418,6 +439,22 @@ struct TGetRepesentationFunctor: TViewFunctor } return aResStr; } + + QString + virtual + getPointMap(VISU::PointMap3d_i* thePrs3d, + SVTK_ViewWindow* theViewWindow, + VISU_ActorBase* theActorBase) + { + QString aResStr = ""; + if (theActorBase) { + switch (theActorBase->GetRepresentation()) { + ENUM2STRING( aResStr, VISU::WIREFRAME ); // = 1 + ENUM2STRING( aResStr, VISU::SHADED ); // = 2 + } + } + return aResStr; + } }; QString VisuGUI_Selection::representation( const int ind ) const @@ -501,6 +538,17 @@ struct TIsShrunkFunctor: TViewFunctor { return theActor->IsShrunk() ? "1" : "0"; } + + QString + virtual + getPointMap(VISU::PointMap3d_i* thePointMap, + SVTK_ViewWindow* theViewWindow, + VISU_ActorBase* theActorBase) + { + if (theActorBase) + return theActorBase->IsShrunk() ? "1" : "0"; + else return "0"; + } }; QString VisuGUI_Selection::isShrunk( const int ind ) const diff --git a/src/VISUGUI/VisuGUI_Prs3dDlg.cxx b/src/VISUGUI/VisuGUI_Prs3dDlg.cxx index 3dcc4386..d8110578 100644 --- a/src/VISUGUI/VisuGUI_Prs3dDlg.cxx +++ b/src/VISUGUI/VisuGUI_Prs3dDlg.cxx @@ -1046,9 +1046,6 @@ void VisuGUI_ScalarBarPane::initFromPrsObject(VISU::ColoredPrs3d_i* thePrs) myTextDlg->setTitleText(aTitle.in()); myTitle = aTitle.in(); - vtkFloatingPointType R, G, B; - myScalarMap->GetTitleColor(&R, &G, &B); - setPosAndSize( myScalarMap->GetPosX(), myScalarMap->GetPosY(), myScalarMap->GetWidth(), @@ -1076,16 +1073,23 @@ void VisuGUI_ScalarBarPane::initFromPrsObject(VISU::ColoredPrs3d_i* thePrs) myBarDlg->setLabelsFormat(myScalarMap->GetLabelsFormat()); myBarDlg->setUnitsVisible(myScalarMap->IsUnitsVisible()); - myTextDlg->myTitleFont->SetData(QColor((int)(R*255.), (int)(G*255.), (int)(B*255.)), + vtkFloatingPointType R, G, B; + myScalarMap->GetTitleColor(R, G, B); + + QColor aTextColor = QColor((int)(R*255.), (int)(G*255.), (int)(B*255.)); + + myTextDlg->myTitleFont->SetData(aTextColor, myScalarMap->GetTitFontType(), myScalarMap->IsBoldTitle(), myScalarMap->IsItalicTitle(), myScalarMap->IsShadowTitle()); // "Labels" - myScalarMap->GetLabelColor(&R, &G, &B); + myScalarMap->GetLabelColor(R, G, B); + + QColor aLabelColor = QColor((int)(R*255.), (int)(G*255.), (int)(B*255.)); - myTextDlg->myLabelFont->SetData(QColor((int)(R*255.), (int)(G*255.), (int)(B*255.)), + myTextDlg->myLabelFont->SetData(aLabelColor, myScalarMap->GetLblFontType(), myScalarMap->IsBoldLabel(), myScalarMap->IsItalicLabel(), diff --git a/src/VISUGUI/VisuGUI_Prs3dTools.h b/src/VISUGUI/VisuGUI_Prs3dTools.h index 570a96e0..f33d496d 100644 --- a/src/VISUGUI/VisuGUI_Prs3dTools.h +++ b/src/VISUGUI/VisuGUI_Prs3dTools.h @@ -264,7 +264,9 @@ namespace VISU // Display created presentation. if (aViewWindow) { PublishInView(theModule, aPrs3d, aViewWindow); - aViewWindow->onFitAll(); + if(GetResourceMgr()->booleanValue("VISU","automatic_fit_all",false)){ + aViewWindow->onFitAll(); + } AddScalarBarPosition(theModule, aViewWindow, aPrs3d, aPos); } diff --git a/src/VISUGUI/VisuGUI_Selection.cxx b/src/VISUGUI/VisuGUI_Selection.cxx index 5d9bd5b4..c4b6d44e 100644 --- a/src/VISUGUI/VisuGUI_Selection.cxx +++ b/src/VISUGUI/VisuGUI_Selection.cxx @@ -55,6 +55,8 @@ #include "SVTK_ViewWindow.h" #include "SVTK_Selector.h" +#include "VISU_ConvertorUtils.hxx" + #include "utilities.h" // OCCT Includes @@ -499,21 +501,30 @@ void VisuGUI_SelectionDlg::onSelectionEvent() { { int aVTKID = anVISUActor->GetNodeVTKID(anID); if(aVTKID >= 0){ + if ( aVTKID >= 0 ) { vtkFloatingPointType* aCoord = anVISUActor->GetNodeCoord(anID); myXValLbl->setText( QString::number( aCoord[0] ) ); myYValLbl->setText( QString::number( aCoord[1] ) ); myZValLbl->setText( QString::number( aCoord[2] ) ); - myIDValLbl->setText( QString::number(anID) ); - myScalarValLbl->setText(getValue(aPntData, aVTKID)); - myVectorValLbl->setText(getVector(aPntData, aVTKID)); + myIDValLbl->setText( QString::number( anID ) ); + + if ( !VISU::IsElnoData( aDataSet ) ) { + myScalarValLbl->setText( getValue( aPntData, aVTKID ) ); + myVectorValLbl->setText( getVector( aPntData, aVTKID ) ); + } else { + myScalarValLbl->setText( "< ELNO data >" ); + myVectorValLbl->setText( "< ELNO data >" ); + } + const VISU::PIDMapper& aMapper = aPrs3d->GetPipeLine()->GetIDMapper(); - VISU::TStructuredId aStructuredId = aMapper->GetIndexesOfNode(anID); + VISU::TStructuredId aStructuredId = aMapper->GetIndexesOfNode( anID ); myKValLbl->setText( GetNumber( aStructuredId, 2 ) ); myJValLbl->setText( GetNumber( aStructuredId, 1 ) ); myIValLbl->setText( GetNumber( aStructuredId, 0 ) ); - } + } } break; + } case 1: { vtkCellData* aCellData = aDataSet->GetCellData(); diff --git a/src/VISUGUI/VisuGUI_Table3dDlg.cxx b/src/VISUGUI/VisuGUI_Table3dDlg.cxx index d76db59b..6c961fbf 100644 --- a/src/VISUGUI/VisuGUI_Table3dDlg.cxx +++ b/src/VISUGUI/VisuGUI_Table3dDlg.cxx @@ -162,7 +162,10 @@ void VisuGUI_Table3DPane::initFromPrsObject( VISU::PointMap3d_i* thePrs ) myPrs = thePrs; // scale - ScaleSpn->setValue( thePrs->GetScaleFactor() ); + double aScale = thePrs->GetScaleFactor(); + if (aScale<0) + aScale = 0; + ScaleSpn->setValue( aScale ); // prs type int id = thePrs->GetIsContourPrs() ? CONTOUR_PRS_ID : SURFACE_PRS_ID; @@ -418,7 +421,7 @@ void VisuGUI_TableScalarBarPane::initFromPrsObject( VISU::PointMap3d_i* thePrs ) myTitle = aTitle.in(); vtkFloatingPointType R, G, B; - myBarPrs->GetTitleColor( &R, &G, &B ); + myBarPrs->GetTitleColor( R, G, B ); setPosAndSize( myBarPrs->GetPosX(), myBarPrs->GetPosY(), @@ -444,7 +447,7 @@ void VisuGUI_TableScalarBarPane::initFromPrsObject( VISU::PointMap3d_i* thePrs ) myBarPrs->IsShadowTitle() ); // "Labels" - myBarPrs->GetLabelColor( &R, &G, &B ); + myBarPrs->GetLabelColor( R, G, B ); myTextDlg->myLabelFont->SetData( QColor( (int)(R*255.), (int)(G*255.), (int)(B*255.) ), myBarPrs->GetLblFontType(), @@ -642,6 +645,47 @@ void VisuGUI_TableScalarBarPane::changeDefaults( int ) } } +//======================================================================= +//function : Check +//purpose : Called when button is clicked, validates data and closes dialog +//======================================================================= +bool VisuGUI_TableScalarBarPane::check() +{ + double minVal = MinEdit->text().toDouble(); + double maxVal = MaxEdit->text().toDouble(); + if ( RBIrange->isChecked() ) { + if (minVal >= maxVal) { + SUIT_MessageBox::warning( this,tr("WRN_VISU"), + tr("MSG_MINMAX_VALUES") ); + return false; + } + } + + // check if logarithmic mode is on and check imposed range to not contain negative values + if ( CBLog->isChecked() ) { + if ( minVal <= 0.0 ) { + if ( RBIrange->isChecked() ) { + SUIT_MessageBox::warning( this, + tr("WRN_VISU"), + tr("WRN_LOGARITHMIC_RANGE") ); + } else { + if ( minVal == 0) + SUIT_MessageBox::warning( this, + tr("WRN_VISU"), + tr("WRN_LOGARITHMIC_RANGE") ); + else + SUIT_MessageBox::warning( this, + tr("WRN_VISU"), + tr("WRN_LOGARITHMIC_FIELD_RANGE") ); + RBIrange->setChecked(true); + changeRange(1); + } + return false; + } + } + return true; +} + //======================================================================= //function : Constructor //purpose : @@ -650,7 +694,7 @@ VisuGUI_Table3DDlg::VisuGUI_Table3DDlg ( SalomeApp_Module* theModule ) : QDialog ( VISU::GetDesktop( theModule ) ) { setModal( false ); - setWindowTitle( tr( "TITLE" ) ); + setWindowTitle( tr( "Point Map 3D Definition" ) ); setSizeGripEnabled( true ); QVBoxLayout* TopLayout = new QVBoxLayout( this ); @@ -704,14 +748,26 @@ VisuGUI_Table3DDlg::~VisuGUI_Table3DDlg() { } +//======================================================================= +//function : accept +//purpose : +//======================================================================= +void VisuGUI_Table3DDlg::accept() +{ + if (myScalarBarPane->check()) + QDialog::accept(); +} + //======================================================================= //function : onApply //purpose : //======================================================================= void VisuGUI_Table3DDlg::onApply() { - storeToPrsObject( myPrsCopy ); - myPrsCopy->UpdateActors(); + if (myScalarBarPane->check()) { + storeToPrsObject( myPrsCopy ); + myPrsCopy->UpdateActors(); + } } //======================================================================= @@ -720,7 +776,24 @@ void VisuGUI_Table3DDlg::onApply() //======================================================================= void VisuGUI_Table3DDlg::onHelp() { - // "table_3d_page.html"; + QString aHelpFileName = "table_3d_page.html"; + LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication()); + if (app) { + VisuGUI* aVisuGUI = dynamic_cast( app->activeModule() ); + app->onHelpContextModule(aVisuGUI ? app->moduleName(aVisuGUI->moduleName()) : QString(""), aHelpFileName); + } + else { + QString platform; +#ifdef WIN32 + platform = "winapplication"; +#else + platform = "application"; +#endif + SUIT_MessageBox::warning( this, QObject::tr("WRN_WARNING"), + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", platform)).arg(aHelpFileName) ); + } + } //======================================================================= @@ -745,4 +818,3 @@ void VisuGUI_Table3DDlg::initFromPrsObject( VISU::PointMap3d_i* thePrs ) myIsoPane->initFromPrsObject( thePrs ); myScalarBarPane->initFromPrsObject( thePrs ); } - diff --git a/src/VISUGUI/VisuGUI_Table3dDlg.h b/src/VISUGUI/VisuGUI_Table3dDlg.h index 3945fb33..2257b483 100644 --- a/src/VISUGUI/VisuGUI_Table3dDlg.h +++ b/src/VISUGUI/VisuGUI_Table3dDlg.h @@ -173,6 +173,7 @@ public: virtual int storeToPrsObject( VISU::PointMap3d_i* ); protected slots: + void accept(); void onHelp(); void onApply(); diff --git a/src/VISUGUI/VisuGUI_TimeAnimation.cxx b/src/VISUGUI/VisuGUI_TimeAnimation.cxx index 26b7ca6f..86df91b6 100644 --- a/src/VISUGUI/VisuGUI_TimeAnimation.cxx +++ b/src/VISUGUI/VisuGUI_TimeAnimation.cxx @@ -34,7 +34,7 @@ #include "VisuGUI_VectorsDlg.h" #include "VisuGUI_IsoSurfacesDlg.h" #include "VisuGUI_StreamLinesDlg.h" -#include "VisuGUI_ScalarMapOnDeformedShapeDlg.h" +#include "VisuGUI_DeformedShapeAndScalarMapDlg.h" #include "VisuGUI_GaussPointsDlg.h" #include "VISU_TimeAnimation.h" @@ -47,7 +47,7 @@ #include "VISU_CutLines_i.hh" #include "VISU_Vectors_i.hh" #include "VISU_StreamLines_i.hh" -#include "VISU_ScalarMapOnDeformedShape_i.hh" +#include "VISU_DeformedShapeAndScalarMap_i.hh" #include "VISU_GaussPoints_i.hh" #include "VISU_ViewManager_i.hh" @@ -92,6 +92,42 @@ #define MAXVAL 1e10 #define VALPRECISION 8 +namespace { + void GeneratePresentations(int theFieldId, VISU_TimeAnimation* theAnimator) + { + theAnimator->generatePresentations(theFieldId); + FieldData& aFieldData = theAnimator->getFieldData(theFieldId); + + + int aRefFieldId = ( theAnimator->getAnimationMode() == VISU::Animation::PARALLEL ) ? theFieldId : 0; + if(VISU::ColoredPrs3d_i* aInitialPrs3d = dynamic_cast(theAnimator->getFieldData(aRefFieldId).myPrs[0])){ + for (long aFrameId = 0; aFrameId < aFieldData.myNbFrames; aFrameId++) { + VISU::ColoredPrs3d_i* aColoredPrs3d = aFieldData.myPrs[aFrameId]; + + // Special case for DeformedShape And ScalarMap presentation + // Restore time stamp number for all presentations + VISU::DeformedShapeAndScalarMap_i* aDeformedAndScalPrs = dynamic_cast(aColoredPrs3d); + int aTimeStampNum = -1; + if(aDeformedAndScalPrs){ + aTimeStampNum = aDeformedAndScalPrs->GetScalarTimeStampNumber(); + } + aColoredPrs3d->SameAs(aInitialPrs3d); + + if(aDeformedAndScalPrs){ + aDeformedAndScalPrs->SetScalarField(aDeformedAndScalPrs->GetScalarEntity(), + aDeformedAndScalPrs->GetScalarFieldName(), + aTimeStampNum); + } + + std::string aTitle = aColoredPrs3d->GetCTitle(); + if ( aFrameId != 0 && theAnimator->getAnimationMode() == VISU::Animation::SUCCESSIVE ) { + aColoredPrs3d->SetTitle(aTitle.c_str()); + } + } + } + } +} + ArrangeDlg::ArrangeDlg(QWidget* theParent, VISU_TimeAnimation* theAnimator) : QDialog(theParent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint), myAnimator(theAnimator), @@ -130,7 +166,7 @@ ArrangeDlg::ArrangeDlg(QWidget* theParent, vtkActorCollection *aCollection = myViewWindow->getRenderer()->GetActors(); aCollection->InitTraversal(); while(vtkActor* anActor = aCollection->GetNextActor()){ - if (VISU_Actor* anVISUActor = dynamic_cast(anActor)) + if (VISU_Actor* anVISUActor = dynamic_cast(anActor)) { if(anVISUActor->GetVisibility() != 0){ if (VISU::Prs3d_i* aPrs = anVISUActor->GetPrs3d()){ if(!myPrsMap.contains(aPrs)){ @@ -154,6 +190,31 @@ ArrangeDlg::ArrangeDlg(QWidget* theParent, } } } + } else { //if PointMap3d Actor + if (VISU_ActorBase* anActorBase = dynamic_cast(anActor)) + if(anActorBase->GetVisibility() != 0) + if (VISU::PointMap3d_i* aPrs = dynamic_cast(anActorBase->GetFactory())) { + if(!myPointMapPrsMap.contains(aPrs)){ + Handle(SALOME_InteractiveObject) anIO = aPrs->GetIO(); + if(!anIO->hasEntry()) + continue; + SalomeApp_Study* aStudy = VISU::GetAppStudy(theModule); + VISU::TObjectInfo anObjectInfo = VISU::GetObjectByEntry(aStudy, anIO->getEntry()); + if(_PTR(SObject) aSObject = anObjectInfo.mySObject){ + _PTR(GenericAttribute) anAttr; + if (aSObject->FindAttribute(anAttr, "AttributeName")) { + _PTR(AttributeName) aName(anAttr); + QString strIn(aName->Value().c_str()); + aPrsNames.append(strIn); + myPointMapPrsMap[aPrs] = myOffsets.count(); + Offset aOffs; + anActorBase->GetPosition(aOffs.myOffset); + myOffsets.append(aOffs); + } + } + } + } + } } myFieldLst->addItems(aPrsNames); myFieldLst->setCurrentRow(0); @@ -345,7 +406,7 @@ void ArrangeDlg::acceptAnimation() QApplication::setOverrideCursor( Qt::WaitCursor ); FieldData& aData = myAnimator->getFieldData(myFieldLst->currentRow()); if (aData.myPrs.empty()) - myAnimator->generatePresentations(myFieldLst->currentRow()); + GeneratePresentations(myFieldLst->currentRow(),myAnimator); vtkFloatingPointType aBounds[6]; aData.myPrs[0]->GetBounds(aBounds); vtkFloatingPointType aDist = 0; @@ -409,14 +470,24 @@ void ArrangeDlg::acceptViewWindow() if (mySaveChk->isChecked()) aPrs->SetOffset(aOffs.myOffset[0],aOffs.myOffset[1],aOffs.myOffset[2]); } + QMap::Iterator itt; + for (itt = myPointMapPrsMap.begin(); itt != myPointMapPrsMap.end(); ++itt) { + VISU::PointMap3d_i* aPrs = itt.key(); + Offset& aOffs = myOffsets[itt.value()]; + if (VISU_ActorBase* anActor = VISU::FindActorBase(myViewWindow, aPrs)) + anActor->SetPosition(aOffs.myOffset); + if (mySaveChk) + if (mySaveChk->isChecked()) + aPrs->SetOffset(aOffs.myOffset[0],aOffs.myOffset[1],aOffs.myOffset[2]); + } } else { vtkFloatingPointType aDist = 0; vtkFloatingPointType aShift = 0; vtkFloatingPointType aPrevDist = 0; vtkFloatingPointType aPrevShift = 0; - int i; + int i = 0; QMap::Iterator it; - for (it = myPrsMap.begin(), i = 0; it != myPrsMap.end(); ++it, i++) { + for (it = myPrsMap.begin(); it != myPrsMap.end(); ++it, i++) { VISU::Prs3d_i* aPrs = it.key(); if (VISU_Actor* aActor = VISU::FindActor(myViewWindow, aPrs)) { int aAxis = getAxis(); @@ -489,7 +560,69 @@ void ArrangeDlg::acceptViewWindow() aPrevDist = aDist; aPrevShift = aShift; } - } + } // end of myPrsMap loop + // Loop in PointMap3D the same as previous loop + QMap::Iterator itt; + for (itt = myPointMapPrsMap.begin(); itt != myPointMapPrsMap.end(); ++itt, i++) { + VISU::PointMap3d_i* aPrs = itt.key(); + if (VISU_ActorBase* aActor = VISU::FindActorBase(myViewWindow, aPrs)) { + int aAxis = getAxis(); + + vtkFloatingPointType aZeroOffset[3]; + aZeroOffset[0] = aZeroOffset[1] = aZeroOffset[2] = 0; + aActor->SetPosition(aZeroOffset); + aActor->GetMapper()->Update(); + + vtkFloatingPointType aBounds[6]; + aActor->GetBounds(aBounds); + switch (aAxis) { + case XAxis: + aDist = fabs(aBounds[1] - aBounds[0]); + break; + case YAxis: + aDist = fabs(aBounds[3] - aBounds[2]); + break; + case ZAxis: + aDist = fabs(aBounds[5] - aBounds[4]); + } + vtkFloatingPointType aOffset[3]; + aOffset[0] = aOffset[1] = aOffset[2] = 0; + aOffset[aAxis] = + (aBounds[2*aAxis+1] < aBounds[2*aAxis]) ? -aBounds[2*aAxis+1] : -aBounds[2*aAxis]; + + if (i > 0) { + vtkFloatingPointType aCCDist = (aDist + aPrevDist) / 2.0; + + vtkFloatingPointType dx = fabs(aBounds[1] - aBounds[0]); + vtkFloatingPointType dy = fabs(aBounds[3] - aBounds[2]); + vtkFloatingPointType dz = fabs(aBounds[5] - aBounds[4]); + vtkFloatingPointType max = (dx > dy) ? dx : dy; + max = (dz > max) ? dz : max; + max /= 100.0; + + if (aCCDist < max) { + // set base distance between centers of bounding boxes + // to minimal (but big enough) size of current bounding box + if (dx < max) dx = FLT_MAX; + if (dy < max) dy = FLT_MAX; + if (dz < max) dz = FLT_MAX; + + aCCDist = (dx < dy) ? dx : dy; + aCCDist = (dz < aCCDist) ? dz : aCCDist; + } + aShift = aPrevShift + aPrevDist/2.0 + aCCDist*getDistance() - aDist/2.0; + } + + aOffset[aAxis] += aShift; + aActor->SetPosition(aOffset); + if (mySaveChk) + if (mySaveChk->isChecked()) + aPrs->SetOffset(aOffset[0],aOffset[1],aOffset[2]); + + aPrevDist = aDist; + aPrevShift = aShift; + } + } // end of myPointMapPrsMap loop } myViewWindow->getRenderer()->ResetCameraClippingRange(); myViewWindow->Repaint(); @@ -704,6 +837,8 @@ void SetupDlg::initialize() FieldData& aData = myAnimator->getFieldData( 0 ); _PTR(SObject) aField = aData.myField; + if(!aField) return; + _PTR(ChildIterator) anIter = aStudy->NewChildIterator(aField); anIter->Next(); // First is reference on support for(int index = 1; anIter->More(); anIter->Next(), index++) @@ -729,7 +864,7 @@ enum PrsComboItem { TVECTORS_ITEM = 6, // VISU::TVECTORS TSTREAMLINES_ITEM = 7, // VISU::TSTREAMLINES TGAUSSPOINTS_ITEM = 8, // VISU::TGAUSSPOINTS - TSCALARMAPONDEFORMEDSHAPE_ITEM = 9 // VISU::TSCALARMAPONDEFORMEDSHAPE + TDEFORMEDSHAPEANDSCALARMAP_ITEM = 9 // VISU::TDEFORMEDSHAPEANDSCALARMAP }; //------------------------------------------------------------------------ @@ -820,9 +955,9 @@ void SetupDlg::onFieldChange (int theIndex) myTypeId2ComboId[TSTREAMLINES_ITEM] = myComboId2TypeId.size(); myComboId2TypeId.push_back(TSTREAMLINES_ITEM);; - myTypeCombo->addItem("Scalar map on Deformed shape"); // item 9 - myTypeId2ComboId[TSCALARMAPONDEFORMEDSHAPE_ITEM] = myComboId2TypeId.size(); - myComboId2TypeId.push_back(TSCALARMAPONDEFORMEDSHAPE_ITEM);; + myTypeCombo->addItem("Deformed shape and Scalar map"); // item 9 + myTypeId2ComboId[TDEFORMEDSHAPEANDSCALARMAP_ITEM] = myComboId2TypeId.size(); + myComboId2TypeId.push_back(TDEFORMEDSHAPEANDSCALARMAP_ITEM);; } if(anEnableGP){ @@ -851,7 +986,8 @@ void SetupDlg::onFieldChange (int theIndex) myTypeCombo->setCurrentIndex(myTypeId2ComboId[TDEFORMEDSHAPE_ITEM]); break; case VISU::TSCALARMAPONDEFORMEDSHAPE: //Scalar Map on Deformed Shape - myTypeCombo->setCurrentIndex(myTypeId2ComboId[TSCALARMAPONDEFORMEDSHAPE_ITEM]); + case VISU::TDEFORMEDSHAPEANDSCALARMAP: + myTypeCombo->setCurrentIndex(myTypeId2ComboId[TDEFORMEDSHAPEANDSCALARMAP_ITEM]); break; case VISU::TVECTORS: //Vectors myTypeCombo->setCurrentIndex(myTypeId2ComboId[TVECTORS_ITEM]); @@ -895,8 +1031,8 @@ void SetupDlg::onTypeChanged (int theIndex) case TDEFORMEDSHAPE_ITEM: //Deformed Shape aData.myPrsType = VISU::TDEFORMEDSHAPE; break; - case TSCALARMAPONDEFORMEDSHAPE_ITEM: //Scalar Map on Deformed Shape - aData.myPrsType = VISU::TSCALARMAPONDEFORMEDSHAPE; + case TDEFORMEDSHAPEANDSCALARMAP_ITEM: //Scalar Map on Deformed Shape + aData.myPrsType = VISU::TDEFORMEDSHAPEANDSCALARMAP; break; case TVECTORS_ITEM: //Vectors aData.myPrsType = VISU::TVECTORS; @@ -971,7 +1107,7 @@ void SetupDlg::onPreferencesDlg() } } - if(!aData.myNbFrames || !aData.myPrs[0]){ + if(!aData.myNbFrames || aData.myPrs.empty() || !aData.myPrs[0]){ QApplication::restoreOverrideCursor(); SUIT_MessageBox::warning(this, tr("ERROR"), @@ -1006,18 +1142,43 @@ void SetupDlg::onPreferencesDlg() c.suspend(); EditPrs(myModule,aData,myAnimator); break; - case TSCALARMAPONDEFORMEDSHAPE_ITEM: //Scalar Map on Deformed Shape + case TDEFORMEDSHAPEANDSCALARMAP_ITEM: //Scalar Map on Deformed Shape c.suspend(); { - typedef VisuGUI_ScalarMapOnDeformedShapeDlg DLG; - typedef VISU::ScalarMapOnDeformedShape_i TYPE; + typedef VisuGUI_DeformedShapeAndScalarMapDlg DLG; + typedef VISU::DeformedShapeAndScalarMap_i TYPE; DLG* aDlg = new DLG (myModule); TYPE* aPrs3d = dynamic_cast(aData.myPrs[0]); aDlg->initFromPrsObject(aPrs3d, true); - if (aDlg->exec() && aDlg->storeToPrsObject(aData.myPrs[0])) { - for (int i = 1; i < aData.myNbFrames; i++){ - aData.myPrs[i]->SameAs(aData.myPrs[0]); - } + if (aDlg->exec() && aDlg->storeToPrsObject(aData.myPrs[0])) { + for (long aFrameId = 1; aFrameId < aData.myNbFrames; aFrameId++){ + TYPE* aDeformedPrs3d = dynamic_cast(aData.myPrs[aFrameId]); + //Set correct time stamp number + int aTimeStampNum = aDeformedPrs3d->GetScalarTimeStampNumber(); + aDeformedPrs3d->SameAs(aPrs3d); + aDeformedPrs3d->SetScalarField(aDeformedPrs3d->GetScalarEntity(), + aDeformedPrs3d->GetScalarFieldName(), + aTimeStampNum); + + } + + if ( myAnimator->getAnimationMode() == VISU::Animation::SUCCESSIVE ) { + for (int aFieldId = 1; aFieldId < myAnimator->getNbFields(); aFieldId++) { + FieldData& aFieldData = myAnimator->getFieldData(aFieldId); + for (long aFrameId = 0; aFrameId < aFieldData.myNbFrames; aFrameId++) { + TYPE* aDeformedPrs3d = dynamic_cast(aFieldData.myPrs[aFrameId]); + std::string aTitle = aDeformedPrs3d->GetCTitle(); + //Set correct time stamp number + int aTimeStampNum = aDeformedPrs3d->GetScalarTimeStampNumber(); + aDeformedPrs3d->SameAs(aPrs3d); + aDeformedPrs3d->SetTitle(aTitle.c_str()); + aDeformedPrs3d->SetScalarField(aDeformedPrs3d->GetScalarEntity(), + aDeformedPrs3d->GetScalarFieldName(), + aTimeStampNum); + + } + } + } } delete aDlg; } @@ -1625,7 +1786,8 @@ void VisuGUI_TimeAnimationDlg::createFrames() FieldData& aFieldData = myAnimator->getFieldData(i); if( aFieldData.myPrs.empty() ) { - myAnimator->generatePresentations(i); + //myAnimator->generatePresentations(i); + GeneratePresentations(i,myAnimator); continue; } @@ -1634,6 +1796,8 @@ void VisuGUI_TimeAnimationDlg::createFrames() // when a range or a sequence of the animation has been changed if( isRegenerate ) { + GeneratePresentations(i,myAnimator); + /* VISU::ColoredPrs3d_i* aPrs3d = dynamic_cast(aFieldData.myPrs[0]); if( !aPrs3d ) continue; @@ -1649,6 +1813,7 @@ void VisuGUI_TimeAnimationDlg::createFrames() aColoredPrs3d->SetTitle(aTitle.c_str()); } } + */ } } if( isRegenerate ) diff --git a/src/VISUGUI/VisuGUI_TimeAnimation.h b/src/VISUGUI/VisuGUI_TimeAnimation.h index d472288d..400f8513 100644 --- a/src/VISUGUI/VisuGUI_TimeAnimation.h +++ b/src/VISUGUI/VisuGUI_TimeAnimation.h @@ -48,6 +48,7 @@ class VISU_TimeAnimation; namespace VISU { class Prs3d_i; + class PointMap3d_i; } class SVTK_ViewWindow; @@ -114,6 +115,7 @@ class ArrangeDlg: public QDialog int myCurrent; QMap myPrsMap; + QMap myPointMapPrsMap; }; diff --git a/src/VISUGUI/VisuGUI_Tools.cxx b/src/VISUGUI/VisuGUI_Tools.cxx index ef30aef2..6df04f65 100644 --- a/src/VISUGUI/VisuGUI_Tools.cxx +++ b/src/VISUGUI/VisuGUI_Tools.cxx @@ -381,6 +381,79 @@ namespace VISU theSelectionMgr->setSelectedObjects(aNewListIO); } + /*! + * \brief Check, if the object can be deleted + * + * \param theEntry - entry of the object to check + * \param theModule - is used to access Study and VISU_Gen + * \retval bool - returns TRUE if the object is removable + */ + bool + IsRemovable (const std::string theEntry, + const SalomeApp_Module* theModule) + { + // asv : if selected object is a Save Point object selected in object browser - return false + if ( QString( theEntry.c_str() ).startsWith( QObject::tr( "SAVE_POINT_DEF_NAME" ) ) ) + return false; + + _PTR(Study) aStudy = GetCStudy(GetAppStudy(theModule)); + + _PTR(SObject) aSObject = aStudy->FindObjectID(theEntry); + VISU::Storable::TRestoringMap pMap; + if (aSObject) { + CORBA::Object_var aCORBAObject = VISU::ClientSObjectToObject(aSObject); + if (!CORBA::is_nil(aCORBAObject)) { + VISU::RemovableObject_var aRemovableObj = VISU::RemovableObject::_narrow(aCORBAObject); + if (CORBA::is_nil(aRemovableObj)) { + // Not removable CORBA object + return false; + } + } else { + // Can be removed, if lays directly under VISU + // (first sub-level) or is a child of such an object + string aNAME, aVisuNAME = GetVisuGen(theModule)->ComponentDataType(); + _PTR(GenericAttribute) anAttr; + _PTR(AttributeString) aComment; + + bool isUnderVISU = false; + _PTR(SObject) aFatherSObject = aSObject->GetFather(); + if (aFatherSObject->FindAttribute(anAttr, "AttributeName")) { + // mkr : 24.11.2006 : use AttributeName and module title for correct "Delete" + // popup item displaying in object browser popup + _PTR(AttributeName) aComment (anAttr); + aNAME = aComment->Value(); + QString aVisuTITLE = theModule->getApp()->moduleTitle(aVisuNAME.c_str()); + if (!aVisuTITLE.compare(aNAME.c_str())) { + isUnderVISU = true; + } + } + if (!isUnderVISU) { + // Not directly under VISU component, check father + aCORBAObject = VISU::ClientSObjectToObject(aFatherSObject); + if (!CORBA::is_nil(aCORBAObject)) { + // Father has IOR + return false; + } + + isUnderVISU = false; + aFatherSObject = aFatherSObject->GetFather(); + if (aFatherSObject->FindAttribute(anAttr, "AttributeString")) { + _PTR(AttributeString) aComment (anAttr); + aNAME = aComment->Value(); + if (aNAME == aVisuNAME) { + isUnderVISU = true; + } + } + if (!isUnderVISU) { + // Father is not directly under VISU component + return false; + } + } + } + } + return true; + } + /*! * \brief Check, if "Delete" popup-menu can be put on current selection * @@ -404,64 +477,8 @@ namespace VISU for (; anIter.More(); anIter.Next()) { Handle(SALOME_InteractiveObject) anIO = anIter.Value(); if (anIO->hasEntry()) { - - // asv : if selected object is a Save Point object selected in object browser - return false - if ( QString( anIO->getEntry() ).startsWith( QObject::tr( "SAVE_POINT_DEF_NAME" ) ) ) - return false; - - _PTR(SObject) aSObject = aStudy->FindObjectID(anIO->getEntry()); - VISU::Storable::TRestoringMap pMap; - if (aSObject) { - CORBA::Object_var aCORBAObject = VISU::ClientSObjectToObject(aSObject); - if (!CORBA::is_nil(aCORBAObject)) { - VISU::RemovableObject_var aRemovableObj = VISU::RemovableObject::_narrow(aCORBAObject); - if (CORBA::is_nil(aRemovableObj)) { - // Not removable CORBA object - return false; - } - } else { - // Can be removed, if lays directly under VISU - // (first sub-level) or is a child of such an object - string aNAME, aVisuNAME = GetVisuGen(theModule)->ComponentDataType(); - _PTR(GenericAttribute) anAttr; - _PTR(AttributeString) aComment; - - bool isUnderVISU = false; - _PTR(SObject) aFatherSObject = aSObject->GetFather(); - if (aFatherSObject->FindAttribute(anAttr, "AttributeName")) { - // mkr : 24.11.2006 : use AttributeName and module title for correct "Delete" - // popup item displaying in object browser popup - _PTR(AttributeName) aComment (anAttr); - aNAME = aComment->Value().c_str(); - QString aVisuTITLE = theModule->getApp()->moduleTitle(QString(aVisuNAME.c_str())); - if (!aVisuTITLE.compare(QString(aNAME.c_str()))) { - isUnderVISU = true; - } - } - if (!isUnderVISU) { - // Not directly under VISU component, check father - aCORBAObject = VISU::ClientSObjectToObject(aFatherSObject); - if (!CORBA::is_nil(aCORBAObject)) { - // Father has IOR - return false; - } - - isUnderVISU = false; - aFatherSObject = aFatherSObject->GetFather(); - if (aFatherSObject->FindAttribute(anAttr, "AttributeString")) { - _PTR(AttributeString) aComment (anAttr); - aNAME = aComment->Value(); - if (aNAME == aVisuNAME) { - isUnderVISU = true; - } - } - if (!isUnderVISU) { - // Father is not directly under VISU component - return false; - } - } - } - } + if (!IsRemovable(anIO->getEntry(), theModule)) + return false; } } return true; @@ -540,32 +557,58 @@ namespace VISU if(aSelectionInfo.empty()) return; + VISU::Prs3d_i* aPrs3d; + VISU::PointMap3d_i* aTable; + VISU_Actor* anActor; + VISU_ActorBase* anActorBase; + TSelectionItem aSelectionItem = aSelectionInfo.front(); - VISU::Prs3d_i* aPrs3d = GetPrs3dFromBase(aSelectionItem.myObjectInfo.myBase); - if(!aPrs3d) - return; + aPrs3d = GetPrs3dFromBase(aSelectionItem.myObjectInfo.myBase); + if(!aPrs3d) { + aTable = dynamic_cast(aSelectionItem.myObjectInfo.myBase); + if(!aTable) + return; + } SVTK_ViewWindow* aViewWindow = GetActiveViewWindow(theModule); if(!aViewWindow) return; - VISU_Actor* anActor = FindActor(aViewWindow, aPrs3d); - if(!anActor) - return; + if (aPrs3d) { + anActor = FindActor(aViewWindow, aPrs3d); + if(!anActor) + return; + } else { + anActorBase = VISU::FindActorBase(aViewWindow, aTable); + if(!anActorBase) + return; + } switch (theType) { case VISU::SHRINK: + if (aPrs3d) { if (anActor->IsShrunk()) anActor->UnShrink(); else anActor->SetShrink(); + } else if (aTable) { + if (anActorBase->IsShrunk()) + anActorBase->UnShrink(); + else + anActorBase->SetShrink(); + } break; default: - if (VISU::Mesh_i* aMesh = dynamic_cast(aPrs3d)) { - aMesh->SetPresentationType(theType); - RecreateActor(theModule, aMesh); - } else { - anActor->SetRepresentation(theType); + if (aPrs3d) { + if (VISU::Mesh_i* aMesh = dynamic_cast(aPrs3d)) { + aMesh->SetPresentationType(theType); + RecreateActor(theModule, aMesh); + } else { + anActor->SetRepresentation(theType); + } + } + else if (aTable) { + anActorBase->SetRepresentation(theType); } } aViewWindow->Repaint(); @@ -730,6 +773,17 @@ namespace VISU return FindActor(theViewWindow, aPrs3d); } + //------------------------------------------------------------ + VISU_ActorBase* + FindActorBase(const SalomeApp_Study* theStudy, + SVTK_ViewWindow* theViewWindow, + const QString& theEntry) + { + TObjectInfo anObjectInfo = GetObjectByEntry(theStudy, theEntry.toLatin1().constData()); + VISU::PointMap3d_i* aTable = dynamic_cast(anObjectInfo.myBase); + return FindActorBase(theViewWindow, aTable); + } + //------------------------------------------------------------ void RecreateActor (const SalomeApp_Module* theModule, @@ -979,17 +1033,32 @@ namespace VISU aPlot->getCurves( clist ); SPlot2d_Curve* plotCurve = 0; SPlot2d_Curve* tmpCurve; - for (int i = 0; i < clist.count(); i++) { - tmpCurve = dynamic_cast(clist.at(i)); - if (tmpCurve && tmpCurve->hasIO() && - theCurve->GetEntry() != tmpCurve->getIO()->getEntry()) { - plotCurve = tmpCurve; - } else if (theDisplaying == VISU::eDisplayOnly) { - aPlot->eraseCurve(clist.at(i)); + if(theDisplaying == VISU::eErase) { + // 23.06.2008 skl for IPAL17672 + for (int i = 0; i < clist.count(); i++) { + tmpCurve = dynamic_cast(clist.at(i)); + if (tmpCurve && tmpCurve->hasIO() && + theCurve->GetEntry() == tmpCurve->getIO()->getEntry()) { + plotCurve = tmpCurve; + aPlot->eraseCurve(clist.at(i)); + break; + } } + UpdateCurve(theCurve, aPlot, plotCurve, theDisplaying); + } + else { + for (int i = 0; i < clist.count(); i++) { + tmpCurve = dynamic_cast(clist.at(i)); + if (tmpCurve && tmpCurve->hasIO() && + theCurve->GetEntry() != tmpCurve->getIO()->getEntry()) { + plotCurve = tmpCurve; + } + else if (theDisplaying == VISU::eDisplayOnly) { + aPlot->eraseCurve(clist.at(i)); + } + } + UpdateCurve(theCurve, aPlot, plotCurve, theDisplaying); } - - UpdateCurve(theCurve, aPlot, plotCurve, theDisplaying); aPlot->Repaint(); } @@ -1057,7 +1126,9 @@ namespace VISU } } aPlot->Repaint(); - aPlot->fitAll(); + if(GetResourceMgr()->booleanValue("VISU","automatic_fit_all",false)){ + aPlot->fitAll(); + } qApp->processEvents(); } @@ -1169,7 +1240,9 @@ namespace VISU if(av)(const_cast(av))->OnEraseAll(); } PublishMeshInView(theModule, pPresent, theViewWindow); - SetFitAll(theViewWindow); + if(GetResourceMgr()->booleanValue("VISU","automatic_fit_all",false)){ + SetFitAll(theViewWindow); + } #ifdef CHECKTIME timer.Stop(); MESSAGE("VisuGUI::CreateMesh() - DISPLAY MESH"); @@ -1228,6 +1301,7 @@ namespace VISU case VISU::TSTREAMLINES: case VISU::TPLOT3D: case VISU::TSCALARMAPONDEFORMEDSHAPE: + case VISU::TDEFORMEDSHAPEANDSCALARMAP: { PortableServer::ServantBase_var aServant = VISU::GetServant(aCORBAObject); if (aServant.in()) { diff --git a/src/VISUGUI/VisuGUI_Tools.h b/src/VISUGUI/VisuGUI_Tools.h index 8e69af3d..e5d8510b 100644 --- a/src/VISUGUI/VisuGUI_Tools.h +++ b/src/VISUGUI/VisuGUI_Tools.h @@ -127,6 +127,8 @@ namespace VISU void Remove(LightApp_SelectionMgr* theSelectionMgr, const Handle(SALOME_InteractiveObject)& theIO); + bool IsRemovable (const std::string theEntry, + const SalomeApp_Module* theModule); bool IsRemovableSelected(const SalomeApp_Module* theModule); void DeleteSObject(VisuGUI* theModule, @@ -168,6 +170,9 @@ namespace VISU VISU_Actor* FindActor(const SalomeApp_Study* theStudy, SVTK_ViewWindow* theViewWindow, const QString& theEntry); + VISU_ActorBase* FindActorBase(const SalomeApp_Study* theStudy, + SVTK_ViewWindow* theViewWindow, + const QString& theEntry); void RecreateActor(const SalomeApp_Module* theModule, VISU::Prs3d_i* thePrs); diff --git a/src/VISUGUI/VisuGUI_TransparencyDlg.cxx b/src/VISUGUI/VisuGUI_TransparencyDlg.cxx index b470b5a0..ba83ec2d 100644 --- a/src/VISUGUI/VisuGUI_TransparencyDlg.cxx +++ b/src/VISUGUI/VisuGUI_TransparencyDlg.cxx @@ -217,6 +217,11 @@ void VisuGUI_TransparencyDlg::SetTransparency() VISU_Actor* anActor = VISU::FindActor(VISU::GetAppStudy(myModule), myViewWindow, anIO->getEntry()); if (anActor) anActor->SetOpacity(opacity); + else { + VISU_ActorBase* anActor = VISU::FindActorBase(VISU::GetAppStudy(myModule), myViewWindow, anIO->getEntry()); + if (anActor) + anActor->SetOpacity(opacity); + } } myViewWindow->Repaint(); } diff --git a/src/VISUGUI/VisuGUI_VectorsDlg.cxx b/src/VISUGUI/VisuGUI_VectorsDlg.cxx index b0f4bdcc..ed7bcc57 100644 --- a/src/VISUGUI/VisuGUI_VectorsDlg.cxx +++ b/src/VISUGUI/VisuGUI_VectorsDlg.cxx @@ -91,7 +91,11 @@ VisuGUI_VectorsDlg::VisuGUI_VectorsDlg (SalomeApp_Module* theModule) ScaleLabel = new QLabel (tr("LBL_SCALE_FACTOR"), TopGroup ); ScalFact = new QtxDoubleSpinBox( 1e-20, 1.0E+38, 0.1, TopGroup ); - ScalFact->setDecimals( 5 ); + + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + int aPrecision = aResourceMgr->integerValue( "VISU", "floating_point_precision", 0 ); + + ScalFact->setDecimals( aPrecision*(-1) ); // ScalFact->setDecimals( 5 ); ScalFact->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); ScalFact->setValue( 0.1 ); @@ -322,9 +326,20 @@ void VisuGUI_VectorsDlg::enableSetColor() /*! Sets Scale factor */ -void VisuGUI_VectorsDlg::setScaleFactor( double sf ) +void VisuGUI_VectorsDlg::setScaleFactor( double theFactor ) { - ScalFact->setValue( sf ); + double i=0.1; + while (1) { // Calculate Step & Precission + if ( int (theFactor/i) > 0) + break; + else { + i = i*0.1; + } + } + + ScalFact->setSingleStep(i); + + ScalFact->setValue( theFactor ); } /*! diff --git a/src/VISU_I/Makefile.am b/src/VISU_I/Makefile.am index a4ff436a..0bc6b6ac 100644 --- a/src/VISU_I/Makefile.am +++ b/src/VISU_I/Makefile.am @@ -50,10 +50,14 @@ salomeinclude_HEADERS = \ VISU_ViewManager_i.hh \ VISU_View_i.hh \ VISU_TimeAnimation.h \ - VISU_ScalarMapOnDeformedShape_i.hh \ + VISU_DeformedShapeAndScalarMap_i.hh \ VISU_ColoredPrs3dFactory.hh \ + VISU_MonoColorPrs_i.hh \ + VISU_Deformation_i.hh \ + VISU_OptionalDeformation_i.hh \ SALOME_GenericObjPointer.hh + libVISUEngineImpl_la_SOURCES = \ VISUConfig.cc \ VISU_Result_i.cc \ @@ -74,7 +78,7 @@ libVISUEngineImpl_la_SOURCES = \ VISU_CutLines_i.cc \ VISU_Vectors_i.cc \ VISU_StreamLines_i.cc \ - VISU_ScalarMapOnDeformedShape_i.cc \ + VISU_DeformedShapeAndScalarMap_i.cc \ VISU_ColoredPrs3dCache_i.cc \ VISU_ColoredPrs3dHolder_i.cc \ VISU_ColoredPrs3dFactory.cc \ @@ -85,6 +89,9 @@ libVISUEngineImpl_la_SOURCES = \ VISU_Table_i.cc \ VISU_PointMap3d_i.cc \ VISU_DumpPython.cc \ + VISU_MonoColorPrs_i.cc \ + VISU_Deformation_i.cc \ + VISU_OptionalDeformation_i.cc \ SALOME_GenericObjPointer.cc MOC_FILES = VISU_TimeAnimation_moc.cxx diff --git a/src/VISU_I/VISUConfig.cc b/src/VISU_I/VISUConfig.cc index 2ff2fd7f..073d07c8 100644 --- a/src/VISU_I/VISUConfig.cc +++ b/src/VISU_I/VISUConfig.cc @@ -214,8 +214,8 @@ namespace VISU return VISU::TISOSURFACES; if ( theComment == "DEFORMEDSHAPE" ) return VISU::TDEFORMEDSHAPE; - if ( theComment == "SCALARMAPONDEFORMEDSHAPE" ) - return VISU::TSCALARMAPONDEFORMEDSHAPE; + if ( theComment == "DEFORMEDSHAPEANDSCALARMAP" ) + return VISU::TDEFORMEDSHAPEANDSCALARMAP; if ( theComment == "GAUSSPOINTS" ) return VISU::TGAUSSPOINTS; if ( theComment == "PLOT3D" ) diff --git a/src/VISU_I/VISU_ColoredPrs3dCache_i.cc b/src/VISU_I/VISU_ColoredPrs3dCache_i.cc index 76fee4fb..9e833c82 100644 --- a/src/VISU_I/VISU_ColoredPrs3dCache_i.cc +++ b/src/VISU_I/VISU_ColoredPrs3dCache_i.cc @@ -47,6 +47,8 @@ #include +#include "utilities.h" + #ifdef _DEBUG_ static int MYDEBUG = 0; #else @@ -390,7 +392,7 @@ VISU::ColoredPrs3dCache_i ::CreateHolder(VISU::VISUType theType, const VISU::ColoredPrs3dHolder::BasicInput& theInput) { - if(MYDEBUG) cout << "CreateHolder " << theType << endl; + if(MYDEBUG) MESSAGE ("CreateHolder "<GetEntry().c_str() << " " << aList.size() << endl; + if(MYDEBUG) MESSAGE("GetLastVisitedPrs " << theHolder->GetEntry().c_str() << " " << aList.size() ); if( !aList.empty() ) return aList.front(); return VISU::TPrs3dPtr(); @@ -622,7 +624,7 @@ VISU::ColoredPrs3dCache_i const VISU::ColoredPrs3dHolder::BasicInput& theInput, VISU::View3D_ptr theView3D) { - if(MYDEBUG) cout << "VISU::ColoredPrs3dCache_i::UpdateLastVisitedPrs" << endl; + if(MYDEBUG) MESSAGE( "VISU::ColoredPrs3dCache_i::UpdateLastVisitedPrs" ); TPrs3dPtr aPrs3d; try{ TPrs3dPtr aLastVisitedPrs3d = GetLastVisitedPrs(theHolder); @@ -633,12 +635,12 @@ VISU::ColoredPrs3dCache_i CORBA::Float aRequiredMemory = 0.0; if(aPrs3d = FindPrsByInput(aLastVisitedPrsList, theInput)){ aLastVisitedPrsList.push_front(aPrs3d); - if(MYDEBUG) cout << "FindPrsByInput " << aPrs3d << endl; + if(MYDEBUG) MESSAGE( "FindPrsByInput " << aPrs3d ); }else if(anIsCheckPossible && IsPossible(aPrsType, theInput, aRequiredMemory, aHolderEntry)){ if( aRequiredMemory > 1.0 / VTK_LARGE_FLOAT ) ClearMemory(aRequiredMemory, aHolderEntry); aPrs3d = CreatePrs(aPrsType, theInput, theHolder); - if(MYDEBUG) cout << "Created " << aPrs3d << endl; + if(MYDEBUG) MESSAGE( "Created " << aPrs3d ); }else{ aPrs3d = aLastVisitedPrsList.back(); aPrs3d->SetResultObject(theInput.myResult); @@ -648,12 +650,21 @@ VISU::ColoredPrs3dCache_i aPrs3d->SetTimeStampNumber(theInput.myTimeStampNumber); aLastVisitedPrsList.pop_back(); aLastVisitedPrsList.push_front(aPrs3d); - if(MYDEBUG) cout << "Move only " << aPrs3d << endl; + if(MYDEBUG) MESSAGE( "Move only " << aPrs3d ); } //if(MYDEBUG) PrintCache(); aPrs3d->SameAs(thePrs); - aPrs3d->UpdateActors(); + + // special case for deformed shape + VISU::DeformedShapeAndScalarMap_i* dShape = + dynamic_cast( aPrs3d.get() ); + if ( dShape && dShape->GetScalarTimeStampNumber() != theInput.myTimeStampNumber ) + { + dShape->SetScalarField( dShape->GetScalarEntity(), + dShape->GetScalarFieldName(), theInput.myTimeStampNumber ); + } + if(CORBA::is_nil(theView3D)) return false; @@ -697,6 +708,8 @@ VISU::ColoredPrs3dCache_i aPrs3d->SetActiveState(true); } + + aPrs3d->UpdateActors(); ProcessVoidEvent(new TRenderEvent(aViewWindow)); //aViewWindow->getRenderWindow()->Render(); return true; @@ -761,8 +774,8 @@ VISU::ColoredPrs3dCache_i { if(MYDEBUG) { - cout << "--------------CACHE-----------------" << endl; - cout << "Cache memory - " << GetMemorySize() << " Mb" << endl; + MESSAGE_BEGIN(std::endl << "--------------CACHE-----------------" ); + MESSAGE_ADD(std::endl << "Cache memory - " << GetMemorySize() << " Mb" ); TColoredPrs3dHolderMap::const_iterator aHolderIter = myHolderMap.begin(); TColoredPrs3dHolderMap::const_iterator aHolderIterEnd = myHolderMap.end(); for(; aHolderIter != aHolderIterEnd; aHolderIter++){ @@ -770,19 +783,18 @@ VISU::ColoredPrs3dCache_i TLastVisitedPrsList::const_iterator aPrsIter = aPrsList.begin(); TLastVisitedPrsList::const_iterator aPrsIterEnd = aPrsList.end(); - cout << "--------------------------" << endl; - cout << "Holder - " << aHolderIter->first.c_str() << endl; - cout << "Size - " << aPrsList.size() << endl; + MESSAGE_ADD(std::endl << "--------------------------" ); + MESSAGE_ADD(std::endl << "Holder - " << aHolderIter->first.c_str() ); + MESSAGE_ADD(std::endl << "Size - " << aPrsList.size() ); for(; aPrsIter != aPrsIterEnd; aPrsIter++) if(TPrs3dPtr aPrs3d = *aPrsIter) { - cout << aPrs3d << " (" << aPrs3d->GetMemorySize() << " Mb)"; + MESSAGE_ADD(std::endl << aPrs3d << " (" << aPrs3d->GetMemorySize() << " Mb)"); if(aPrsIter == aPrsList.begin()) - cout << " (device)"; - cout << endl; + MESSAGE_ADD( " (device)" ); } } - cout << "------------------------------------" << endl; + MESSAGE_END(std::endl << "------------------------------------" ); } } diff --git a/src/VISU_I/VISU_ColoredPrs3dFactory.cc b/src/VISU_I/VISU_ColoredPrs3dFactory.cc index cff778da..0aee75f2 100644 --- a/src/VISU_I/VISU_ColoredPrs3dFactory.cc +++ b/src/VISU_I/VISU_ColoredPrs3dFactory.cc @@ -97,7 +97,8 @@ namespace VISU case TDEFORMEDSHAPE: return VISU::CreatePrs3dByEnum(theStudy, thePublishInStudyMode); case TSCALARMAPONDEFORMEDSHAPE: - return VISU::CreatePrs3dByEnum(theStudy, thePublishInStudyMode); + case TDEFORMEDSHAPEANDSCALARMAP: + return VISU::CreatePrs3dByEnum(theStudy, thePublishInStudyMode); case TISOSURFACES: return VISU::CreatePrs3dByEnum(theStudy, thePublishInStudyMode); case TSTREAMLINES: @@ -201,7 +202,8 @@ namespace VISU aMemory = CheckIsPossible(theInput, theMemoryCheck); break; case TSCALARMAPONDEFORMEDSHAPE: - aMemory = CheckIsPossible(theInput, theMemoryCheck); + case TDEFORMEDSHAPEANDSCALARMAP: + aMemory = CheckIsPossible(theInput, theMemoryCheck); break; case TISOSURFACES: aMemory = CheckIsPossible(theInput, theMemoryCheck); diff --git a/src/VISU_I/VISU_ColoredPrs3dFactory.hh b/src/VISU_I/VISU_ColoredPrs3dFactory.hh index eae438dd..98ee08f2 100644 --- a/src/VISU_I/VISU_ColoredPrs3dFactory.hh +++ b/src/VISU_I/VISU_ColoredPrs3dFactory.hh @@ -33,7 +33,7 @@ #include "VISU_I.hxx" #include "SALOME_GenericObjPointer.hh" -#include "VISU_ScalarMapOnDeformedShape_i.hh" +#include "VISU_DeformedShapeAndScalarMap_i.hh" #include "VISU_Plot3D_i.hh" #include "VISU_GaussPoints_i.hh" #include "VISU_StreamLines_i.hh" @@ -52,7 +52,8 @@ namespace VISU namespace TL { //---------------------------------------------------------------------------- - typedef TList > > > > > > > > > + TNullType> > > > > > > > > > > TColoredPrs3dTypeList; typedef TList, + TList, TList, TList, TList, @@ -76,7 +78,7 @@ namespace VISU TList, TList, TList, - TNullType> > > > > > > > > > + TNullType> > > > > > > > > > > TColoredPrs3dEnumList; diff --git a/src/VISU_I/VISU_ColoredPrs3d_i.cc b/src/VISU_I/VISU_ColoredPrs3d_i.cc index 2bdb127f..787eba58 100644 --- a/src/VISU_I/VISU_ColoredPrs3d_i.cc +++ b/src/VISU_I/VISU_ColoredPrs3d_i.cc @@ -170,6 +170,12 @@ VISU::ColoredPrs3d_i:: ColoredPrs3d_i(EPublishInStudyMode thePublishInStudyMode) : myPublishInStudyMode(thePublishInStudyMode), myIsTimeStampFixed(thePublishInStudyMode == EPublishUnderTimeStamp), + myEntity( VISU::Entity( -1 ) ), + myPreviousEntity( VISU::Entity( -1 ) ), + myTimeStampNumber( -1 ), + myPreviousTimeStampNumber( -1 ), + myIsUnits( true ), + myOrientation( VISU::ColoredPrs3dBase::HORIZONTAL ), myColoredPL(NULL), myIsFixedRange(false), myIsRestored(true) @@ -341,7 +347,7 @@ void VISU::ColoredPrs3d_i ::SetEntity(VISU::Entity theEntity) { - if(myEntity == theEntity) + if ( myEntity == theEntity ) return; VISU::TSetModified aModified(this); @@ -425,7 +431,7 @@ void VISU::ColoredPrs3d_i ::SetTimeStampNumber(CORBA::Long theTimeStampNumber) { - if(myTimeStampNumber == theTimeStampNumber) + if ( myTimeStampNumber == theTimeStampNumber ) return; VISU::TSetModified aModified(this); @@ -710,14 +716,14 @@ VISU::ColoredPrs3d_i SetShadowTitle(anOrigin->IsShadowTitle()); SetTitFontType(anOrigin->GetTitFontType()); vtkFloatingPointType r,g,b; - anOrigin->GetTitleColor(&r,&g,&b); + anOrigin->GetTitleColor(r,g,b); SetTitleColor(r,g,b); SetBoldLabel(anOrigin->IsBoldLabel()); SetItalicLabel(anOrigin->IsItalicLabel()); SetShadowLabel(anOrigin->IsShadowLabel()); SetLblFontType(anOrigin->GetLblFontType()); - anOrigin->GetLabelColor(&r,&g,&b); + anOrigin->GetLabelColor(r,g,b); SetLabelColor(r,g,b); myIsTimeStampFixed = anOrigin->IsTimeStampFixed(); @@ -931,7 +937,7 @@ void VISU::ColoredPrs3d_i ::SetBarOrientation(VISU::ColoredPrs3dBase::Orientation theOrientation) { - if(myOrientation == theOrientation) + if ( myOrientation == theOrientation ) return; VISU::TSetModified aModified(this); @@ -1177,13 +1183,15 @@ VISU::ColoredPrs3d_i //---------------------------------------------------------------------------- void VISU::ColoredPrs3d_i -::SetUnitsVisible(CORBA::Boolean isVisible) +::SetUnitsVisible(CORBA::Boolean theIsVisible) { - if( myIsUnits != isVisible ){ - VISU::TSetModified aModified(this); - myIsUnits = isVisible; - myParamsTime.Modified(); - } + if ( myIsUnits == theIsVisible ) + return; + + VISU::TSetModified aModified( this ); + + myIsUnits = theIsVisible; + myParamsTime.Modified(); } //---------------------------------------------------------------------------- @@ -1293,13 +1301,13 @@ VISU::ColoredPrs3d_i //---------------------------------------------------------------------------- void VISU::ColoredPrs3d_i -::GetTitleColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB) +::GetTitleColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB) { - *theR = myTitleColor[0]; - *theG = myTitleColor[1]; - *theB = myTitleColor[2]; + theR = myTitleColor[0]; + theG = myTitleColor[1]; + theB = myTitleColor[2]; } //---------------------------------------------------------------------------- @@ -1414,13 +1422,13 @@ VISU::ColoredPrs3d_i //---------------------------------------------------------------------------- void VISU::ColoredPrs3d_i -::GetLabelColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB) +::GetLabelColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB) { - *theR = myLabelColor[0]; - *theG = myLabelColor[1]; - *theB = myLabelColor[2]; + theR = myLabelColor[0]; + theG = myLabelColor[1]; + theB = myLabelColor[2]; } //---------------------------------------------------------------------------- @@ -1593,9 +1601,11 @@ VISU::ColoredPrs3d_i QColor aTextColor = aResourceMgr->colorValue( "VISU", "scalar_bar_title_color", QColor( 255, 255, 255 ) ); - myTitleColor[0] = aTextColor.red() / 255; - myTitleColor[1] = aTextColor.green() / 255; - myTitleColor[2] = aTextColor.blue() / 255; + SetTitleColor(aTextColor.red()/255., aTextColor.green()/255., aTextColor.blue()/255.); + + myTitleColor[0] = aTextColor.red() / 255.; + myTitleColor[1] = aTextColor.green() / 255.; + myTitleColor[2] = aTextColor.blue() / 255.; myIsBoldLabel = myIsItalicLabel = myIsShadowLabel = true; myLblFontType = VTK_ARIAL; @@ -1616,9 +1626,11 @@ VISU::ColoredPrs3d_i QColor aLabelColor = aResourceMgr->colorValue( "VISU", "scalar_bar_label_color", QColor( 255, 255, 255 ) ); - myLabelColor[0] = aLabelColor.red() / 255; - myLabelColor[1] = aLabelColor.green() / 255; - myLabelColor[2] = aLabelColor.blue() / 255; + SetLabelColor(aLabelColor.red()/255., aLabelColor.green()/255., aLabelColor.blue()/255.); + + myLabelColor[0] = aLabelColor.red() / 255.; + myLabelColor[1] = aLabelColor.green() / 255.; + myLabelColor[2] = aLabelColor.blue() / 255.; return this; } diff --git a/src/VISU_I/VISU_ColoredPrs3d_i.hh b/src/VISU_I/VISU_ColoredPrs3d_i.hh index 50177693..9046637c 100644 --- a/src/VISU_I/VISU_ColoredPrs3d_i.hh +++ b/src/VISU_I/VISU_ColoredPrs3d_i.hh @@ -483,9 +483,9 @@ namespace VISU virtual void - GetTitleColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB); + GetTitleColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB); virtual void @@ -527,9 +527,9 @@ namespace VISU virtual void - GetLabelColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB); + GetLabelColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB); virtual void diff --git a/src/VISU_I/VISU_CorbaMedConvertor.cxx b/src/VISU_I/VISU_CorbaMedConvertor.cxx index 385ca3f2..1bdcf0ae 100644 --- a/src/VISU_I/VISU_CorbaMedConvertor.cxx +++ b/src/VISU_I/VISU_CorbaMedConvertor.cxx @@ -37,6 +37,8 @@ #include "ReceiverFactory.hxx" #include "MED_SliceArray.hxx" +#include "utilities.h" + #define USER_INTERLACE MED_FULL_INTERLACE #ifdef _DEBUG_ @@ -588,13 +590,13 @@ namespace else aGeom2ProfileIds = aSupport->getNumberFromFile(aMGeom); int aLen = aGeom2ProfileIds->length(); - if(MYDEBUG) MESSAGE(" - aMGeom="<" << anId << endl; + if(MYDEBUG) MESSAGE_ADD(std::endl << "------------------------------->" << anId); } - if(MYDEBUG) cout << endl; + if(MYDEBUG) MESSAGE_END(" "); } catch(...) { continue; } diff --git a/src/VISU_I/VISU_CutLines_i.cc b/src/VISU_I/VISU_CutLines_i.cc index cdb55177..e329711c 100644 --- a/src/VISU_I/VISU_CutLines_i.cc +++ b/src/VISU_I/VISU_CutLines_i.cc @@ -102,6 +102,7 @@ VISU::CutLines_i:: CutLines_i(EPublishInStudyMode thePublishInStudyMode) : ColoredPrs3d_i(thePublishInStudyMode), ScalarMap_i(thePublishInStudyMode), + myUseAbsLength( false ), myCutLinesPL(NULL) {} @@ -551,7 +552,7 @@ void VISU::CutLines_i ::SetUseAbsoluteLength(CORBA::Boolean theAbsLength) { - if(myUseAbsLength == theAbsLength) + if ( myUseAbsLength == theAbsLength ) return; VISU::TSetModified aModified(this); diff --git a/src/VISU_I/VISU_CutPlanes_i.cc b/src/VISU_I/VISU_CutPlanes_i.cc index 55856310..4592dea6 100644 --- a/src/VISU_I/VISU_CutPlanes_i.cc +++ b/src/VISU_I/VISU_CutPlanes_i.cc @@ -25,6 +25,7 @@ // Module : VISU #include "VISU_CutPlanesPL.hxx" +#include "VISU_Convertor.hxx" #include "VISU_Prs3dUtils.hh" #include "VISU_CutPlanes_i.hh" @@ -41,6 +42,7 @@ static int MYDEBUG = 0; #endif + //---------------------------------------------------------------------------- size_t VISU::CutPlanes_i @@ -95,8 +97,12 @@ VISU::CutPlanes_i ::CutPlanes_i(EPublishInStudyMode thePublishInStudyMode): ColoredPrs3d_i(thePublishInStudyMode), ScalarMap_i(thePublishInStudyMode), - myCutPlanesPL(NULL) -{} + myCutPlanesPL(NULL), + Deformation_i(this), + OptionalDeformation_i(this) +{ + if(MYDEBUG) MESSAGE("CutPlanes_i::CutPlanes_i()"); +} //---------------------------------------------------------------------------- @@ -131,6 +137,8 @@ VISU::CutPlanes_i if(aCondList[i].toInt() == 0) SetPlanePosition(i,aPosList[i].toDouble()); + OptionalDeformation_i::RestoreDeformation(theSObject,theMap); + return this; } @@ -152,6 +160,7 @@ void VISU::CutPlanes_i::ToStream(std::ostringstream& theStr){ } Storable::DataToStream( theStr, "myPlanePosition", (const char*)aStrPos.toLatin1()); Storable::DataToStream( theStr, "myPlaneCondition", (const char*)aStrCon.toLatin1()); + OptionalDeformation_i::DeformationToStream(theStr); } @@ -321,6 +330,7 @@ VISU::CutPlanes_i }else myCutPlanesPL = dynamic_cast(thePipeLine); + InitDeformedPipeLine(myCutPlanesPL); TSuperClass::CreatePipeLine(myCutPlanesPL); } @@ -348,3 +358,10 @@ VISU::CutPlanes_i return NULL; } +void +VISU::CutPlanes_i:: +SameAs(const Prs3d_i* theOrigin){ + if(MYDEBUG) MESSAGE("CutPlanes_i::SameAs()"); + TSuperClass::SameAs(theOrigin); + OptionalDeformation_i::SameAsDeformation(dynamic_cast(theOrigin)); +} diff --git a/src/VISU_I/VISU_CutPlanes_i.hh b/src/VISU_I/VISU_CutPlanes_i.hh index 9386f9f3..8a5f9355 100644 --- a/src/VISU_I/VISU_CutPlanes_i.hh +++ b/src/VISU_I/VISU_CutPlanes_i.hh @@ -28,6 +28,7 @@ #define VISU_CutPlanes_i_HeaderFile #include "VISU_ScalarMap_i.hh" +#include "VISU_OptionalDeformation_i.hh" class VISU_CutPlanesPL; @@ -35,7 +36,8 @@ namespace VISU { //---------------------------------------------------------------------------- class VISU_I_EXPORT CutPlanes_i : public virtual POA_VISU::CutPlanes, - public virtual ScalarMap_i + public virtual ScalarMap_i, + public virtual OptionalDeformation_i { static int myNbPresent; CutPlanes_i(const CutPlanes_i&); @@ -157,6 +159,10 @@ namespace VISU Restore(SALOMEDS::SObject_ptr theSObject, const Storable::TRestoringMap& theMap); + virtual + void + SameAs(const Prs3d_i* theOrigin); + //! Redefines VISU_ColoredPrs3d_i::CreateActor virtual VISU_Actor* diff --git a/src/VISU_I/VISU_Deformation_i.cc b/src/VISU_I/VISU_Deformation_i.cc new file mode 100755 index 00000000..507a9476 --- /dev/null +++ b/src/VISU_I/VISU_Deformation_i.cc @@ -0,0 +1,166 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File : VISU_Deformation_i.cc +// Author : +// Module : VISU + +#include "VISU_Deformation_i.hh" +#include "VISU_Result_i.hh" +#include "VISU_Prs3dUtils.hh" + +#include "VISU_DeformationPL.hxx" +#include "VISU_Convertor.hxx" +#include "VISU_DeformationPL.hxx" +#include "VISUConfig.hh" + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + +//--------------------------------------------------------------- +VISU::Deformation_i::Deformation_i(VISU::ColoredPrs3d_i *thePrs3d): + myColoredPrs3d(thePrs3d) +{ + if(MYDEBUG) MESSAGE("Deformation_i::Deformation_i()"); +} + +//--------------------------------------------------------------- +VISU::Deformation_i::~Deformation_i() +{ + if(MYDEBUG) MESSAGE("Deformation_i::~Deformation_i()"); +} + +//--------------------------------------------------------------- +void VISU::Deformation_i::SetScale(CORBA::Double theScale) +{ + if(MYDEBUG) MESSAGE("Deformation_i::SetScale()"); + + VISU::TSetModified aModified(GetColoredPrs3d()); + + ProcessVoidEvent(new TVoidMemFun1ArgEvent + (GetSpecificDeformedPL(), &VISU_DeformationPL::SetScale, theScale)); +} + +//--------------------------------------------------------------- +void VISU::Deformation_i::InitDeformedPipeLine(VISU_DeformationPL* theDeformedPipeLine){ + + if(MYDEBUG) MESSAGE("Deformation_i::InitDeformedPipeLine()"); + myDeformationPL = theDeformedPipeLine; +} + +//--------------------------------------------------------------- +CORBA::Double +VISU::Deformation_i +::GetScale() +{ + if(MYDEBUG) MESSAGE("Deformation_i::GetScale()"); + return GetSpecificDeformedPL()->GetScale(); +} + +//--------------------------------------------------------------- +VISU::Entity VISU::Deformation_i::GetVectorialFieldEntity(){ + return myVectorialEntity; +} + +//--------------------------------------------------------------- +char* VISU::Deformation_i::GetVectorialFieldName(){ + return CORBA::string_dup(myVectorialFieldName.c_str()); +} + +//--------------------------------------------------------------- +void VISU::Deformation_i:: +DeformationToStream(std::ostringstream& theStr) +{ + Storable::DataToStream(theStr,"myScaleFactor", GetScale()); + Storable::DataToStream(theStr,"myVectorialField", GetVectorialFieldName()); + Storable::DataToStream(theStr,"myVectorialEntiry", GetVectorialFieldEntity()); + +} + +//--------------------------------------------------------------- +void +VISU::Deformation_i::RestoreDeformation(SALOMEDS::SObject_ptr theSObject, + const Storable::TRestoringMap& theMap) +{ + SetScale(VISU::Storable::FindValue(theMap,"myScaleFactor").toDouble()); + VISU::Entity anEntity = VISU::Entity(VISU::Storable::FindValue(theMap, "myVectorialEntiry").toInt()); + + SetVectorialField(anEntity, + VISU::Storable::FindValue(theMap, "myVectorialField").toLatin1().constData()); +} + +//--------------------------------------------------------------- +void +VISU::Deformation_i::SameAsDeformation(const Deformation_i *aDeformedPrs){ + if(const Deformation_i* aPrs = dynamic_cast(aDeformedPrs)) { + Deformation_i* anOrigin = const_cast(aPrs); + + CORBA::String_var aVectorialFieldName = anOrigin->GetVectorialFieldName(); + VISU::Entity anEntity = anOrigin->GetVectorialFieldEntity(); + this->SetVectorialField(anEntity, + aVectorialFieldName); + this->SetScale(anOrigin->GetScale()); + } +} + +void VISU::Deformation_i::SetVectorialField(Entity theEntity, const char* theFieldName){ + if(MYDEBUG) MESSAGE("CutPlanes_i::SetVectorialField()"); + + bool anIsModified = false; + if(!anIsModified) + anIsModified |= GetVectorialFieldEntity() != theEntity; + + if(!anIsModified) + anIsModified |= GetVectorialFieldName() != theFieldName; + + if(!anIsModified) + return; + + ColoredPrs3d_i *aColoredPrs = GetColoredPrs3d(); + int aTimeStampNumber = aColoredPrs->GetTimeStampNumber(); + + VISU::TEntity aEntity = VISU::TEntity(theEntity); + + VISU::Result_i::PInput anInput = aColoredPrs->GetCResult()->GetInput(aColoredPrs->GetCMeshName(), + theEntity, + theFieldName, + aTimeStampNumber); + + PField aVectorialField = anInput->GetField(aColoredPrs->GetCMeshName(), aEntity, theFieldName); + + VISU::PUnstructuredGridIDMapper anIDMapper = + anInput->GetTimeStampOnMesh(aColoredPrs->GetCMeshName(), + aEntity, + theFieldName, + aTimeStampNumber); + if(GetSpecificDeformedPL() && anIDMapper) { + ProcessVoidEvent(new TVoidMemFun1ArgEvent + (GetSpecificDeformedPL(), &VISU_DeformationPL::SetVectorialField, anIDMapper)); + + VISU::TSetModified aModified(GetColoredPrs3d()); + + myVectorialEntity = theEntity; + myVectorialFieldName = theFieldName; + myVectorialField = anIDMapper; + } +}; diff --git a/src/VISU_I/VISU_Deformation_i.hh b/src/VISU_I/VISU_Deformation_i.hh new file mode 100755 index 00000000..821b2735 --- /dev/null +++ b/src/VISU_I/VISU_Deformation_i.hh @@ -0,0 +1,103 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File : VISU_Deformation_i.hxx +// Author : +// Module : VISU + +#ifndef VISU_Deformation_i_HeaderFile +#define VISU_Deformation_i_HeaderFile + +#include "VISU_I.hxx" +#include "VISU_ColoredPrs3d_i.hh" +#include "VISU_DeformationPL.hxx" + + + +namespace VISU{ + + class VISU_I_EXPORT Deformation_i : public virtual POA_VISU::Deformation + { + Deformation_i(const Deformation_i&); + public: + typedef VISU::Deformation TInterface; + + Deformation_i(VISU::ColoredPrs3d_i* theColoredPrs3d); + virtual ~Deformation_i(); + + virtual + void + SetScale(CORBA::Double theScale); + + virtual + CORBA::Double + GetScale(); + + virtual + void + DeformationToStream(std::ostringstream& theStr); + + virtual + void + RestoreDeformation(SALOMEDS::SObject_ptr theSObject, + const Storable::TRestoringMap& theMap); + + virtual + void + SameAsDeformation(const Deformation_i *aDeformedPrs); + + virtual + VISU::Entity + GetVectorialFieldEntity(); + + virtual + char* + GetVectorialFieldName(); + + virtual void SetVectorialField(Entity theEntity, const char* theFieldName); + + protected: + virtual + void + InitDeformedPipeLine(VISU_DeformationPL* theDeformedPipeLine); + + VISU_DeformationPL* + GetSpecificDeformedPL() const + { + return myDeformationPL; + } + + ColoredPrs3d_i* GetColoredPrs3d(){ + return myColoredPrs3d; + } + + + private: + VISU_DeformationPL *myDeformationPL; + + PField myVectorialField; + VISU::Entity myVectorialEntity; + std::string myVectorialFieldName; + ColoredPrs3d_i *myColoredPrs3d; + + }; +} + +#endif diff --git a/src/VISU_I/VISU_ScalarMapOnDeformedShape_i.cc b/src/VISU_I/VISU_DeformedShapeAndScalarMap_i.cc similarity index 78% rename from src/VISU_I/VISU_ScalarMapOnDeformedShape_i.cc rename to src/VISU_I/VISU_DeformedShapeAndScalarMap_i.cc index 1a5d6388..9667e0c3 100644 --- a/src/VISU_I/VISU_ScalarMapOnDeformedShape_i.cc +++ b/src/VISU_I/VISU_DeformedShapeAndScalarMap_i.cc @@ -20,16 +20,16 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // -// File : VISU_ScalarMapOnDeformedShape_i.cc +// File : VISU_DeformedShapeAndScalarMap_i.cc // Author : Eugeny Nikolaev // Module : VISU -#include "VISU_ScalarMapOnDeformedShape_i.hh" +#include "VISU_DeformedShapeAndScalarMap_i.hh" #include "VISU_Prs3dUtils.hh" #include "VISU_Result_i.hh" #include "VISU_ScalarMapAct.h" -#include "VISU_ScalarMapOnDeformedShapePL.hxx" +#include "VISU_DeformedShapeAndScalarMapPL.hxx" #include "VISU_Convertor.hxx" #include "SUIT_ResourceMgr.h" @@ -50,7 +50,7 @@ static int INCMEMORY = 4+12; //--------------------------------------------------------------- size_t -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::IsPossible(Result_i* theResult, const std::string& theMeshName, VISU::Entity theEntity, @@ -87,7 +87,7 @@ VISU::ScalarMapOnDeformedShape_i aSize *= INCMEMORY; aResult = VISU_PipeLine::CheckAvailableMemory(aSize); if(MYDEBUG) - MESSAGE("ScalarMapOnDeformedShape_i::IsPossible - CheckAvailableMemory = "<(theOrigin)){ - ScalarMapOnDeformedShape_i* anOrigin = const_cast(aPrs3d); + if(const DeformedShapeAndScalarMap_i* aPrs3d = dynamic_cast(theOrigin)){ + DeformedShapeAndScalarMap_i* anOrigin = const_cast(aPrs3d); CORBA::String_var aFieldName = anOrigin->GetScalarFieldName(); SetScalarField(anOrigin->GetScalarEntity(), @@ -228,44 +228,44 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- void -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::SetScale(CORBA::Double theScale) { VISU::TSetModified aModified(this); - ProcessVoidEvent(new TVoidMemFun1ArgEvent - (GetSpecificPL(), &VISU_ScalarMapOnDeformedShapePL::SetScale, theScale)); + ProcessVoidEvent(new TVoidMemFun1ArgEvent + (GetSpecificPL(), &VISU_DeformedShapeAndScalarMapPL::SetScale, theScale)); } //--------------------------------------------------------------- CORBA::Double -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::GetScale() { - return myScalarMapOnDeformedShapePL->GetScale(); + return myDeformedShapeAndScalarMapPL->GetScale(); } //--------------------------------------------------------------- void -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::CreatePipeLine(VISU_PipeLine* thePipeLine) { if(!thePipeLine){ - myScalarMapOnDeformedShapePL = VISU_ScalarMapOnDeformedShapePL::New(); + myDeformedShapeAndScalarMapPL = VISU_DeformedShapeAndScalarMapPL::New(); }else - myScalarMapOnDeformedShapePL = dynamic_cast(thePipeLine); + myDeformedShapeAndScalarMapPL = dynamic_cast(thePipeLine); - myScalarMapOnDeformedShapePL->GetMapper()->SetScalarVisibility(1); + myDeformedShapeAndScalarMapPL->GetMapper()->SetScalarVisibility(1); - TSuperClass::CreatePipeLine(myScalarMapOnDeformedShapePL); + TSuperClass::CreatePipeLine(myDeformedShapeAndScalarMapPL); } //--------------------------------------------------------------- bool -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::CheckIsPossible() { return IsPossible(GetCResult(),GetCMeshName(),GetEntity(),GetCFieldName(),GetTimeStampNumber(),true); @@ -274,7 +274,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- VISU_Actor* -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::CreateActor() { VISU_Actor* anActor = TSuperClass::CreateActor(true); @@ -291,7 +291,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- void -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::UpdateActor(VISU_Actor* theActor) { if(VISU_ScalarMapAct* anActor = dynamic_cast(theActor)){ @@ -304,7 +304,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- void -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::SetField(VISU::PField theField) { TSuperClass::SetField(theField); @@ -316,7 +316,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- void -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::SetScalarField(VISU::Entity theEntity, const char* theFieldName, CORBA::Long theTimeStampNumber) @@ -351,9 +351,9 @@ VISU::ScalarMapOnDeformedShape_i theTimeStampNumber); vtkUnstructuredGrid* anOutput = anIDMapper->GetUnstructuredGridOutput(); - if(myScalarMapOnDeformedShapePL && anOutput) - ProcessVoidEvent(new TVoidMemFun1ArgEvent - (GetSpecificPL(), &VISU_ScalarMapOnDeformedShapePL::SetScalars, anOutput)); + if(myDeformedShapeAndScalarMapPL && anOutput) + ProcessVoidEvent(new TVoidMemFun1ArgEvent + (GetSpecificPL(), &VISU_DeformedShapeAndScalarMapPL::SetScalars, anOutput)); myScalarEntity = theEntity; myScalarFieldName = theFieldName; @@ -370,7 +370,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- VISU::Entity -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::GetScalarEntity() { return myScalarEntity; @@ -379,7 +379,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- char* -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::GetScalarFieldName() { return CORBA::string_dup(myScalarFieldName.c_str()); @@ -388,7 +388,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- CORBA::Long -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::GetScalarTimeStampNumber() { return myScalarTimeStampNumber; @@ -397,7 +397,7 @@ VISU::ScalarMapOnDeformedShape_i //--------------------------------------------------------------- VISU::PField -VISU::ScalarMapOnDeformedShape_i +VISU::DeformedShapeAndScalarMap_i ::GetScalarField() { return myScalarField; diff --git a/src/VISU_I/VISU_ScalarMapOnDeformedShape_i.hh b/src/VISU_I/VISU_DeformedShapeAndScalarMap_i.hh similarity index 82% rename from src/VISU_I/VISU_ScalarMapOnDeformedShape_i.hh rename to src/VISU_I/VISU_DeformedShapeAndScalarMap_i.hh index 83f2e64d..35827d1d 100644 --- a/src/VISU_I/VISU_ScalarMapOnDeformedShape_i.hh +++ b/src/VISU_I/VISU_DeformedShapeAndScalarMap_i.hh @@ -20,43 +20,43 @@ // See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com // // -// File: VISU_ScalarMapOnDeformedShape_i.hh +// File: VISU_DeformedShapeAndScalarMap_i.hh // Author: Eugeny Nikolaev // Module : VISU -#ifndef VISU_ScalarMapOnDeformedShape_i_HeaderFile -#define VISU_ScalarMapOnDeformedShape_i_HeaderFile +#ifndef VISU_DeformedShapeAndScalarMap_i_HeaderFile +#define VISU_DeformedShapeAndScalarMap_i_HeaderFile #include "VISU_ScalarMap_i.hh" -class VISU_ScalarMapOnDeformedShapePL; +class VISU_DeformedShapeAndScalarMapPL; namespace VISU { //---------------------------------------------------------------------------- //! Class of Scalar Map on Deformed Shape presentation. - class VISU_I_EXPORT ScalarMapOnDeformedShape_i : public virtual POA_VISU::ScalarMapOnDeformedShape, - public virtual ScalarMap_i + class VISU_I_EXPORT DeformedShapeAndScalarMap_i : public virtual POA_VISU::DeformedShapeAndScalarMap, + public virtual ScalarMap_i { static int myNbPresent; - ScalarMapOnDeformedShape_i(const ScalarMapOnDeformedShape_i&); + DeformedShapeAndScalarMap_i(const DeformedShapeAndScalarMap_i&); public: //---------------------------------------------------------------------------- typedef ScalarMap_i TSuperClass; - typedef VISU::ScalarMapOnDeformedShape TInterface; + typedef VISU::DeformedShapeAndScalarMap TInterface; explicit - ScalarMapOnDeformedShape_i(EPublishInStudyMode thePublishInStudyModep); + DeformedShapeAndScalarMap_i(EPublishInStudyMode thePublishInStudyModep); virtual - ~ScalarMapOnDeformedShape_i(); + ~DeformedShapeAndScalarMap_i(); virtual VISU::VISUType GetType() { - return VISU::TSCALARMAPONDEFORMEDSHAPE; + return VISU::TDEFORMEDSHAPEANDSCALARMAP; } virtual @@ -71,10 +71,10 @@ namespace VISU void SameAs(const Prs3d_i* theOrigin); - VISU_ScalarMapOnDeformedShapePL* + VISU_DeformedShapeAndScalarMapPL* GetSpecificPL() { - return myScalarMapOnDeformedShapePL; + return myDeformedShapeAndScalarMapPL; } protected: @@ -168,7 +168,7 @@ namespace VISU GetScalarField(); private: - VISU_ScalarMapOnDeformedShapePL *myScalarMapOnDeformedShapePL; + VISU_DeformedShapeAndScalarMapPL *myDeformedShapeAndScalarMapPL; PField myScalarField; VISU::Entity myScalarEntity; diff --git a/src/VISU_I/VISU_DeformedShape_i.cc b/src/VISU_I/VISU_DeformedShape_i.cc index de8f43cf..a4811982 100644 --- a/src/VISU_I/VISU_DeformedShape_i.cc +++ b/src/VISU_I/VISU_DeformedShape_i.cc @@ -123,6 +123,7 @@ VISU::DeformedShape_i ::DeformedShape_i(EPublishInStudyMode thePublishInStudyMode): ColoredPrs3d_i(thePublishInStudyMode), ScalarMap_i(thePublishInStudyMode), + MonoColorPrs_i(thePublishInStudyMode), myDeformedShapePL(NULL) { if(MYDEBUG) MESSAGE("DeformedShape_i::DeformedShape_i"); @@ -151,8 +152,6 @@ VISU::DeformedShape_i const std::string& theFieldName, CORBA::Long theTimeStampNumber) { - myIsColored = false; - myColor.R = myColor.G = myColor.B = 0.5; return TSuperClass::Create(theMeshName,theEntity,theFieldName,theTimeStampNumber); } @@ -167,10 +166,6 @@ VISU::DeformedShape_i return NULL; SetScale(VISU::Storable::FindValue(theMap,"myFactor").toDouble()); - myIsColored = VISU::Storable::FindValue(theMap,"myIsColored").toInt(); - myColor.R = VISU::Storable::FindValue(theMap,"myColor.R").toDouble(); - myColor.G = VISU::Storable::FindValue(theMap,"myColor.G").toDouble(); - myColor.B = VISU::Storable::FindValue(theMap,"myColor.B").toDouble(); return this; } @@ -184,11 +179,6 @@ VISU::DeformedShape_i TSuperClass::ToStream(theStr); Storable::DataToStream( theStr, "myFactor", GetScale() ); - - Storable::DataToStream( theStr, "myIsColored", myIsColored ); - Storable::DataToStream( theStr, "myColor.R", myColor.R ); - Storable::DataToStream( theStr, "myColor.G", myColor.G ); - Storable::DataToStream( theStr, "myColor.B", myColor.B ); } @@ -220,54 +210,6 @@ VISU::DeformedShape_i } -//--------------------------------------------------------------- -CORBA::Boolean -VISU::DeformedShape_i -::IsColored() -{ - return myIsColored; -} - - -//--------------------------------------------------------------- -void -VISU::DeformedShape_i -::ShowColored(CORBA::Boolean theColored) -{ - if(myIsColored == theColored) - return; - - myIsColored = theColored; - myParamsTime.Modified(); -} - -//--------------------------------------------------------------- -SALOMEDS::Color -VISU::DeformedShape_i -::GetColor() -{ - return myColor; -} - - -//--------------------------------------------------------------- -void -VISU::DeformedShape_i -::SetColor(const SALOMEDS::Color& theColor) -{ - bool anIsSameValue = VISU::CheckIsSameValue(myColor.R, theColor.R); - anIsSameValue &= VISU::CheckIsSameValue(myColor.G, theColor.G); - anIsSameValue &= VISU::CheckIsSameValue(myColor.B, theColor.B); - if(anIsSameValue) - return; - - VISU::TSetModified aModified(this); - - myColor = theColor; - myParamsTime.Modified(); -} - - //--------------------------------------------------------------- void VISU::DeformedShape_i @@ -321,34 +263,7 @@ VISU::DeformedShape_i bool toShrink = aResourceMgr->booleanValue("VISU", "deformed_shape_shrink", false); anActor->SetRepresentation(aDispMode); if (toShrink && !toSupressShrinking) anActor->SetShrink(); - anActor->GetProperty()->SetColor(myColor.R,myColor.G,myColor.B); return anActor; } -//--------------------------------------------------------------- -VISU_Actor* -VISU::DeformedShape_i -::CreateActor() -{ - return CreateActor(false); -} - - -//--------------------------------------------------------------- -void -VISU::DeformedShape_i -::UpdateActor(VISU_Actor* theActor) -{ - if(VISU_ScalarMapAct* anActor = dynamic_cast(theActor)){ - if(IsColored()){ - anActor->SetBarVisibility(true); - GetPipeLine()->GetMapper()->SetScalarVisibility(1); - }else{ - anActor->SetBarVisibility(false); - GetPipeLine()->GetMapper()->SetScalarVisibility(0); - anActor->GetProperty()->SetColor(myColor.R,myColor.G,myColor.B); - } - TSuperClass::UpdateActor(theActor); - } -} diff --git a/src/VISU_I/VISU_DeformedShape_i.hh b/src/VISU_I/VISU_DeformedShape_i.hh index 1f5d90c7..96487209 100644 --- a/src/VISU_I/VISU_DeformedShape_i.hh +++ b/src/VISU_I/VISU_DeformedShape_i.hh @@ -28,7 +28,7 @@ #define VISU_DeformedShape_i_HeaderFile #include -#include "VISU_ScalarMap_i.hh" +#include "VISU_MonoColorPrs_i.hh" class VISU_DeformedShapePL; @@ -36,14 +36,14 @@ namespace VISU { //---------------------------------------------------------------------------- class VISU_I_EXPORT DeformedShape_i : public virtual POA_VISU::DeformedShape, - public virtual ScalarMap_i + public virtual MonoColorPrs_i { static int myNbPresent; DeformedShape_i(const DeformedShape_i&); public: //---------------------------------------------------------------------------- - typedef ScalarMap_i TSuperClass; + typedef MonoColorPrs_i TSuperClass; typedef VISU::DeformedShape TInterface; explicit @@ -71,22 +71,6 @@ namespace VISU CORBA::Double GetScale(); - virtual - CORBA::Boolean - IsColored(); - - virtual - void - ShowColored(CORBA::Boolean theColored); - - virtual - SALOMEDS::Color - GetColor(); - - virtual - void - SetColor(const SALOMEDS::Color& theColor); - VISU_DeformedShapePL* GetSpecificPL() const { @@ -105,8 +89,6 @@ namespace VISU CheckIsPossible(); VISU_DeformedShapePL *myDeformedShapePL; - SALOMEDS::Color myColor; - bool myIsColored; public: static @@ -152,17 +134,10 @@ namespace VISU void SetMapScale(double theMapScale = 1.0); - virtual - VISU_Actor* - CreateActor(); - virtual VISU_Actor* CreateActor(bool toSupressShrinking); - virtual - void - UpdateActor(VISU_Actor* theActor) ; }; } diff --git a/src/VISU_I/VISU_DumpPython.cc b/src/VISU_I/VISU_DumpPython.cc index 8c4f613f..93da7d73 100644 --- a/src/VISU_I/VISU_DumpPython.cc +++ b/src/VISU_I/VISU_DumpPython.cc @@ -39,8 +39,9 @@ #include "VISU_StreamLines_i.hh" #include "VISU_Plot3D_i.hh" #include "VISU_Table_i.hh" +#include "VISU_PointMap3d_i.hh" #include "VISU_GaussPoints_i.hh" -#include "VISU_ScalarMapOnDeformedShape_i.hh" +#include "VISU_DeformedShapeAndScalarMap_i.hh" #include "VISU_ColoredPrs3dCache_i.hh" #include "VISU_ColoredPrs3dHolder_i.hh" @@ -415,6 +416,21 @@ namespace VISU return thePrefix; } + //--------------------------------------------------------------------------- + std::string + MonoColorPrsToPython(SALOMEDS::SObject_ptr theSObject, + VISU::MonoColorPrs_i* theServant, + std::ostream& theStr, + const std::string& theName, + TColoredPrs3dFactory& thePrsFactory, + std::string thePrefix) + { + thePrefix = ScalarMapToPython(theSObject, theServant, theStr, theName, thePrsFactory, thePrefix); + theStr<IsColored())<<")"<GetColor())<<")"<GetScale()<<")"<IsColored())<<")"<GetColor())<<")"<IsColored())<<")"<GetColor())<<")"<GetNbSurfaces()<<")"<IsLabeled()<<","<GetNbLabels()<<")"<GetPlanePosition(anId)<<")"<IsDeformed())<<")"<IsDeformed()){ + theStr<< thePrefix << theName << ".SetScale(" << theServant->GetScale()<<")"<GetVectorialFieldEntity(); + switch(anEntity){ + case NODE: + aStringEntity = "VISU.NODE"; + break; + case EDGE: + aStringEntity = "VISU.EDGE"; + break; + case FACE: + aStringEntity = "VISU.FACE"; + break; + case CELL: + aStringEntity = "VISU.CELL"; + break; + } + theStr<< thePrefix << theName << ".SetVectorialField("<GetVectorialFieldName() <<"')"<(GetServant(anObj).in())){ - TCreateFromResult aPrsFactory(theSObject, aServant, aName, "ScalarMapOnDeformedShapeOnField", theArgumentName); - thePrefix = ScalarMapOnDeformedShapeToPython(theSObject, aServant, theStr, aName, aPrsFactory, thePrefix); + case VISU::TDEFORMEDSHAPEANDSCALARMAP: + if(DeformedShapeAndScalarMap_i* aServant = dynamic_cast(GetServant(anObj).in())){ + TCreateFromResult aPrsFactory(theSObject, aServant, aName, "DeformedShapeAndScalarMapOnField", theArgumentName); + thePrefix = DeformedShapeAndScalarMapToPython(theSObject, aServant, theStr, aName, aPrsFactory, thePrefix); theStr<(GetServant(anObj).in())) { + CORBA::Short aTag = theSObject->Tag(); + theStr<GetScaleFactor()<<")"<GetIsContourPrs()<<")"<GetNbOfContours()<<")"<GetScaling()){ + case LINEAR: + aParam = "VISU.LINEAR"; + break; + case LOGARITHMIC: + aParam = "VISU.LOGARITHMIC"; + break; + } + theStr<GetNbColors()<<")"<GetLabels()<<")"<GetBarOrientation()){ + case ColoredPrs3dBase::HORIZONTAL: + aParam = "VISU.ColoredPrs3d.HORIZONTAL"; + break; + case ColoredPrs3dBase::VERTICAL: + aParam = "VISU.ColoredPrs3d.VERTICAL"; + break; + } + theStr<IsRangeFixed()) + theStr<GetMin()<<", "<GetMax()<<")"<GetPosX()<<", "<GetPosY()<<")"<GetWidth()<<", "<GetHeight()<<")"<GetOffset(dx, dy, dz); + theStr<(GetServant(anObj).in())){ TCreateFromResult aPrsFactory(theSObject, aServant, aName, "GaussPointsOnField", theArgumentName); @@ -1721,8 +1832,9 @@ namespace VISU break; } case VISU::TSCALARMAPONDEFORMEDSHAPE: - if(ScalarMapOnDeformedShape_i* aServant = dynamic_cast(aDevice)){ - ScalarMapOnDeformedShapeToPython(aSObject, aServant, theStr, "aDevice", aPrsFactory, aPrefix3); + case VISU::TDEFORMEDSHAPEANDSCALARMAP: + if(DeformedShapeAndScalarMap_i* aServant = dynamic_cast(aDevice)){ + DeformedShapeAndScalarMapToPython(aSObject, aServant, theStr, "aDevice", aPrsFactory, aPrefix3); break; } case VISU::TVECTORS: diff --git a/src/VISU_I/VISU_GaussPoints_i.cc b/src/VISU_I/VISU_GaussPoints_i.cc index d8f465ce..cbb1fe7f 100644 --- a/src/VISU_I/VISU_GaussPoints_i.cc +++ b/src/VISU_I/VISU_GaussPoints_i.cc @@ -892,7 +892,7 @@ VISU::GaussPoints_i vtkTextProperty* aTitleProp = theScalarBar->GetTitleTextProperty(); aTitleProp->SetFontFamily(GetTitFontType()); - GetTitleColor(&anRGB[0],&anRGB[1],&anRGB[2]); + GetTitleColor(anRGB[0],anRGB[1],anRGB[2]); aTitleProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); IsBoldTitle()? aTitleProp->BoldOn() : aTitleProp->BoldOff(); @@ -902,7 +902,7 @@ VISU::GaussPoints_i vtkTextProperty* aLabelProp = theScalarBar->GetLabelTextProperty(); aLabelProp->SetFontFamily(GetLblFontType()); - GetLabelColor(&anRGB[0],&anRGB[1],&anRGB[2]); + GetLabelColor(anRGB[0],anRGB[1],anRGB[2]); aLabelProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); IsBoldLabel()? aLabelProp->BoldOn() : aLabelProp->BoldOff(); diff --git a/src/VISU_I/VISU_Gen_i.cc b/src/VISU_I/VISU_Gen_i.cc index f4ccad96..0732d558 100644 --- a/src/VISU_I/VISU_Gen_i.cc +++ b/src/VISU_I/VISU_Gen_i.cc @@ -210,7 +210,7 @@ namespace VISU Storable::RegistryStorableEngine(StreamLines_i::myComment.c_str(),&(StorableEngine)); Storable::RegistryStorableEngine(Plot3D_i::myComment.c_str(),&(StorableEngine)); Storable::RegistryStorableEngine(Vectors_i::myComment.c_str(),&(StorableEngine)); - Storable::RegistryStorableEngine(ScalarMapOnDeformedShape_i::myComment.c_str(),&(StorableEngine)); + Storable::RegistryStorableEngine(DeformedShapeAndScalarMap_i::myComment.c_str(),&(StorableEngine)); Storable::RegistryStorableEngine(ColoredPrs3dHolder_i::myComment.c_str(),&(ColoredPrs3dHolder_i::StorableEngine)); Storable::RegistryStorableEngine(ColoredPrs3dCache_i::myComment.c_str(),&(ColoredPrs3dCache_i::StorableEngine)); @@ -968,7 +968,7 @@ namespace VISU //--------------------------------------------------------------- - ScalarMapOnDeformedShape_ptr + DeformedShapeAndScalarMap_ptr VISU_Gen_i ::ScalarMapOnDeformedShapeOnField(Result_ptr theResult, const char* theMeshName, @@ -976,11 +976,28 @@ namespace VISU const char* theFieldName, CORBA::Long theIteration) { - return Prs3dOnField(theResult, - theMeshName, - theEntity, - theFieldName, - theIteration)._retn(); + return DeformedShapeAndScalarMapOnField(theResult, + theMeshName, + theEntity, + theFieldName, + theIteration); + } + + +//--------------------------------------------------------------- + DeformedShapeAndScalarMap_ptr + VISU_Gen_i + ::DeformedShapeAndScalarMapOnField(Result_ptr theResult, + const char* theMeshName, + VISU::Entity theEntity, + const char* theFieldName, + CORBA::Long theIteration) + { + return Prs3dOnField(theResult, + theMeshName, + theEntity, + theFieldName, + theIteration)._retn(); } @@ -1150,7 +1167,9 @@ namespace VISU VISU_Gen_i ::CreateTable(const char* theTableEntry) { - if(myStudyDocument->GetProperties()->IsLocked()) + TCollection_AsciiString tmp( (char*)theTableEntry ); // 11.06.2008 IPAL18844 + if( myStudyDocument->GetProperties()->IsLocked() || + tmp.Length()==0 ) return Table::_nil(); return ProcessEvent(new CreateTableEvent(myStudyDocument, theTableEntry)); @@ -1375,12 +1394,11 @@ namespace VISU SALOMEDS_Tool::PutStreamToFiles(theStream, aTmpDir, false); if(MYDEBUG) MESSAGE("Result_i::PasteInto - aListOfFileNames->length() = "<length()); - std::string aLocalPersistentID; + std::ostrstream aLocalPersistentID; { std::string aCopyPersist = aTmpDir + "copy_persistent"; - std::ifstream anInputFileStream(aCopyPersist.c_str()); - anInputFileStream>>aLocalPersistentID; - anInputFileStream.close(); + std::ifstream anInputFileStream( aCopyPersist.c_str() ); + anInputFileStream >> aLocalPersistentID.rdbuf(); } //Just for Result::Restore to find the Comment attribute :( @@ -1389,7 +1407,7 @@ namespace VISU std::string aFileName(aTmpDir); if(aListOfFileNames->length() > 1) aFileName += aListOfFileNames[1].in(); - Storable* aStorable = Storable::Create(aSObject, aLocalPersistentID, aFileName, false); + Storable* aStorable = Storable::Create(aSObject, aLocalPersistentID.str(), aFileName, false); SALOMEDS::ListOfFileNames_var aFilesToRemove = new SALOMEDS::ListOfFileNames; aFilesToRemove->length(1); diff --git a/src/VISU_I/VISU_Gen_i.hh b/src/VISU_I/VISU_Gen_i.hh index 1f38e06e..1043ed2a 100644 --- a/src/VISU_I/VISU_Gen_i.hh +++ b/src/VISU_I/VISU_Gen_i.hh @@ -177,13 +177,23 @@ namespace VISU const char* theFieldName, CORBA::Long theIteration); + //This function is obsolete. Use DeformedShapeAndScalarMapOnField instead. virtual - ScalarMapOnDeformedShape_ptr + DeformedShapeAndScalarMap_ptr ScalarMapOnDeformedShapeOnField(Result_ptr theResult, const char* theMeshName, VISU::Entity theEntity, const char* theFieldName, CORBA::Long theIteration); + + virtual + DeformedShapeAndScalarMap_ptr + DeformedShapeAndScalarMapOnField(Result_ptr theResult, + const char* theMeshName, + VISU::Entity theEntity, + const char* theFieldName, + CORBA::Long theIteration); + virtual Vectors_ptr VectorsOnField(Result_ptr theResult, diff --git a/src/VISU_I/VISU_I.cxx b/src/VISU_I/VISU_I.cxx index 6c8c3973..27114c9f 100644 --- a/src/VISU_I/VISU_I.cxx +++ b/src/VISU_I/VISU_I.cxx @@ -43,7 +43,7 @@ #include "VISU_Vectors_i.hh" #include "VISU_StreamLines_i.hh" #include "VISU_GaussPoints_i.hh" -#include "VISU_ScalarMapOnDeformedShape_i.hh" +#include "VISU_DeformedShapeAndScalarMap_i.hh" #include "VISU_ViewManager_i.hh" #include "VISU_View_i.hh" #include "VISU_TimeAnimation.h" diff --git a/src/VISU_I/VISU_IsoSurfaces_i.cc b/src/VISU_I/VISU_IsoSurfaces_i.cc index 30b01592..90e3b18a 100644 --- a/src/VISU_I/VISU_IsoSurfaces_i.cc +++ b/src/VISU_I/VISU_IsoSurfaces_i.cc @@ -30,9 +30,12 @@ #include "VISU_IsoSurfacesPL.hxx" #include "VISU_Result_i.hh" #include "VISU_Actor.h" +#include "VISU_ScalarMapAct.h" +#include "VISU_IsoSurfActor.h" #include "SUIT_ResourceMgr.h" #include "SALOME_Event.h" +#include #ifdef _DEBUG_ static int MYDEBUG = 0; @@ -94,7 +97,10 @@ VISU::IsoSurfaces_i ::IsoSurfaces_i(EPublishInStudyMode thePublishInStudyMode) : ColoredPrs3d_i(thePublishInStudyMode), ScalarMap_i(thePublishInStudyMode), - myIsoSurfacesPL(NULL) + MonoColorPrs_i(thePublishInStudyMode), + myIsoSurfacesPL(NULL), + myIsLabeled(false), + myNbLabels(3) {} @@ -106,7 +112,12 @@ VISU::IsoSurfaces_i const std::string& theFieldName, CORBA::Long theTimeStampNumber) { - return TSuperClass::Create(theMeshName,theEntity,theFieldName,theTimeStampNumber); + VISU::Storable* aRes = TSuperClass::Create(theMeshName,theEntity,theFieldName,theTimeStampNumber); + myIsColored = true; + myColor.R = myColor.G = myColor.B = 0.; + //myIsLabeled = false; + //myNbLabels = 3; + return aRes; } @@ -122,6 +133,8 @@ VISU::IsoSurfaces_i SetNbSurfaces(VISU::Storable::FindValue(theMap,"myNbSurface").toInt()); float aMin = VISU::Storable::FindValue(theMap,"myRange[0]").toDouble(); float aMax = VISU::Storable::FindValue(theMap,"myRange[1]").toDouble(); + myNbLabels = VISU::Storable::FindValue(theMap,"myNbLabels").toInt(); + myIsLabeled = VISU::Storable::FindValue(theMap,"myIsLabeled").toInt(); SetSubRange(aMin,aMax); return this; @@ -138,8 +151,22 @@ VISU::IsoSurfaces_i Storable::DataToStream( theStr, "myNbSurface", int(GetNbSurfaces()) ); Storable::DataToStream( theStr, "myRange[0]", GetSubMin() ); Storable::DataToStream( theStr, "myRange[1]", GetSubMax() ); + Storable::DataToStream( theStr, "myNbLabels", myNbLabels ); + Storable::DataToStream( theStr, "myIsLabeled", myIsLabeled ); } +//--------------------------------------------------------------- +void VISU::IsoSurfaces_i::SameAs(const Prs3d_i* theOrigin) +{ + TSuperClass::SameAs(theOrigin); + + if(const IsoSurfaces_i* aPrs3d = dynamic_cast(theOrigin)){ + IsoSurfaces_i* anOrigin = const_cast(aPrs3d); + ShowLabels(anOrigin->IsLabeled(), anOrigin->GetNbLabels()); + } +} + + //--------------------------------------------------------------- VISU::IsoSurfaces_i @@ -231,20 +258,33 @@ VISU::IsoSurfaces_i } //--------------------------------------------------------------- -VISU_Actor* -VISU::IsoSurfaces_i -::CreateActor() +VISU_Actor* VISU::IsoSurfaces_i::CreateActor() { - if(VISU_Actor* anActor = TSuperClass::CreateActor()){ + VISU_IsoSurfActor* anActor = VISU_IsoSurfActor::New(); + try{ + VISU::Prs3d_i::CreateActor(anActor); + anActor->SetBarVisibility(true); anActor->SetVTKMapping(true); SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); int aDispMode = aResourceMgr->integerValue("VISU" , "iso_surfaces_represent", 2); anActor->SetRepresentation(aDispMode); - return anActor; + UpdateActor(anActor); + }catch(...){ + anActor->Delete(); + throw ; } - return NULL; + + return anActor; } +//--------------------------------------------------------------- +void VISU::IsoSurfaces_i::UpdateActor(VISU_ActorBase* theActor) +{ + if(VISU_IsoSurfActor* anActor = dynamic_cast(theActor)){ + anActor->SetLinesLabeled(myIsLabeled, myNbLabels); + } + TSuperClass::UpdateActor(theActor); +} //--------------------------------------------------------------- void @@ -253,3 +293,26 @@ VISU::IsoSurfaces_i { myIsoSurfacesPL->SetMapScale(theMapScale); } + +//--------------------------------------------------------------- +CORBA::Boolean VISU::IsoSurfaces_i::IsLabeled() +{ + return myIsLabeled; +} + +//--------------------------------------------------------------- +void VISU::IsoSurfaces_i::ShowLabels(CORBA::Boolean theShow, CORBA::Long theNb) +{ + if ((myIsLabeled == theShow) && (myNbLabels == theNb)) return; + VISU::TSetModified aModified(this); + myIsLabeled = theShow; + myNbLabels = theNb; + myParamsTime.Modified(); +} + +//--------------------------------------------------------------- +CORBA::Long VISU::IsoSurfaces_i::GetNbLabels() +{ + return myNbLabels; +} + diff --git a/src/VISU_I/VISU_IsoSurfaces_i.hh b/src/VISU_I/VISU_IsoSurfaces_i.hh index 74cc1c3d..1e5b6dd4 100644 --- a/src/VISU_I/VISU_IsoSurfaces_i.hh +++ b/src/VISU_I/VISU_IsoSurfaces_i.hh @@ -28,7 +28,8 @@ #define VISU_IsoSurfaces_i_HeaderFile #include "VISU_I.hxx" -#include "VISU_ScalarMap_i.hh" +//#include "VISU_ScalarMap_i.hh" +#include "VISU_MonoColorPrs_i.hh" class VISU_IsoSurfacesPL; @@ -36,19 +37,21 @@ namespace VISU { //---------------------------------------------------------------------------- class VISU_I_EXPORT IsoSurfaces_i : public virtual POA_VISU::IsoSurfaces, - public virtual ScalarMap_i + public virtual MonoColorPrs_i { static int myNbPresent; IsoSurfaces_i(const IsoSurfaces_i&); public: //---------------------------------------------------------------------------- - typedef ScalarMap_i TSuperClass; + typedef MonoColorPrs_i TSuperClass; typedef VISU::IsoSurfaces TInterface; explicit IsoSurfaces_i(EPublishInStudyMode thePublishInStudyModep); + virtual void SameAs(const Prs3d_i* theOrigin); + virtual ~IsoSurfaces_i(); @@ -84,7 +87,14 @@ namespace VISU { return myIsoSurfacesPL; } + + + virtual CORBA::Boolean IsLabeled(); + virtual void ShowLabels(CORBA::Boolean theShow, CORBA::Long theNb); + + virtual CORBA::Long GetNbLabels(); + protected: //! Redefines VISU_ColoredPrs3d_i::CreatePipeLine virtual @@ -103,6 +113,9 @@ namespace VISU VISU_IsoSurfacesPL* myIsoSurfacesPL; + bool myIsLabeled; + CORBA::Long myNbLabels; + public: static size_t @@ -150,6 +163,9 @@ namespace VISU virtual void SetMapScale(double theMapScale = 1.0); + + virtual void UpdateActor(VISU_ActorBase* theActor); + }; } diff --git a/src/VISU_I/VISU_MonoColorPrs_i.cc b/src/VISU_I/VISU_MonoColorPrs_i.cc new file mode 100644 index 00000000..28afbc8d --- /dev/null +++ b/src/VISU_I/VISU_MonoColorPrs_i.cc @@ -0,0 +1,186 @@ +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File : VISU_MonoColorPrs_i.cxx +// Author : Vitaly Smetannikov +// Module : VISU + + +#include "VISU_MonoColorPrs_i.hh" +#include "VISU_Prs3dUtils.hh" +#include "VISU_PipeLineUtils.hxx" +#include "VISU_ScalarMapAct.h" + +#include "VISU_PipeLine.hxx" + +#include +#include + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + +//--------------------------------------------------------------- +VISU::MonoColorPrs_i +::MonoColorPrs_i(EPublishInStudyMode thePublishInStudyMode): + ColoredPrs3d_i(thePublishInStudyMode), + ScalarMap_i(thePublishInStudyMode) +{ + if(MYDEBUG) MESSAGE("MonoColorPrs_i::MonoColorPrs_i"); +} + +//--------------------------------------------------------------- +void +VISU::MonoColorPrs_i +::SameAs(const Prs3d_i* theOrigin) +{ + TSuperClass::SameAs(theOrigin); + + if(const MonoColorPrs_i* aPrs3d = dynamic_cast(theOrigin)){ + MonoColorPrs_i* anOrigin = const_cast(aPrs3d); + SetColor(anOrigin->GetColor()); + ShowColored(anOrigin->IsColored()); + } +} + + +//--------------------------------------------------------------- +VISU::Storable* +VISU::MonoColorPrs_i +::Create(const std::string& theMeshName, + VISU::Entity theEntity, + const std::string& theFieldName, + CORBA::Long theTimeStampNumber) +{ + myIsColored = false; + myColor.R = myColor.G = myColor.B = 0.5; + return TSuperClass::Create(theMeshName,theEntity,theFieldName,theTimeStampNumber); +} + +//--------------------------------------------------------------- +VISU::Storable* +VISU::MonoColorPrs_i +::Restore(SALOMEDS::SObject_ptr theSObject, + const Storable::TRestoringMap& theMap) +{ + if(!TSuperClass::Restore(theSObject, theMap)) + return NULL; + + myIsColored = VISU::Storable::FindValue(theMap,"myIsColored").toInt(); + myColor.R = VISU::Storable::FindValue(theMap,"myColor.R").toDouble(); + myColor.G = VISU::Storable::FindValue(theMap,"myColor.G").toDouble(); + myColor.B = VISU::Storable::FindValue(theMap,"myColor.B").toDouble(); + + return this; +} + +//--------------------------------------------------------------- +void +VISU::MonoColorPrs_i +::ToStream(std::ostringstream& theStr) +{ + TSuperClass::ToStream(theStr); + + Storable::DataToStream( theStr, "myIsColored", myIsColored ); + Storable::DataToStream( theStr, "myColor.R", myColor.R ); + Storable::DataToStream( theStr, "myColor.G", myColor.G ); + Storable::DataToStream( theStr, "myColor.B", myColor.B ); +} + + +//--------------------------------------------------------------- +VISU::MonoColorPrs_i::~MonoColorPrs_i() +{ + if(MYDEBUG) MESSAGE("MonoColorPrs_i::~MonoColorPrs_i()"); +} + +//--------------------------------------------------------------- +CORBA::Boolean VISU::MonoColorPrs_i::IsColored() +{ + return myIsColored; +} + + + +//--------------------------------------------------------------- +void +VISU::MonoColorPrs_i::ShowColored(CORBA::Boolean theColored) +{ + if(myIsColored == theColored) + return; + myIsColored = theColored; + myParamsTime.Modified(); +} + +//--------------------------------------------------------------- +SALOMEDS::Color VISU::MonoColorPrs_i::GetColor() +{ + return myColor; +} + +//--------------------------------------------------------------- +void VISU::MonoColorPrs_i::SetColor(const SALOMEDS::Color& theColor) +{ + bool anIsSameValue = VISU::CheckIsSameValue(myColor.R, theColor.R); + anIsSameValue &= VISU::CheckIsSameValue(myColor.G, theColor.G); + anIsSameValue &= VISU::CheckIsSameValue(myColor.B, theColor.B); + if(anIsSameValue) + return; + + VISU::TSetModified aModified(this); + + myColor = theColor; + myParamsTime.Modified(); +} + +//--------------------------------------------------------------- +VISU_Actor* VISU::MonoColorPrs_i::CreateActor(bool toSupressShrinking) +{ + VISU_Actor* anActor = TSuperClass::CreateActor(toSupressShrinking); + anActor->GetProperty()->SetColor(myColor.R,myColor.G,myColor.B); + return anActor; +} + +//--------------------------------------------------------------- +VISU_Actor* VISU::MonoColorPrs_i::CreateActor() +{ + return CreateActor(false); +} + +//--------------------------------------------------------------- +void VISU::MonoColorPrs_i::UpdateActor(VISU_ActorBase* theActor) +{ + if(VISU_ScalarMapAct* anActor = dynamic_cast(theActor)){ + if(IsColored()){ + anActor->SetBarVisibility(true); + GetPipeLine()->GetMapper()->SetScalarVisibility(1); + }else{ + anActor->SetBarVisibility(false); + GetPipeLine()->GetMapper()->SetScalarVisibility(0); + anActor->GetProperty()->SetColor(myColor.R,myColor.G,myColor.B); + } + TSuperClass::UpdateActor(theActor); + } +} + diff --git a/src/VISU_I/VISU_MonoColorPrs_i.hh b/src/VISU_I/VISU_MonoColorPrs_i.hh new file mode 100644 index 00000000..50fff308 --- /dev/null +++ b/src/VISU_I/VISU_MonoColorPrs_i.hh @@ -0,0 +1,83 @@ +// VISU OBJECT : interactive object for VISU entities implementation +// +// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File : VISU_MonoColorPrs_i.hxx +// Author : Vitaly Smetannikov +// Module : VISU + + +#ifndef VISU_MonoColorPrs_i_HeaderFile +#define VISU_MonoColorPrs_i_HeaderFile + +#include +#include "VISU_ScalarMap_i.hh" + +namespace VISU +{ + //---------------------------------------------------------------------------- + class VISU_I_EXPORT MonoColorPrs_i : public virtual POA_VISU::MonoColorPrs, + public virtual ScalarMap_i + { + MonoColorPrs_i(const MonoColorPrs_i&); + + public: + //---------------------------------------------------------------------------- + typedef ScalarMap_i TSuperClass; + typedef VISU::MonoColorPrs TInterface; + + explicit MonoColorPrs_i(EPublishInStudyMode thePublishInStudyModep); + + virtual void SameAs(const Prs3d_i* theOrigin); + + virtual ~MonoColorPrs_i(); + + virtual CORBA::Boolean IsColored(); + + virtual void ShowColored(CORBA::Boolean theColored); + + virtual SALOMEDS::Color GetColor(); + + virtual void SetColor(const SALOMEDS::Color& theColor); + + protected: + SALOMEDS::Color myColor; + bool myIsColored; + + public: + virtual Storable* Create(const std::string& theMeshName, + VISU::Entity theEntity, + const std::string& theFieldName, + CORBA::Long theTimeStampNumber); + + virtual void ToStream(std::ostringstream& theStr); + + virtual Storable* Restore(SALOMEDS::SObject_ptr theSObject, + const Storable::TRestoringMap& theMap); + + virtual VISU_Actor* CreateActor(); + + virtual VISU_Actor* CreateActor(bool toSupressShrinking); + + virtual void UpdateActor(VISU_ActorBase* theActor); + }; +}; +#endif diff --git a/src/VISU_I/VISU_OptionalDeformation_i.cc b/src/VISU_I/VISU_OptionalDeformation_i.cc new file mode 100755 index 00000000..77a12298 --- /dev/null +++ b/src/VISU_I/VISU_OptionalDeformation_i.cc @@ -0,0 +1,110 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File : VISU_OptionalDeformation_i.cc +// Author : +// Module : VISU + +#include "VISU_OptionalDeformation_i.hh" +#include "VISU_Result_i.hh" +#include "VISU_Prs3dUtils.hh" +#include "VISUConfig.hh" + +#include "VISU_OptionalDeformationPL.hxx" + + +#ifdef _DEBUG_ +static int MYDEBUG = 0; +#else +static int MYDEBUG = 0; +#endif + +//--------------------------------------------------------------- +VISU::OptionalDeformation_i::OptionalDeformation_i(VISU::ColoredPrs3d_i *theColoredPrs3d): + Deformation_i(theColoredPrs3d) +{ + if(MYDEBUG) MESSAGE("OptionalDeformation_i::OptionalDeformation_i()"); +} + +//--------------------------------------------------------------- +VISU::OptionalDeformation_i::~OptionalDeformation_i() +{ + if(MYDEBUG) MESSAGE("OptionalDeformation_i::~OptionalDeformation_i()"); +} + +//--------------------------------------------------------------- +void VISU::OptionalDeformation_i::UseDeformation(CORBA::Boolean theFlag){ + if(MYDEBUG) MESSAGE("OptionalDeformation_i::UseDeformation()"); + + VISU::TSetModified aModified(GetColoredPrs3d()); + + ProcessVoidEvent(new TVoidMemFun1ArgEvent + (GetSpecificDeformedPL(), &VISU_OptionalDeformationPL::UseDeformation, theFlag)); +} + +//--------------------------------------------------------------- +CORBA::Boolean VISU::OptionalDeformation_i::IsDeformed(){ + + if(MYDEBUG) MESSAGE("OptionalDeformation_i::IsDeformed()"); + return GetSpecificDeformedPL()->IsDeformed(); +} + + +void VISU::OptionalDeformation_i::InitDeformedPipeLine(VISU_DeformationPL* theDeformedPipeLine){ + + if(MYDEBUG) MESSAGE("OptionalDeformation_i::InitDeformedPipeLine()"); + myOptionalDeformationPL = dynamic_cast(theDeformedPipeLine); + + TSuperClass::InitDeformedPipeLine(myOptionalDeformationPL); +} + +//--------------------------------------------------------------- +void VISU::OptionalDeformation_i:: +DeformationToStream(std::ostringstream& theStr) +{ + Storable::DataToStream(theStr,"IsDeformed", IsDeformed()); + if(IsDeformed()) + TSuperClass::DeformationToStream(theStr); +} + +//--------------------------------------------------------------- +void +VISU::OptionalDeformation_i::RestoreDeformation(SALOMEDS::SObject_ptr theSObject, + const Storable::TRestoringMap& theMap) +{ + UseDeformation(Storable::FindValue(theMap,"IsDeformed").toInt()); + if(IsDeformed()) + TSuperClass::RestoreDeformation(theSObject,theMap); +} + + + +void +VISU::OptionalDeformation_i::SameAsDeformation(const Deformation_i *aDeformedPrs){ + + if(const OptionalDeformation_i* aPrs3d = dynamic_cast(aDeformedPrs)){ + OptionalDeformation_i* anOrigin = const_cast(aPrs3d); + UseDeformation(anOrigin->IsDeformed()); + + if(anOrigin->IsDeformed()){ + TSuperClass::SameAsDeformation(aDeformedPrs); + } + } +} diff --git a/src/VISU_I/VISU_OptionalDeformation_i.hh b/src/VISU_I/VISU_OptionalDeformation_i.hh new file mode 100755 index 00000000..ac6a08ff --- /dev/null +++ b/src/VISU_I/VISU_OptionalDeformation_i.hh @@ -0,0 +1,76 @@ +// Copyright (C) 2008 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// 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 +// +// +// File : VISU_Deformation_i.hxx +// Author : +// Module : VISU + +#ifndef VISU_OptionalDeformation_i_HeaderFile +#define VISU_OptionalDeformation_i_HeaderFile + +#include "VISU_I.hxx" +#include "VISU_Deformation_i.hh" +#include "VISU_OptionalDeformationPL.hxx" + +namespace VISU { + class VISU_I_EXPORT OptionalDeformation_i : public virtual POA_VISU::OptionalDeformation, + public virtual Deformation_i + { + OptionalDeformation_i(const OptionalDeformation_i&); + public: + typedef VISU::OptionalDeformation TInterface; + typedef Deformation_i TSuperClass; + + OptionalDeformation_i(VISU::ColoredPrs3d_i* theModifiedEngine); + virtual ~OptionalDeformation_i(); + + virtual void UseDeformation(CORBA::Boolean theFlag); + virtual CORBA::Boolean IsDeformed(); + + + virtual + void + DeformationToStream(std::ostringstream& theStr); + + virtual + void + RestoreDeformation(SALOMEDS::SObject_ptr theSObject, + const Storable::TRestoringMap& theMap); + + virtual + void + SameAsDeformation(const Deformation_i *aDeformedPrs); + + protected: + virtual + void InitDeformedPipeLine(VISU_DeformationPL* theDeformedPipeLine); + + VISU_OptionalDeformationPL* + GetSpecificDeformedPL() const + { + return myOptionalDeformationPL; + } + + private: + VISU_OptionalDeformationPL* myOptionalDeformationPL; + + }; +} +#endif diff --git a/src/VISU_I/VISU_PointMap3d_i.cc b/src/VISU_I/VISU_PointMap3d_i.cc index ed2c2c01..2885a351 100644 --- a/src/VISU_I/VISU_PointMap3d_i.cc +++ b/src/VISU_I/VISU_PointMap3d_i.cc @@ -21,7 +21,7 @@ // // // File : VISU_PointMap3d_i.cc -// Author : Vadim SANDLER +// Author : Dmitry Matveitchev // Module : VISU #include "VISU_PointMap3d_i.hh" @@ -82,7 +82,7 @@ VISU::PointMap3d_i::PointMap3d_i( SALOMEDS::Study_ptr theStudy, const char* theO myActorCollection(vtkActorCollection::New()), myIsActiveState(true) { - MESSAGE("PointMap3d_i::PointMap3d_i - "<booleanValue( "VISU", "scalar_bar_display_units", true ); SetUnitsVisible(isUnits); + SetSourceRange(); + + if( aResourceMgr->booleanValue("VISU", "scalar_bar_logarithmic", false) ) + SetScaling(VISU::LOGARITHMIC); + else + SetScaling(VISU::LINEAR); + + int aNumberOfColors = aResourceMgr->integerValue( "VISU", "scalar_bar_num_colors", 64 ); + SetNbColors(aNumberOfColors); + + int aRangeType = aResourceMgr->integerValue("VISU" , "scalar_range_type", 0); + UseFixedRange(aRangeType == 1); + if(aRangeType == 1){ + float aMin = aResourceMgr->doubleValue("VISU", "scalar_range_min", 0); + float aMax = aResourceMgr->doubleValue("VISU", "scalar_range_max", 0); + SetRange(aMin, aMax); + } + QString aLabelsFormat = aResourceMgr->stringValue( "VISU", "scalar_bar_label_format", "%-#6.3g" ); SetLabelsFormat(aLabelsFormat.toLatin1().constData()); @@ -338,6 +367,12 @@ VISU_PointMap3dActor* VISU::PointMap3d_i::CreateActor() anActor->SetPipeLine(myTablePL); anActor->SetFactory(this); + SUIT_ResourceMgr* aResourceMgr = VISU::GetResourceMgr(); + int aDispMode = aResourceMgr->integerValue("VISU", "point_map_represent", 2); + bool toShrink = aResourceMgr->booleanValue("VISU", "scalar_map_shrink", false); + anActor->SetRepresentation(aDispMode); + if (toShrink) anActor->SetShrink(); + Handle (SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(GetEntry().c_str(), "VISU", GetName().c_str()); anActor->setIO(anIO); @@ -357,6 +392,7 @@ VISU_PointMap3dActor* VISU::PointMap3d_i::CreateActor() void VISU::PointMap3d_i::UpdateActor(VISU_ActorBase* theActor) { if(VISU_PointMap3dActor* anActor = dynamic_cast(theActor)){ + Update(); VISU_ScalarBarActor *aScalarBar = anActor->GetScalarBar(); aScalarBar->SetLookupTable(GetSpecificPL()->GetBarTable()); aScalarBar->SetTitle(GetTitle()); @@ -377,7 +413,7 @@ void VISU::PointMap3d_i::UpdateActor(VISU_ActorBase* theActor) vtkTextProperty* aTitleProp = aScalarBar->GetTitleTextProperty(); aTitleProp->SetFontFamily(GetTitFontType()); - GetTitleColor(&anRGB[0],&anRGB[1],&anRGB[2]); + GetTitleColor(anRGB[0],anRGB[1],anRGB[2]); aTitleProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); IsBoldTitle()? aTitleProp->BoldOn() : aTitleProp->BoldOff(); @@ -387,7 +423,7 @@ void VISU::PointMap3d_i::UpdateActor(VISU_ActorBase* theActor) vtkTextProperty* aLabelProp = aScalarBar->GetLabelTextProperty(); aLabelProp->SetFontFamily(GetLblFontType()); - GetLabelColor(&anRGB[0],&anRGB[1],&anRGB[2]); + GetLabelColor(anRGB[0],anRGB[1],anRGB[2]); aLabelProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); IsBoldLabel()? aLabelProp->BoldOn() : aLabelProp->BoldOff(); @@ -410,6 +446,38 @@ VISU::PointMap3d_i ProcessVoidEvent(new VISU::TInvokeSignalEvent(myUpdateActorsSignal)); } +//---------------------------------------------------------------------------- +void +VISU::PointMap3d_i +::Update() +{ + if(GetMTime() < myUpdateTime.GetMTime()) + return; + + if(MYDEBUG) MESSAGE("PointMap3d_i::Update - this = "< + (GetSpecificPL(), &VISU_PipeLine::Update)); + myUpdateTime.Modified(); + }catch(std::exception&){ + throw; + }catch(...){ + throw std::runtime_error("PointMap3d_i::Update >> unexpected exception was caught!!!"); + } +} + +//---------------------------------------------------------------------------- +unsigned long int +VISU::PointMap3d_i +::GetMTime() +{ + unsigned long int aTime = myParamsTime.GetMTime(); + if( GetSpecificPL() ) + aTime = std::max(aTime, GetSpecificPL()->GetMTime()); + return aTime; +} + /*! Builds presentation of table */ @@ -683,6 +751,40 @@ CORBA::Double VISU::PointMap3d_i::GetMin() return myTablePL->GetScalarRange()[0]; } +CORBA::Double VISU::PointMap3d_i::GetMinTableValue() +{ + SALOMEDS::GenericAttribute_var anAttr; + mySObj->FindAttribute(anAttr, "AttributeTableOfReal"); + SALOMEDS::AttributeTableOfReal_var aTableOfReal = SALOMEDS::AttributeTableOfReal::_narrow(anAttr); + double aMin = aTableOfReal->GetValue(1, 1); + + for (int i=1; i<=aTableOfReal->GetNbColumns(); i++) + for (int j=1; j<=aTableOfReal->GetNbRows(); j++) { + double aVal = aTableOfReal->GetValue(j, i); + if (aVal < aMin) + aMin = aVal; + } + + return aMin; +} + +CORBA::Double VISU::PointMap3d_i::GetMaxTableValue() +{ + SALOMEDS::GenericAttribute_var anAttr; + mySObj->FindAttribute(anAttr, "AttributeTableOfReal"); + SALOMEDS::AttributeTableOfReal_var aTableOfReal = SALOMEDS::AttributeTableOfReal::_narrow(anAttr); + double aMax = aTableOfReal->GetValue(1, 1); + + for (int i=1; i<=aTableOfReal->GetNbColumns(); i++) + for (int j=1; j<=aTableOfReal->GetNbRows(); j++) { + double aVal = aTableOfReal->GetValue(j, i); + if (aVal > aMax) + aMax = aVal; + } + + return aMax; +} + CORBA::Double VISU::PointMap3d_i::GetMax() { return myTablePL->GetScalarRange()[1]; @@ -702,8 +804,6 @@ CORBA::Double VISU::PointMap3d_i::GetSourceMin() vtkFloatingPointType aRange[2]; GetSpecificPL()->GetSourceRange(aRange); return aRange[0]; - - UseFixedRange(false); } CORBA::Double VISU::PointMap3d_i::GetSourceMax() @@ -718,6 +818,8 @@ void VISU::PointMap3d_i::SetSourceRange() GetSpecificPL()->SetSourceRange(); ProcessVoidEvent(new TVoidMemFunEvent (GetSpecificPL(), &VISU_DeformedGridPL::SetSourceRange)); + + UseFixedRange(false); } CORBA::Boolean VISU::PointMap3d_i::IsRangeFixed() @@ -825,6 +927,23 @@ VISU::Scaling VISU::PointMap3d_i::GetScaling() return VISU::Scaling(GetSpecificPL()->GetScaling()); } +//------------------- Check Table on Positive Values ------------ +bool VISU::PointMap3d_i::IsPositiveTable() +{ + SALOMEDS::GenericAttribute_var anAttr; + mySObj->FindAttribute(anAttr, "AttributeTableOfReal"); + SALOMEDS::AttributeTableOfReal_var aTableOfReal = SALOMEDS::AttributeTableOfReal::_narrow(anAttr); + + for (int i=1; i<=aTableOfReal->GetNbColumns(); i++) + for (int j=1; j<=aTableOfReal->GetNbRows(); j++) { + double aVal = aTableOfReal->GetValue(j, i); + if (aVal < 0) + return false; + } + + return true; +} + //------------------- Plot3dBase Methods ------------------------ void VISU::PointMap3d_i::SetScaleFactor (CORBA::Double theScaleFactor) @@ -872,14 +991,6 @@ void VISU::PointMap3d_i::SetActiveState ( bool theState ) myIsActiveState = theState; } -unsigned long int VISU::PointMap3d_i::GetMTime () -{ - unsigned long int aTime = myParamsTime.GetMTime(); - if( GetSpecificPL() ) - aTime = std::max(aTime, GetSpecificPL()->GetMTime()); - return aTime; -} - void VISU::PointMap3d_i::RemoveActor (VISU_ActorBase* theActor) { myActorCollection->RemoveItem(theActor); @@ -957,13 +1068,13 @@ void VISU::PointMap3d_i::SetTitFontType(int theTitFontType) } //---------------------------------------------------------------------------- -void VISU::PointMap3d_i::GetTitleColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB) +void VISU::PointMap3d_i::GetTitleColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB) { - *theR = myTitleColor[0]; - *theG = myTitleColor[1]; - *theB = myTitleColor[2]; + theR = myTitleColor[0]; + theG = myTitleColor[1]; + theB = myTitleColor[2]; } //---------------------------------------------------------------------------- @@ -1048,13 +1159,13 @@ void VISU::PointMap3d_i::SetLblFontType(int theLblFontType) } //---------------------------------------------------------------------------- -void VISU::PointMap3d_i::GetLabelColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB) +void VISU::PointMap3d_i::GetLabelColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB) { - *theR = myLabelColor[0]; - *theG = myLabelColor[1]; - *theB = myLabelColor[2]; + theR = myLabelColor[0]; + theG = myLabelColor[1]; + theB = myLabelColor[2]; } //---------------------------------------------------------------------------- diff --git a/src/VISU_I/VISU_PointMap3d_i.hh b/src/VISU_I/VISU_PointMap3d_i.hh index dfe6d125..593721ec 100644 --- a/src/VISU_I/VISU_PointMap3d_i.hh +++ b/src/VISU_I/VISU_PointMap3d_i.hh @@ -65,6 +65,10 @@ namespace VISU virtual void UpdateActor(VISU_ActorBase* thePointMap3dActor); virtual void UpdateActors(); + virtual void Update(); + + virtual Handle(SALOME_InteractiveObject) GetIO(); + //----------- override Prs3d methods ----------------------------- //! Move the 3D presentation according to the given offset parameters @@ -80,6 +84,8 @@ namespace VISU virtual CORBA::Double GetMin(); virtual CORBA::Double GetMax(); + virtual CORBA::Double GetMinTableValue(); + virtual CORBA::Double GetMaxTableValue(); virtual void SetRange(CORBA::Double theMin, CORBA::Double theMax); virtual CORBA::Double GetSourceMin(); @@ -120,16 +126,18 @@ namespace VISU virtual VISU::Scaling GetScaling(); virtual void SetScaling(VISU::Scaling theScaling); + bool IsPositiveTable(); + // Plot3dBase methods void SetScaleFactor (CORBA::Double theScaleFactor); - double GetScaleFactor(); + CORBA::Double GetScaleFactor(); void SetContourPrs (CORBA::Boolean theIsContourPrs ); - bool GetIsContourPrs(); + CORBA::Boolean GetIsContourPrs(); void SetNbOfContours (CORBA::Long); - long GetNbOfContours(); + CORBA::Long GetNbOfContours(); VISU_DeformedGridPL* GetSpecificPL() const { return myTablePL; } @@ -157,9 +165,9 @@ namespace VISU virtual void SetShadowTitle(bool isShadow); virtual int GetTitFontType(); virtual void SetTitFontType(int theType); - virtual void GetTitleColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB); + virtual void GetTitleColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB); virtual void SetTitleColor(vtkFloatingPointType theR, vtkFloatingPointType theG, vtkFloatingPointType theB); @@ -172,9 +180,9 @@ namespace VISU virtual void SetShadowLabel(bool isShadow); virtual int GetLblFontType(); virtual void SetLblFontType(int theType); - virtual void GetLabelColor(vtkFloatingPointType* theR, - vtkFloatingPointType* theG, - vtkFloatingPointType* theB); + virtual void GetLabelColor(vtkFloatingPointType& theR, + vtkFloatingPointType& theG, + vtkFloatingPointType& theB); virtual void SetLabelColor(vtkFloatingPointType theR, vtkFloatingPointType theG, vtkFloatingPointType theB); @@ -212,6 +220,9 @@ namespace VISU CORBA::Float myOffset[3]; bool myIsActiveState; vtkTimeStamp myParamsTime; + vtkTimeStamp myUpdateTime; + + Handle(SALOME_InteractiveObject) myIO; //Font management diff --git a/src/VISU_I/VISU_Prs3d_i.cc b/src/VISU_I/VISU_Prs3d_i.cc index 9951cbbe..55e2bd1d 100644 --- a/src/VISU_I/VISU_Prs3d_i.cc +++ b/src/VISU_I/VISU_Prs3d_i.cc @@ -41,7 +41,7 @@ #include #ifdef _DEBUG_ -static int MYDEBUG = 0; +static int MYDEBUG = 1; #else static int MYDEBUG = 0; #endif @@ -99,6 +99,7 @@ VISU::Prs3d_i::~Prs3d_i() { if(MYDEBUG) MESSAGE("Prs3d_i::~Prs3d_i - this = "<Destroy(); } @@ -157,8 +158,13 @@ VISU::Prs3d_i if(GetCResult() == theResult) return; - if(theResult) + if(theResult) { SetStudyDocument(theResult->GetStudyDocument()); + theResult->Register(); + } + if(myResult) { + myResult->Destroy(); + } VISU::TSetModified aModified(this); diff --git a/src/VISU_I/VISU_Result_i.cc b/src/VISU_I/VISU_Result_i.cc index f250318d..a43015d9 100644 --- a/src/VISU_I/VISU_Result_i.cc +++ b/src/VISU_I/VISU_Result_i.cc @@ -62,7 +62,7 @@ #include #ifdef _DEBUG_ -static int MYDEBUG = 0; +static int MYDEBUG = 1; #else static int MYDEBUG = 0; #endif @@ -162,6 +162,7 @@ VISU::Result_i myIsBuildParts(false), myIsPartsDone(false) { + if(MYDEBUG) MESSAGE("Result_i::Result_i - this = "<length(aMeshOnEntityMap.size()); - VISU::TMeshOnEntityMap::const_iterator anIter = aMeshOnEntityMap.end(); + VISU::TMeshOnEntityMap::const_iterator anIter = aMeshOnEntityMap.begin(); for(size_t anId = 0; anIter != aMeshOnEntityMap.end(); anIter++, anId++){ const VISU::TEntity& anEntity = anIter->first; anEntities[anId] = VISU::Entity(anEntity); @@ -1044,7 +1047,7 @@ VISU::Result_i { aResult->length(aFamilyMap.size()); - VISU::TFamilyMap::const_iterator anIter = aFamilyMap.end(); + VISU::TFamilyMap::const_iterator anIter = aFamilyMap.begin(); for(size_t anId = 0; anIter != aFamilyMap.end(); anIter++, anId++){ const std::string& aName = anIter->first; aResult[anId] = aName.c_str(); @@ -1077,7 +1080,7 @@ VISU::Result_i { aResult->length(aGroupMap.size()); - VISU::TGroupMap::const_iterator anIter = aGroupMap.end(); + VISU::TGroupMap::const_iterator anIter = aGroupMap.begin(); for(size_t anId = 0; anIter != aGroupMap.end(); anIter++, anId++){ const std::string& aName = anIter->first; aResult[anId] = aName.c_str(); @@ -1121,7 +1124,7 @@ VISU::Result_i { aResult->length(aFieldMap.size()); - VISU::TFieldMap::const_iterator anIter = aFieldMap.end(); + VISU::TFieldMap::const_iterator anIter = aFieldMap.begin(); for(size_t anId = 0; anIter != aFieldMap.end(); anIter++, anId++){ const std::string& aName = anIter->first; aResult[anId] = aName.c_str(); @@ -1178,7 +1181,7 @@ VISU::Result_i { aResult->length(aValField.size()); - VISU::TValField::const_iterator anIter = aValField.end(); + VISU::TValField::const_iterator anIter = aValField.begin(); for(size_t anId = 0; anIter != aValField.end(); anIter++, anId++){ const vtkIdType& aTimeStampNumber = anIter->first; aResult[anId] = aTimeStampNumber; @@ -1350,7 +1353,7 @@ std::string VISU::Result_i ::GetFileName() const { - if(GetSourceId() == eFile) + if(GetSourceId() == eRestoredFile) return VISU::MakeFileName(myFileName, this); return myFileName; diff --git a/src/VISU_I/VISU_ScalarMap_i.cc b/src/VISU_I/VISU_ScalarMap_i.cc index d974a484..61edb836 100644 --- a/src/VISU_I/VISU_ScalarMap_i.cc +++ b/src/VISU_I/VISU_ScalarMap_i.cc @@ -443,7 +443,7 @@ VISU::ScalarMap_i vtkTextProperty* aTitleProp = aScalarBar->GetTitleTextProperty(); aTitleProp->SetFontFamily(GetTitFontType()); - GetTitleColor(&anRGB[0],&anRGB[1],&anRGB[2]); + GetTitleColor(anRGB[0],anRGB[1],anRGB[2]); aTitleProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); IsBoldTitle()? aTitleProp->BoldOn() : aTitleProp->BoldOff(); @@ -453,7 +453,7 @@ VISU::ScalarMap_i vtkTextProperty* aLabelProp = aScalarBar->GetLabelTextProperty(); aLabelProp->SetFontFamily(GetLblFontType()); - GetLabelColor(&anRGB[0],&anRGB[1],&anRGB[2]); + GetLabelColor(anRGB[0],anRGB[1],anRGB[2]); aLabelProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); IsBoldLabel()? aLabelProp->BoldOn() : aLabelProp->BoldOff(); diff --git a/src/VISU_I/VISU_StreamLines_i.cc b/src/VISU_I/VISU_StreamLines_i.cc index 8919fc3e..01ebfa16 100644 --- a/src/VISU_I/VISU_StreamLines_i.cc +++ b/src/VISU_I/VISU_StreamLines_i.cc @@ -120,7 +120,7 @@ VISU::StreamLines_i ::StreamLines_i(EPublishInStudyMode thePublishInStudyMode) : ColoredPrs3d_i(thePublishInStudyMode), ScalarMap_i(thePublishInStudyMode), - DeformedShape_i(thePublishInStudyMode), + MonoColorPrs_i(thePublishInStudyMode), myStreamLinesPL(NULL), myAppendFilter(vtkAppendFilter::New()) {} diff --git a/src/VISU_I/VISU_StreamLines_i.hh b/src/VISU_I/VISU_StreamLines_i.hh index f0cee757..a1ccf3b9 100644 --- a/src/VISU_I/VISU_StreamLines_i.hh +++ b/src/VISU_I/VISU_StreamLines_i.hh @@ -27,7 +27,8 @@ #ifndef VISU_StreamLines_i_HeaderFile #define VISU_StreamLines_i_HeaderFile -#include "VISU_DeformedShape_i.hh" +//#include "VISU_DeformedShape_i.hh" +#include "VISU_MonoColorPrs_i.hh" class VISU_StreamLinesPL; class vtkAppendFilter; @@ -36,14 +37,15 @@ namespace VISU { //---------------------------------------------------------------------------- class VISU_I_EXPORT StreamLines_i : public virtual POA_VISU::StreamLines, - public virtual DeformedShape_i + public virtual MonoColorPrs_i + //public virtual DeformedShape_i { static int myNbPresent; StreamLines_i(const StreamLines_i&); public: //---------------------------------------------------------------------------- - typedef DeformedShape_i TSuperClass; + typedef MonoColorPrs_i TSuperClass; typedef VISU::StreamLines TInterface; explicit diff --git a/src/VISU_I/VISU_Table_i.cc b/src/VISU_I/VISU_Table_i.cc index 3abd1ecc..0910d8dc 100644 --- a/src/VISU_I/VISU_Table_i.cc +++ b/src/VISU_I/VISU_Table_i.cc @@ -36,6 +36,8 @@ #include "VISU_TableReader.hxx" #include "VISU_ConvertorUtils.hxx" +#include "utilities.h" + #ifdef _DEBUG_ static int MYDEBUG = 0; #else @@ -66,6 +68,7 @@ const char* VISU::Table_i::GetComment() const VISU::Table_i::Table_i( SALOMEDS::Study_ptr theStudy, const char* theObjectEntry ) : PrsObject_i(theStudy) { + MESSAGE("Table_i::Table_i - "<FindObjectID(theObjectEntry); myOrientation = VISU::Table::HORIZONTAL; } @@ -74,7 +77,7 @@ VISU::Table_i::Table_i( SALOMEDS::Study_ptr theStudy, const char* theObjectEntry */ VISU::Table_i::~Table_i() { - MESSAGE("Table_i::~Table_i"); + MESSAGE("Table_i::~Table_i - "<NewObject(aFileObject); anAttr = aStudyBuilder->FindOrCreateAttribute(aRealObject, "AttributeName"); aName = SALOMEDS::AttributeName::_narrow(anAttr); - if(MYDEBUG) cout<<"aTable2D.myTitle = "<SetValue(aTable2D.myTitle.c_str()); } else { @@ -1215,7 +1218,7 @@ VISU::ImportTables(const char* theFileName, SALOMEDS::Study_ptr theStudy) int kEnd = aNewTable2D.myRows[0].myValues.size(); aTableOfReal->SetNbColumns(kEnd); for(int j = 0, jEnd = aNewTable2D.myRows.size(); j < jEnd; j++){ - if(MYDEBUG) cout<<"j = "<GetFather(); + aSObj = aSObj->GetFather(); + aSObj = aSObj->GetFather(); + CORBA::Object_var anObject = VISU::ClientSObjectToObject(aSObj); + if (CORBA::is_nil(anObject)) return false; + aNewData.myResult = dynamic_cast(VISU::GetServant(anObject).in()); + VISU::Storable::TRestoringMap aMap = VISU::Storable::GetStorableMap(aNewData.myField); if(VISU::Storable::FindValue(aMap,"myComment") != "FIELD") return false; @@ -490,7 +499,12 @@ double getMaxFieldsValue( QList& theFieldsLst ) return aRes; } -void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) { +void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) +{ + int nbf = myFieldsLst.size(); + if( theFieldNum<0 || theFieldNum>nbf-1 ) + return; + FieldData& aData = myFieldsLst[theFieldNum]; // Delete previous presentations @@ -596,13 +610,14 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) { aSequence); break; case VISU::TSCALARMAPONDEFORMEDSHAPE: // Scalar map on deformed shape - GeneratePresentations(myStudy, - aData, - aResult, - isRangeDefined(), - myTimeMinVal, - myTimeMaxVal, - aSequence); + case VISU::TDEFORMEDSHAPEANDSCALARMAP: + GeneratePresentations(myStudy, + aData, + aResult, + isRangeDefined(), + myTimeMinVal, + myTimeMaxVal, + aSequence); break; default: MESSAGE("Not implemented for this presentation type: " << aData.myPrsType); @@ -618,7 +633,7 @@ void VISU_TimeAnimation::generatePresentations(CORBA::Long theFieldNum) { myFieldsAbsFrames.push_back(aData.myNbFrames); if (theFieldNum == getNbFields() - 1) { - if ( aData.myPrsType != VISU::TGAUSSPOINTS) { + if ( aData.myPrsType != VISU::TGAUSSPOINTS && aData.myPrsType != TDEFORMEDSHAPEANDSCALARMAP && aData.myPrsType != TSCALARMAPONDEFORMEDSHAPE) { // Initialize the MinMax controller VISU::PCompositeMinMaxController aMinMaxController(new VISU::TCompositeMinMaxController()); @@ -1369,11 +1384,17 @@ void VISU_TimeAnimation::saveImages( int theFieldId, if (myDumpFormat.compare("AVI") != 0) { QString aFile(myDumpPath); + int aFrameNb = myFrame; // parallel animation mode + if ( myAnimationMode == VISU::Animation::SUCCESSIVE ) // successive animation mode + aFrameNb = getRelativeFrameNumber(myFrame).second; + + int aMaxNb = myFieldsLst[theFieldId].myTiming.size(); + int nbDigits = QString("%1").arg(aMaxNb).length(); + QString aFormat = QString("%.%1d_").arg(nbDigits); + QString aName; - if ( myAnimationMode == VISU::Animation::PARALLEL ) // parallel animation mode - aName = QString("%1").arg(myFieldsLst[theFieldId].myTiming[myFrame]); - else // successive animation mode - aName = QString("%1").arg(myFieldsLst[theFieldId].myTiming[getRelativeFrameNumber(myFrame).second]); + aName.sprintf(aFormat.toLatin1().data(), aFrameNb); + aName += QString("%1").arg(myFieldsLst[theFieldId].myTiming[aFrameNb]); int aPos = -1; while ((aPos = aName.indexOf(".")) > -1 ) @@ -1678,7 +1699,8 @@ std::string GetPresentationComment (VISU::VISUType thePrsType) aPrsCmt = VISU::GaussPoints_i::myComment; break; case VISU::TSCALARMAPONDEFORMEDSHAPE: - aPrsCmt = VISU::ScalarMapOnDeformedShape_i::myComment; + case VISU::TDEFORMEDSHAPEANDSCALARMAP: + aPrsCmt = VISU::DeformedShapeAndScalarMap_i::myComment; break; default: aPrsCmt = "Unknown presentation"; @@ -1842,9 +1864,15 @@ void VISU_TimeAnimation::restoreFromStudy(_PTR(SObject) theField) for (anIter->Init(); anIter->More(); anIter->Next()) { _PTR(SObject) aRefObj = anIter->Value(); _PTR(SObject) aFieldObj; + if (!aRefObj->ReferencedObject(aFieldObj) ) continue; + int nbAttr = aFieldObj->GetAllAttributes().size(); + //std::string name1 = aFieldObj->GetName(); + if(nbAttr<1) + continue; + addField(aFieldObj); if ( isRangeDefined() || isSequenceDefined() ) myFieldsAbsFrames.pop_back(); @@ -1882,8 +1910,8 @@ void VISU_TimeAnimation::restoreFromStudy(_PTR(SObject) theField) aData.myPrsType = VISU::TSTREAMLINES; else if (strName == VISU::GaussPoints_i::myComment.c_str()) aData.myPrsType = VISU::TGAUSSPOINTS; - else if (strName == VISU::ScalarMapOnDeformedShape_i::myComment.c_str()) - aData.myPrsType = VISU::TSCALARMAPONDEFORMEDSHAPE; + else if (strName == VISU::DeformedShapeAndScalarMap_i::myComment.c_str()) + aData.myPrsType = VISU::TDEFORMEDSHAPEANDSCALARMAP; else continue; generatePresentations(getNbFields()-1); diff --git a/src/VISU_I/VISU_TimeAnimation.h b/src/VISU_I/VISU_TimeAnimation.h index 09221faa..d3ed8fa7 100644 --- a/src/VISU_I/VISU_TimeAnimation.h +++ b/src/VISU_I/VISU_TimeAnimation.h @@ -26,6 +26,9 @@ #include "VISUConfig.hh" +#include "VISU_Result_i.hh" +#include "SALOME_GenericObjPointer.hh" + #include #include @@ -37,7 +40,7 @@ class VISU_Actor; namespace VISU { - class Result_i; + //class Result_i; class ColoredPrs3d_i; class ExecutionState; } @@ -52,6 +55,8 @@ struct FieldData std::vector myActors; // Actors std::vector myTiming; // time values CORBA::Float myOffset[3]; + typedef SALOME::GenericObjPtr TResultPtr; + TResultPtr myResult; }; diff --git a/src/VISU_I/VISU_Vectors_i.cc b/src/VISU_I/VISU_Vectors_i.cc index 525ebc98..1ef9bab6 100644 --- a/src/VISU_I/VISU_Vectors_i.cc +++ b/src/VISU_I/VISU_Vectors_i.cc @@ -129,6 +129,7 @@ VISU::Vectors_i ::Vectors_i(EPublishInStudyMode thePublishInStudyMode) : ColoredPrs3d_i(thePublishInStudyMode), ScalarMap_i(thePublishInStudyMode), + MonoColorPrs_i(thePublishInStudyMode), DeformedShape_i(thePublishInStudyMode), myLineWidth(1.0), myVectorsPL(NULL) diff --git a/src/VISU_I/VISU_View_i.cc b/src/VISU_I/VISU_View_i.cc index 22f813cd..a7bd144f 100644 --- a/src/VISU_I/VISU_View_i.cc +++ b/src/VISU_I/VISU_View_i.cc @@ -2382,7 +2382,8 @@ namespace VISU { VISU::VISUType aType = myPrs->GetType(); if (aType != VISU::TSCALARMAP && aType != VISU::TDEFORMEDSHAPE && - aType != VISU::TSCALARMAPONDEFORMEDSHAPE) { + aType != VISU::TSCALARMAPONDEFORMEDSHAPE && + aType != VISU::TDEFORMEDSHAPEANDSCALARMAP) { myResult = "Insideframe representation is not available for this type of presentations."; return; } diff --git a/src/VISU_SWIG/VISU_Example_01.py b/src/VISU_SWIG/VISU_Example_01.py index 159ebdf4..a9e97fc3 100644 --- a/src/VISU_SWIG/VISU_Example_01.py +++ b/src/VISU_SWIG/VISU_Example_01.py @@ -100,7 +100,7 @@ cutplanes.SetOrientation(VISU.CutPlanes.YZ, 0, 0) myView.DisplayOnly(cutplanes) print "Creating Scalar Map On Deformed Shape.......", -scalarmapondefshape = myVisu.ScalarMapOnDeformedShapeOnField(myResult,myMeshName,myNodeEntity,'vitesse',1); +scalarmapondefshape = myVisu.DeformedShapeAndScalarMapOnField(myResult,myMeshName,myNodeEntity,'vitesse',1); if scalarmapondefshape is None : print "Error" else : print "OK" scalarmapondefshape.SetScalarField(myCellEntity,'pression',2); @@ -158,7 +158,7 @@ cutplanes1.SetOrientation(VISU.CutPlanes.YZ, 0, 0) myView1.DisplayOnly(cutplanes1) print "Creating Scalar Map On Deformed Shape.......", -scalarmapondefshape1 = myVisu.ScalarMapOnDeformedShapeOnField(myResult1,myMeshName1,myCellEntity,'vectoriel field',1); +scalarmapondefshape1 = myVisu.DeformedShapeAndScalarMapOnField(myResult1,myMeshName1,myCellEntity,'vectoriel field',1); if scalarmapondefshape1 is None : print "Error" else : print "OK" myView1.DisplayOnly(scalarmapondefshape1) diff --git a/src/VISU_SWIG/VISU_Example_07.py b/src/VISU_SWIG/VISU_Example_07.py index c676ddf5..600f3225 100644 --- a/src/VISU_SWIG/VISU_Example_07.py +++ b/src/VISU_SWIG/VISU_Example_07.py @@ -144,7 +144,7 @@ scmap = myVisu.CutPlanesOnField(myResult,myMeshName,VISU.NODE,myFieldName,1); ChangeRepresentation(scmap, VISU.SHADED, 1, 1, 0.5, 3) print "Creating Scalar Map On Deformed Shape.......", -scmap = myVisu.ScalarMapOnDeformedShapeOnField(myResult,myMeshName,VISU.NODE,myFieldName,1); +scmap = myVisu.DeformedShapeAndScalarMapOnField(myResult,myMeshName,VISU.NODE,myFieldName,1); ChangeRepresentation(scmap, VISU.SHADED, 1, 1, 0.5, 3) print "Creating Deformed Shape.......", diff --git a/src/VISU_SWIG/visu.py b/src/VISU_SWIG/visu.py index abc7e831..f9df3325 100644 --- a/src/VISU_SWIG/visu.py +++ b/src/VISU_SWIG/visu.py @@ -628,15 +628,15 @@ def CreatePrsForResult(theVisu, theResult, theView, thePrsTypeList, thePictureDi else : aVISUObjList.append(aPrsObj) - if HasValue(thePrsTypeList,VISU.TSCALARMAPONDEFORMEDSHAPE) : - print " Creating ScalarMapOnDeformedShapeOnField", - aPrsObj = theVisu.ScalarMapOnDeformedShapeOnField(theResult,aMeshName,anEntity,aFieldName,aTimeStampId) + if HasValue(thePrsTypeList,VISU.TSCALARMAPONDEFORMEDSHAPE) or HasValue(thePrsTypeList,VISU.TDEFORMEDSHAPEANDSCALARMAP) : + print " Creating DeformedShapeAndScalarMapOnField", + aPrsObj = theVisu.DeformedShapeAndScalarMapOnField(theResult,aMeshName,anEntity,aFieldName,aTimeStampId) if aPrsObj is None : print "Error" else : print ",OK" theView.DisplayOnly(aPrsObj) theView.FitAll() - aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TSCALARMAPONDEFORMEDSHAPE." + thePictureExt + aPictureName = thePictureDir + aMeshNamePic + "_" + anEntityId + "_" + aFieldName + "_" + str(aTimeStampId) + "_TDEFORMEDSHAPEANDSCALARMAP." + thePictureExt aPictureName = re.sub("\s+","_", aPictureName) theView.SavePicture(aPictureName) if theIsAutoDelete : diff --git a/src/VISU_SWIG/visu_cache.py b/src/VISU_SWIG/visu_cache.py index bdd01bde..d30ad9d5 100644 --- a/src/VISU_SWIG/visu_cache.py +++ b/src/VISU_SWIG/visu_cache.py @@ -56,6 +56,7 @@ PRS3D_TYPE_LIST.append(VISU.TDEFORMEDSHAPE) PRS3D_TYPE_LIST.append(VISU.TVECTORS) PRS3D_TYPE_LIST.append(VISU.TSTREAMLINES) PRS3D_TYPE_LIST.append(VISU.TSCALARMAPONDEFORMEDSHAPE) +PRS3D_TYPE_LIST.append(VISU.TDEFORMEDSHAPEANDSCALARMAP) #--------------------------------------------------------------- @@ -83,4 +84,4 @@ anInput.myEntity = VISU.CELL; anInput.myFieldName = "pression"; WalkTroughTimeStamps(VISU.TGAUSSPOINTS, anInput, aViewManager) -#execfile('/data/apo/a.py') \ No newline at end of file +#execfile('/data/apo/a.py') diff --git a/src/VISU_SWIG/visu_pointmap3d.py b/src/VISU_SWIG/visu_pointmap3d.py new file mode 100755 index 00000000..f16d6ee0 --- /dev/null +++ b/src/VISU_SWIG/visu_pointmap3d.py @@ -0,0 +1,57 @@ +import os +import VISU +from visu_gui import * + +aTableFile = os.getenv('DATA_DIR') + '/Tables/table_test.xls' + +aTableSObject = myVisu.ImportTables(aTableFile) + +aTable = None +if aTableSObject: + anIsFound, aSObject = aTableSObject.FindSubObject(1) + if anIsFound: + aTable = aSObject.GetObject() + +aViewManager = myVisu.GetViewManager(); +aView = aViewManager.Create3DView() +if aView is None : print "Creating View Error" +print aTable + +##########Get Values################ +aScaleFactor = aTable.GetScaleFactor(); +anIsContourPrs = aTable.GetIsContourPrs(); +aNbOfContours = aTable.GetNbOfContours(); +aScaling = aTable.GetScaling(); +aMin = aTable.GetMin(); +aMax = aTable.GetMax(); +aSourceMin = aTable.GetSourceMin(); +aSourceMax = aTable.GetSourceMax(); +aPosX = aTable.GetPosX(); +aPosY = aTable.GetPosY(); +aHeight = aTable.GetHeight(); +aWidth = aTable.GetWidth(); +aNbColors = aTable.GetNbColors(); +aLabels = aTable.GetLabels(); +aBarOrientation = aTable.GetBarOrientation(); + + +print "Get Values:" +print "aScaleFactor = ", aScaleFactor +print "anIsContourPrs = ", anIsContourPrs +print "aNbOfContours = ", aNbOfContours +print "aScaling = ", aScaling +print "===== SCALAR BAR =======" +print "aMin = ", aMin +print "aMax = ", aMax +print "aSourceMin = ", aSourceMin +print "aSourceMax = ", aSourceMax +print "aPosX = ", aPosX +print "aPosY = ", aPosY +print "aHeight = ", aHeight +print "aWidth = ", aWidth +print "aNbColors = ", aNbColors +print "aLabels = ", aLabels +print "aBarOrientation = ", aBarOrientation + +aView.DisplayOnly( aTable ) +aView.FitAll() \ No newline at end of file diff --git a/src/VVTK/VVTK_ImageWriter.cxx b/src/VVTK/VVTK_ImageWriter.cxx index 30853887..6177a068 100755 --- a/src/VVTK/VVTK_ImageWriter.cxx +++ b/src/VVTK/VVTK_ImageWriter.cxx @@ -30,6 +30,8 @@ #include +#include "utilities.h" + #include #include #include @@ -61,7 +63,7 @@ VVTK_ImageWriter VVTK_ImageWriter ::~VVTK_ImageWriter() { - if(MYDEBUG) cout<<"VVTK_ImageWriter::~VVTK_ImageWriter - this = "< #ifdef _DEBUG_ static int MYDEBUG = 0; @@ -49,9 +50,9 @@ VVTK_ImageWriterMgr int aMax = std::numeric_limits::max() / 2; mySemaphore = new QSemaphore(aMax); mySemaphore->acquire( aMax ); - if(MYDEBUG) cout<<"VVTK_ImageWriterMgr::VVTK_ImageWriterMgr "<< + if(MYDEBUG) MESSAGE("VVTK_ImageWriterMgr::VVTK_ImageWriterMgr "<< //"- total = "<total()<< - "; available = "<available()<setValue( aCursorSize ); - - aPyramidHeight = aResourceMgr->doubleValue( "VISU", "picking_pyramid_height", aPyramidHeight ); - myPyramidHeightSpinBox->setValue( aPyramidHeight ); - - aPointTolerance = aResourceMgr->doubleValue( "VISU", "picking_point_tolerance", aPointTolerance ); - myPointToleranceSpinBox->setValue( aPointTolerance ); - - aColor = aResourceMgr->colorValue( "VISU", "picking_selection_color", aColor ); - //QPalette aPalette( mySelectionColorButton->palette() ); - //aPalette.setColor( mySelectionColorButton->backgroundRole(), aColor ); - mySelectionColorButton->setColor( aColor ); - - anInfoWindowTransparency = aResourceMgr->integerValue( "VISU", "picking_transparency", anInfoWindowTransparency ); - myTransparencySpinBox->setValue( anInfoWindowTransparency ); - - anInfoWindowPosition = aResourceMgr->integerValue( "VISU", "picking_position", anInfoWindowPosition ); - myPositionComboBox->setCurrentIndex( anInfoWindowPosition ); - - aZoomFactor = aResourceMgr->doubleValue( "VISU", "picking_zoom_factor", aZoomFactor ); - myZoomFactorSpinBox->setValue( aZoomFactor ); - - aStepNumber = aResourceMgr->integerValue( "VISU", "picking_step_number", aStepNumber ); - myStepNumberSpinBox->setValue( aStepNumber ); - - aDisplayParentMesh = aResourceMgr->booleanValue( "VISU", "picking_display_parent_mesh", aDisplayParentMesh ); - myDisplayParentMeshCheckBox->setChecked( aDisplayParentMesh ); - + myCursorSizeSpinBox->setValue( myPickingSettings->GetCursorSize() ); + myPyramidHeightSpinBox->setValue( myPickingSettings->GetPyramidHeight() ); + myPointToleranceSpinBox->setValue( myPickingSettings->GetPointTolerance() ); + myTransparencySpinBox->setValue( int(myPickingSettings->GetInfoWindowTransparency() * 100.0) ); + myPositionComboBox->setCurrentIndex( myPickingSettings->GetInfoWindowPosition() ); + myZoomFactorSpinBox->setValue( myPickingSettings->GetZoomFactor() ); + myStepNumberSpinBox->setValue( myPickingSettings->GetStepNumber() ); + myDisplayParentMeshCheckBox->setChecked( myPickingSettings->GetDisplayParentMesh() ); + + vtkFloatingPointType* aColor = myPickingSettings->GetColor(); + mySelectionColorButton->setColor( QColor( ( int )( aColor[0] * 255.0 ), + ( int )( aColor[1] * 255.0 ), + ( int )( aColor[2] * 255.0 ) ) ); onClickApply(); } @@ -621,8 +566,6 @@ void VVTK_PickingDlg::KeyPressed() void VVTK_PickingDlg::onClickApply() { - myPickingSettings->SetInitial( false ); - myPickingSettings->SetCursorSize( myCursorSizeSpinBox->value() ); myPickingSettings->SetPyramidHeight( myPyramidHeightSpinBox->value() ); myPickingSettings->SetPointTolerance( myPointToleranceSpinBox->value() ); diff --git a/src/VVTK/VVTK_Recorder.cxx b/src/VVTK/VVTK_Recorder.cxx index 4208ca75..e9e173f7 100755 --- a/src/VVTK/VVTK_Recorder.cxx +++ b/src/VVTK/VVTK_Recorder.cxx @@ -320,7 +320,7 @@ VVTK_Recorder myPaused = myPaused ? 0 : 1; if(myPaused && !myFrameIndexes.empty()){ myFrameIndexes.back() *= -1; - if(MYDEBUG) cout<<"VVTK_Recorder::Pause - myFrameIndexes.back() = "<