Salome HOME
Merge from V6_main 13/12/2012 BR_KERNEL_REFACTORING V7_1_0_pre
authorvsr <vsr@opencascade.com>
Thu, 13 Dec 2012 11:41:29 +0000 (11:41 +0000)
committervsr <vsr@opencascade.com>
Thu, 13 Dec 2012 11:41:29 +0000 (11:41 +0000)
245 files changed:
configure.ac
doc/salome/gui/SMESH/CMakeLists.txt [new file with mode: 0644]
doc/salome/gui/SMESH/images/a-creategroup.png
doc/salome/gui/SMESH/images/a-cuttingofquadrangles.png
doc/salome/gui/SMESH/images/creategroup.png
doc/salome/gui/SMESH/images/creategroup_on_filter.png
doc/salome/gui/SMESH/images/dlg_0D_on_all_nodes.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/editgroup.png
doc/salome/gui/SMESH/images/image146.png
doc/salome/gui/SMESH/input/about_meshes.doc
doc/salome/gui/SMESH/input/adding_nodes_and_elements.doc
doc/salome/gui/SMESH/input/additional_hypo.doc
doc/salome/gui/SMESH/input/basic_meshing_algos.doc
doc/salome/gui/SMESH/input/colors_size.doc
doc/salome/gui/SMESH/input/constructing_meshes.doc
doc/salome/gui/SMESH/input/constructing_submeshes.doc
doc/salome/gui/SMESH/input/creating_groups.doc
doc/salome/gui/SMESH/input/cutting_quadrangles.doc
doc/salome/gui/SMESH/input/extrusion.doc
doc/salome/gui/SMESH/input/importing_exporting_meshes.doc
doc/salome/gui/SMESH/input/mesh_preferences.doc
doc/salome/gui/SMESH/input/removing_nodes_and_elements.doc
doc/salome/gui/SMESH/input/reorient_faces.doc
doc/salome/gui/SMESH/input/selection_filter_library.doc
doc/salome/gui/SMESH/input/smeshpy_interface.doc
doc/salome/gui/SMESH/input/tui_modifying_meshes.doc
doc/salome/gui/SMESH/input/tui_use_existing_faces.doc
doc/salome/gui/SMESH/input/uniting_set_of_triangles.doc
idl/SMESH_BasicHypothesis.idl
idl/SMESH_Gen.idl
idl/SMESH_Mesh.idl
idl/SMESH_MeshEditor.idl
resources/Makefile.am
resources/StdMeshers.xml
resources/mesh_0D_elem.png [new file with mode: 0644]
resources/mesh_0D_on_all_nodes.png [new file with mode: 0644]
src/Controls/SMESH_Controls.cxx
src/Controls/SMESH_ControlsDef.hxx
src/DriverGMF/DriverGMF.cxx [new file with mode: 0644]
src/DriverGMF/DriverGMF.hxx [new file with mode: 0644]
src/DriverGMF/DriverGMF_Read.cxx
src/DriverGMF/DriverGMF_Read.hxx
src/DriverGMF/DriverGMF_Write.cxx
src/DriverGMF/DriverGMF_Write.hxx
src/DriverGMF/Makefile.am
src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx
src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx
src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx
src/DriverSTL/Makefile.am
src/OBJECT/SMESH_PreviewActorsCollection.cxx
src/SMDS/SMDS_MemoryLimit.cxx
src/SMESH/SMESH_Gen.cxx
src/SMESH/SMESH_Hypothesis.cxx
src/SMESH/SMESH_Mesh.cxx
src/SMESH/SMESH_Mesh.hxx
src/SMESH/SMESH_MeshEditor.cxx
src/SMESH/SMESH_MeshEditor.hxx
src/SMESH/SMESH_MesherHelper.cxx
src/SMESH/SMESH_ProxyMesh.cxx
src/SMESH/SMESH_ProxyMesh.hxx
src/SMESH/SMESH_subMesh.cxx
src/SMESH/SMESH_subMesh.hxx
src/SMESHDS/SMESHDS_Mesh.cxx
src/SMESHDS/SMESHDS_SubMesh.hxx
src/SMESHFiltersSelection/SMESH_Type.h
src/SMESHFiltersSelection/SMESH_TypeFilter.cxx
src/SMESHFiltersSelection/SMESH_TypeFilter.hxx
src/SMESHGUI/Makefile.am
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.h [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx
src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx
src/SMESHGUI/SMESHGUI_ClippingDlg.cxx
src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx
src/SMESHGUI/SMESHGUI_CopyMeshDlg.cxx
src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx
src/SMESHGUI/SMESHGUI_DeleteGroupDlg.h
src/SMESHGUI/SMESHGUI_Dialog.cxx
src/SMESHGUI/SMESHGUI_DuplicateNodesDlg.cxx
src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx
src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx
src/SMESHGUI/SMESHGUI_FilterDlg.cxx
src/SMESHGUI/SMESHGUI_FindElemByPointDlg.cxx
src/SMESHGUI/SMESHGUI_GroupDlg.cxx
src/SMESHGUI/SMESHGUI_GroupDlg.h
src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.cxx
src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx
src/SMESHGUI/SMESHGUI_Hypotheses.cxx
src/SMESHGUI/SMESHGUI_Hypotheses.h
src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx
src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx
src/SMESHGUI/SMESHGUI_Measurements.cxx
src/SMESHGUI/SMESHGUI_MergeDlg.cxx
src/SMESHGUI/SMESHGUI_MeshInfo.cxx
src/SMESHGUI/SMESHGUI_MeshOp.cxx
src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx
src/SMESHGUI/SMESHGUI_PropertiesDlg.cxx
src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx
src/SMESHGUI/SMESHGUI_RenumberingDlg.cxx
src/SMESHGUI/SMESHGUI_ReorientFacesDlg.cxx
src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx
src/SMESHGUI/SMESHGUI_RotationDlg.cxx
src/SMESHGUI/SMESHGUI_ScaleDlg.cxx
src/SMESHGUI/SMESHGUI_Selection.cxx
src/SMESHGUI/SMESHGUI_SelectionOp.cxx
src/SMESHGUI/SMESHGUI_SmoothingDlg.cxx
src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx
src/SMESHGUI/SMESHGUI_TranslationDlg.cxx
src/SMESHGUI/SMESHGUI_VTKUtils.cxx
src/SMESHGUI/SMESH_images.ts
src/SMESHGUI/SMESH_msg_en.ts
src/SMESHGUI/SMESH_msg_fr.ts
src/SMESHUtils/Makefile.am
src/SMESHUtils/SMESH_Octree.cxx
src/SMESHUtils/SMESH_Octree.hxx
src/SMESHUtils/SMESH_OctreeNode.cxx
src/SMESHUtils/SMESH_OctreeNode.hxx
src/SMESHUtils/SMESH_Quadtree.cxx [new file with mode: 0644]
src/SMESHUtils/SMESH_Quadtree.hxx [new file with mode: 0644]
src/SMESHUtils/SMESH_Tree.hxx [new file with mode: 0644]
src/SMESHUtils/SMESH_TypeDefs.hxx
src/SMESH_I/Makefile.am
src/SMESH_I/SMESH_2smeshpy.cxx
src/SMESH_I/SMESH_2smeshpy.hxx
src/SMESH_I/SMESH_Gen_i.cxx
src/SMESH_I/SMESH_Gen_i.hxx
src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_I/SMESH_MeshEditor_i.hxx
src/SMESH_I/SMESH_Mesh_i.cxx
src/SMESH_I/SMESH_Mesh_i.hxx
src/SMESH_SWIG/smeshDC.py
src/SMESH_SWIG/smesh_algorithm.py
src/StdMeshers/Makefile.am
src/StdMeshers/StdMeshers_Cartesian_3D.cxx
src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx
src/StdMeshers/StdMeshers_CompositeSegment_1D.cxx
src/StdMeshers/StdMeshers_FaceSide.cxx
src/StdMeshers/StdMeshers_FaceSide.hxx
src/StdMeshers/StdMeshers_MEFISTO_2D.cxx
src/StdMeshers/StdMeshers_MEFISTO_2D.hxx
src/StdMeshers/StdMeshers_Prism_3D.cxx
src/StdMeshers/StdMeshers_ProjectionUtils.cxx
src/StdMeshers/StdMeshers_ProjectionUtils.hxx
src/StdMeshers/StdMeshers_Projection_2D.cxx
src/StdMeshers/StdMeshers_Quadrangle_2D.cxx
src/StdMeshers/StdMeshers_Quadrangle_2D.hxx
src/StdMeshers/StdMeshers_Regular_1D.cxx
src/StdMeshers/StdMeshers_ViscousLayers.cxx
src/StdMeshers/StdMeshers_ViscousLayers.hxx
src/StdMeshers/StdMeshers_ViscousLayers2D.cxx [new file with mode: 0644]
src/StdMeshers/StdMeshers_ViscousLayers2D.hxx [new file with mode: 0644]
src/StdMeshersGUI/StdMeshersGUI_ObjectReferenceParamWdg.cxx
src/StdMeshersGUI/StdMeshersGUI_ObjectReferenceParamWdg.h
src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx
src/StdMeshersGUI/StdMeshers_msg_en.ts
src/StdMeshersGUI/StdMeshers_msg_fr.ts
src/StdMeshers_I/Makefile.am
src/StdMeshers_I/StdMeshers_ViscousLayers2D_i.cxx [new file with mode: 0644]
src/StdMeshers_I/StdMeshers_ViscousLayers2D_i.hxx [new file with mode: 0644]
src/StdMeshers_I/StdMeshers_ViscousLayers_i.cxx
src/StdMeshers_I/StdMeshers_ViscousLayers_i.hxx
src/StdMeshers_I/StdMeshers_i.cxx
src/Tools/Makefile.am
src/Tools/MeshCut/Makefile.am
src/Tools/YamsPlug/Makefile.am [new file with mode: 0644]
src/Tools/YamsPlug/Tolerance.png [new file with mode: 0644]
src/Tools/YamsPlug/ViewText.ui [new file with mode: 0644]
src/Tools/YamsPlug/YamsPlugDialog.ui [new file with mode: 0644]
src/Tools/YamsPlug/doc/Advanced_params.rst [new file with mode: 0644]
src/Tools/YamsPlug/doc/Generics_params.rst [new file with mode: 0644]
src/Tools/YamsPlug/doc/Mandatory_params.rst [new file with mode: 0644]
src/Tools/YamsPlug/doc/conf.py [new file with mode: 0644]
src/Tools/YamsPlug/doc/editHypo.rst [new file with mode: 0644]
src/Tools/YamsPlug/doc/images/Advanced.png [new file with mode: 0644]
src/Tools/YamsPlug/doc/images/AppelYams.png [new file with mode: 0644]
src/Tools/YamsPlug/doc/images/Generic.png [new file with mode: 0644]
src/Tools/YamsPlug/doc/images/Simple.png [new file with mode: 0644]
src/Tools/YamsPlug/doc/images/Tolerance.png [new file with mode: 0644]
src/Tools/YamsPlug/doc/index.rst [new file with mode: 0644]
src/Tools/YamsPlug/doc/lct.rst [new file with mode: 0644]
src/Tools/YamsPlug/monViewText.py [new file with mode: 0644]
src/Tools/YamsPlug/monYamsPlugDialog.py [new file with mode: 0644]
src/Tools/YamsPlug/select1.png [new file with mode: 0644]
src/Tools/YamsPlug/yamsplug_plugin.py [new file with mode: 0644]
src/Tools/padder/doc/images/SMESH_spadder_end.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_inputdialog_concrete.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_inputdialog_start.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_inputdialog_steelbar.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_menu.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_finished.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_ready.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_compute_running.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_published.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_plugindialog_start.png [deleted file]
src/Tools/padder/doc/images/SMESH_spadder_start.png [deleted file]
src/Tools/padder/doc/images/padder_error_noresource.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image01.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image02.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image02bis.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image03.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image04.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image05.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image06.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image07.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image08.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image09.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image10.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image11.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image12.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_image13.png [new file with mode: 0644]
src/Tools/padder/doc/images/padder_sphererendering.png [new file with mode: 0644]
src/Tools/padder/doc/input/padder_userguide.doc
src/Tools/padder/meshjob/idl/MESHJOB.idl
src/Tools/padder/meshjob/impl/MeshJobManager_i.cxx
src/Tools/padder/meshjob/impl/MeshJobManager_i.hxx
src/Tools/padder/resources/Makefile.am
src/Tools/padder/resources/padderexe/Makefile.am [deleted file]
src/Tools/padder/resources/padderexe/buildparticules.py [deleted file]
src/Tools/padder/resources/padderexe/envPadder.sh.in [deleted file]
src/Tools/padder/resources/padderexe/med2/REF_FinalEDMesh.med [deleted file]
src/Tools/padder/resources/padderexe/med2/REF_spheres.dat.xyz [deleted file]
src/Tools/padder/resources/padderexe/med2/concrete.med [deleted file]
src/Tools/padder/resources/padderexe/med2/data.txt [deleted file]
src/Tools/padder/resources/padderexe/med2/ferraill.med [deleted file]
src/Tools/padder/resources/padderexe/med2/ferrtran.med [deleted file]
src/Tools/padder/resources/padderexe/med2/padder.exe [deleted file]
src/Tools/padder/resources/padderexe/med3/concrete.med [deleted file]
src/Tools/padder/resources/padderexe/med3/data.txt [deleted file]
src/Tools/padder/resources/padderexe/med3/ferraill.med [deleted file]
src/Tools/padder/resources/padderexe/med3/padder.exe [deleted file]
src/Tools/padder/resources/padderexe/padder.sh [deleted file]
src/Tools/padder/resources/padderexe/particules.png [deleted file]
src/Tools/padder/resources/testdata/Makefile.am [new file with mode: 0644]
src/Tools/padder/resources/testdata/buildparticules.py [new file with mode: 0755]
src/Tools/padder/resources/testdata/concrete.med [new file with mode: 0644]
src/Tools/padder/resources/testdata/ferraill.med [new file with mode: 0644]
src/Tools/padder/resources/testdata/particules.png [new file with mode: 0644]
src/Tools/padder/resources/testdata/teststudy.hdf [new file with mode: 0644]
src/Tools/padder/spadderpy/__init__.py
src/Tools/padder/spadderpy/gui/inputdialog.py
src/Tools/padder/spadderpy/gui/plugindialog.py
src/Tools/padder/spadderpy/padder.cfg.in
src/Tools/padder/unittests/usecase_meshJobManager.py
src/Tools/smesh_plugins.py

index 51899e3..c45c59f 100644 (file)
@@ -574,6 +574,7 @@ AC_OUTPUT([ \
   src/SMESH_PY/Makefile \
   src/Tools/Makefile \
   src/Tools/MeshCut/Makefile \
+  src/Tools/YamsPlug/Makefile \
   src/Tools/padder/Makefile \
   src/Tools/padder/meshjob/Makefile \
   src/Tools/padder/meshjob/idl/Makefile \
@@ -587,8 +588,7 @@ AC_OUTPUT([ \
   src/Tools/padder/resources/appligen/Makefile \
   src/Tools/padder/resources/appligen/appligen.sh \
   src/Tools/padder/resources/appligen/config_appli.xml \
-  src/Tools/padder/resources/padderexe/Makefile \
-  src/Tools/padder/resources/padderexe/envPadder.sh \
+  src/Tools/padder/resources/testdata/Makefile \
   src/Tools/padder/unittests/Makefile \
   src/Tools/padder/unittests/autotest.sh \
   src/Tools/padder/doc/Makefile \
diff --git a/doc/salome/gui/SMESH/CMakeLists.txt b/doc/salome/gui/SMESH/CMakeLists.txt
new file mode 100644 (file)
index 0000000..b15f609
--- /dev/null
@@ -0,0 +1,78 @@
+# Copyright (C) 2012  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# 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(${KERNEL_ROOT_DIR}/salome_adm/cmake_files/SalomeMacros.cmake)
+
+SET(top_builddir ${CMAKE_BINARY_DIR})
+SET(top_srcdir ${CMAKE_SOURCE_DIR})
+SET(srcdir ${CMAKE_CURRENT_SOURCE_DIR})
+SET(builddir ${CMAKE_CURRENT_BINARY_DIR})
+SET(datadir ${CMAKE_INSTALL_PREFIX}/share)
+SET(docdir ${datadir}/doc/salome)
+SET(guidocdir ${docdir}/gui/SMESH)
+
+SALOME_CONFIGURE_FILE(doxyfile.in doxyfile)
+SALOME_CONFIGURE_FILE(doxyfile_py.in doxyfile_py)
+SALOME_CONFIGURE_FILE(static/header.html.in ${builddir}/static/header.html)
+SALOME_CONFIGURE_FILE(static/header_py.html.in ${builddir}/static/header_py.html)
+
+SALOME_INSTALL_SCRIPTS(collect_mesh_methods.py bin/salome)
+            
+SET(DOC_SMESH_MeshersList StdMeshers)
+SET(f1 "${srcdir}/collect_mesh_methods.py")
+SET(f "$ENV{KERNEL_ROOT_DIR}/bin/salome/prepare_generating_doc.py")
+IF(WINDOWS)
+  STRING(REPLACE "/" "\\" f ${f})
+  STRING(REPLACE "/" "\\" f1 ${f1})
+  STRING(REPLACE "/" "\\" SCR "@SET PYTHONPATH=${OMNIORB_ROOT_USER}/lib/x86_win32\;%PYTHONPATH%
+  @SET PYTHONPATH=${OMNIORB_ROOT_USER}/lib/python\;%PYTHONPATH%
+  @SET PATH=${OMNIORB_ROOT_USER}/lib/x86_win32\;%PATH%
+  @SET PATH=$ENV{KERNEL_ROOT_DIR}/lib/salome\;%PATH%
+  @SET PYTHONPATH=$ENV{KERNEL_ROOT_DIR}/bin/salome\;%PYTHONPATH%
+  @SET PYTHONPATH=$ENV{KERNEL_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
+  @SET PYTHONPATH=$ENV{MED_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
+  @SET PYTHONPATH=$ENV{MED_ROOT_DIR}/bin/salome\;%PYTHONPATH%
+  @SET PYTHONPATH=$ENV{GEOM_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
+  @SET PYTHONPATH=$ENV{GEOM_ROOT_DIR}/bin/salome\;%PYTHONPATH%
+  @SET PYTHONPATH=${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
+  @SET PYTHONPATH=${CMAKE_INSTALL_PREFIX}/bin/salome\;%PYTHONPATH%
+  @SET SMESH_MeshersList=${DOC_SMESH_MeshersList}
+  ")
+  SET(EXT "bat")
+  SET(CALL_STR "call")
+ELSE(WINDOWS)
+  SET(DOC_PYTHONPATH "${CMAKE_INSTALL_PREFIX}/bin/salome:${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/salome:${MED_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${GEOM_ROOT_DIR}/bin/salome:${GEOM_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${KERNEL_ROOT_DIR}/bin/salome:${KERNEL_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${OMNIORB_ROOT_USER}/lib/python${PYTHON_VERSION}/site-packages:${OMNIORB_ROOT_USER}/lib64/python${PYTHON_VERSION}/site-packages")
+  SET(SCR "export PYTHONPATH=${DOC_PYTHONPATH}:${PYTHONPATH}
+  export SMESH_MeshersList=${DOC_SMESH_MeshersList}
+  ")
+  SET(EXT "sh")
+  SET(CALL_STR ".")
+ENDIF(WINDOWS)
+
+FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp_env.${EXT} "${SCR}")
+
+ADD_CUSTOM_TARGET(usr_docs ${PYTHON_EXECUTABLE} ${f} smesh.py ${CMAKE_SOURCE_DIR}/src/SMESH_SWIG/smeshDC.py smesh
+  COMMAND mkdir tmp && ${CALL_STR} ${CMAKE_CURRENT_BINARY_DIR}/tmp_env.${EXT} && ${PYTHON_EXECUTABLE} ${f1} -o tmp/smesh.py StdMeshers
+  COMMAND ${DOXYGEN_EXECUTABLE} doxyfile_py
+  COMMAND ${DOXYGEN_EXECUTABLE} doxyfile
+  COMMAND ${PYTHON_EXECUTABLE} -c "import os, shutil; os.remove(r'''smesh.py'''); shutil.rmtree(r'''tmp''')"
+  COMMAND ${PYTHON_EXECUTABLE} -c "import shutil, sys; shutil.rmtree(r'''${CMAKE_INSTALL_PREFIX}/share/doc/salome/gui/SMESH''', True); shutil.copytree(r'''${CMAKE_CURRENT_BINARY_DIR}''', r'''${CMAKE_INSTALL_PREFIX}/share/doc/salome/gui/SMESH''', ignore=shutil.ignore_patterns('tmp_env.*', '*usr_docs*', '*CMakeFiles*', '*.cmake', 'doxyfile*', '*.vcproj', 'static', 'Makefile*')); shutil.copy(r'''${CMAKE_CURRENT_SOURCE_DIR}/images/head.png''', r'''${CMAKE_INSTALL_PREFIX}/share/doc/salome/gui/SMESH''')"
+  VERBATIM 
+  WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}             
+)
index ee2b6ba..734e6c8 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/a-creategroup.png and b/doc/salome/gui/SMESH/images/a-creategroup.png differ
index 6ae6ee4..48eaf88 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/a-cuttingofquadrangles.png and b/doc/salome/gui/SMESH/images/a-cuttingofquadrangles.png differ
index ec24a4f..710064b 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/creategroup.png and b/doc/salome/gui/SMESH/images/creategroup.png differ
index 0a494c0..98e5a58 100644 (file)
Binary files a/doc/salome/gui/SMESH/images/creategroup_on_filter.png and b/doc/salome/gui/SMESH/images/creategroup_on_filter.png differ
diff --git a/doc/salome/gui/SMESH/images/dlg_0D_on_all_nodes.png b/doc/salome/gui/SMESH/images/dlg_0D_on_all_nodes.png
new file mode 100644 (file)
index 0000000..842b3bb
Binary files /dev/null and b/doc/salome/gui/SMESH/images/dlg_0D_on_all_nodes.png differ
index fb10224..1a9db08 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/editgroup.png and b/doc/salome/gui/SMESH/images/editgroup.png differ
index a952f5f..06c1c03 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/image146.png and b/doc/salome/gui/SMESH/images/image146.png differ
index 411fc30..dc68cff 100644 (file)
@@ -18,11 +18,11 @@ different meshing parameters than the whole mesh.
 
 Several created meshes can be \subpage building_compounds_page "combined into another mesh".
 
-The whole mesh or it's part can be \subpage copy_mesh_page "copied" into another mesh.
+The whole mesh or its part can be \subpage copy_mesh_page "copied" into another mesh.
 
 Meshing parameters of meshes and sub-meshes can be 
-\subpage editing_meshes_page "edited", then only a path of mesh
-depending on changed parameters will be re-computed.
+\subpage editing_meshes_page "edited", then only the mesh part
+depending on the changed parameters will be re-computed.
 
 Meshes can be edited using the MESH functions destined for 
 \ref modifying_meshes_page "modification" of generated meshes.
index a51bbdd..7f4ff56 100644 (file)
@@ -7,6 +7,7 @@
 <ul>
 <li>\ref adding_nodes_anchor "Nodes"</li>
 <li>\ref adding_0delems_anchor "0D Elements"</li>
+<li>\ref adding_0delems_on_all_nodes_anchor "0D elements on Element Nodes"</li>
 <li>\ref adding_balls_anchor "Ball Elements"</li>
 <li>\ref adding_edges_anchor "Edges"</li>
 <li>\ref adding_triangles_anchor "Triangles"</li>
 <li>Select your mesh in the Object Browser or in the 3D viewer.</li>
 
 <li>From the \b Modification menu choose the \b Add item, the
-following associated submenu will appear:</li>
+following associated sub-menu will appear:</li>
 
 \image html image146.png
 
-From this submenu select the type of element which you would like to add to your mesh.
+From this sub-menu select the type of element which you would like to add to your mesh.
 
-\note All dialogs for new node or element adding to the mesh (except for
-the dialog for 0D elements) provide the possibility to automatically add
-a node or element to the specified group or to create the anew using
+\note All dialogs for new node or element adding to the mesh provide
+the possibility to automatically add
+a node or element to the specified group or to create it anew using
 <b>Add to group</b> box, that allows choosing an existing group for
 the created node or element or giving the name to a new group. By
 default, the <b>Add to group</b> check box is switched off. If the user
-swiches this check box on, the combo box listing all currently
+switches this check box on, the combo box listing all currently
 existing groups of the corresponding type becomes available. By
 default, no group is selected. In this case, when the user presses
 <b>Apply</b> or <b>Apply & Close</b> button, the warning message box
@@ -71,21 +72,50 @@ created:
 
 \image html add0delement.png
 
-In this dialog box specify the node which will form your 0d element by
-selecting it in the 3D viewer and click the \b Apply or
-<b>Apply and Close</b> button. Your 0D element will be created:
+In this dialog box specify nodes which will form your 0D elements by
+selecting them in the 3D viewer and click the \b Apply or
+<b>Apply and Close</b> button. Your 0D elements will be created:
 
 \image html add_0delement.png
 
+\anchor adding_0delems_on_all_nodes_anchor
+<h2>Making 0D elements on Element Nodes</h2>
+
+There is another way to create 0D elements. It is possible to create 
+0D elements on all nodes of the selected mesh, sub-mesh, or a group of elements or nodes.
+
+\image html dlg_0D_on_all_nodes.png
+
+In this dialog 
+<ul>
+  <li> The radio-buttons allow choosing the type of object to create 0D elements on.
+    <ul>
+      <li><b> Mesh, sub-mesh, group </b> -  this button allows selecting
+       a mesh, a sub-mesh or a group to create 0D elements on the nodes of its
+        elements. The name of the selected object is shown in the dialog. </li>
+      <li><b> Elements </b> - this button allows selecting elements in the
+        VTK viewer or typing their IDs in the dialog.</li>
+      <li><b> Nodes </b> - this button allows selecting nodes to create
+        0D elements on in the VTK viewer or typing their IDs in the dialog.</li>
+  </ul></li>
+  <li><b> Set Filter </b> button allows selecting elements or nodes 
+by filtering mesh elements or nodes with different criteria
+(see \ref filtering_elements "Filter usage").</li>
+<li> Switching on <b>Add to group</b> check-box allows specifying the
+  name of the group to which all created or found 0D elements  will be added. You can either select an existing group from
+  a drop-down list, or enter the name of the group to be created.</li>
+</ul>
+
+
 \anchor adding_balls_anchor
 <h2>Adding ball elements</h2>
 
 \image html addball.png
 
-In this dialog box specify the node which will form your ball element
-either by selecting it in the 3D viewer or by manual entering its ID,
-specify a ball diameter and click the \b Apply or <b>Apply and
-Close</b> button. Your ball element will be created:
+In this dialog box specify the nodes, which will form your ball elements,
+either by selecting them in the 3D viewer or by manually entering their IDs,
+specify the ball diameter and click the \b Apply or <b>Apply and
+Close</b> button.
 
 \image html add_ball.png
 
index 61ac480..2fde9c1 100644 (file)
@@ -20,8 +20,8 @@ adjacent elements).
 <h2>Quadratic Mesh</h2>
 
 Quadratic Mesh hypothesis allows to build a quadratic mesh (whose
-edges are not straight but broken lines and can be defined by three
-points: first, middle and last) instead of an ordinary one.
+edges are not straight but curved lines and can be defined by three
+points: first, middle and last instead of an ordinary two).
 
 \anchor propagation_anchor
 <h2>Propagation of 1D Hypothesis on opposite edges</h2>
@@ -47,27 +47,34 @@ hypothesis, this hypothesis has one restriction on its work: the total quantity
 segments on all four sides of the face must be even (divisible by 2).
 
 \anchor viscous_layers_anchor
-<h2>Viscous Layers</h2>
-
-<b>Viscous Layers</b> additional hypothesis can be used together with
-some 3D algorithms, Hexahedron(i,j,k) for example. This
-hypothesis allows creation of layers of highly stretched prisms near
-mesh boundary, which is beneficial for high quality viscous
-computations. The prisms constructed on the quadrangular mesh faces are
-actually the hexahedrons.
+<h2>Viscous Layers and Viscous Layers 2D</h2>
 
+<b>Viscous Layers</b> and <b>Viscous Layers 2D </b> additional
+hypotheses can be used together with some 3D algorithms, for example,
+Hexahedron(i,j,k) or 2D algorithms, for example, Triangle
+(MEFISTO), correspondingly. These hypotheses allow creation of layers
+of highly stretched elements, prisms in 3D and quadrilaterals in 2D,
+near mesh boundary, which is beneficial for high quality viscous
+computations.
 
 \image html viscous_layers_hyp.png
 
 <ul>
 <li><b>Name</b> - allows to define the name of the hypothesis.</li>
-<li><b>Total thicknes</b> - gives the total thickness of prism layers.</li>
-<li><b>Number of layers</b> - defines the number of prism layers.</li>
-<li><b>Stretch factor</b> - defines the growth factor of prism height
+<li><b>Total thickness</b> - gives the total thickness of element layers.</li>
+<li><b>Number of layers</b> - defines the number of element layers.</li>
+<li><b>Stretch factor</b> - defines the growth factor of element height
 from the mesh boundary inwards.</li>
-<li><b>Faces without layers</b> - defines geometrical faces on which
-prism layers should not be constructed. By default the prism layers
-are not constructed on geometrical faces shared by solids.</li>
+<li><b>Faces (Edges) without layers</b> - defines geometrical faces
+  (or edges in 2D) on which element layers should not be
+  constructed. By default the element layers are not constructed on
+  geometrical faces shared by solids (and edges shared by faces in 2D). 
+  \note A mesh shown in the 3D Viewer can prevent selection of faces
+  and edges, in this case just hide the mesh. To avoid a long wait when a
+  geometry with many faces (or edges) is displayed, the number of faces
+  (edges) shown at a time is limited by the value of "Sub-shapes
+  preview chunk size" preference (in Preferences/Mesh/General tab).
+</li>
 </ul>
 
 \image html viscous_layers_mesh.png A group containing viscous layer prisms.
index a4ebe1c..ff225d0 100644 (file)
@@ -64,7 +64,7 @@ There is also a number of more specific algorithms:
 </ul>
 \ref use_existing_anchor "Use existing edges" and 
 \ref use_existing_anchor "Use existing faces" algorithms can be
-used to create an 1D or a 2D mesh in a python script.
+used to create a 1D or a 2D mesh in a python script.
 
 \ref constructing_meshes_page "Constructing meshes" page describes in
 detail how to apply meshing algorithms.
index c0953ff..e777e84 100644 (file)
@@ -14,7 +14,7 @@ shown.
 
 - \b Nodes:
   - \b Color - color of nodes.
-  - \b Type and \b Scale - these options allow changing of the nodes
+  - \b Type and \b Scale - these options allow changing the nodes
     representation (see \subpage point_marker_page "Point Marker" page
     for more details).
 - <b>Edges / wireframe</b>:
@@ -23,13 +23,13 @@ shown.
     in wireframe mode).
 - \b Faces:
   - \b Front - surface color of face elements (seen in shading mode).
-  - \b Back - backside surface color of face elements. Use slider to
-    select this color generated on base of the \b Face color by
+  - \b Back - backside surface color of face elements. Use the slider to
+    select this color generated on the base of the \b Face color by
     changing its brightness and saturation. 
 - \b Volumes:
   - \b Normal - surface color of normal volume elements (seen in shading mode).
-  - \b Reversed - surface color of volume elements. Use slider to
-    select this color generated on base of the \b Normal color by
+  - \b Reversed - surface color of volume elements. Use the slider to
+    select this color generated on the base of the \b Normal color by
     changing its brightness and saturation. 
 - \b Outlines:
   - \b Color - color of element borders in shading mode.
index 23349d0..bef7099 100644 (file)
@@ -37,42 +37,42 @@ written in Python.
     "Create mesh" dialog box contains several tab pages titled \b 3D,
     \b 2D, \b 1D and \b 0D. The title of each page reflects the
     dimension of the CAD model (geometry) the algorithms listed on
-    this page affect to. For example, \b 3D page lists algorithms
+    this page affect. For example, \b 3D page lists the algorithms
     that affect 3D geometrical objects (solids).
 
     \note
-    - Some page(s) can be disabled if the source geometrical
+    - Some page(s) can be disabled if the source geometrical
     object does not include shapes (sub-shapes) of the corresponding
-    dimension(s). For example, if input object is a geometrical face,
+    dimension(s). For example, if the input object is a geometrical face,
     \b 3D page is disabled.
-    - Some algorithms affect on geometry of several dimensions,
-    i.e. "1D-2D" or "1D-2D-3D". If such algorithm is selected by the
-    user, dialog box pages related to the corresponding lower level
+    - Some algorithms affect the geometry of several dimensions,
+    i.e. "1D-2D" or "1D-2D-3D". If such an algorithm is selected by the
+    user, the dialog box pages related to the corresponding lower level
     dimensions are disabled.
     - \b 0D page does not refer to the 0D elements, but to 0D
     geometry (vertices). Mesh module does not provide algorithms that
     produce 0D elements. Currently \b 0D page provides only one
-    algorithm "Segments around vertex" that allows specyfing required
-    size of mesh edges about some selected vertex(vertices).
+    algorithm "Segments around vertex" that allows specyfying the required
+    size of mesh edges about the selected vertex (or vertices).
 
     For example, you need to mesh a 3D object.
 
-    First, type the name for your mesh in the \b Name box, by default,
+    First, type the name of your mesh in the \b Name box, by default,
     it is "Mesh_1". Then select the geometrical object you wish to
     mesh in the Object Browser and click "Select" button near \b Geometry
-    field (if name of the object not yet appeared in \b Geometry field).
+    field (if the name of the object has not yet appeared in \b Geometry field).
 
     \image html image120.png
     <em>"Select" button</em>
 
     Now you can define 3D Algorithm and 3D Hypotheses, which will be
-    applied to solids of your geometrical object. Click the <em>"Add
+    applied to the solids of your geometrical object. Click the <em>"Add
       Hypothesis"</em>  button to add a hypothesis.
 
     \image html image121.png
     <em>"Add Hypothesis" button</em>
 
-    Click the <em>"Edit Hypothesis"</em> button to change values for the
+    Click the <em>"Edit Hypothesis"</em> button to change the values for the
     current hypothesis.
 
     \image html image122.png
@@ -86,14 +86,14 @@ written in Python.
     will be used to mesh faces and edges of your geometry. (Note
     that any object has edges, even if their existence is not
     apparent, for example, a sphere has 4 edges). Note that the
-    choice of hypotheses and of an algorithm of lower dimension depends on
-    the algorithm. 
+    choice of hypotheses and lower dimension algorithms depends on
+    the higher dimension algorithm. 
 
-    Some algorithms generate mesh of several dimensions while others, of
-    only one dimension. In the latter case there must be one Algorithm and zero or several
+    Some algorithms generate mesh of several dimensions, while others
+    produce mesh of only one dimension. In the latter case there must be one Algorithm and zero or several
     Hypotheses for each dimension of your object, otherwise you will
     not get any mesh at all. Of course, if you wish to mesh a face,
-    which is a 2D object, you don't need to define 3D Algorithm and
+    which is a 2D object, you do not need to define a 3D Algorithm and
     Hypotheses.
 
     In the <b>Object Browser</b> the structure of the new mesh will be
@@ -122,7 +122,7 @@ written in Python.
       tags).
 
       \image html hypo_sets.png
-      List of sets of hypotheses: <em>[custom]</em>
+      List of sets of hypotheses. Tag <em>[custom]</em> is
       automatically added to the sets defined by the user
   </li>
 </ol>
@@ -164,7 +164,7 @@ Select <b>1D mesh</b> or <b>2D mesh</b> preview mode in the Preview dialog.
 <b>Compute</b> button computes the whole mesh.
 
 When the Preview dialog is closed, the question about the storage of temporarily
-created mesh elements appers:
+created mesh elements appears:
 
 \image html preview_tmp_data.png
 
@@ -185,7 +185,7 @@ Choose "Change submesh priority" from the Mesh menu or a pop-up
 menu. The opened dialog shows a list of submeshes in the order of
 their priority. 
 
-There is an example of submesh order modifications of the Mesh created on a Box
+There is an example of submesh order modifications taking a Mesh created on a Box
 shape. The main Mesh object:
 <ul>
   <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=20</li>
@@ -195,22 +195,22 @@ shape. The main Mesh object:
 The first submesh object <b>Submesh_1</b> created on <b>Face_1</b> is:
 <ul>
   <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=4</li>
-  <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis<b>MaxElementArea</b>=1200</li>
+  <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis <b>MaxElementArea</b>=1200</li>
 </ul>
 The second submesh object <b>Submesh_2</b> created on <b>Face_2</b> is:
 <ul>
   <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=8</li>
-  <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis<b>MaxElementArea</b>=1200</li>
+  <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis <b>MaxElementArea</b>=1200</li>
 </ul>
 
 And the last submesh object <b>Submesh_3</b> created on <b>Face_3</b> is:
 <ul>
   <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=12</li>
-  <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis<b>MaxElementArea</b>=1200</li>
+  <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis <b>MaxElementArea</b>=1200</li>
 </ul>
 
 The sub-meshes become concurrent if they share sub-shapes that can be
-meshed with different algorithms (or different hypothesises). In the
+meshed with different algorithms (or different hypotheses). In the
 example, we have three submeshes with concurrent algorithms, because
 they have different hypotheses.
 
@@ -289,21 +289,21 @@ visualizing in magenta the geometrical entity that causes it.
 "Mesh computation/Show a computation result notification" preference 
 to the "Never" value. This option gives the possibility to control mesh
 computation reporting. There are the following possibilities: always
-show information box, only if an error occurs or never. 
+show the information box, show only if an error occurs or never. 
 By default, the information box is always shown after mesh computation operation.
 
 <b>Publish Sub-shape</b> button publishes the sub-shape, whose meshing
-failed, in GEOM component as a child of the mesh geometry, which
+has failed, in GEOM component as a child of the mesh geometry, which
 allows analyzing the problem geometry and creating a submesh on it in
-order to locally tune hypotheses.
+order to locally tune the hypotheses.
 
-If a cause of failure is an invalid input mesh and the algorithm has
-provided information on what mesh entities are bad <b>Show bad Mesh</b> 
-button appears in the dialog. Clicked, it shows bad mesh entities in
+If the failure is caused by an invalid input mesh and the algorithm has
+found which mesh entities are bad, <b>Show bad Mesh</b> 
+button appears in the dialog. Clicked, it shows the bad mesh entities in
 the Viewer in magenta. Sometimes the shown mesh entities are too small
-or/and hidden by other mesh elements, to see them it can be helpful to
-switch the mesh to Wireframe visualization mode or to switch off
-visualization of faces and volumes (if any).
+or/and hidden by other mesh elements. They can be seen after
+switching the mesh to Wireframe visualization mode or switching off
+the visualization of faces and volumes (if any).
 
 \image html show_bad_mesh.png
 <em>Too close nodes causing meshing failure are shown in magenta using <b>Show
@@ -313,22 +313,22 @@ visualization of faces and volumes (if any).
 \anchor use_existing_anchor
 <h2>"Use existing edges" and "Use existing faces" algorithms</h2>
 
-It is possible to create an 1D or a 2D mesh in a python script
+It is possible to create a 1D or a 2D mesh in a python script
 (using <em>AddNode, AddEdge</em> and <em>AddFace</em> commands) and
 then use such sub-meshes in the construction of a 2D or a 3D mesh. For
 this, there exist two algorithms: <b>Use existing edges</b> and <b>Use
-  existing faces</b>. Scenario of their usage is following. For
-example, you want to use standard algorithms to generate 1D and 3D
+  existing faces</b>.
+For example, you want to use standard algorithms to generate 1D and 3D
 meshes and to create 2D mesh by your python code. Then you
 <ul>
-  <li> create a mesh object, assign an 1D algorithm,</li>
-  <li> invoke \b Compute command, which computes an 1D mesh,</li>
+  <li> create a mesh object, assign a 1D algorithm,</li>
+  <li> invoke \b Compute command, which computes a 1D mesh,</li>
   <li> assign <b>Use existing faces</b> and a 3D algorithm,</li>
   <li> run your python code, which creates a 2D mesh,</li>
   <li> invoke \b Compute command, which computes a 3D mesh.</li>
 </ul>
 
-Consider trying a sample script demonstrating usage of 
+Consider trying a sample script demonstrating the usage of 
 \ref tui_use_existing_faces "Use existing faces" algorithm for
 construction of a 2D mesh using Python commands.
 
index 9f6254c..060adae 100644 (file)
@@ -18,7 +18,9 @@ while the box is a 3D object.  <br>
  will be used. This means that an edge shared by two faces each having
  its own different sub-mesh, will be meshed using algorithms and
  hypotheses of any of the two, chosen randomly. This indeterminacy can
- be fixed by defining \ref submesh_order_anchor "Sub-mesh priority".
+ be fixed by defining \ref submesh_order_anchor "Sub-mesh priority". The
+ default sub-meshes priority is such that multi-dimensional algorithms
+ are processed first.
 <br>
 
 \n Construction of a sub-mesh consists of:
@@ -54,30 +56,32 @@ sub-mesh. You can define algorithms and hypotheses in the same way as
 in \ref constructing_meshes_page "Create mesh" menu.
 
 \par
-If the parent mesh is already computed, then you can define 
+If the parent mesh is already computed, then you can define the
 \b Geometry by picking mesh elements computed on a sub-shape of interest
-in the 3D Viewer, i.e. you don't have to extract this sub-shape
-previously in Geometry module. To start element selection, press \a
+in the 3D Viewer, i.e. you do not have to extract this sub-shape
+in Geometry module beforehand. To start element selection, press \a
 Selection button to the right of \b Geometry label. If this button is
 already down, then click it to release and then click it again. The
-following pop-up menu to choose a way of geometry definition will
+following pop-up menu allowing to choose a way of geometry definition will
 appear.
 
 \par
 \image html choose_geom_selection_way.png
 
 \par
-There the first item enables selecting the sub-shape in the Object
-Browser, the second one makes appear the following dialog.
+<b>Direct geometry selection</b> enables selecting the sub-shape in the Object
+Browser.
+<b>Find geometry by mesh element selection</b> activates the following dialog.
 
 \par
 \image html find_geom_by_mesh_elem.png
 
 \par
 In this dialog, <b> Element Type </b> defines kind of element to pick in the
-Viewer. Instead of picking an element in the Viewer, you can type its
-ID in <b> Element ID</b> field. <b> Geometry name </b> allow you
-define a name of the sub-shape with which it will be published in the Study.
+Viewer. 
+Instead of picking an element in the Viewer, you can type its
+ID in <b> Element ID</b> field. 
+<b> Geometry name </b> field allows defining a name of the sub-shape.
 
 
 \par
index 966e091..95adb86 100644 (file)
@@ -15,6 +15,8 @@ viewer.</li>
 elements which will form your group:</li>
 <ul>
 <li><b>Nodes</b></li>
+<li><b>0D Element</b></li>
+<li><b>Ball</b></li>
 <li><b>Edges</b></li>
 <li><b>Faces</b></li>
 <li><b>Volumes</b></li>
index 2865835..88fa5ae 100644 (file)
@@ -28,7 +28,7 @@ the ID of this quadrangle will be added to the list. To remove a
 selected element or elements from the list click \b Remove button. <b>Sort
 list</b> button allows to sort the list of IDs. \b Filter button allows to
 apply a definite filter to the selection of quadrangles.</li>
-<li><b>Apply to all</b> radio button allows to modify the orientation of all
+<li><b>Apply to all</b> check box allows to modify the orientation of all
 quadrangles of the currently displayed mesh or sub-mesh.</li>
 <li>\b Preview - provides a preview of cutting in the viewer.</li>
 </ul>
@@ -39,8 +39,19 @@ quadrangles of the currently displayed mesh or sub-mesh.</li>
 <li><b>Use diagonal 1-3</b> and <b>Use diagonal 2-4</b> allows to
 specify the opposite corners which will be connected by the cutting
 edge.</li>
-<li><b>Use numeric factor</b> - allows to chose a quality criterion
-  optimization of which will be used to select the cutting edge.</li>
+<li><b>Use numeric functor</b> - allows to choose a quality criterion
+ which will be optimized at the outcome of the operation.
+<ul>
+<li><b>Minimum diagonal</b> - cuts by the shortest edge.</li>
+<li><b>Aspect Ratio</b> - cuts by the edge splitting the quadrangle 
+into triangles with optimal \ref aspect_ratio_page "Aspect Ratio". The reference value is 1.</li>
+<li><b>Minimum Angle</b> -  cuts by the edge splitting the quadrangle 
+into triangles with optimal  \ref minimum_angle_page "Minimum Angle". The reference value is 60 degrees.</li>
+<li><b>Skew</b> -   cuts by the edge splitting the quadrangle 
+into triangles with optimal \ref skew_page "Skew". The reference value 
+is 0.0 degrees.</li>
+</ul>
+</li>
 </ul>
 </li>
 <li><b>Select from</b> - allows to choose a sub-mesh or an existing
index 1b34380..cb061b3 100644 (file)
@@ -3,18 +3,27 @@
 \page extrusion_page Extrusion
 
 \n Extrusion is used to build mesh elements of plus one
-dimension than the input ones. Any line or planar element can be
-extruded. Line elements will extrude into quadrilateral plane elements.
-Triangular and Quadrilateral plane elements extrude into Pentahedron
-and Hexahedron solids respectively.
+dimension than the input ones. Any node, segment or 2D element can be
+extruded. Each type of elements has a corresponding type of extruded elements:
+<table>
+<tr><td><b>Extruded element</b></td><td><b> Result elements </b></td></tr>
+<tr><td>Node              </td><td> Segments </td></tr>
+<tr><td>Segment           </td><td> Quadrilaterals </td></tr>
+<tr><td>Triangle          </td><td> Pentahedrons </td></tr>
+<tr><td>Quadrilateral     </td><td> Hexahedrons </td></tr>
+<tr><td>Polygon           </td><td> Polyhedrons </td></tr>
+<tr><td>Hexagonal polygon </td><td> Hexagonal prism </td></tr>
+</table>
 
 <em>To use extrusion:</em>
 <ol>
 <li>From the \b Modification menu choose the \b Extrusion item or click
 <em>"Extrusion"</em> button in the toolbar. 
 
+<center>
 \image html image91.png
-<center><em>"Extrusion" button</em></center>
+<em>"Extrusion" button</em>
+</center>
 
 The following dialog common for line and planar elements will appear:
 
@@ -26,32 +35,36 @@ The following dialog common for line and planar elements will appear:
 
 <li>In this dialog:
 <ul>
-<li>select the type of elements which will be extruded (0D, 1D or 2D),</li>
-<li>specify the IDs of the elements which will be extruded:
-<ul>
-<li><b>Select the whole mesh, submesh or group</b> activating this
-checkbox; or</li>
-<li>choose mesh elements with the mouse in the 3D Viewer. It is
-possible to select a whole area with a mouse frame; or</li> 
-<li>input the element IDs directly in <b>ID Elements</b> field. The selected elements will be highlighted in the
-viewer; or</li>
-<li>apply Filters. <b>Set filter</b> button allows to apply a filter to the selection of elements. See more
-about filters in the \ref selection_filter_library_page "Selection filter library" page.</li>
-</ul>
-</li>
-<li>If the <b>Extrude to Distance</b> radio button is selected</li>
-<ul>
-<li>specify the distance at which the elements will be extruded,</li>
-</ul>
-<li>If the <b>Extrude Along Vector</b> radio button is selected</li>
-<ul>
-<li>specify the coordinates of the vector along which the elements will be extruded, or select the face (the normal to the face will define the vector)</li>
-<li>specify the distance of extrusion along the vector,</li>
-</ul>
-<li>specify the number of steps;</li>
-<li>activate  <b>Generate Groups</b> checkbox if it is necessary to copy the groups of
-elements of the source mesh to the newly created one. </li>
-</li>
+  <li>Select the type of elements which will be extruded (0D, 1D or 2D).</li>
+  <li>Specify the IDs of the elements which will be extruded by one
+    following means:
+    <ul>
+      <li><b>Select the whole mesh, submesh or group</b> activating this
+        checkbox.</li>
+      <li>Choose mesh elements with the mouse in the 3D Viewer. It is
+        possible to select a whole area with a mouse frame.</li> 
+      <li>Input the element IDs directly in <b>ID Elements</b>
+        field. The selected elements will be highlighted in the viewer.</li> 
+      <li>Apply Filters. <b>Set filter</b> button allows to apply a
+        filter to the selection of elements. See more about filters in
+        the \ref filtering_elements "Selection filters" page.</li> 
+    </ul>
+  </li>
+  <li>If the <b>Extrude to Distance</b> radio button is selected</li>
+  <ul>
+    <li>specify the distance at which the elements will be extruded.</li>
+  </ul>
+  <li>If the <b>Extrude Along Vector</b> radio button is selected</li>
+  <ul>
+    <li>specify the coordinates of the vector along which the elements
+      will be extruded, or select the face (the normal to the face will
+      define the vector),</li>
+    <li>specify the distance of extrusion along the vector.</li>
+  </ul>
+  <li>Specify the number of steps.</li>
+  <li>If you activate <b>Generate Groups</b> check-box, the created
+    elements contained in groups will be included into new groups named
+    by pattern "<old group name>_extruded". </li>
 </ul>
 
 <li>Click \b Apply or <b> Apply and Close</b>  button to confirm the operation.</li>
index 7c8eeb7..9b0d032 100644 (file)
@@ -4,7 +4,7 @@
 
 \n In MESH there is a functionality allowing importation/exportation
 of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (simple ascii format), \b STL,
-\b GMF and \b CGNS format files. You can also export a group as a whole mesh.
+\b GMF (internal format of DISTENE products, namely BLSurf, GHS3D and Hexotic algorithms) and \b CGNS format files. You can also export a group as a whole mesh.
 
 
 <em>To import a mesh:</em>
index 1b1b2f9..d2a6eb4 100644 (file)
@@ -98,6 +98,12 @@ number of segments on each edge</li>
 <li><b>Area precision</b> - allows to adjust input precision of mesh element area.</li>
 <li><b>Volume precision</b> - allows to adjust input precision of mesh element volume.</li>
 </ul>
+<li><b>Preview</b></li>
+<ul>
+<li><b>Sub-shapes preview chunk size</b> - allows to limit the number
+of preview sub-shapes shown in the hypotheses creation dialog boxes,
+for example "Reverse Edges" parameter of \ref number_of_segments_anchor "Number of segments" hypothesis. 
+</ul>
 <li><b>Python Dump</b></li>
 <ul>
 <li><b>Historical python dump</b> checkbox allows switching between 
index 0a48ee6..63f2f3b 100644 (file)
@@ -122,9 +122,16 @@ button in the toolbar. You can also right-click on the mesh in the
 Object Browser and select Clear Mesh Data in the pop-up menu.</li>
 </ol>
 
+<center>
 \image html mesh_clear.png
-<center><em>"Clear Mesh Data" button</em></center>
-
+<em>"Clear Mesh Data" button</em></center>
+
+\note This command works in a different way in different situations: <ul>
+  <li> if the mesh is computed on a geometry, then "Clear Mesh Data" removes
+    all elements and nodes.</li>
+  <li> if the mesh is not based on a geometry (imported, compound, created from
+    scratch etc), then "Clear Mesh Data" removes only the elements and
+    nodes computed by algorithms. If no such elements or nodes have been created, can remove nothing.</li></ul>
 
 <br><b>See Also</b> a sample TUI Script of a 
 \ref tui_removing_nodes_and_elements "Removing Nodes and Elements" operation.  
index f637aec..db408ef 100644 (file)
@@ -3,17 +3,17 @@
 \page reorient_faces_page Reorient faces by vector
 
 \n This operation allows changing orientation of a set of neighboring
-faces. The desired orientation is defined by a vector. Since direction
+faces. The desired orientation is defined by a vector. Since the direction
 of face normals in the set can be even opposite, it is necessary to
 specify a control face whose normal will be compared with the vector. This
-face can be specified either explicitly or can be found by closeness to
+face can be either specified explicitly or found by proximity to
 a given point.
 
 Orientation of a face is changed by reverting the order of its nodes.
 
 <em>To change orientation of faces:</em>
 <ol>
-<li>In the \b Modification menu select the <b>Reorient faces by
+<li>In the \b Modification menu select <b>Reorient faces by
     vector</b> item or click <em>Reorient faces by
     vector</em> button in the toolbar.
 
@@ -31,24 +31,19 @@ The following dialog box will appear:
 
 <li>In this dialog
 <ul>
-<li>Specify a way of selection of the control face: by point or
-  explicitely.</li>
-<li>Select an \b Object containing faces to reorient, either in the Object
-  Browser or in the 3D Viewer; it can be either <ul>
-    <li>group of faces,</li>
-    <li>sub-mesh of faces or</li>
-    <li>mesh.</li>
-    </ul></li>
-<li>Specify either coordinates of a \b Point by which the control face
-  will be found or the control \b Face it-self. You can easy specify the \b
-  Point by either picking a node in the 3D Viewer or by selecting a vertex
-  in the Object Browser. The \b Face can be either picked by mouse in
-  the 3D Viewer or its ID can be entered by typing.</li>
-<li>Set up a \b Direction to be compared with the normal of the
-  control face. You can either pick a node in the 3D Viewer then a \b Direction
-  from the coordinate system origin to the selected node will be set,
-  or you can pick two nodes (holding Shift button) then a \b Direction
-  from the first to the second node will be set.</li>
+<li>Specify the way of selection of the control face: by point or
+  explicitly.</li>
+<li>Select the \b Object (mesh, sub-mesh or a group of faces) containing faces to reorient in the Object Browser or in the 3D Viewer.</li>
+<li>Specify the coordinates of the \b Point by which the control face
+  will be found or of the control \b Face itself. You can easy specify the \b
+  Point by either picking a node in the 3D Viewer or selecting a vertex
+  in the Object Browser. It is possible to pick the  \b Face by mouse in
+  the 3D Viewer or enter its ID.</li>
+<li>Set up the \b Direction vector to be compared with the normal of the
+  control face. If you pick a node in the 3D Viewer then the \b Direction
+  vector will go from the coordinate system origin to the selected node.
+  If you pick two nodes (holding Shift button) then the \b Direction vector
+  will go from the first to the second node.</li>
 </ul>
 </li>
 
index 4e58dce..12aabc2 100644 (file)
@@ -15,7 +15,14 @@ load an existing filter library.
 the current study. You can \b Add or \b Delete filters.
 \n In <b>Filter name</b> box you can specify the name for your
 filter. By default it is prefixed with the corresponding entity type.
-\n Each filter can be applicable to \b Nodes, \b Edges, \b Faces or \b
+
+\anchor filtering_elements
+
+When we use filters during a group creation or another operation (by 
+clicking <b>Set Filters</b> button in the corresponding dialog), the
+menu for setting filters looks a bit differently (see the image below).
+
+Each filter can be applicable to \b Nodes, \b Edges, \b Faces or \b
 Volumes. You can combine many criteria in one filter, but they all
 must be of the same <b>Entity type</b>.
 \n The \b Add button creates a new criterion at the end of the list of
@@ -30,21 +37,18 @@ sense of a criterion using \b Unary operator Not and you should
 specify logical relations between criteria using \b Binary operators
 Or and And.
 \n Some criteria should have the additional parameter of \b Tolerance.
-
-When we create a group using filters (for this click
-<b>Set Filters</b> button in the <b>Create Group</b> dialog), the menu
-for setting filters looks a bit differently (see below). Switching
-on <b>Insert filter in viewer</b> checkbox limits selection of elements
-in the Viewer using your current filter.
+<br> 
+Switching on <b>Insert filter in viewer</b> checkbox limits
+selection of elements in the Viewer to the current filter.
 <br>
 In the \b Source field you choose if the filter will be applied to
 the whole \b Mesh, the <b>Initial Selection</b> or the <b>Current
 Group</b>. If \b Mesh is chosen, the elements satisfying the filter
 will be selected in the 3D Viewer. If <b> Initial Selection</b> is
 chosen, the filter will be applied to the selected elements and the
-elements rejected by the filter will be deseleced. If <b>Current
+elements rejected by the filter will be deselected. If <b>Current
 Group</b> is chosen, the filter will be applied to the list of
-elements in the <em>Greate Croup</em> dialog and the elements rejected
+elements in the current dialog and the elements rejected
 by the filter will be removed from the list.
 <br>
 <b>Copy from...</b> button gives you a possibility to load an
@@ -68,7 +72,7 @@ shape the algorithm works slower.
 </li><li>
 <b>Lying on Geom</b> selects entities whose at least one node
 lies on the shape defined by the <b>Threshold Value</b>.
-If the hreshold shape is a sub-shape of the main shape of the mesh the
+If the threshold shape is a sub-shape of the main shape of the mesh the
 algorithm works faster, if this is any other
 shape, the algorithm works slower.
 </li><li>
@@ -167,7 +171,7 @@ The following criteria allow selecting mesh <b>Faces</b>:
 one element of mesh only. See also a
 \ref free_edges_page "Free Edges quality control".
 </li><li>
-<b>Free faces</b> selects 2D mesh elements wich belong to less than two volumes.
+<b>Free faces</b> selects 2D mesh elements, which belong to less than two volumes.
 </li><li>
 <b>Double faces</b> selects 2D mesh elements basing on the same set of nodes.
 See also \ref filter_double_elements "Double Elements quality control".
index 29ff056..b2b4879 100644 (file)
@@ -116,6 +116,7 @@ the following links:
 
 - \subpage tui_creating_meshes_page
 - \subpage tui_cartesian_algo
+- \subpage tui_use_existing_faces
 - \subpage tui_viewing_meshes_page
 - \subpage tui_defining_hypotheses_page
 - \subpage tui_quality_controls_page
index 922d159..977ff6e 100644 (file)
@@ -11,9 +11,9 @@
 <h3>Add Node</h3>
 
 \code
-import SMESH_mechanic
+import smesh
 
-mesh = SMESH_mechanic.mesh
+mesh = smesh.Mesh()
 
 # add node
 new_id = mesh.AddNode(50, 10, 0)
@@ -27,9 +27,9 @@ else:           print "New Node has been added with ID ", new_id
 <h3>Add 0D Element</h3>
 
 \code
-import SMESH_mechanic
+import smesh
 
-mesh = SMESH_mechanic.mesh
+mesh = smesh.Mesh()
 
 # add node
 node_id = mesh.AddNode(50, 10, 0)
@@ -43,6 +43,54 @@ else:           print "New 0D Element has been added with ID ", new_id
 \endcode
 
 <br>
+\anchor tui_add_0DElement_on_all_nodes
+<h3>Add 0D Element on Element Nodes</h3>
+
+\code
+import smesh, SMESH, geompy
+
+# create a geometry
+box = geompy.MakeBoxDXDYDZ( 10, 10, 10 )
+face = geompy.SubShapeAll( box, geompy.ShapeType["FACE"])[0]
+
+# make 3D mesh
+mesh = smesh.Mesh( box )
+mesh.AutomaticHexahedralization(0)
+
+# create 0D elements on all nodes of the mesh
+res = mesh.Add0DElementsToAllNodes( mesh )
+
+# find 0D elements on all nodes of the mesh, all found nodes are added to a new group
+groupName = "0Dmesh"
+res = mesh.Add0DElementsToAllNodes( mesh, groupName )
+mesh.RemoveGroupWithContents( res ) # remove all found 0D elements
+
+# create 0D elements on all nodes of a sub-mesh, with group creation
+groupName = "0Dsubmesh"
+submesh = mesh.GetSubMesh( face, "faceSM")
+res = mesh.Add0DElementsToAllNodes( submesh, groupName )
+
+# create 0D elements on all nodes of a group
+group = mesh.Group( face, "faceGroup" )
+res = mesh.Add0DElementsToAllNodes( group )
+
+# remove all 0D elements
+mesh.RemoveElements( mesh.GetIdsFromFilter( smesh.GetFilter( SMESH.ELEM0D,
+                                                             SMESH.FT_ElemGeomType,
+                                                             "=",SMESH.Geom_POINT )))
+
+# create 0D elements on all nodes of some elements
+res = mesh.Add0DElementsToAllNodes( mesh.GetElementsId() )
+
+mesh.RemoveElements( mesh.GetElementsByType( SMESH.ELEM0D ))
+
+# create 0D elements on some nodes
+nodes = range(1,10)
+res = mesh.Add0DElementsToAllNodes( mesh.GetIDSource( nodes, SMESH.NODE ))
+
+\endcode
+
+<br>
 \anchor tui_add_edge
 <h3>Add Edge</h3>
 
index 8b9c732..0f95ac4 100644 (file)
@@ -1,6 +1,6 @@
 /*!
 
-\page tui_use_existing_faces Use existing faces
+\page tui_use_existing_faces Use existing faces algorithm
 
 This sample demonstrates how to use <b>Use existing faces</b> algorithm,
 which is actulally just a stub allowing to use your own 2D algoritm
index 74e2ab2..051b286 100644 (file)
@@ -28,8 +28,8 @@ to sort the list of IDs. The <b>Set filter</b> button allows to apply a
 definite filter to selection of triangles.</li>
 <li><b>Apply to all</b> radio button allows to modify connectivity and
 type of all triangles of the currently displayed mesh or sub-mesh.</li>
-<li>\b Criterion menu allows to chose a quality criterion
 optimization of which will be used to select triangles to unite.</li>
+<li>\b Criterion menu allows to choose a quality criterion,
which will be optimized to select triangles to unite.</li>
 <li><b>Select from</b> set of fields allows to choose a sub-mesh or an
 existing group whose triangle elements will be automatically added to
 the list.</li>
index 5ec9ebb..2a08129 100644 (file)
@@ -862,6 +862,39 @@ module StdMeshers
   };
 
   /*!
+   * interface of "Viscous Layers 2D" hypothesis.
+   * This hypothesis specifies parameters of layers of quadrilaterals to build
+   * near mesh boundary. This hypothesis can be used by several 2D algorithms:
+   * Mefisto, Quadrangle (mapping), NETGEN, BLSURF
+   */
+  interface StdMeshers_ViscousLayers2D : SMESH::SMESH_Hypothesis
+  {
+    /*!
+     * Set edges to exclude from treatment
+     */
+    void SetIgnoreEdges(in SMESH::long_array edgeIDs) raises (SALOME::SALOME_Exception);
+    SMESH::long_array GetIgnoreEdges();
+
+    /*!
+     * Set total thickness of layers of prisms
+     */
+    void SetTotalThickness(in double thickness) raises (SALOME::SALOME_Exception);
+    double GetTotalThickness();
+
+    /*!
+     * Set number of layers of prisms
+     */
+    void SetNumberLayers(in short nb) raises (SALOME::SALOME_Exception);
+    short GetNumberLayers();
+
+    /*!
+     * Set factor (>1.0) of growth of layer thickness towards inside of mesh
+     */
+    void SetStretchFactor(in double factor) raises (SALOME::SALOME_Exception);
+    double GetStretchFactor();
+  };
+
+  /*!
    * interface of "Body fitting Parameters" hypothesis.
    * This hypothesis specifies 
    * - Definition of the Cartesian grid
index b8d3176..8385a90 100644 (file)
@@ -240,8 +240,11 @@ module SMESH
 
     /*!
      * Create Mesh object importing data from given GMF file
+     *  \param theFileName - a name of file to import
+     *  \param theMakeRequiredGroups - if true, groups of required entities will be created
      */
     SMESH_Mesh CreateMeshesFromGMF( in string               theFileName,
+                                    in boolean              theMakeRequiredGroups,
                                     out SMESH::ComputeError theError)
       raises ( SALOME::SALOME_Exception );
 
index b8d2b5e..56f465e 100644 (file)
@@ -663,7 +663,8 @@ module SMESH
                      in string         file,
                      in boolean        overwrite ) raises (SALOME::SALOME_Exception);
     void ExportGMF( in SMESH_IDSource  meshPart, 
-                    in string          file ) raises (SALOME::SALOME_Exception);
+                    in string          file,
+                    in boolean         withRequiredGroups) raises (SALOME::SALOME_Exception);
     void ExportPartToDAT( in SMESH_IDSource meshPart, 
                           in string         file ) raises (SALOME::SALOME_Exception);
     void ExportPartToUNV( in SMESH_IDSource meshPart, 
index 08f2b70..3425d89 100644 (file)
@@ -151,7 +151,6 @@ module SMESH
      */
     long AddPolyhedralVolume (in long_array IdsOfNodes,
                               in long_array Quantities);
-
     /*!
      *  Create volume of many faces, giving IDs of existing faces.
      *  \param IdsOfFaces List of face IDs for volume creation.
@@ -161,6 +160,19 @@ module SMESH
     long AddPolyhedralVolumeByFaces (in long_array IdsOfFaces);
 
     /*!
+     * Create 0D elements on all nodes of the given object except those 
+     * nodes on which a 0D element already exists.
+     *  \param theObject object on whose nodes 0D elements will be created.
+     *  \param theGroupName optional name of a group to add 0D elements created
+     *         and/or found on nodes of \a theObject.
+     *  \return an object (a new group or a temporary SMESH_IDSource) holding
+     *          ids of new and/or found 0D elements.
+     */
+    SMESH_IDSource Create0DElementsOnAllNodes(in SMESH_IDSource theObject,
+                                              in string         theGroupName)
+      raises (SALOME::SALOME_Exception);
+
+    /*!
      * \brief Bind a node to a vertex
       * \param NodeID - node ID
       * \param VertexID - vertex ID available through GEOM_Object.GetSubShapeIndices()[0]
index dcbb70e..4cb55e8 100644 (file)
@@ -113,6 +113,8 @@ dist_salomeres_DATA = \
        mesh_update.png \
        mesh_vertex_n.png \
        mesh_vertex.png \
+       mesh_0D_elem.png \
+       mesh_0D_on_all_nodes.png \
        mesh_volume_3d.png \
        bare_border_volume.png \
        bare_border_face.png \
index b82d6a4..59f6204 100644 (file)
                gui-lib="StdMeshersGUI">
   <hypotheses>
 
-    <hypothesis type="SegmentLengthAroundVertex"
-                label-id="Length Near Vertex"
-                icon-id="mesh_hypo_length.png"
-                dim="0"/>
-
-    <hypothesis type="LocalLength"
-                label-id="Local Length"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="MaxLength"
-                label-id="Max Size"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="Arithmetic1D"
-                label-id="Arithmetic 1D"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="FixedPoints1D"
-                label-id="Fixed Points 1D"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="StartEndLength"
-                label-id="Start and End Length"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="NumberOfSegments"
-                label-id="Nb. Segments"
-                icon-id="mesh_hypo_segment.png"
-                dim="1"/>
-
-    <hypothesis type="Deflection1D"
-                label-id="Deflection 1D"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="Propagation"
-                label-id="Propagation of 1D Hyp. on Opposite Edges"
-                icon-id="mesh_hypo_length.png"
-                dim="1"
+    <hypothesis type     ="SegmentLengthAroundVertex"
+                label-id ="Length Near Vertex"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="0"/>
+
+    <hypothesis type     ="LocalLength"
+                label-id ="Local Length"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="MaxLength"
+                label-id ="Max Size"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="Arithmetic1D"
+                label-id ="Arithmetic 1D"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="FixedPoints1D"
+                label-id ="Fixed Points 1D"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="StartEndLength"
+                label-id ="Start and End Length"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="NumberOfSegments"
+                label-id ="Nb. Segments"
+                icon-id  ="mesh_hypo_segment.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="Deflection1D"
+                label-id ="Deflection 1D"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="Propagation"
+                label-id ="Propagation of 1D Hyp. on Opposite Edges"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"
                 auxiliary="true"/>
 
-    <hypothesis type="AutomaticLength"
-                label-id="Automatic Length"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
+    <hypothesis type     ="AutomaticLength"
+                label-id ="Automatic Length"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
 
-    <hypothesis type="LengthFromEdges"
-                label-id="Length From Edges"
-                icon-id="mesh_hypo_length.png"
-                dim="2"/>
+    <hypothesis type     ="LengthFromEdges"
+                label-id ="Length From Edges"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="2"/>
 
-    <hypothesis type="QuadranglePreference"
-                label-id="Quadrangle Preference"
-                icon-id="mesh_algo_quad.png"
+    <hypothesis type     ="QuadranglePreference"
+                label-id ="Quadrangle Preference"
+                icon-id  ="mesh_algo_quad.png"
                 auxiliary="true"
-                dim="2"/>
+                dim      ="2"/>
 
-    <hypothesis type="QuadraticMesh"
-                label-id="Quadratic Mesh"
-                icon-id="mesh_algo_quad.png"
-                dim="1"
+    <hypothesis type     ="QuadraticMesh"
+                label-id ="Quadratic Mesh"
+                icon-id  ="mesh_algo_quad.png"
+                dim      ="1"
                 auxiliary="true"/>                
 
-    <hypothesis type="MaxElementArea"
-                label-id="Max. Element Area"
-                icon-id="mesh_hypo_area.png"
-                dim="2"/>
+    <hypothesis type     ="MaxElementArea"
+                label-id ="Max. Element Area"
+                icon-id  ="mesh_hypo_area.png"
+                dim      ="2"/>
                 
-    <hypothesis type="NotConformAllowed"
-                label-id="Not Conform Mesh Allowed"
-                icon-id="mesh_hypo_length.png"
-                dim="1,2,3"
+    <hypothesis type     ="NotConformAllowed"
+                label-id ="Not Conform Mesh Allowed"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1,2,3"
                 auxiliary="true"/>                
 
-    <hypothesis type="MaxElementVolume"
-                label-id="Max. Element Volume"
-                icon-id="mesh_hypo_volume.png"
-                dim="3"/>
-
-    <hypothesis type="ProjectionSource3D"
-                label-id="Source Shape 3D"
-                icon-id="mesh_hypo_volume.png"
-                dim="3"/>
-
-    <hypothesis type="ProjectionSource2D"
-                label-id="Source Face"
-                icon-id="mesh_hypo_area.png"
-                dim="2"/>
-
-    <hypothesis type="ProjectionSource1D"
-                label-id="Source Edge"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="ImportSource2D"
-                label-id="Source Faces"
-                icon-id="mesh_hypo_area.png"
-                dim="2"/>
-
-    <hypothesis type="ImportSource1D"
-                label-id="Source Edges"
-                icon-id="mesh_hypo_length.png"
-                dim="1"/>
-
-    <hypothesis type="NumberOfLayers"
-                label-id="Number of Layers"
-                icon-id="mesh_hypo_length.png"
-                dim="3"/>
-
-    <hypothesis type="LayerDistribution"
-                label-id="Distribution of Layers"
-                icon-id="mesh_hypo_length.png"
-                dim="3"/>
-
-    <hypothesis type="ViscousLayers"
-                label-id="Viscous Layers"
-                icon-id="mesh_algo_quad.png"
+    <hypothesis type     ="MaxElementVolume"
+                label-id ="Max. Element Volume"
+                icon-id  ="mesh_hypo_volume.png"
+                dim      ="3"/>
+
+    <hypothesis type     ="ProjectionSource3D"
+                label-id ="Source Shape 3D"
+                icon-id  ="mesh_hypo_volume.png"
+                dim      ="3"/>
+
+    <hypothesis type     ="ProjectionSource2D"
+                label-id ="Source Face"
+                icon-id  ="mesh_hypo_area.png"
+                dim      ="2"/>
+
+    <hypothesis type     ="ProjectionSource1D"
+                label-id ="Source Edge"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="ImportSource2D"
+                label-id ="Source Faces"
+                icon-id  ="mesh_hypo_area.png"
+                dim      ="2"/>
+
+    <hypothesis type     ="ImportSource1D"
+                label-id ="Source Edges"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="1"/>
+
+    <hypothesis type     ="NumberOfLayers"
+                label-id ="Number of Layers"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="3"/>
+
+    <hypothesis type     ="LayerDistribution"
+                label-id ="Distribution of Layers"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="3"/>
+
+    <hypothesis type     ="ViscousLayers2D"
+                label-id ="Viscous Layers 2D"
+                icon-id  ="mesh_algo_quad.png"
                 auxiliary="true"
-                dim="3"/>
+                dim      ="2"/>
 
-    <hypothesis type="NumberOfLayers2D"
-                label-id="Number of Layers"
-                icon-id="mesh_hypo_length.png"
-                dim="2"/>
+    <hypothesis type     ="ViscousLayers"
+                label-id ="Viscous Layers"
+                icon-id  ="mesh_algo_quad.png"
+                auxiliary="true"
+                dim      ="3"/>
+
+    <hypothesis type     ="NumberOfLayers2D"
+                label-id ="Number of Layers"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="2"/>
 
-    <hypothesis type="LayerDistribution2D"
-                label-id="Distribution of Layers"
-                icon-id="mesh_hypo_length.png"
-                dim="2"/>
+    <hypothesis type     ="LayerDistribution2D"
+                label-id ="Distribution of Layers"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="2"/>
 
-    <hypothesis type="QuadrangleParams"
-                label-id="Quadrangle Parameters"
-                icon-id="mesh_hypo_length.png"
-                dim="2"/>
+    <hypothesis type     ="QuadrangleParams"
+                label-id ="Quadrangle Parameters"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="2"/>
 
-    <hypothesis type="CartesianParameters3D"
-                label-id="Body Fitting Parameters"
-                icon-id="mesh_hypo_length.png"
-                dim="3"/>
+    <hypothesis type     ="CartesianParameters3D"
+                label-id ="Body Fitting Parameters"
+                icon-id  ="mesh_hypo_length.png"
+                dim      ="3"/>
 
   </hypotheses>
 
   <algorithms>
 
-    <algorithm type="SegmentAroundVertex_0D"
-              label-id="Segments around Vertex"
-              icon-id="mesh_algo_regular.png"
-               hypos="SegmentLengthAroundVertex"
-               output="VERTEX"
-               dim="0"/>
-
-    <algorithm type="Regular_1D"
-              label-id="Wire Discretisation"
-              icon-id="mesh_algo_regular.png"
-               hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
+    <algorithm type     ="SegmentAroundVertex_0D"
+              label-id ="Segments around Vertex"
+              icon-id  ="mesh_algo_regular.png"
+               hypos    ="SegmentLengthAroundVertex"
+               output   ="VERTEX"
+               dim      ="0"/>
+
+    <algorithm type     ="Regular_1D"
+              label-id ="Wire Discretisation"
+              icon-id  ="mesh_algo_regular.png"
+               hypos    ="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
                opt-hypos="Propagation,QuadraticMesh"
-               input="VERTEX"
-               output="EDGE"
-               dim="1">
+               input    ="VERTEX"
+               output   ="EDGE"
+               dim      ="1">
       <python-wrap>
         <algo>Regular_1D=Segment()</algo>
         <hypo>LocalLength=LocalLength(SetLength(1),,SetPrecision(1))</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="CompositeSegment_1D"
-              label-id="Composite Side Discretisation"
-              icon-id="mesh_algo_regular.png"
-               hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
+    <algorithm type     ="CompositeSegment_1D"
+              label-id ="Composite Side Discretisation"
+              icon-id  ="mesh_algo_regular.png"
+               hypos    ="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
                opt-hypos="Propagation,QuadraticMesh"
-               input="VERTEX"
-               output="EDGE"
-               dim="1">
+               input    ="VERTEX"
+               output   ="EDGE"
+               dim      ="1">
       <python-wrap>
         <algo>CompositeSegment_1D=Segment(algo=smesh.COMPOSITE)</algo>
         <hypo>LocalLength=LocalLength(SetLength(), ,SetPrecision())</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="MEFISTO_2D"
-              label-id="Triangle (Mefisto)"
-              icon-id="mesh_algo_mefisto.png"
-               hypos="LengthFromEdges,MaxElementArea"
-               input="EDGE"
-               output="TRIA"
-               dim="2">
+    <algorithm type      ="MEFISTO_2D"
+              label-id  ="Triangle (Mefisto)"
+              icon-id   ="mesh_algo_mefisto.png"
+               hypos     ="LengthFromEdges,MaxElementArea"
+               opt-hypos ="ViscousLayers2D"
+               input     ="EDGE"
+               output    ="TRIA"
+               dim       ="2">
       <python-wrap>
         <algo>MEFISTO_2D=Triangle(algo=smesh.MEFISTO)</algo>
         <hypo>LengthFromEdges=LengthFromEdges()</hypo>
         <hypo>MaxElementArea=MaxElementArea(SetMaxElementArea())</hypo>
+        <hypo>ViscousLayers2D=ViscousLayers2D(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreEdges())</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Quadrangle_2D"
-               label-id="Quadrangle (Mapping)"
-               icon-id="mesh_algo_quad.png"
-               hypos="QuadrangleParams"
-               input="EDGE"
-               output="QUAD"
-               dim="2">
+    <algorithm type     ="Quadrangle_2D"
+               label-id ="Quadrangle (Mapping)"
+               icon-id  ="mesh_algo_quad.png"
+               hypos    ="QuadrangleParams"
+               opt-hypos="ViscousLayers2D"
+               input    ="EDGE"
+               output   ="QUAD"
+               dim      ="2">
       <python-wrap>
         <algo>Quadrangle_2D=Quadrangle(algo=smesh.QUADRANGLE)</algo>
         <hypo>QuadrangleParams=QuadrangleParameters(SetQuadType(),SetTriaVertex())</hypo>
+        <hypo>ViscousLayers2D=ViscousLayers2D(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreEdges())</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Hexa_3D"
-               label-id="Hexahedron (i,j,k)"
-               icon-id="mesh_algo_hexa.png"
-               input="QUAD"
+    <algorithm type     ="Hexa_3D"
+               label-id ="Hexahedron (i,j,k)"
+               icon-id  ="mesh_algo_hexa.png"
+               input    ="QUAD"
               need-geom="false"
                opt-hypos="ViscousLayers"
-               dim="3">
+               dim      ="3">
       <python-wrap>
         <algo>Hexa_3D=Hexahedron(algo=smesh.Hexa)</algo>
         <hypo>ViscousLayers=ViscousLayers(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreFaces())</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Projection_1D"
+    <algorithm type    ="Projection_1D"
                label-id="Projection 1D"
-               icon-id="mesh_algo_regular.png"
-               hypos="ProjectionSource1D"
-               output="EDGE"
-               dim="1">
+               icon-id ="mesh_algo_regular.png"
+               hypos   ="ProjectionSource1D"
+               output  ="EDGE"
+               dim     ="1">
       <python-wrap>
         <algo>Projection_1D=Projection1D()</algo>
         <hypo>ProjectionSource1D=SourceEdge(SetSourceEdge(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2))</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Projection_2D"
+    <algorithm type    ="Projection_2D"
                label-id="Projection 2D"
-               icon-id="mesh_algo_quad.png"
-               input="EDGE"
-               hypos="ProjectionSource2D"
-               output="QUAD,TRIA"
-               dim="2">
+               icon-id ="mesh_algo_quad.png"
+               input   ="EDGE"
+               hypos   ="ProjectionSource2D"
+               output  ="QUAD,TRIA"
+               dim     ="2">
       <python-wrap>
         <algo>Projection_2D=Projection2D()</algo>
         <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Projection_1D2D"
+    <algorithm type    ="Projection_1D2D"
                label-id="Projection 1D-2D"
-               icon-id="mesh_algo_quad.png"
-               input=""
-               hypos="ProjectionSource2D"
-               output="QUAD,TRIA"
-               dim="2">
+               icon-id ="mesh_algo_quad.png"
+               hypos   ="ProjectionSource2D"
+               output  ="QUAD,TRIA"
+               dim     ="2">
       <python-wrap>
         <algo>Projection_1D2D=Projection1D2D()</algo>
         <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2),SetVertexAssociation(3),SetVertexAssociation(4))</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Projection_3D"
+    <algorithm type    ="Projection_3D"
                label-id="Projection 3D"
-               icon-id="mesh_algo_hexa.png"
-               hypos="ProjectionSource3D"
-               input="QUAD,TRIA"
-               dim="3">
+               icon-id ="mesh_algo_hexa.png"
+               hypos   ="ProjectionSource3D"
+               input   ="QUAD,TRIA"
+               dim     ="3">
       <python-wrap>
         <algo>Projection_3D=Projection3D()</algo>
         <hypo>ProjectionSource3D=SourceShape3D(SetSource3DShape(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Import_1D"
+    <algorithm type    ="Import_1D"
                label-id="Use Existing 1D Elements"
-               icon-id="mesh_algo_regular.png"
-               hypos="ImportSource1D"
-               output="EDGE"
-               dim="1">
+               icon-id ="mesh_algo_regular.png"
+               hypos   ="ImportSource1D"
+               output  ="EDGE"
+               dim     ="1">
       <python-wrap>
         <algo>Import_1D=UseExisting1DElements()</algo>
         <hypo>ImportSource1D=SourceEdges(SetSourceEdges(),SetCopySourceMesh(1),SetCopySourceMesh(2))</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Import_1D2D"
-               label-id="Use Existing 2D Elements"
-               icon-id="mesh_algo_quad.png"
-               hypos="ImportSource2D"
-               output="QUAD,TRIA"
+    <algorithm type             ="Import_1D2D"
+               label-id         ="Use Existing 2D Elements"
+               icon-id          ="mesh_algo_quad.png"
+               hypos            ="ImportSource2D"
+               output           ="QUAD,TRIA"
                support-submeshes="false"
-               dim="2">
+               dim              ="2">
       <python-wrap>
         <algo>Import_1D2D=UseExisting2DElements()</algo>
         <hypo>ImportSource2D=SourceFaces(SetSourceFaces(),SetCopySourceMesh(1),SetCopySourceMesh(2))</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Prism_3D"
+    <algorithm type    ="Prism_3D"
                label-id="3D Extrusion"
-               icon-id="mesh_algo_hexa.png"
-               input="QUAD,TRIA"
-               dim="3">
+               icon-id ="mesh_algo_hexa.png"
+               input   ="QUAD,TRIA"
+               dim     ="3">
       <python-wrap>
         <algo>Prism_3D=Prism()</algo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="RadialPrism_3D"
+    <algorithm type    ="RadialPrism_3D"
                label-id="Radial Prism 3D"
-               icon-id="mesh_algo_hexa.png"
-               hypos="NumberOfLayers, LayerDistribution"
-               input="QUAD,TRIA"
-               dim="3">
+               icon-id ="mesh_algo_hexa.png"
+               hypos   ="NumberOfLayers, LayerDistribution"
+               input   ="QUAD,TRIA"
+               dim     ="3">
       <python-wrap>
         <algo>RadialPrism_3D=Prism('RadialPrism_3D')</algo>
         <hypo>NumberOfLayers=NumberOfLayers(SetNumberOfLayers())</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="UseExisting_1D"
+    <algorithm type    ="UseExisting_1D"
                label-id="Use Existing Edges"
-               icon-id="mesh_algo_regular.png"
-               input="VERTEX"
-               output="EDGE"
-               dim="1">
+               icon-id ="mesh_algo_regular.png"
+               input   ="VERTEX"
+               output  ="EDGE"
+               dim     ="1">
       <python-wrap>
         <algo>UseExisting_1D=UseExistingSegments()</algo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="UseExisting_2D"
+    <algorithm type    ="UseExisting_2D"
                label-id="Use Existing Faces"
-               icon-id="mesh_algo_quad.png"
-               input="EDGE"
-               output="QUAD,TRIA"
-               dim="2">
+               icon-id ="mesh_algo_quad.png"
+               input   ="EDGE"
+               output  ="QUAD,TRIA"
+               dim     ="2">
       <python-wrap>
         <algo>UseExisting_2D=UseExistingFaces()</algo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="RadialQuadrangle_1D2D"
+    <algorithm type    ="RadialQuadrangle_1D2D"
                label-id="Radial Quadrangle 1D2D"
-               icon-id="mesh_algo_quad.png"
-               hypos="NumberOfLayers2D, LayerDistribution2D"
-               input="EDGE"
-               output="QUAD,TRIA"
-               dim="2">
+               icon-id ="mesh_algo_quad.png"
+               hypos   ="NumberOfLayers2D, LayerDistribution2D"
+               input   ="EDGE"
+               output  ="QUAD,TRIA"
+               dim     ="2">
       <python-wrap>
         <algo>RadialQuadrangle_1D2D=Quadrangle(algo=smesh.RADIAL_QUAD)</algo>
         <hypo>NumberOfLayers2D=NumberOfLayers(SetNumberOfLayers())</hypo>
       </python-wrap>
     </algorithm>
 
-    <algorithm type="Cartesian_3D"
-               label-id="Body Fitting"
-               icon-id="mesh_algo_hexa.png"
-               hypos="CartesianParameters3D"
+    <algorithm type             ="Cartesian_3D"
+               label-id         ="Body Fitting"
+               icon-id          ="mesh_algo_hexa.png"
+               hypos            ="CartesianParameters3D"
                support-submeshes="false"
-               dim="3">
+               dim              ="3">
       <python-wrap>
         <algo>Cartesian_3D=BodyFitted()</algo>
       </python-wrap>
diff --git a/resources/mesh_0D_elem.png b/resources/mesh_0D_elem.png
new file mode 100644 (file)
index 0000000..be599b5
Binary files /dev/null and b/resources/mesh_0D_elem.png differ
diff --git a/resources/mesh_0D_on_all_nodes.png b/resources/mesh_0D_on_all_nodes.png
new file mode 100644 (file)
index 0000000..8237656
Binary files /dev/null and b/resources/mesh_0D_on_all_nodes.png differ
index 66601f3..3e44afe 100644 (file)
                             AUXILIARY METHODS
 */
 
-namespace{
+namespace {
+
+  const double theEps = 1e-100;
+  const double theInf = 1e+100;
 
   inline gp_XYZ gpXYZ(const SMDS_MeshNode* aNode )
   {
@@ -231,7 +234,11 @@ bool NumericalFunctor::GetPoints(const int theId,
   if ( myMesh == 0 )
     return false;
 
-  return GetPoints( myMesh->FindElement( theId ), theRes );
+  const SMDS_MeshElement* anElem = myMesh->FindElement( theId );
+  if ( !anElem || anElem->GetType() != this->GetType() )
+    return false;
+
+  return GetPoints( anElem, theRes );
 }
 
 bool NumericalFunctor::GetPoints(const SMDS_MeshElement* anElem,
@@ -239,7 +246,7 @@ bool NumericalFunctor::GetPoints(const SMDS_MeshElement* anElem,
 {
   theRes.clear();
 
-  if ( anElem == 0)
+  if ( anElem == 0 )
     return false;
 
   theRes.reserve( anElem->NbNodes() );
@@ -424,66 +431,60 @@ SMDSAbs_ElementType Volume::GetType() const
   return SMDSAbs_Volume;
 }
 
-
+//=======================================================================
 /*
   Class       : MaxElementLength2D
   Description : Functor calculating maximum length of 2D element
 */
+double MaxElementLength2D::GetValue( const TSequenceOfXYZ& P )
+{
+  if(P.size() == 0)
+    return 0.;
+  double aVal = 0;
+  int len = P.size();
+  if( len == 3 ) { // triangles
+    double L1 = getDistance(P( 1 ),P( 2 ));
+    double L2 = getDistance(P( 2 ),P( 3 ));
+    double L3 = getDistance(P( 3 ),P( 1 ));
+    aVal = Max(L1,Max(L2,L3));
+  }
+  else if( len == 4 ) { // quadrangles
+    double L1 = getDistance(P( 1 ),P( 2 ));
+    double L2 = getDistance(P( 2 ),P( 3 ));
+    double L3 = getDistance(P( 3 ),P( 4 ));
+    double L4 = getDistance(P( 4 ),P( 1 ));
+    double D1 = getDistance(P( 1 ),P( 3 ));
+    double D2 = getDistance(P( 2 ),P( 4 ));
+    aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
+  }
+  else if( len == 6 ) { // quadratic triangles
+    double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
+    double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
+    double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 1 ));
+    aVal = Max(L1,Max(L2,L3));
+  }
+  else if( len == 8 || len == 9 ) { // quadratic quadrangles
+    double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
+    double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
+    double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 7 ));
+    double L4 = getDistance(P( 7 ),P( 8 )) + getDistance(P( 8 ),P( 1 ));
+    double D1 = getDistance(P( 1 ),P( 5 ));
+    double D2 = getDistance(P( 3 ),P( 7 ));
+    aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
+  }
+
+  if( myPrecision >= 0 )
+  {
+    double prec = pow( 10., (double)myPrecision );
+    aVal = floor( aVal * prec + 0.5 ) / prec;
+  }
+  return aVal;
+}
 
 double MaxElementLength2D::GetValue( long theElementId )
 {
   TSequenceOfXYZ P;
-  if( GetPoints( theElementId, P ) ) {
-    double aVal = 0;
-    const SMDS_MeshElement* aElem = myMesh->FindElement( theElementId );
-    SMDSAbs_ElementType aType = aElem->GetType();
-    int len = P.size();
-    switch( aType ) {
-    case SMDSAbs_Face:
-      if( len == 3 ) { // triangles
-        double L1 = getDistance(P( 1 ),P( 2 ));
-        double L2 = getDistance(P( 2 ),P( 3 ));
-        double L3 = getDistance(P( 3 ),P( 1 ));
-        aVal = Max(L1,Max(L2,L3));
-        break;
-      }
-      else if( len == 4 ) { // quadrangles
-        double L1 = getDistance(P( 1 ),P( 2 ));
-        double L2 = getDistance(P( 2 ),P( 3 ));
-        double L3 = getDistance(P( 3 ),P( 4 ));
-        double L4 = getDistance(P( 4 ),P( 1 ));
-        double D1 = getDistance(P( 1 ),P( 3 ));
-        double D2 = getDistance(P( 2 ),P( 4 ));
-        aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
-        break;
-      }
-      else if( len == 6 ) { // quadratic triangles
-        double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
-        double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
-        double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 1 ));
-        aVal = Max(L1,Max(L2,L3));
-        break;
-      }
-      else if( len == 8 || len == 9 ) { // quadratic quadrangles
-        double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
-        double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
-        double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 7 ));
-        double L4 = getDistance(P( 7 ),P( 8 )) + getDistance(P( 8 ),P( 1 ));
-        double D1 = getDistance(P( 1 ),P( 5 ));
-        double D2 = getDistance(P( 3 ),P( 7 ));
-        aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
-        break;
-      }
-    }
-
-    if( myPrecision >= 0 )
-    {
-      double prec = pow( 10., (double)myPrecision );
-      aVal = floor( aVal * prec + 0.5 ) / prec;
-    }
-    return aVal;
-  }
-  return 0.;
+  return GetPoints( theElementId, P ) ? GetValue(P) : 0.0;
 }
 
 double MaxElementLength2D::GetBadRate( double Value, int /*nbNodes*/ ) const
@@ -496,6 +497,7 @@ SMDSAbs_ElementType MaxElementLength2D::GetType() const
   return SMDSAbs_Face;
 }
 
+//=======================================================================
 /*
   Class       : MaxElementLength3D
   Description : Functor calculating maximum length of 3D element
@@ -670,7 +672,7 @@ SMDSAbs_ElementType MaxElementLength3D::GetType() const
   return SMDSAbs_Volume;
 }
 
-
+//=======================================================================
 /*
   Class       : MinimumAngle
   Description : Functor for calculation of minimum angle
@@ -761,8 +763,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
     double maxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) );
     double half_perimeter = ( aLen[0] + aLen[1] + aLen[2] ) / 2.;
     double anArea = getArea( P( 1 ), P( 2 ), P( 3 ) );
-    if ( anArea <= Precision::Confusion() )
-      return 0.;
+    if ( anArea <= theEps  )
+      return theInf;
     return alfa * maxLen * half_perimeter / anArea;
   }
   else if ( nbNodes == 6 ) { // quadratic triangles
@@ -781,8 +783,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
     double maxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) );
     double half_perimeter = ( aLen[0] + aLen[1] + aLen[2] ) / 2.;
     double anArea = getArea( P(1), P(3), P(5) );
-    if ( anArea <= Precision::Confusion() )
-      return 0.;
+    if ( anArea <= theEps )
+      return theInf;
     return alfa * maxLen * half_perimeter / anArea;
   }
   else if( nbNodes == 4 ) { // quadrangle
@@ -825,8 +827,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
     double C2 = Min( anArea[ 0 ],
                   Min( anArea[ 1 ],
                     Min( anArea[ 2 ], anArea[ 3 ] ) ) );
-    if ( C2 <= Precision::Confusion() )
-      return 0.;
+    if ( C2 <= theEps )
+      return theInf;
     return alpha * L * C1 / C2;
   }
   else if( nbNodes == 8 || nbNodes == 9 ) { // nbNodes==8 - quadratic quadrangle
@@ -869,8 +871,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
     double C2 = Min( anArea[ 0 ],
                   Min( anArea[ 1 ],
                     Min( anArea[ 2 ], anArea[ 3 ] ) ) );
-    if ( C2 <= Precision::Confusion() )
-      return 0.;
+    if ( C2 <= theEps )
+      return theInf;
     return alpha * L * C1 / C2;
   }
   return 0;
@@ -1288,8 +1290,8 @@ double Warping::ComputeA( const gp_XYZ& thePnt1,
   double aLen1 = gp_Pnt( thePnt1 ).Distance( gp_Pnt( thePnt2 ) );
   double aLen2 = gp_Pnt( thePnt2 ).Distance( gp_Pnt( thePnt3 ) );
   double L = Min( aLen1, aLen2 ) * 0.5;
-  if ( L < Precision::Confusion())
-    return 0.;
+  if ( L < theEps )
+    return theInf;
 
   gp_XYZ GI = ( thePnt2 + thePnt1 ) / 2. - theG;
   gp_XYZ GJ = ( thePnt3 + thePnt2 ) / 2. - theG;
@@ -1334,8 +1336,8 @@ double Taper::GetValue( const TSequenceOfXYZ& P )
   double J4 = getArea( P( 3 ), P( 4 ), P( 1 ) ) / 2.;
 
   double JA = 0.25 * ( J1 + J2 + J3 + J4 );
-  if ( JA <= Precision::Confusion() )
-    return 0.;
+  if ( JA <= theEps )
+    return theInf;
 
   double T1 = fabs( ( J1 - JA ) / JA );
   double T2 = fabs( ( J2 - JA ) / JA );
@@ -1401,8 +1403,8 @@ double Skew::GetValue( const TSequenceOfXYZ& P )
       ? 0. : fabs( PI2 - v1.Angle( v2 ) );
 
     //BUG SWP12743
-    if ( A < Precision::Angular() )
-      return 0.;
+    if ( A < theEps )
+      return theInf;
 
     return A * 180. / M_PI;
   }
@@ -2645,43 +2647,7 @@ bool ElemGeomType::IsSatisfy( long theId )
   const SMDSAbs_ElementType anElemType = anElem->GetType();
   if ( myType != SMDSAbs_All && anElemType != myType )
     return false;
-  const int aNbNode = anElem->NbNodes();
-  bool isOk = false;
-  switch( anElemType )
-  {
-  case SMDSAbs_Node:
-    isOk = (myGeomType == SMDSGeom_POINT);
-    break;
-
-  case SMDSAbs_Edge:
-    isOk = (myGeomType == SMDSGeom_EDGE);
-    break;
-
-  case SMDSAbs_Face:
-    if ( myGeomType == SMDSGeom_TRIANGLE )
-      isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 6 : aNbNode == 3));
-    else if ( myGeomType == SMDSGeom_QUADRANGLE )
-      isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? ( aNbNode == 8 || aNbNode == 9 ) : aNbNode == 4));
-    else if ( myGeomType == SMDSGeom_POLYGON )
-      isOk = anElem->IsPoly();
-    break;
-
-  case SMDSAbs_Volume:
-    if ( myGeomType == SMDSGeom_TETRA )
-      isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 10 : aNbNode == 4));
-    else if ( myGeomType == SMDSGeom_PYRAMID )
-      isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 13 : aNbNode == 5));
-    else if ( myGeomType == SMDSGeom_PENTA )
-      isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 15 : aNbNode == 6));
-    else if ( myGeomType == SMDSGeom_HEXA )
-      isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? ( aNbNode == 20 || aNbNode == 27 ): aNbNode == 8));
-    else if ( myGeomType == SMDSGeom_HEXAGONAL_PRISM )
-      isOk = (anElem->GetEntityType() == SMDSEntity_Hexagonal_Prism );
-     else if ( myGeomType == SMDSGeom_POLYHEDRA )
-      isOk = anElem->IsPoly();
-    break;
-    default: break;
-  }
+  bool isOk = ( anElem->GetGeomType() == myGeomType );
   return isOk;
 }
 
@@ -3565,7 +3531,6 @@ void ManifoldPart::getFacesByLink( const ManifoldPart::Link& theLink,
 
 ElementsOnSurface::ElementsOnSurface()
 {
-  myMesh = 0;
   myIds.Clear();
   myType = SMDSAbs_All;
   mySurf.Nullify();
@@ -3575,15 +3540,13 @@ ElementsOnSurface::ElementsOnSurface()
 
 ElementsOnSurface::~ElementsOnSurface()
 {
-  myMesh = 0;
 }
 
 void ElementsOnSurface::SetMesh( const SMDS_Mesh* theMesh )
 {
-  if ( myMesh == theMesh )
-    return;
-  myMesh = theMesh;
-  process();
+  myMeshModifTracer.SetMesh( theMesh );
+  if ( myMeshModifTracer.IsMeshModified())
+    process();
 }
 
 bool ElementsOnSurface::IsSatisfy( long theElementId )
@@ -3638,32 +3601,14 @@ void ElementsOnSurface::process()
   if ( mySurf.IsNull() )
     return;
 
-  if ( myMesh == 0 )
+  if ( !myMeshModifTracer.GetMesh() )
     return;
 
-  if ( myType == SMDSAbs_Face || myType == SMDSAbs_All )
-  {
-    myIds.ReSize( myMesh->NbFaces() );
-    SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
-    for(; anIter->more(); )
-      process( anIter->next() );
-  }
-
-  if ( myType == SMDSAbs_Edge || myType == SMDSAbs_All )
-  {
-    myIds.ReSize( myIds.Extent() + myMesh->NbEdges() );
-    SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator();
-    for(; anIter->more(); )
-      process( anIter->next() );
-  }
+  myIds.ReSize( myMeshModifTracer.GetMesh()->GetMeshInfo().NbElements( myType ));
 
-  if ( myType == SMDSAbs_Node )
-  {
-    myIds.ReSize( myMesh->NbNodes() );
-    SMDS_NodeIteratorPtr anIter = myMesh->nodesIterator();
-    for(; anIter->more(); )
-      process( anIter->next() );
-  }
+  SMDS_ElemIteratorPtr anIter = myMeshModifTracer.GetMesh()->elementsIterator( myType );
+  for(; anIter->more(); )
+    process( anIter->next() );
 }
 
 void ElementsOnSurface::process( const SMDS_MeshElement* theElemPtr )
@@ -3782,26 +3727,7 @@ void ElementsOnShape::SetShape (const TopoDS_Shape&       theShape,
   
   if ( !myMesh ) return;
 
-  switch (myType)
-  {
-  case SMDSAbs_All:
-    myIds.ReSize(myMesh->NbEdges() + myMesh->NbFaces() + myMesh->NbVolumes());
-    break;
-  case SMDSAbs_Node:
-    myIds.ReSize(myMesh->NbNodes());
-    break;
-  case SMDSAbs_Edge:
-    myIds.ReSize(myMesh->NbEdges());
-    break;
-  case SMDSAbs_Face:
-    myIds.ReSize(myMesh->NbFaces());
-    break;
-  case SMDSAbs_Volume:
-    myIds.ReSize(myMesh->NbVolumes());
-    break;
-  default:
-    break;
-  }
+  myIds.ReSize( myMeshModifTracer.GetMesh()->GetMeshInfo().NbElements( myType ));
 
   myShapesMap.Clear();
   addShape(myShape);
index 0609c99..587f5b6 100644 (file)
@@ -162,6 +162,7 @@ namespace SMESH{
     class SMESHCONTROLS_EXPORT MaxElementLength2D: public virtual NumericalFunctor{
     public:
       virtual double GetValue( long theElementId );
+      virtual double GetValue( const TSequenceOfXYZ& P );
       virtual double GetBadRate( double Value, int nbNodes ) const;
       virtual SMDSAbs_ElementType GetType() const;
     };
@@ -783,7 +784,7 @@ namespace SMESH{
       bool    isOnSurface( const SMDS_MeshNode* theNode );
 
     private:
-      const SMDS_Mesh*      myMesh;
+      TMeshModifTracer      myMeshModifTracer;
       TColStd_MapOfInteger  myIds;
       SMDSAbs_ElementType   myType;
       //Handle(Geom_Surface)  mySurf;
diff --git a/src/DriverGMF/DriverGMF.cxx b/src/DriverGMF/DriverGMF.cxx
new file mode 100644 (file)
index 0000000..17ebb5e
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  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      : DriverGMF.hxx
+// Created   : Thu Nov 15 16:45:58 2012
+// Author    : Edward AGAPOV (eap)
+
+#include "DriverGMF.hxx"
+
+#include <boost/filesystem.hpp>
+
+extern "C"
+{
+#include "libmesh5.h"
+}
+
+namespace DriverGMF
+{
+
+  //================================================================================
+  /*!
+   * \brief Closes GMF mesh at destruction
+   */
+  //================================================================================
+
+  MeshCloser::~MeshCloser()
+  {
+    if ( _gmfMeshID )
+      GmfCloseMesh( _gmfMeshID );
+  }
+
+  //================================================================================
+  /*!
+   * \brief Checks GMF file extension
+   */
+  //================================================================================
+
+  bool isExtensionCorrect( const std::string& fileName )
+  {
+    std::string ext  = boost::filesystem::extension(fileName);
+    switch ( ext.size() ) {
+    case 5: return ( ext == ".mesh" || ext == ".solb" );
+    case 6: return ( ext == ".meshb" );
+    case 4: return ( ext == ".sol" );
+    }
+    return false;
+  }
+}
diff --git a/src/DriverGMF/DriverGMF.hxx b/src/DriverGMF/DriverGMF.hxx
new file mode 100644 (file)
index 0000000..52d560f
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  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      : DriverGMF.hxx
+// Created   : Thu Nov 15 16:45:58 2012
+// Author    : Edward AGAPOV (eap)
+
+#ifndef __DriverGMF_HXX__
+#define __DriverGMF_HXX__
+
+#include <string>
+
+namespace DriverGMF
+{
+  /*!
+   * \brief An object closing GMF mesh at destruction
+   */
+  struct MeshCloser
+  {
+    int _gmfMeshID;
+    MeshCloser( const int gmfMeshID ): _gmfMeshID(gmfMeshID) {}
+    ~MeshCloser();
+  };
+
+  bool isExtensionCorrect( const std::string& fileName );
+}
+
+#endif
index 332519b..9cf599f 100644 (file)
 // Author    : Edward AGAPOV (eap)
 
 #include "DriverGMF_Read.hxx"
-#include "DriverGMF_Write.hxx"
+#include "DriverGMF.hxx"
 
 #include "SMESHDS_Group.hxx"
 #include "SMESHDS_Mesh.hxx"
 #include "SMESH_Comment.hxx"
 
+#include <Basics_Utils.hxx>
+
 extern "C"
 {
 #include "libmesh5.h"
@@ -38,15 +40,9 @@ extern "C"
 #include <stdarg.h>
 
 // --------------------------------------------------------------------------------
-// Closing GMF mesh at destruction
-DriverGMF_MeshCloser::~DriverGMF_MeshCloser()
-{
-  if ( _gmfMeshID )
-    GmfCloseMesh( _gmfMeshID );
-}
-// --------------------------------------------------------------------------------
 DriverGMF_Read::DriverGMF_Read():
-  Driver_SMESHDS_Mesh()
+  Driver_SMESHDS_Mesh(),
+  _makeRequiredGroups( true )
 {
 }
 // --------------------------------------------------------------------------------
@@ -62,6 +58,8 @@ DriverGMF_Read::~DriverGMF_Read()
 
 Driver_Mesh::Status DriverGMF_Read::Perform()
 {
+  Kernel_Utils::Localizer loc;
+
   Status status = DRS_OK;
 
   int dim, version;
@@ -69,9 +67,13 @@ Driver_Mesh::Status DriverGMF_Read::Perform()
   // open the file
   int meshID = GmfOpenMesh( myFile.c_str(), GmfRead, &version, &dim );
   if ( !meshID )
-    return addMessage( SMESH_Comment("Can't open for reading ") << myFile, /*fatal=*/true );
-
-  DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
+  {
+    if ( DriverGMF::isExtensionCorrect( myFile ))
+      return addMessage( SMESH_Comment("Can't open for reading ") << myFile, /*fatal=*/true );
+    else
+      return addMessage( SMESH_Comment("Not '.mesh' or '.meshb' extension of file ") << myFile, /*fatal=*/true );
+  }
+  DriverGMF::MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
 
   // Read nodes
 
@@ -277,40 +279,43 @@ Driver_Mesh::Status DriverGMF_Read::Perform()
 
   // Read required entities into groups
 
-  // get ids of existing groups
-  std::set< int > groupIDs;
-  const std::set<SMESHDS_GroupBase*>& groups = myMesh->GetGroups();
-  std::set<SMESHDS_GroupBase*>::const_iterator grIter = groups.begin();
-  for ( ; grIter != groups.end(); ++grIter )
-    groupIDs.insert( (*grIter)->GetID() );
-  if ( groupIDs.empty() ) groupIDs.insert( 0 );
-
-  const int kes[4][3] = { { GmfRequiredVertices,      SMDSAbs_Node, nodeIDShift },
-                          { GmfRequiredEdges,         SMDSAbs_Edge, edgeIDShift },
-                          { GmfRequiredTriangles,     SMDSAbs_Face, triaIDShift },
-                          { GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift }};
-  const char* names[4] = { "_required_Vertices"      ,
-                           "_required_Edges"         ,
-                           "_required_Triangles"     ,
-                           "_required_Quadrilaterals" };
-  for ( int i = 0; i < 4; ++i )
+  if ( _makeRequiredGroups )
   {
-    int                 gmfKwd = kes[i][0];
-    SMDSAbs_ElementType entity = (SMDSAbs_ElementType) kes[i][1];
-    int                 shift  = kes[i][2];
-    if ( int nb = GmfStatKwd(meshID, gmfKwd))
-    {
-      const int newID = *groupIDs.rbegin() + 1;
-      groupIDs.insert( newID );
-      SMESHDS_Group* group = new SMESHDS_Group( newID, myMesh, entity );
-      group->SetStoreName( names[i] );
-      myMesh->AddGroup( group );
+    // get ids of existing groups
+    std::set< int > groupIDs;
+    const std::set<SMESHDS_GroupBase*>& groups = myMesh->GetGroups();
+    std::set<SMESHDS_GroupBase*>::const_iterator grIter = groups.begin();
+    for ( ; grIter != groups.end(); ++grIter )
+      groupIDs.insert( (*grIter)->GetID() );
+    if ( groupIDs.empty() ) groupIDs.insert( 0 );
 
-      GmfGotoKwd(meshID, gmfKwd);
-      for ( int i = 0; i < nb; ++i )
+    const int kes[4][3] = { { GmfRequiredVertices,      SMDSAbs_Node, nodeIDShift },
+                            { GmfRequiredEdges,         SMDSAbs_Edge, edgeIDShift },
+                            { GmfRequiredTriangles,     SMDSAbs_Face, triaIDShift },
+                            { GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift }};
+    const char* names[4] = { "_required_Vertices"      ,
+                             "_required_Edges"         ,
+                             "_required_Triangles"     ,
+                             "_required_Quadrilaterals" };
+    for ( int i = 0; i < 4; ++i )
+    {
+      int                 gmfKwd = kes[i][0];
+      SMDSAbs_ElementType entity = (SMDSAbs_ElementType) kes[i][1];
+      int                 shift  = kes[i][2];
+      if ( int nb = GmfStatKwd(meshID, gmfKwd))
       {
-        GmfGetLin(meshID, gmfKwd, &iN[0] );
-        group->Add( shift + iN[0] );
+        const int newID = *groupIDs.rbegin() + 1;
+        groupIDs.insert( newID );
+        SMESHDS_Group* group = new SMESHDS_Group( newID, myMesh, entity );
+        group->SetStoreName( names[i] );
+        myMesh->AddGroup( group );
+
+        GmfGotoKwd(meshID, gmfKwd);
+        for ( int i = 0; i < nb; ++i )
+        {
+          GmfGetLin(meshID, gmfKwd, &iN[0] );
+          group->Add( shift + iN[0] );
+        }
       }
     }
   }
index a003804..3622693 100644 (file)
@@ -45,12 +45,19 @@ public:
   DriverGMF_Read();
   ~DriverGMF_Read();
 
+  void SetMakeRequiredGroups( bool theMakeRequiredGroups )
+  {
+    _makeRequiredGroups = theMakeRequiredGroups;
+  }
+
   virtual Status Perform();
 
  private:
 
   Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...);
 
+  bool _makeRequiredGroups;
+
 };
 
 
index cdddd62..926f7f4 100644 (file)
 // Author    : Edward AGAPOV (eap)
 
 #include "DriverGMF_Write.hxx"
+#include "DriverGMF.hxx"
 
 #include "SMESHDS_GroupBase.hxx"
 #include "SMESHDS_Mesh.hxx"
 #include "SMESH_Comment.hxx"
 
+#include <Basics_Utils.hxx>
+
 extern "C"
 {
 #include "libmesh5.h"
@@ -57,7 +60,7 @@ extern "C"
 
 
 DriverGMF_Write::DriverGMF_Write():
-  Driver_SMESHDS_Mesh()
+  Driver_SMESHDS_Mesh(), _exportRequiredGroups( true )
 {
 }
 DriverGMF_Write::~DriverGMF_Write()
@@ -66,13 +69,20 @@ DriverGMF_Write::~DriverGMF_Write()
 
 Driver_Mesh::Status DriverGMF_Write::Perform()
 {
-  const int dim = 3, version = 3;
+  Kernel_Utils::Localizer loc;
+
+  const int dim = 3, version = sizeof(long) == 4 ? 2 : 3;
 
   int meshID = GmfOpenMesh( myFile.c_str(), GmfWrite, version, dim );
   if ( !meshID )
-    return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true );
+  {
+    if ( DriverGMF::isExtensionCorrect( myFile ))
+      return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true );
+    else
+      return addMessage( SMESH_Comment("Not '.mesh' or '.meshb' extension of file ") << myFile, /*fatal=*/true );
+  }
 
-  DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
+  DriverGMF::MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
 
   // nodes
   std::map< const SMDS_MeshNode* , int > node2IdMap;
@@ -233,85 +243,88 @@ Driver_Mesh::Status DriverGMF_Write::Perform()
     END_ELEM_WRITE( prism );
 
 
-  // required entities
-  SMESH_Comment badGroups;
-  const std::set<SMESHDS_GroupBase*>&      groupSet = myMesh->GetGroups();
-  std::set<SMESHDS_GroupBase*>::const_iterator grIt = groupSet.begin();
-  for ( ; grIt != groupSet.end(); ++grIt )
+  if ( _exportRequiredGroups )
   {
-    const SMESHDS_GroupBase* group = *grIt;
-    std::string          groupName = group->GetStoreName();
-    std::string::size_type     pos = groupName.find( "_required_" );
-    if ( pos == std::string::npos ) continue;
-
-    int                    gmfKwd;
-    SMDSAbs_EntityType smdsEntity;
-    std::string entity = groupName.substr( pos + strlen("_required_"));
-    if      ( entity == "Vertices" ) {
-      gmfKwd   = GmfRequiredVertices;
-      smdsEntity = SMDSEntity_Node;
-    }
-    else if ( entity == "Edges" ) {
-      gmfKwd   = GmfRequiredEdges;
-      smdsEntity = SMDSEntity_Edge;
-    }
-    else if ( entity == "Triangles" ) {
-      gmfKwd   = GmfRequiredTriangles;
-      smdsEntity = SMDSEntity_Triangle;
-    }
-    else if ( entity == "Quadrilaterals" ) {
-      gmfKwd   = GmfRequiredQuadrilaterals;
-      smdsEntity = SMDSEntity_Quadrangle;
-    }
-    else {
-      addMessage( SMESH_Comment("Invalig gmf entity name: ") << entity, /*fatal=*/false );
-      continue;
-    }
-
-    // check elem type in the group
-    int nbOkElems = 0;
-    SMDS_ElemIteratorPtr elemIt = group->GetElements();
-    while ( elemIt->more() )
-      nbOkElems += ( elemIt->next()->GetEntityType() == smdsEntity );
-
-    if ( nbOkElems != group->Extent() && nbOkElems == 0 )
+    // required entities
+    SMESH_Comment badGroups;
+    const std::set<SMESHDS_GroupBase*>&      groupSet = myMesh->GetGroups();
+    std::set<SMESHDS_GroupBase*>::const_iterator grIt = groupSet.begin();
+    for ( ; grIt != groupSet.end(); ++grIt )
     {
-      badGroups << " " << groupName;
-      continue;
-    }
-
-    // choose a TElem2IDMap
-    TElem2IDMap* elem2IDMap = 0;
-    if ( smdsEntity == SMDSEntity_Quadrangle && nbOkElems != myMesh->NbFaces() )
-      elem2IDMap = & quad2IDMap;
-    else if ( smdsEntity == SMDSEntity_Triangle && nbOkElems != myMesh->NbFaces() )
-      elem2IDMap = & tria2IDMap;
-    else if ( smdsEntity == SMDSEntity_Edge && nbOkElems != myMesh->NbEdges() )
-      elem2IDMap = & edge2IDMap;
-
-    // write the group
-    GmfSetKwd( meshID, gmfKwd, nbOkElems );
-    elemIt = group->GetElements();
-    if ( elem2IDMap )
-      for ( ; elemIt->more(); )
-      {
-        const SMDS_MeshElement* elem = elemIt->next();
-        if ( elem->GetEntityType() == smdsEntity )
-          GmfSetLin( meshID, gmfKwd, (*elem2IDMap)[ elem ] );
+      const SMESHDS_GroupBase* group = *grIt;
+      std::string          groupName = group->GetStoreName();
+      std::string::size_type     pos = groupName.find( "_required_" );
+      if ( pos == std::string::npos ) continue;
+
+      int                    gmfKwd;
+      SMDSAbs_EntityType smdsEntity;
+      std::string entity = groupName.substr( pos + strlen("_required_"));
+      if      ( entity == "Vertices" ) {
+        gmfKwd   = GmfRequiredVertices;
+        smdsEntity = SMDSEntity_Node;
       }
-    else
-      for ( int gmfID = 1; elemIt->more(); ++gmfID)
+      else if ( entity == "Edges" ) {
+        gmfKwd   = GmfRequiredEdges;
+        smdsEntity = SMDSEntity_Edge;
+      }
+      else if ( entity == "Triangles" ) {
+        gmfKwd   = GmfRequiredTriangles;
+        smdsEntity = SMDSEntity_Triangle;
+      }
+      else if ( entity == "Quadrilaterals" ) {
+        gmfKwd   = GmfRequiredQuadrilaterals;
+        smdsEntity = SMDSEntity_Quadrangle;
+      }
+      else {
+        addMessage( SMESH_Comment("Invalig gmf entity name: ") << entity, /*fatal=*/false );
+        continue;
+      }
+
+      // check elem type in the group
+      int nbOkElems = 0;
+      SMDS_ElemIteratorPtr elemIt = group->GetElements();
+      while ( elemIt->more() )
+        nbOkElems += ( elemIt->next()->GetEntityType() == smdsEntity );
+
+      if ( nbOkElems != group->Extent() && nbOkElems == 0 )
       {
-        const SMDS_MeshElement* elem = elemIt->next();
-        if ( elem->GetEntityType() == smdsEntity )
-          GmfSetLin( meshID, gmfKwd, gmfID );
+        badGroups << " " << groupName;
+        continue;
       }
 
-  } // loop on groups
+      // choose a TElem2IDMap
+      TElem2IDMap* elem2IDMap = 0;
+      if ( smdsEntity == SMDSEntity_Quadrangle && nbOkElems != myMesh->NbFaces() )
+        elem2IDMap = & quad2IDMap;
+      else if ( smdsEntity == SMDSEntity_Triangle && nbOkElems != myMesh->NbFaces() )
+        elem2IDMap = & tria2IDMap;
+      else if ( smdsEntity == SMDSEntity_Edge && nbOkElems != myMesh->NbEdges() )
+        elem2IDMap = & edge2IDMap;
+
+      // write the group
+      GmfSetKwd( meshID, gmfKwd, nbOkElems );
+      elemIt = group->GetElements();
+      if ( elem2IDMap )
+        for ( ; elemIt->more(); )
+        {
+          const SMDS_MeshElement* elem = elemIt->next();
+          if ( elem->GetEntityType() == smdsEntity )
+            GmfSetLin( meshID, gmfKwd, (*elem2IDMap)[ elem ] );
+        }
+      else
+        for ( int gmfID = 1; elemIt->more(); ++gmfID)
+        {
+          const SMDS_MeshElement* elem = elemIt->next();
+          if ( elem->GetEntityType() == smdsEntity )
+            GmfSetLin( meshID, gmfKwd, gmfID );
+        }
 
-  if ( !badGroups.empty() )
-    addMessage( SMESH_Comment("Groups of elements of inappropriate geometry:")
-                << badGroups, /*fatal=*/false );
+    } // loop on groups
+
+    if ( !badGroups.empty() )
+      addMessage( SMESH_Comment("Groups of elements of inappropriate geometry:")
+                  << badGroups, /*fatal=*/false );
+  }
 
   return DRS_OK;
 }
index fd0918d..0e8ee4f 100644 (file)
@@ -42,18 +42,16 @@ public:
   DriverGMF_Write();
   ~DriverGMF_Write();
 
+  void SetExportRequiredGroups( bool toExport )
+  {
+    _exportRequiredGroups = toExport;
+  }
+
   virtual Status Perform();
-};
 
-/*!
- * \brief An object closing GMF mesh at destruction
- */
-struct DriverGMF_MeshCloser
-{
-  int _gmfMeshID;
-  DriverGMF_MeshCloser( const int gmfMeshID ): _gmfMeshID(gmfMeshID) {}
-  ~DriverGMF_MeshCloser();
-};
+ private:
 
+  bool _exportRequiredGroups;
+};
 
 #endif
index 895c83a..d2aa333 100644 (file)
@@ -23,6 +23,7 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am
 salomeinclude_HEADERS = \
        DriverGMF_Read.hxx \
        DriverGMF_Write.hxx \
+       DriverGMF.hxx \
        SMESH_DriverGMF.hxx \
        libmesh5.h
 
@@ -31,20 +32,22 @@ lib_LTLIBRARIES = libMeshDriverGMF.la
 dist_libMeshDriverGMF_la_SOURCES = \
        DriverGMF_Read.cxx \
        DriverGMF_Write.cxx \
+       DriverGMF.cxx \
        libmesh5.c
 
 # additionnal information to compil and link file
 libMeshDriverGMF_la_CPPFLAGS = \
        $(KERNEL_CXXFLAGS) \
        $(CAS_CPPFLAGS) \
-        $(VTK_INCLUDES) \
-       $(BOOST_CPPFLAGS) \
+       $(VTK_INCLUDES) \
+       $(BOOST_CPPFLAGS) -DBOOST_SYSTEM_NO_DEPRECATED \
        -I$(srcdir)/../Driver \
        -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMDS \
        -I$(srcdir)/../SMESHDS
 
 libMeshDriverGMF_la_LDFLAGS  = \
-       $(BOOST_LIBS) \
+       $(BOOST_LIBS) -lboost_filesystem \
        ../Driver/libMeshDriver.la \
-       ../SMESHUtils/libSMESHUtils.la
+       ../SMESHUtils/libSMESHUtils.la \
+       $(KERNEL_LDFLAGS) -lSALOMEBasics
index 9d1bf4a..7ce9474 100644 (file)
@@ -50,7 +50,9 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh():
   myDoGroupOfNodes (false),
   myDoGroupOfEdges (false),
   myDoGroupOfFaces (false),
-  myDoGroupOfVolumes (false)
+  myDoGroupOfVolumes (false),
+  myDoGroupOf0DElems(false),
+  myDoGroupOfBalls(false)
 {}
 
 void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, 
index 2687363..e5d260f 100644 (file)
@@ -22,6 +22,8 @@
 
 #include <stdio.h>
 #include <gp_Pnt.hxx>
+#include <Basics_Utils.hxx>
+
 //=======================================================================
 //function : HashCode
 //purpose  : 
@@ -104,6 +106,8 @@ void DriverSTL_R_SMDS_Mesh::SetIsCreateFaces( const bool theIsCreate )
 
 Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::Perform()
 {
+  Kernel_Utils::Localizer loc;
+
   Status aResult = DRS_OK;
 
   TCollection_AsciiString aFileName( (char *)myFile.c_str() );
index e4e2700..cf893a3 100644 (file)
 #include "SMESH_TypeDefs.hxx"
 
 #include <OSD_File.hxx>
-//#include <OSD_FromWhere.hxx>
 #include <OSD_Path.hxx>
 #include <OSD_Protection.hxx>
-//#include <OSD_SingleProtection.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <gp_XYZ.hxx>
+#include <Basics_Utils.hxx>
 
 #include "utilities.h"
 
@@ -59,6 +58,8 @@ void DriverSTL_W_SMDS_Mesh::SetIsAscii( const bool theIsAscii )
 
 Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::Perform()
 {
+  Kernel_Utils::Localizer loc;
+
   Status aResult = DRS_OK;
 
   if ( !myMesh ) {
index 4265386..709da5f 100644 (file)
@@ -60,6 +60,7 @@ libMeshDriverSTL_la_CPPFLAGS = \
 libMeshDriverSTL_la_LDFLAGS  = \
        ../Driver/libMeshDriver.la \
        ../SMDS/libSMDS.la \
+       $(KERNEL_LDFLAGS) -lSALOMEBasics \
        $(CAS_LDPATH) -lTKernel -lTKSTL -lTKTopAlgo -lTKMesh
 
 STL_Test_CPPFLAGS = \
index b5e145c..9fecefb 100644 (file)
@@ -77,7 +77,7 @@ bool SMESH_PreviewActorsCollection::Init( const TopoDS_Shape& theShape,
   myMapOfShapes.Clear();
   myIndices.clear();
   myCurrentChunk = 0;
-  myChunkSize = mgr->integerValue( "SMESH", "preview_actor_chunk_size", 100 );
+  myChunkSize = qMax(1, mgr->integerValue( "SMESH", "preview_actor_chunk_size", 100 ) );
 
   if ( theShape.IsNull() )
     return false;
index 8df5206..2bcf1a5 100644 (file)
@@ -22,8 +22,8 @@
 // Author    : Edward AGAPOV (eap)
 // Executable to find out a lower RAM limit (MB), i.e. at what size of freeRAM
 // reported by sysinfo, no more memory can be allocated.
-// This is not done inside a function of SALOME because allocated memory is not returned
-// to the system. (PAL16631)
+// This is not done inside a function of SALOME because allocated memory is not always
+// returned to the system. (PAL16631)
 //
 #ifndef WIN32
 #include <sys/sysinfo.h>
index c18ace1..95013c9 100644 (file)
@@ -155,7 +155,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
       // check for preview dimension limitations
       if ( aShapesId && GetShapeDim( aShType ) > (int)aDim )
       {
-        // clear compute state to not show previous compute errors
+        // clear compute state not to show previous compute errors
         //  if preview invoked less dimension less than previous
         smToCompute->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
         continue;
@@ -355,23 +355,8 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
   MEMOSTAT;
 
   SMESHDS_Mesh *myMesh = aMesh.GetMeshDS();
-  myMesh->adjustStructure();
   MESSAGE("*** compactMesh after compute");
   myMesh->compactMesh();
-  //myMesh->adjustStructure();
-  list<int> listind = myMesh->SubMeshIndices();
-  list<int>::iterator it = listind.begin();
-  int total = 0;
-  for(; it != listind.end(); ++it)
-    {
-      ::SMESHDS_SubMesh *subMesh = myMesh->MeshElements(*it);
-      total +=  subMesh->getSize();
-    }
-  MESSAGE("total elements and nodes in submesh sets:" << total);
-  MESSAGE("Number of node objects " << SMDS_MeshNode::nbNodes);
-  MESSAGE("Number of cell objects " << SMDS_MeshCell::nbCells);
-  //myMesh->dumpGrid();
-  //aMesh.GetMeshDS()->Modified();
 
   // fix quadratic mesh by bending iternal links near concave boundary
   if ( aShape.IsSame( aMesh.GetShapeToMesh() ) &&
@@ -589,6 +574,8 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh&               aMesh,
 
     if ( aLocIgnoAlgo ) // algo is hidden by a local algo of upper dim
     {
+      theErrors.push_back( SMESH_Gen::TAlgoStateError() );
+      theErrors.back().Set( SMESH_Hypothesis::HYP_HIDDEN_ALGO, algo, false );
       INFOS( "Local <" << algo->GetName() << "> is hidden by local <"
             << aLocIgnoAlgo->GetName() << ">");
     }
@@ -598,9 +585,12 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh&               aMesh,
       int dim = algo->GetDim();
       int aMaxGlobIgnoDim = ( aGlobIgnoAlgo ? aGlobIgnoAlgo->GetDim() : -1 );
 
-      if ( dim < aMaxGlobIgnoDim )
+      if ( dim < aMaxGlobIgnoDim &&
+           ( isGlobal || !aGlobIgnoAlgo->SupportSubmeshes() ))
       {
         // algo is hidden by a global algo
+        theErrors.push_back( SMESH_Gen::TAlgoStateError() );
+        theErrors.back().Set( SMESH_Hypothesis::HYP_HIDDEN_ALGO, algo, true );
         INFOS( ( isGlobal ? "Global" : "Local" )
               << " <" << algo->GetName() << "> is hidden by global <"
               << aGlobIgnoAlgo->GetName() << ">");
@@ -680,7 +670,7 @@ static bool checkMissing(SMESH_Gen*                aGen,
   }
   case SMESH_subMesh::MISSING_HYP: {
     // notify if an algo missing hyp is attached to aSubMesh
-    algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() );
+    algo = aSubMesh->GetAlgo();
     ASSERT( algo );
     bool IsGlobalHypothesis = aGen->IsGlobalHypothesis( algo, aMesh );
     if (!IsGlobalHypothesis || !globalChecked[ algo->GetDim() ])
@@ -731,7 +721,7 @@ static bool checkMissing(SMESH_Gen*                aGen,
   {
     bool checkNoAlgo2 = ( algo->NeedDiscreteBoundary() );
     SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false,
-                                                                     /*complexShapeFirst=*/false);
+                                                                     /*complexShapeFirst=*/true);
     while ( itsub->more() )
     {
       // sub-meshes should not be checked further more
@@ -823,7 +813,8 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh&               theMesh,
   for (dim = 3; dim > 0; dim--)
   {
     if (aGlobAlgoArr[ dim ] &&
-        !aGlobAlgoArr[ dim ]->NeedDiscreteBoundary())
+        !aGlobAlgoArr[ dim ]->NeedDiscreteBoundary() /*&&
+        !aGlobAlgoArr[ dim ]->SupportSubmeshes()*/ )
     {
       aGlobIgnoAlgo = aGlobAlgoArr[ dim ];
       break;
@@ -880,14 +871,13 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh&               theMesh,
     if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX)
       break;
 
-    if ( aCheckedSubs.insert( smToCheck ).second ) // not yet checked
-      if (!checkMissing (this, theMesh, smToCheck, aTopAlgoDim,
-                         globalChecked, checkNoAlgo, aCheckedSubs, theErrors))
-      {
-        ret = false;
-        if (smToCheck->GetAlgoState() == SMESH_subMesh::NO_ALGO )
-          checkNoAlgo = false;
-      }
+    if (!checkMissing (this, theMesh, smToCheck, aTopAlgoDim,
+                       globalChecked, checkNoAlgo, aCheckedSubs, theErrors))
+    {
+      ret = false;
+      if (smToCheck->GetAlgoState() == SMESH_subMesh::NO_ALGO )
+        checkNoAlgo = false;
+    }
   }
 
   if ( !hasAlgo ) {
index 48f293a..fafd29b 100644 (file)
@@ -24,7 +24,6 @@
 //  File   : SMESH_Hypothesis.cxx
 //  Author : Paul RASCLE, EDF
 //  Module : SMESH
-//  $Header$
 //
 #include "SMESH_Hypothesis.hxx"
 #include "SMESH_Gen.hxx"
@@ -50,8 +49,6 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
   _type = PARAM_ALGO;
   _shapeType = 0; // to be set by algo with TopAbs_Enum
   _param_algo_dim = -1; // to be set by algo parameter
-  //_parameters = string();
-  //_lastParameters = string();
 }
 
 //=============================================================================
@@ -171,59 +168,3 @@ SMESH_Mesh* SMESH_Hypothesis::GetMeshByPersistentID(int id)
   }
   return 0;
 }
-
-//=============================================================================
-/*!
- * 
- */
-//=============================================================================
-// void SMESH_Hypothesis::SetParameters(const char *theParameters)
-// {
-//   string aNewParameters(theParameters);
-//   if(aNewParameters.size()==0 && _parameters.size()==0)
-//     aNewParameters = " ";
-//   if(_parameters.size()>0)
-//     _parameters +="|";
-//   _parameters +=aNewParameters;
-//   SetLastParameters(theParameters);
-// }
-
-// //=============================================================================
-// /*!
-//  * 
-//  */
-// //=============================================================================
-// void SMESH_Hypothesis::ClearParameters()
-// {
-//   _parameters = string();
-// }
-
-// //=============================================================================
-// /*!
-//  * 
-//  */
-// //=============================================================================
-// char* SMESH_Hypothesis::GetParameters() const
-// {
-//   return (char*)_parameters.c_str();
-// }
-
-// //=============================================================================
-// /*!
-//  * 
-//  */
-// //=============================================================================
-// char* SMESH_Hypothesis::GetLastParameters() const
-// {
-//   return (char*)_lastParameters.c_str();
-// }
-
-// //=============================================================================
-// /*!
-//  * 
-//  */
-// //=============================================================================
-// void SMESH_Hypothesis::SetLastParameters(const char* theParameters)
-// {
-//   _lastParameters = string(theParameters);
-// }
index 0b171a6..2616e0b 100644 (file)
@@ -347,16 +347,32 @@ void SMESH_Mesh::Load()
 
 void SMESH_Mesh::Clear()
 {
-  // clear mesh data
-  _myMeshDS->ClearMesh();
+  if ( HasShapeToMesh() ) // remove all nodes and elements
+  {
+    // clear mesh data
+    _myMeshDS->ClearMesh();
 
-  // update compute state of submeshes
-  if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
+    // update compute state of submeshes
+    if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
+    {
+      sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
+      sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
+      sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // for event listeners (issue 0020918)
+      sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN );
+    }
+  }
+  else // remove only nodes/elements computed by algorithms
   {
-    sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
-    sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
-    sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // for event listeners (issue 0020918)
-    sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN );
+    if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
+    {
+      SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true,
+                                                               /*complexShapeFirst=*/true);
+      while ( smIt->more() )
+      {
+        sm = smIt->next();
+        sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
+      }
+    }
   }
   _isModified = false;
 }
@@ -545,11 +561,13 @@ int SMESH_Mesh::CGNSToMesh(const char*  theFileName,
  */
 //================================================================================
 
-SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName)
+SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName,
+                                            bool        theMakeRequiredGroups)
 {
   DriverGMF_Read myReader;
   myReader.SetMesh(_myMeshDS);
   myReader.SetFile(theFileName);
+  myReader.SetMakeRequiredGroups( theMakeRequiredGroups );
   myReader.Perform();
   //theMeshName = myReader.GetMeshName();
 
@@ -1419,11 +1437,14 @@ void SMESH_Mesh::ExportCGNS(const char *        file,
 //================================================================================
 
 void SMESH_Mesh::ExportGMF(const char *        file,
-                           const SMESHDS_Mesh* meshDS)
+                           const SMESHDS_Mesh* meshDS,
+                           bool                withRequiredGroups)
 {
   DriverGMF_Write myWriter;
   myWriter.SetFile( file );
   myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS ));
+  myWriter.SetExportRequiredGroups( withRequiredGroups );
+
   myWriter.Perform();
 }
 
@@ -1999,7 +2020,9 @@ void SMESH_Mesh::fillAncestorsMap(const TopoDS_Shape& theShape)
   {
     // a geom group is added. Insert it into lists of ancestors before
     // the first ancestor more complex than group members
-    int memberType = TopoDS_Iterator( theShape ).Value().ShapeType();
+    TopoDS_Iterator subIt( theShape );
+    if ( !subIt.More() ) return;
+    int memberType = subIt.Value().ShapeType();
     for ( desType = TopAbs_VERTEX; desType >= memberType; desType-- )
       for (TopExp_Explorer des( theShape, TopAbs_ShapeEnum( desType )); des.More(); des.Next())
       {
index 5bd9b9c..2b926f5 100644 (file)
@@ -122,7 +122,8 @@ public:
 
   int CGNSToMesh(const char* theFileName, const int theMeshIndex, std::string& theMeshName);
   
-  SMESH_ComputeErrorPtr GMFToMesh(const char* theFileName);
+  SMESH_ComputeErrorPtr GMFToMesh(const char* theFileName,
+                                  bool        theMakeRequiredGroups = true );
 
   SMESH_Hypothesis::Hypothesis_Status
   AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
@@ -244,7 +245,8 @@ public:
   void ExportCGNS(const char *        file,
                   const SMESHDS_Mesh* mesh);
   void ExportGMF(const char *        file,
-                 const SMESHDS_Mesh* mesh);
+                 const SMESHDS_Mesh* mesh,
+                 bool                withRequiredGroups = true );
   void ExportSAUV(const char *file, 
                   const char* theMeshName = NULL, 
                   bool theAutoGroups = true) throw(SALOME_Exception);
index 9a821ab..ce9b88f 100644 (file)
@@ -120,6 +120,19 @@ SMESH_MeshEditor::SMESH_MeshEditor( SMESH_Mesh* theMesh )
 {
 }
 
+//================================================================================
+/*!
+ * \brief Clears myLastCreatedNodes and myLastCreatedElems
+ */
+//================================================================================
+
+void SMESH_MeshEditor::CrearLastCreated()
+{
+  myLastCreatedNodes.Clear();
+  myLastCreatedElems.Clear();
+}
+
+
 //=======================================================================
 /*!
  * \brief Add element
@@ -389,6 +402,44 @@ int SMESH_MeshEditor::Remove (const list< int >& theIDs,
   return removed;
 }
 
+//================================================================================
+/*!
+ * \brief Create 0D elements on all nodes of the given object except those
+ *        nodes on which a 0D element already exists.
+ *  \param elements - Elements on whose nodes to create 0D elements; if empty, 
+ *                    the all mesh is treated
+ *  \param all0DElems - returns all 0D elements found or created on nodes of \a elements
+ */
+//================================================================================
+
+void SMESH_MeshEditor::Create0DElementsOnAllNodes( const TIDSortedElemSet& elements,
+                                                   TIDSortedElemSet&       all0DElems )
+{
+  typedef SMDS_SetIterator<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator> TSetIterator;
+  SMDS_ElemIteratorPtr elemIt;
+  if ( elements.empty() )
+    elemIt = GetMeshDS()->elementsIterator( SMDSAbs_Node );
+  else
+    elemIt = SMDS_ElemIteratorPtr( new TSetIterator( elements.begin(), elements.end() ));
+
+  while ( elemIt->more() )
+  {
+    const SMDS_MeshElement* e = elemIt->next();
+    SMDS_ElemIteratorPtr nodeIt = e->nodesIterator();
+    while ( nodeIt->more() )
+    {
+      const SMDS_MeshNode* n = cast2Node( nodeIt->next() );
+      SMDS_ElemIteratorPtr it0D = n->GetInverseElementIterator( SMDSAbs_0DElement );
+      if ( it0D->more() )
+        all0DElems.insert( it0D->next() );
+      else {
+        myLastCreatedElems.Append( GetMeshDS()->Add0DElement( n ));
+        all0DElems.insert( myLastCreatedElems.Last() );
+      }
+    }
+  }
+}
+
 //=======================================================================
 //function : FindShape
 //purpose  : Return an index of the shape theElem is on
@@ -1065,7 +1116,7 @@ bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theElem)
  * \brief Reorient faces.
  * \param theFaces - the faces to reorient. If empty the whole mesh is meant
  * \param theDirection - desired direction of normal of \a theFace
- * \param theFace - one of \a theFaces that sould be orientated according to
+ * \param theFace - one of \a theFaces that sould be oriented according to
  *        \a theDirection and whose orientation defines orientation of other faces
  * \return number of reoriented faces.
  */
@@ -1093,7 +1144,7 @@ int SMESH_MeshEditor::Reorient2D (TIDSortedElemSet &       theFaces,
 
   // Orient other faces
 
-  set< const SMDS_MeshElement* > startFaces;
+  set< const SMDS_MeshElement* > startFaces, visitedFaces;
   TIDSortedElemSet avoidSet;
   set< SMESH_TLink > checkedLinks;
   pair< set< SMESH_TLink >::iterator, bool > linkIt_isNew;
@@ -1102,16 +1153,26 @@ int SMESH_MeshEditor::Reorient2D (TIDSortedElemSet &       theFaces,
     theFaces.erase( theFace );
   startFaces.insert( theFace );
 
+  int nodeInd1, nodeInd2;
+  const SMDS_MeshElement*           otherFace;
+  vector< const SMDS_MeshElement* > facesNearLink;
+  vector< std::pair< int, int > >   nodeIndsOfFace;
+
   set< const SMDS_MeshElement* >::iterator startFace = startFaces.begin();
-  while ( startFace != startFaces.end() )
+  while ( !startFaces.empty() )
   {
+    startFace = startFaces.begin();
     theFace = *startFace;
-    const int nbNodes = theFace->NbCornerNodes();
+    startFaces.erase( startFace );
+    if ( !visitedFaces.insert( theFace ).second )
+      continue;
 
     avoidSet.clear();
     avoidSet.insert(theFace);
 
     NLink link( theFace->GetNode( 0 ), 0 );
+
+    const int nbNodes = theFace->NbCornerNodes();
     for ( int i = 0; i < nbNodes; ++i ) // loop on links of theFace
     {
       link.second = theFace->GetNode(( i+1 ) % nbNodes );
@@ -1120,33 +1181,61 @@ int SMESH_MeshEditor::Reorient2D (TIDSortedElemSet &       theFaces,
       {
         // link has already been checked and won't be encountered more
         // if the group (theFaces) is manifold
-        checkedLinks.erase( linkIt_isNew.first );
+        //checkedLinks.erase( linkIt_isNew.first );
       }
       else
       {
-        int nodeInd1, nodeInd2;
-        const SMDS_MeshElement* otherFace = FindFaceInSet( link.first, link.second,
-                                                           theFaces, avoidSet,
-                                                           & nodeInd1, & nodeInd2);
+        facesNearLink.clear();
+        nodeIndsOfFace.clear();
+        while (( otherFace = FindFaceInSet( link.first, link.second,
+                                            theFaces, avoidSet, &nodeInd1, &nodeInd2 )))
+          if ( otherFace != theFace)
+          {
+            facesNearLink.push_back( otherFace );
+            nodeIndsOfFace.push_back( make_pair( nodeInd1, nodeInd2 ));
+            avoidSet.insert( otherFace );
+          }
+        if ( facesNearLink.size() > 1 )
+        {
+          // NON-MANIFOLD mesh shell !
+          // select a face most co-directed with theFace,
+          // other faces won't be visited this time
+          gp_XYZ NF, NOF;
+          SMESH_Algo::FaceNormal( theFace, NF, /*normalized=*/false );
+          double proj, maxProj = -1;
+          for ( size_t i = 0; i < facesNearLink.size(); ++i ) {
+            SMESH_Algo::FaceNormal( facesNearLink[i], NOF, /*normalized=*/false );
+            if (( proj = Abs( NF * NOF )) > maxProj ) {
+              maxProj = proj;
+              otherFace = facesNearLink[i];
+              nodeInd1  = nodeIndsOfFace[i].first;
+              nodeInd2  = nodeIndsOfFace[i].second;
+            }
+          }
+          // not to visit rejected faces
+          for ( size_t i = 0; i < facesNearLink.size(); ++i )
+            if ( facesNearLink[i] != otherFace && theFaces.size() > 1 )
+              visitedFaces.insert( facesNearLink[i] );
+        }
+        else if ( facesNearLink.size() == 1 )
+        {
+          otherFace = facesNearLink[0];
+          nodeInd1  = nodeIndsOfFace.back().first;
+          nodeInd2  = nodeIndsOfFace.back().second;
+        }
         if ( otherFace && otherFace != theFace)
         {
-          // link must be reversed in otherFace if orientation ot otherFace
+          // link must be reverse in otherFace if orientation ot otherFace
           // is same as that of theFace
           if ( abs(nodeInd2-nodeInd1) == 1 ? nodeInd2 > nodeInd1 : nodeInd1 > nodeInd2 )
           {
-            // cout << "Reorient " << otherFace->GetID() << " near theFace=" <<theFace->GetID()
-            //      << " \tlink( " << link.first->GetID() << " " << link.second->GetID() << endl;
             nbReori += Reorient( otherFace );
           }
           startFaces.insert( otherFace );
-          if ( theFaces.size() > 1 ) // leave 1 face to prevent finding not selected faces
-            theFaces.erase( otherFace );
         }
       }
-      std::swap( link.first, link.second );
+      std::swap( link.first, link.second ); // reverse the link
     }
-    startFaces.erase( startFace );
-    startFace = startFaces.begin();
   }
   return nbReori;
 }
@@ -1216,7 +1305,8 @@ bool SMESH_MeshEditor::QuadToTri (TIDSortedElemSet &                   theElems,
     if( !elem->IsQuadratic() ) {
 
       // split liner quadrangle
-
+      // for MaxElementLength2D functor we return minimum diagonal for splitting,
+      // because aBadRate1=2*len(diagonal 1-3); aBadRate2=2*len(diagonal 2-4)
       if ( aBadRate1 <= aBadRate2 ) {
         // tr1 + tr2 is better
         newElem1 = aMesh->AddFace( aNodes[2], aNodes[3], aNodes[0] );
@@ -1350,7 +1440,8 @@ int SMESH_MeshEditor::BestSplit (const SMDS_MeshElement*              theQuad,
     SMDS_FaceOfNodes tr3 ( aNodes[1], aNodes[2], aNodes[3] );
     SMDS_FaceOfNodes tr4 ( aNodes[3], aNodes[0], aNodes[1] );
     aBadRate2 = getBadRate( &tr3, theCrit ) + getBadRate( &tr4, theCrit );
-
+    // for MaxElementLength2D functor we return minimum diagonal for splitting,
+    // because aBadRate1=2*len(diagonal 1-3); aBadRate2=2*len(diagonal 2-4)
     if (aBadRate1 <= aBadRate2) // tr1 + tr2 is better
       return 1; // diagonal 1-3
 
@@ -3062,7 +3153,7 @@ void SMESH_MeshEditor::Smooth (TIDSortedElemSet &          theElems,
     SMDS_FaceIteratorPtr fIt = aMesh->facesIterator();
     while ( fIt->more() ) {
       const SMDS_MeshElement* face = fIt->next();
-      theElems.insert( face );
+      theElems.insert( theElems.end(), face );
     }
   }
   // get all face ids theElems are on
@@ -5082,10 +5173,16 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
     if ( BRep_Tool::Degenerated( aTrackEdge ) )
       return EXTR_BAD_PATH_SHAPE;
     TopExp::Vertices( aTrackEdge, aV1, aV2 );
-    aItN = theTrack->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes();
-    const SMDS_MeshNode* aN1 = aItN->next();
-    aItN = theTrack->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes();
-    const SMDS_MeshNode* aN2 = aItN->next();
+    const SMDS_MeshNode* aN1 = 0;
+    const SMDS_MeshNode* aN2 = 0;
+    if ( theTrack->GetSubMesh( aV1 ) && theTrack->GetSubMesh( aV1 )->GetSubMeshDS() ) {
+      aItN = theTrack->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes();
+      aN1 = aItN->next();
+    }
+    if ( theTrack->GetSubMesh( aV2 ) && theTrack->GetSubMesh( aV2 )->GetSubMeshDS() ) {
+      aItN = theTrack->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes();
+      aN2 = aItN->next();
+    }
     // starting node must be aN1 or aN2
     if ( !( aN1 == theN1 || aN2 == theN1 ) )
       return EXTR_BAD_STARTING_NODE;
@@ -5115,7 +5212,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
       }
     }
     list< list<SMESH_MeshEditor_PathPoint> > LLPPs;
-    int startNid = theN1->GetID();
+    TopoDS_Vertex aVprev;
     TColStd_MapOfInteger UsedNums;
     int NbEdges = Edges.Length();
     int i = 1;
@@ -5129,17 +5226,37 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
         SMESH_subMesh* locTrack = *itLSM;
         SMESHDS_SubMesh* locMeshDS = locTrack->GetSubMeshDS();
         TopExp::Vertices( aTrackEdge, aV1, aV2 );
-        aItN = locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS()->GetNodes();
-        const SMDS_MeshNode* aN1 = aItN->next();
-        aItN = locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS()->GetNodes();
-        const SMDS_MeshNode* aN2 = aItN->next();
-        // starting node must be aN1 or aN2
-        if ( !( aN1->GetID() == startNid || aN2->GetID() == startNid ) ) continue;
+        bool aN1isOK = false, aN2isOK = false;
+        if ( aVprev.IsNull() ) {
+          // if previous vertex is not yet defined, it means that we in the beginning of wire
+          // and we have to find initial vertex corresponding to starting node theN1
+          const SMDS_MeshNode* aN1 = 0;
+          const SMDS_MeshNode* aN2 = 0;
+
+          if ( locTrack->GetFather()->GetSubMesh(aV1) && locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS() ) {
+            aItN = locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS()->GetNodes();
+            aN1 = aItN->next();
+          }
+          if ( locTrack->GetFather()->GetSubMesh(aV2) && locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS() ) {
+            aItN = locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS()->GetNodes();
+            aN2 = aItN->next();
+          }
+          // starting node must be aN1 or aN2
+          aN1isOK = ( aN1 && aN1 == theN1 );
+          aN2isOK = ( aN2 && aN2 == theN1 );
+        }
+        else {
+          // we have specified ending vertex of the previous edge on the previous iteration
+          // and we have just to check that it corresponds to any vertex in current segment
+          aN1isOK = aVprev.IsSame( aV1 );
+          aN2isOK = aVprev.IsSame( aV2 );
+        }
+        if ( !aN1isOK && !aN2isOK ) continue;
         // 2. Collect parameters on the track edge
         aPrms.clear();
         aItN = locMeshDS->GetNodes();
         while ( aItN->more() ) {
-          const SMDS_MeshNode* pNode = aItN->next();
+          const SMDS_MeshNode*     pNode = aItN->next();
           const SMDS_EdgePosition* pEPos =
             static_cast<const SMDS_EdgePosition*>( pNode->GetPosition() );
           double aT = pEPos->GetUParameter();
@@ -5147,12 +5264,12 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
         }
         list<SMESH_MeshEditor_PathPoint> LPP;
         //Extrusion_Error err =
-        MakeEdgePathPoints(aPrms, aTrackEdge,(aN1->GetID()==startNid), LPP);
+        MakeEdgePathPoints(aPrms, aTrackEdge, aN1isOK, LPP);
         LLPPs.push_back(LPP);
         UsedNums.Add(k);
         // update startN for search following egde
-        if( aN1->GetID() == startNid ) startNid = aN2->GetID();
-        else startNid = aN1->GetID();
+        if ( aN1isOK ) aVprev = aV2;
+        else           aVprev = aV1;
         break;
       }
     }
@@ -5171,8 +5288,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
       SMESH_MeshEditor_PathPoint PP2 = currList.front();
       gp_Dir D1 = PP1.Tangent();
       gp_Dir D2 = PP2.Tangent();
-      gp_Dir Dnew( gp_Vec( (D1.X()+D2.X())/2, (D1.Y()+D2.Y())/2,
-                           (D1.Z()+D2.Z())/2 ) );
+      gp_Dir Dnew( ( D1.XYZ() + D2.XYZ() ) / 2 );
       PP1.SetTangent(Dnew);
       fullList.push_back(PP1);
       itPP++;
@@ -5891,7 +6007,7 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
   vector< TOldNewGroup* > orderedOldNewGroups; // in order of old groups
   // group names
   set< string > groupNames;
-  
+
   SMESH_Mesh::GroupIteratorPtr groupIt = GetMesh()->GetGroups();
   if ( !groupIt->more() ) return newGroupIDs;
 
@@ -6103,7 +6219,7 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher
         }
         else if ( tree->NbNodes() ) // put a tree to the treeMap
         {
-          const Bnd_B3d& box = tree->getBox();
+          const Bnd_B3d& box = *tree->getBox();
           double sqDist = thePnt.SquareDistance( 0.5 * ( box.CornerMin() + box.CornerMax() ));
           pair<TDistTreeMap::iterator,bool> it_in = treeMap.insert( make_pair( sqDist, tree ));
           if ( !it_in.second ) // not unique distance to box center
@@ -6115,7 +6231,7 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher
       TDistTreeMap::iterator sqDist_tree = treeMap.begin();
       if ( treeMap.size() > 5 ) {
         SMESH_OctreeNode* closestTree = sqDist_tree->second;
-        const Bnd_B3d& box = closestTree->getBox();
+        const Bnd_B3d& box = *closestTree->getBox();
         double limit = sqrt( sqDist_tree->first ) + sqrt ( box.SquareExtent() );
         sqLimit = limit * limit;
       }
@@ -6200,7 +6316,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
 
   protected:
     ElementBndBoxTree():_size(0) {}
-    SMESH_Octree* allocateOctreeChild() const { return new ElementBndBoxTree; }
+    SMESH_Octree* newChild() const { return new ElementBndBoxTree; }
     void          buildChildrenData();
     Bnd_B3d*      buildRootBox();
   private:
@@ -6222,7 +6338,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
   //================================================================================
 
   ElementBndBoxTree::ElementBndBoxTree(const SMDS_Mesh& mesh, SMDSAbs_ElementType elemType, SMDS_ElemIteratorPtr theElemIt, double tolerance)
-    :SMESH_Octree( new SMESH_Octree::Limit( MaxLevel, /*minSize=*/0. ))
+    :SMESH_Octree( new SMESH_TreeLimit( MaxLevel, /*minSize=*/0. ))
   {
     int nbElems = mesh.GetMeshInfo().NbElements( elemType );
     _elements.reserve( nbElems );
@@ -6273,7 +6389,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
     {
       for (int j = 0; j < 8; j++)
       {
-        if ( !_elements[i]->IsOut( myChildren[j]->getBox() ))
+        if ( !_elements[i]->IsOut( *myChildren[j]->getBox() ))
         {
           _elements[i]->_refCount++;
           ((ElementBndBoxTree*)myChildren[j])->_elements.push_back( _elements[i]);
@@ -6304,7 +6420,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
   void ElementBndBoxTree::getElementsNearPoint( const gp_Pnt&     point,
                                                 TIDSortedElemSet& foundElems)
   {
-    if ( getBox().IsOut( point.XYZ() ))
+    if ( getBox()->IsOut( point.XYZ() ))
       return;
 
     if ( isLeaf() )
@@ -6329,7 +6445,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
   void ElementBndBoxTree::getElementsNearLine( const gp_Ax1&     line,
                                                TIDSortedElemSet& foundElems)
   {
-    if ( getBox().IsOut( line ))
+    if ( getBox()->IsOut( line ))
       return;
 
     if ( isLeaf() )
@@ -6355,7 +6471,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
                                                 const double      radius,
                                                 TIDSortedElemSet& foundElems)
   {
-    if ( getBox().IsOut( center, radius ))
+    if ( getBox()->IsOut( center, radius ))
       return;
 
     if ( isLeaf() )
@@ -6657,7 +6773,7 @@ void SMESH_ElementSearcherImpl::findOuterBoundary(const SMDS_MeshElement* outerF
  * \brief Find elements of given type where the given point is IN or ON.
  *        Returns nb of found elements and elements them-selves.
  *
- * 'ALL' type means elements of any type excluding nodes, balls and 0D elements 
+ * 'ALL' type means elements of any type excluding nodes, balls and 0D elements
  */
 //=======================================================================
 
@@ -6734,13 +6850,13 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt&       point,
     }
     TIDSortedElemSet suspectElems;
     _ebbTree->getElementsNearPoint( point, suspectElems );
-    
+
     if ( suspectElems.empty() && _ebbTree->maxSize() > 0 )
     {
-      gp_Pnt boxCenter = 0.5 * ( _ebbTree->getBox().CornerMin() +
-                                 _ebbTree->getBox().CornerMax() );
+      gp_Pnt boxCenter = 0.5 * ( _ebbTree->getBox()->CornerMin() +
+                                 _ebbTree->getBox()->CornerMax() );
       double radius;
-      if ( _ebbTree->getBox().IsOut( point.XYZ() ))
+      if ( _ebbTree->getBox()->IsOut( point.XYZ() ))
         radius = point.Distance( boxCenter ) - 0.5 * _ebbTree->maxSize();
       else
         radius = _ebbTree->maxSize() / pow( 2., _ebbTree->getHeight()) / 2;
@@ -7242,7 +7358,7 @@ namespace
                       POS_ALL = POS_LEFT | POS_RIGHT | POS_VERTEX };
   struct PointPos
   {
-    PositionName _name; 
+    PositionName _name;
     int          _index; // index of vertex or segment
 
     PointPos( PositionName n, int i=-1 ): _name(n), _index(i) {}
@@ -8156,32 +8272,29 @@ private:
 //purpose  : Return list of group of elements built on the same nodes.
 //           Search among theElements or in the whole mesh if theElements is empty
 //=======================================================================
-void SMESH_MeshEditor::FindEqualElements(set<const SMDS_MeshElement*> & theElements,
-                                         TListOfListOfElementsID &      theGroupsOfElementsID)
+
+void SMESH_MeshEditor::FindEqualElements(TIDSortedElemSet &        theElements,
+                                         TListOfListOfElementsID & theGroupsOfElementsID)
 {
   myLastCreatedElems.Clear();
   myLastCreatedNodes.Clear();
 
-  typedef set<const SMDS_MeshElement*> TElemsSet;
   typedef map< SortableElement, int > TMapOfNodeSet;
   typedef list<int> TGroupOfElems;
 
-  TElemsSet elems;
   if ( theElements.empty() )
   { // get all elements in the mesh
     SMDS_ElemIteratorPtr eIt = GetMeshDS()->elementsIterator();
     while ( eIt->more() )
-      elems.insert( elems.end(), eIt->next());
+      theElements.insert( theElements.end(), eIt->next());
   }
-  else
-    elems = theElements;
 
   vector< TGroupOfElems > arrayOfGroups;
   TGroupOfElems groupOfElems;
   TMapOfNodeSet mapOfNodeSet;
 
-  TElemsSet::iterator elemIt = elems.begin();
-  for ( int i = 0, j=0; elemIt != elems.end(); ++elemIt, ++j ) {
+  TIDSortedElemSet::iterator elemIt = theElements.begin();
+  for ( int i = 0, j=0; elemIt != theElements.end(); ++elemIt, ++j ) {
     const SMDS_MeshElement* curElem = *elemIt;
     SortableElement SE(curElem);
     int ind = -1;
@@ -8254,8 +8367,8 @@ void SMESH_MeshEditor::MergeElements(TListOfListOfElementsID & theGroupsOfElemen
 
 void SMESH_MeshEditor::MergeEqualElements()
 {
-  set<const SMDS_MeshElement*> aMeshElements; /* empty input -
-                                                 to merge equal elements in the whole mesh */
+  TIDSortedElemSet aMeshElements; /* empty input ==
+                                     to merge equal elements in the whole mesh */
   TListOfListOfElementsID aGroupsOfElementsID;
   FindEqualElements(aMeshElements, aGroupsOfElementsID);
   MergeElements(aGroupsOfElementsID);
@@ -11779,8 +11892,11 @@ void SMESH_MeshEditor::CreateHoleSkin(double radius,
       groupDS = group->GetGroupDS();
       if ( !groupDS || groupDS->IsEmpty() ) continue;
       std::string grpName = group->GetName();
+      //MESSAGE("grpName=" << grpName);
       if (grpName == groupName)
         break;
+      else
+        groupDS = 0;
     }
 
   bool isNodeGroup = false;
@@ -11794,6 +11910,7 @@ void SMESH_MeshEditor::CreateHoleSkin(double radius,
 
   if (nodesCoords.size() > 0)
     isNodeCoords = true; // a list o nodes given by their coordinates
+  //MESSAGE("---" << isNodeGroup << " " << isNodeCoords);
 
   // --- define groups to build
 
index 1874360..ce52a9c 100644 (file)
@@ -116,6 +116,7 @@ public:
 
   const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
   const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
+  void                           CrearLastCreated();
 
   SMESH_ComputeErrorPtr &        GetError() { return myError; }
 
@@ -139,6 +140,12 @@ public:
   // Remove a node or an element.
   // Modify a compute state of sub-meshes which become empty
 
+  void Create0DElementsOnAllNodes( const TIDSortedElemSet& elements,
+                                   TIDSortedElemSet&       all0DElems);
+  // Create 0D elements on all nodes of the given object except those
+  // nodes on which a 0D element already exists. \a all0DElems returns
+  // all 0D elements found or created on nodes of \a elements
+
   bool InverseDiag (const SMDS_MeshElement * theTria1,
                     const SMDS_MeshElement * theTria2 );
   // Replace two neighbour triangles with ones built on the same 4 nodes
@@ -350,15 +357,6 @@ public:
                        SMESH_Mesh*        theTargetMesh=0);
   // Move or copy theElements applying theTrsf to their nodes
 
-
-  typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
-
-  void FindCoincidentNodes (TIDSortedNodeSet &   theNodes,
-                            const double         theTolerance,
-                            TListOfListOfNodes & theGroupsOfNodes);
-  // Return list of group of nodes close to each other within theTolerance.
-  // Search among theNodes or in the whole mesh if theNodes is empty.
-
   /*!
    * \brief Return SMESH_NodeSearcher. The caller is responsible for deleteing it
    */
@@ -369,18 +367,14 @@ public:
    */
   SMESH_ElementSearcher* GetElementSearcher();
   SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt );
-  /*!
-   * \brief Return true if the point is IN or ON of the element
-   */
-  static bool IsOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol );
 
-  static double GetDistance( const SMDS_MeshFace* face, const gp_Pnt& point );
+  typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
 
-  int SimplifyFace (const std::vector<const SMDS_MeshNode *> faceNodes,
-                    std::vector<const SMDS_MeshNode *>&      poly_nodes,
-                    std::vector<int>&                        quantities) const;
-  // Split face, defined by <faceNodes>, into several faces by repeating nodes.
-  // Is used by MergeNodes()
+  void FindCoincidentNodes (TIDSortedNodeSet &   theNodes,
+                            const double         theTolerance,
+                            TListOfListOfNodes & theGroupsOfNodes);
+  // Return list of group of nodes close to each other within theTolerance.
+  // Search among theNodes or in the whole mesh if theNodes is empty.
 
   void MergeNodes (TListOfListOfNodes & theNodeGroups);
   // In each group, the cdr of nodes are substituted by the first one
@@ -388,8 +382,8 @@ public:
 
   typedef std::list< std::list< int > > TListOfListOfElementsID;
 
-  void FindEqualElements(std::set<const SMDS_MeshElement*> & theElements,
-                         TListOfListOfElementsID &           theGroupsOfElementsID);
+  void FindEqualElements(TIDSortedElemSet &        theElements,
+                         TListOfListOfElementsID & theGroupsOfElementsID);
   // Return list of group of elements build on the same nodes.
   // Search among theElements or in the whole mesh if theElements is empty.
 
@@ -400,6 +394,19 @@ public:
   // Remove all but one of elements built on the same nodes.
   // Return nb of successfully merged groups.
 
+  /*!
+   * \brief Return true if the point is IN or ON of the element
+   */
+  static bool IsOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol );
+
+  static double GetDistance( const SMDS_MeshFace* face, const gp_Pnt& point );
+
+  int SimplifyFace (const std::vector<const SMDS_MeshNode *> faceNodes,
+                    std::vector<const SMDS_MeshNode *>&      poly_nodes,
+                    std::vector<int>&                        quantities) const;
+  // Split face, defined by <faceNodes>, into several faces by repeating nodes.
+  // Is used by MergeNodes()
+
   static bool CheckFreeBorderNodes(const SMDS_MeshNode* theNode1,
                                    const SMDS_MeshNode* theNode2,
                                    const SMDS_MeshNode* theNode3 = 0);
index ffca47e..ab1cc9c 100644 (file)
@@ -283,6 +283,18 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh)
             myDegenShapeIds.insert( meshDS->ShapeToIndex( v.Current() ));
         }
       }
+      if ( !myDegenShapeIds.empty() && !myParIndex ) {
+        if ( surface->IsUPeriodic() || surface->IsUClosed() ) {
+          myParIndex |= U_periodic;
+          myPar1[0] = surf.FirstUParameter();
+          myPar2[0] = surf.LastUParameter();
+        }
+        else if ( surface->IsVPeriodic() || surface->IsVClosed() ) {
+          myParIndex |= V_periodic;
+          myPar1[1] = surf.FirstVParameter();
+          myPar2[1] = surf.LastVParameter();
+        }
+      }
     }
   }
 }
@@ -329,7 +341,7 @@ bool SMESH_MesherHelper::IsMedium(const SMDS_MeshNode*      node,
 TopoDS_Shape SMESH_MesherHelper::GetSubShapeByNode(const SMDS_MeshNode* node,
                                                    const SMESHDS_Mesh*  meshDS)
 {
-  int shapeID = node->getshapeId();
+  int shapeID = node ? node->getshapeId() : 0;
   if ( 0 < shapeID && shapeID <= meshDS->MaxShapeIndex() )
     return meshDS->IndexToShape( shapeID );
   else
@@ -3428,7 +3440,7 @@ namespace { // Structures used by FixQuadraticElements()
  */
 //=======================================================================
 
-void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
+void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError,
                                               bool                   volumeOnly)
 {
   // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
@@ -3462,7 +3474,8 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
 #endif
         SMESH_MesherHelper h(*myMesh);
         h.SetSubShape( s.Current() );
-        h.FixQuadraticElements( error, false );
+        h.ToFixNodeParameters(true);
+        h.FixQuadraticElements( compError, false );
       }
     }
     // fix nodes on geom faces
@@ -3473,12 +3486,12 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
       MSG("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key()));
       SMESH_MesherHelper h(*myMesh);
       h.SetSubShape( fIt.Key() );
-      h.FixQuadraticElements( error, true);
       h.ToFixNodeParameters(true);
+      h.FixQuadraticElements( compError, true);
     }
     //perf_print_all_meters(1);
-    if ( error && error->myName == EDITERR_NO_MEDIUM_ON_GEOM )
-      error->myComment = "during conversion to quadratic, "
+    if ( compError && compError->myName == EDITERR_NO_MEDIUM_ON_GEOM )
+      compError->myComment = "during conversion to quadratic, "
         "some medium nodes were not placed on geometry to avoid distorting elements";
     return;
   }
@@ -3521,7 +3534,7 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
   // Issue 0020982
   // Move medium nodes to the link middle for elements whose corner nodes
   // are out of geometrical boundary to fix distorted elements.
-  force3DOutOfBoundary( *this, error );
+  force3DOutOfBoundary( *this, compError );
 
   if ( elemType == SMDSAbs_Volume )
   {
@@ -3595,7 +3608,9 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
         QLink link( face->GetNode(iN), face->GetNode((iN+1)%nbN), face->GetNode(iN+nbN) );
         pLink = links.insert( link ).first;
         faceLinks[ iN ] = & *pLink;
-        if ( !isCurved )
+        if ( !isCurved &&
+             link.node1()->GetPosition()->GetTypeOfPosition() < 2 &&
+             link.node2()->GetPosition()->GetTypeOfPosition() < 2 )
           isCurved = !link.IsStraight();
       }
       // store QFace
index a4e4f59..29c01ab 100644 (file)
@@ -178,6 +178,21 @@ const SMDS_MeshNode* SMESH_ProxyMesh::GetProxyNode( const SMDS_MeshNode* node )
   return proxy;
 }
 
+//================================================================================
+/*!
+ * \brief Returns number of proxy sub-meshes
+ */
+//================================================================================
+
+int SMESH_ProxyMesh::NbProxySubMeshes() const
+{
+  int nb = 0;
+  for ( size_t i = 0; i < _subMeshes.size(); ++i )
+    nb += bool( _subMeshes[i] );
+
+  return nb;
+}
+
 namespace
 {
   //================================================================================
@@ -329,7 +344,7 @@ SMESH_ProxyMesh::SubMesh* SMESH_ProxyMesh::getProxySubMesh(int index)
   if ( int(_subMeshes.size()) <= index )
     _subMeshes.resize( index+1, 0 );
   if ( !_subMeshes[index] )
-    _subMeshes[index] = new SubMesh( index );
+    _subMeshes[index] = newSubmesh( index );
   return _subMeshes[index];
 }
 
@@ -408,24 +423,24 @@ void SMESH_ProxyMesh::takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh )
 
 //================================================================================
 /*!
- * \brief Removes tmp faces from the _mesh
+ * \brief Removes tmp elements from the _mesh
  */
 //================================================================================
 
-void SMESH_ProxyMesh::removeTmpElement( const SMDS_MeshElement* face )
+void SMESH_ProxyMesh::removeTmpElement( const SMDS_MeshElement* elem )
 {
-  if ( face && face->GetID() > 0 )
+  if ( elem && elem->GetID() > 0 )
   {
-    set< const SMDS_MeshElement* >::iterator i =  _elemsInMesh.find( face );
+    set< const SMDS_MeshElement* >::iterator i =  _elemsInMesh.find( elem );
     if ( i != _elemsInMesh.end() )
     {
-      GetMeshDS()->RemoveFreeElement( face, 0 );
+      GetMeshDS()->RemoveFreeElement( elem, 0 );
       _elemsInMesh.erase( i );
     }
   }
   else
   {
-    delete face;
+    delete elem;
   }
 }
 
@@ -435,9 +450,9 @@ void SMESH_ProxyMesh::removeTmpElement( const SMDS_MeshElement* face )
  */
 //================================================================================
 
-void SMESH_ProxyMesh::storeTmpElement( const SMDS_MeshElement* face )
+void SMESH_ProxyMesh::storeTmpElement( const SMDS_MeshElement* elem )
 {
-  _elemsInMesh.insert( face );
+  _elemsInMesh.insert( elem );
 }
 
 //================================================================================
@@ -499,18 +514,20 @@ void SMESH_ProxyMesh::SubMesh::Clear()
 
 //================================================================================
 /*!
- * \brief Return number of elements in a proxy submesh
+ * \brief Return number of elements in a proxy sub-mesh. The method is meaningful
+ *        for a sub-mesh containing tmp faces.
  */
 //================================================================================
 
 int SMESH_ProxyMesh::SubMesh::NbElements() const
 {
-  return _elements.size();
+  return _uvPtStructVec.empty() ? _elements.size() : _uvPtStructVec.size() - 1;
 }
 
 //================================================================================
 /*!
- * \brief Return elements of a proxy submesh
+ * \brief Return elements of a proxy sub-mesh. The method is meaningful
+ *        for a sub-mesh containing tmp faces.
  */
 //================================================================================
 
@@ -522,6 +539,39 @@ SMDS_ElemIteratorPtr SMESH_ProxyMesh::SubMesh::GetElements() const
 
 //================================================================================
 /*!
+ * \brief Return number of nodes in a proxy sub-mesh. The method is meaningful
+ *        for a sub-mesh containing nodes of 2D viscous layer.
+ */
+//================================================================================
+
+int SMESH_ProxyMesh::SubMesh::NbNodes() const
+{
+  return _uvPtStructVec.size();
+}
+
+//================================================================================
+/*!
+ * \brief Return nodes of a proxy sub-mesh. The method is meaningful
+ *        for a sub-mesh containing nodes of 2D viscous layer.
+ */
+//================================================================================
+
+SMDS_NodeIteratorPtr SMESH_ProxyMesh::SubMesh::GetNodes() const
+{
+  if ( !_uvPtStructVec.empty() )
+    return SMDS_NodeIteratorPtr ( new SMDS_SetIterator
+                                  < SMDS_pNode,
+                                  UVPtStructVec::const_iterator,
+                                  UVPtStruct::NodeAccessor >
+                                  ( _uvPtStructVec.begin(), _uvPtStructVec.end() ));
+
+  return SMDS_NodeIteratorPtr
+    ( new SMDS_SetIterator< SMDS_pNode, std::vector< SMDS_pElement >::const_iterator>
+      ( _elements.begin(), _elements.end() ));
+}
+
+//================================================================================
+/*!
  * \brief Store an element
  */
 //================================================================================
index faf6773..1c5d935 100644 (file)
@@ -28,6 +28,7 @@
 
 #include "SMDS_MeshElement.hxx"
 #include "SMESHDS_SubMesh.hxx"
+#include "SMESH_TypeDefs.hxx"
 
 #include <TopoDS_Shape.hxx>
 
@@ -40,7 +41,8 @@ class SMESHDS_Mesh;
 class SMESH_Mesh;
 
 /*!
- * \brief Container of mesh faces substituting other faces in the input mesh of 3D algorithm
+ * \brief Container of xD mesh elements substituting other ones in the
+ *        input mesh of an (x+1)D algorithm
  */
 class SMESH_EXPORT SMESH_ProxyMesh
 {
@@ -54,32 +56,35 @@ public:
   /*!
    * \brief Proxy sub-mesh
    */
-  class SubMesh : public SMESHDS_SubMesh
+  class SMESH_EXPORT SubMesh : public SMESHDS_SubMesh
   {
   public:
 
-    const TN2NMap* GetNodeNodeMap() const { return _n2n; }
+    const TN2NMap*       GetNodeNodeMap() const { return _n2n; }
     const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const;
-    virtual void AddElement(const SMDS_MeshElement * e);
-    virtual int NbElements() const;
+    const UVPtStructVec& GetUVPtStructVec() const { return _uvPtStructVec; }
+    virtual void         AddElement(const SMDS_MeshElement * e);
+    virtual int          NbElements() const;
+    virtual int          NbNodes() const;
     virtual SMDS_ElemIteratorPtr GetElements() const;
-    virtual void Clear();
-    virtual bool Contains(const SMDS_MeshElement * ME) const;
+    virtual SMDS_NodeIteratorPtr GetNodes() const;
+    virtual void         Clear();
+    virtual bool         Contains(const SMDS_MeshElement * ME) const;
 
     template< class ITERATOR >
     void ChangeElements( ITERATOR it, ITERATOR end )
     {
-      // change SubMesh contents without deleting tmp faces
+      // change SubMesh contents without deleting tmp elements
       // for which the caller is responsible
-      _elements.clear();
-      while ( it != end ) _elements.push_back( *it++ );
+      _elements.assign( it, end );
     }
     SubMesh(int index=0):SMESHDS_SubMesh(0,index),_n2n(0) {}
-    ~SubMesh() { Clear(); }
+    virtual ~SubMesh() { Clear(); }
 
-  private:
+  protected:
     std::vector<const SMDS_MeshElement *> _elements;
     TN2NMap*                              _n2n;
+    UVPtStructVec                         _uvPtStructVec; // for SubMesh of EDGE
     friend class SMESH_ProxyMesh;
   };
   //--------------------------------------------------------------------------------
@@ -90,40 +95,45 @@ public:
   SMESH_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
   virtual ~SMESH_ProxyMesh();
 
-  // Returns the submesh of a face; it can be a proxy sub-mesh
-  const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& face) const;
+  // Returns the submesh of a shape; it can be a proxy sub-mesh
+  const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& shape) const;
 
-  // Returns the proxy sub-mesh of a face; it can be NULL
-  const SubMesh* GetProxySubMesh(const TopoDS_Shape& face) const;
+  // Returns the proxy sub-mesh of a shape; it can be NULL
+  const SubMesh*         GetProxySubMesh(const TopoDS_Shape& shape) const;
 
   // Returns the proxy node of a node; the input node is returned if no proxy exists
-  const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const;
+  const SMDS_MeshNode*   GetProxyNode( const SMDS_MeshNode* node ) const;
 
-  // Returns iterator on all faces of the mesh taking into account substitutions
+  // Returns number of proxy sub-meshes
+  int                    NbProxySubMeshes() const;
+
+  // Returns iterator on all faces of the mesh taking into account substitutions.
   // To be used in case of mesh without shape
-  SMDS_ElemIteratorPtr GetFaces() const;
+  SMDS_ElemIteratorPtr   GetFaces() const;
 
   // Returns iterator on all faces on the face taking into account substitutions
-  SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const;
+  SMDS_ElemIteratorPtr   GetFaces(const TopoDS_Shape& face) const;
 
   // Return total nb of faces taking into account substitutions
-  int NbFaces() const;
+  int                    NbFaces() const;
 
-  bool IsTemporary(const SMDS_MeshElement* elem ) const;
+  bool                   IsTemporary(const SMDS_MeshElement* elem ) const;
 
 
 
-  const SMESH_Mesh* GetMesh() const { return _mesh; }
+  SMESH_Mesh*            GetMesh() const { return const_cast<SMESH_Mesh*>( _mesh ); }
 
-  SMESHDS_Mesh* GetMeshDS() const;
+  SMESHDS_Mesh*          GetMeshDS() const;
 
   //--------------------------------------------------------------------------------
   // Interface for descendants
  protected:
 
-  void setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
+  void     setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
+
+  int      shapeIndex(const TopoDS_Shape& shape) const;
 
-  int shapeIndex(const TopoDS_Shape& shape) const;
+  virtual SubMesh* newSubmesh(int index=0) const { return new SubMesh(index); }
 
   // returns a proxy sub-mesh; zero index is for the case of mesh w/o shape
   SubMesh* findProxySubMesh(int shapeIndex=0) const;
@@ -135,21 +145,21 @@ public:
   SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape());
 
   // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found
-  bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh );
+  bool     takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh );
 
   // move tmp elements residing the _mesh from other proxy mesh to this
-  void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh );
+  void     takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh );
 
-  // removes tmp faces from the _mesh
-  void removeTmpElement( const SMDS_MeshElement* face );
+  // removes tmp element from the _mesh
+  void     removeTmpElement( const SMDS_MeshElement* elem );
 
   // stores tmp element residing the _mesh
-  void storeTmpElement( const SMDS_MeshElement* face );
+  void     storeTmpElement( const SMDS_MeshElement* elem );
 
   // store node-node correspondence
-  void setNode2Node(const SMDS_MeshNode* srcNode,
-                    const SMDS_MeshNode* proxyNode,
-                    const SubMesh*       subMesh);
+  void     setNode2Node(const SMDS_MeshNode* srcNode,
+                        const SMDS_MeshNode* proxyNode,
+                        const SubMesh*       subMesh);
 
   // types of elements needed to implement NbFaces() and GetFaces();
   // if _allowedTypes is empty, only elements from _subMeshes are returned,
index d048ce2..5fae768 100644 (file)
@@ -149,6 +149,17 @@ SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS()
  */
 //=============================================================================
 
+const SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS() const
+{
+  return ((SMESH_subMesh*) this )->GetSubMeshDS();
+}
+
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
 SMESHDS_SubMesh* SMESH_subMesh::CreateSubMeshDS()
 {
   if ( !GetSubMeshDS() ) {
@@ -1122,7 +1133,7 @@ bool SMESH_subMesh::IsConform(const SMESH_Algo* theAlgo)
  */
 //=============================================================================
 
-void SMESH_subMesh::setAlgoState(int state)
+void SMESH_subMesh::setAlgoState(algo_state state)
 {
   _algoState = state;
 }
@@ -1258,7 +1269,19 @@ static void cleanSubMesh( SMESH_subMesh * subMesh )
 
 bool SMESH_subMesh::ComputeStateEngine(int event)
 {
-  _computeError.reset();
+  switch ( event ) {
+  case MODIF_ALGO_STATE:
+  case COMPUTE:
+    //case COMPUTE_CANCELED:
+  case CLEAN:
+    //case SUBMESH_COMPUTED:
+    //case SUBMESH_RESTORED:
+    //case SUBMESH_LOADED:
+    //case MESH_ENTITY_REMOVED:
+    //case CHECK_COMPUTE_STATE:
+    _computeError.reset(); break;
+  default:;
+  }
 
   //MESSAGE("SMESH_subMesh::ComputeStateEngine");
   //SCRUTE(_computeState);
@@ -2066,7 +2089,8 @@ void SMESH_subMesh::SetEventListener(EventListener*     listener,
  */
 //================================================================================
 
-void SMESH_subMesh::setEventListener(EventListener* listener, EventListenerData* data)
+void SMESH_subMesh::setEventListener(EventListener*     listener,
+                                     EventListenerData* data)
 {
   map< EventListener*, EventListenerData* >::iterator l_d =
     _eventListeners.find( listener );
@@ -2076,8 +2100,21 @@ void SMESH_subMesh::setEventListener(EventListener* listener, EventListenerData*
       delete curData;
     l_d->second = data;
   }
-  else 
+  else
+  {
+    for ( l_d = _eventListeners.begin(); l_d != _eventListeners.end(); ++l_d )
+      if ( listener->GetName() == l_d->first->GetName() )
+      {
+        EventListenerData* curData = l_d->second;
+        if ( curData && curData != data && curData->IsDeletable() )
+          delete curData;
+        if ( l_d->first->IsDeletable() )
+          delete l_d->first;
+        _eventListeners.erase( l_d );
+        break;
+      }
     _eventListeners.insert( make_pair( listener, data ));
+  }
 }
 
 //================================================================================
@@ -2128,16 +2165,18 @@ void SMESH_subMesh::notifyListenersOnEvent( const int         event,
                                             SMESH_Hypothesis* hyp)
 {
   map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin();
-  for ( ; l_d != _eventListeners.end(); ++l_d )
+  for ( ; l_d != _eventListeners.end();  )
   {
-    std::pair< EventListener*, EventListenerData* > li_da = *l_d; /* copy to enable removal
-                                                                     of a listener from
-                                                                     _eventListeners by
-                                                                     its ProcessEvent() */
+    std::pair< EventListener*, EventListenerData* > li_da = *l_d++; /* copy to enable removal
+                                                                       of a listener from
+                                                                       _eventListeners by
+                                                                       its ProcessEvent() */
     if ( li_da.first->myBusySM.insert( this ).second )
     {
+      const size_t nbListenersBefore = _eventListeners.size();
       li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp );
-      li_da.first->myBusySM.erase( this );
+      if ( nbListenersBefore == _eventListeners.size() )
+        li_da.first->myBusySM.erase( this ); // a listener hopefully not removed
     }
   }
 }
@@ -2164,6 +2203,9 @@ void SMESH_subMesh::DeleteEventListener(EventListener* listener)
       delete l_d->second;
     }
     _eventListeners.erase( l_d );
+
+    if ( l_d->first && !l_d->first->IsDeletable() )
+      l_d->first->myBusySM.erase( this );
   }
 }
 
index 057f532..43b8349 100644 (file)
@@ -59,15 +59,18 @@ typedef boost::shared_ptr< SMDS_Iterator<SMESH_subMesh*> > SMESH_subMeshIterator
 class SMESH_EXPORT SMESH_subMesh
 {
  public:
-  SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS,
+  SMESH_subMesh(int                  Id,
+                SMESH_Mesh *         father,
+                SMESHDS_Mesh *       meshDS,
                 const TopoDS_Shape & aSubShape);
   virtual ~ SMESH_subMesh();
 
-  int GetId() const;
+  int GetId() const; // == meshDS->ShapeToIndex( aSubShape )
 
   SMESH_Mesh* GetFather() { return _father; }
   
-  SMESHDS_SubMesh * GetSubMeshDS();
+  SMESHDS_SubMesh *       GetSubMeshDS();
+  const SMESHDS_SubMesh * GetSubMeshDS() const;
 
   SMESHDS_SubMesh* CreateSubMeshDS();
   // Explicit SMESHDS_SubMesh creation method, required for persistence mechanism
@@ -206,9 +209,9 @@ public:
   SMESH_Hypothesis::Hypothesis_Status
     SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp);
 
-  int GetAlgoState() const { return _algoState; }
-  int GetComputeState() const { return _computeState; };
-  SMESH_ComputeErrorPtr& GetComputeError() { return _computeError; }
+  algo_state             GetAlgoState() const    { return _algoState; }
+  compute_state          GetComputeState() const { return _computeState; };
+  SMESH_ComputeErrorPtr& GetComputeError()       { return _computeError; }
 
   void DumpAlgoState(bool isMain);
 
@@ -272,7 +275,7 @@ protected:
   void updateSubMeshState(const compute_state theState);
   void cleanDependants();
   void cleanDependsOn();
-  void setAlgoState(int state);
+  void setAlgoState(algo_state state);
 
   /*!
    * \brief Return a shape containing all sub-shapes of the MainShape that can be
@@ -311,8 +314,8 @@ protected:
   std::map < int, SMESH_subMesh * >_mapDepend;
   bool                  _dependenceAnalysed;
 
-  int                   _algoState;
-  int                   _computeState;
+  algo_state            _algoState;
+  compute_state         _computeState;
   SMESH_ComputeErrorPtr _computeError;
 
   // allow algo->Compute() if a subshape of lower dim is meshed but
index a42b9ac..75e83be 100644 (file)
@@ -823,7 +823,7 @@ static void removeFromContainers (map<int,SMESHDS_SubMesh*>&     theSubMeshes,
   // Element should belong to only one sub-mesh
   if ( !theSubMeshes.empty() )
   {
-    SMESHDS_Mesh* mesh = theSubMeshes.begin()->second->getParent();
+    SMESHDS_Mesh* mesh = theSubMeshes.begin()->second->GetParent();
     list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
     if ( isNode ) {
       for ( ; elIt != theElems.end(); ++elIt )
index 049c73e..a9feca8 100644 (file)
@@ -73,7 +73,8 @@ class SMESHDS_EXPORT SMESHDS_SubMesh
   int getSize();
   void compactList();
 
-  inline SMESHDS_Mesh *getParent() {return myParent; };
+  SMESHDS_Mesh *GetParent()   { return myParent; }
+  int           GetID() const { return myIndex; }
 
  private:
   SMESHDS_Mesh * myParent;
index e29c918..ceb4192 100644 (file)
  #define SMESHFILTERSSELECTION_EXPORT
 #endif
 
-enum MeshObjectType {
-  HYPOTHESIS,
-  ALGORITHM,
-  MESH,
-  SUBMESH,
-  MESHorSUBMESH,
-  SUBMESH_VERTEX,
-  SUBMESH_EDGE,
-  SUBMESH_FACE,
-  SUBMESH_SOLID,
-  SUBMESH_COMPOUND,
-  GROUP,
-  GROUP_NODE,
-  GROUP_EDGE,
-  GROUP_FACE,
-  GROUP_VOLUME,
-  GROUP_0D,
-  GROUP_BALL,
-  COMPONENT,
-  IDSOURCE
+namespace SMESH{
+  enum MeshObjectType {
+    HYPOTHESIS,
+    ALGORITHM,
+    MESH,
+    SUBMESH,
+    MESHorSUBMESH,
+    SUBMESH_VERTEX,
+    SUBMESH_EDGE,
+    SUBMESH_FACE,
+    SUBMESH_SOLID,
+    SUBMESH_COMPOUND,
+    GROUP,
+    GROUP_NODE,
+    GROUP_EDGE,
+    GROUP_FACE,
+    GROUP_VOLUME,
+    GROUP_0D,
+    GROUP_BALL,
+    COMPONENT,
+    IDSOURCE
+  };
 };
-
 #endif
index e9b8316..9df3ed8 100644 (file)
@@ -30,7 +30,7 @@
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SMESH_Gen)
 
-SMESH_TypeFilter::SMESH_TypeFilter (MeshObjectType theType)
+SMESH_TypeFilter::SMESH_TypeFilter (SMESH::MeshObjectType theType)
 {
   myType = theType;
 }
@@ -88,7 +88,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
 
     switch (myType)
     {
-      case HYPOTHESIS:
+      case SMESH::HYPOTHESIS:
         {
           if      (aLevel == 2 && (objFather->Tag() == SMESH::Tag_HypothesisRoot))
             // hypo definition
@@ -101,7 +101,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case ALGORITHM:
+      case SMESH::ALGORITHM:
         {
           if      (aLevel == 2 && (objFather->Tag() == SMESH::Tag_AlgorithmsRoot))
             // algo definition
@@ -114,13 +114,13 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case MESH:
+      case SMESH::MESH:
         {
           if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot))
             Ok = true;
           break;
         }
-      case SUBMESH:
+      case SMESH::SUBMESH:
         {
           // see SMESH_Gen_i.cxx for tag numbers
           if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstSubMesh &&
@@ -128,7 +128,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case MESHorSUBMESH:
+      case SMESH::MESHorSUBMESH:
         {
           if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot))
             Ok = true; // mesh
@@ -137,82 +137,82 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
             Ok = true;
           break;
         }
-      case SUBMESH_VERTEX: // Label "SubMeshes on vertexes"
+      case SMESH::SUBMESH_VERTEX: // Label "SubMeshes on vertexes"
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnVertex))
             Ok = true;
           break;
         }
-      case SUBMESH_EDGE:
+      case SMESH::SUBMESH_EDGE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnEdge))
             Ok = true;
           break;
         }
-      case SUBMESH_FACE:
+      case SMESH::SUBMESH_FACE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnFace))
             Ok = true;
           break;
         }
-      case SUBMESH_SOLID:
+      case SMESH::SUBMESH_SOLID:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnSolid))
             Ok = true;
           break;
         }
-      case SUBMESH_COMPOUND:
+      case SMESH::SUBMESH_COMPOUND:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnCompound))
             Ok = true;
           break;
         }
-      case GROUP:
+      case SMESH::GROUP:
         {
           if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstGroup))
             Ok = true;
           break;
         }
-      case GROUP_NODE:
+      case SMESH::GROUP_NODE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_NodeGroups))
             Ok = true;
           break;
         }
-      case GROUP_EDGE:
+      case SMESH::GROUP_EDGE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_EdgeGroups))
             Ok = true;
           break;
         }
-      case GROUP_FACE:
+      case SMESH::GROUP_FACE:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_FaceGroups))
             Ok = true;
           break;
         }
-      case GROUP_VOLUME:
+      case SMESH::GROUP_VOLUME:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_VolumeGroups))
             Ok = true;
           break;
         }
-      case GROUP_0D:
+      case SMESH::GROUP_0D:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_0DElementsGroups))
             Ok = true;
           break;
         }
-      case GROUP_BALL:
+      case SMESH::GROUP_BALL:
         {
           if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_BallElementsGroups))
             Ok = true;
           break;
         }
-      case IDSOURCE:
+      case SMESH::IDSOURCE:
         {
-          Ok = ( SMESH_TypeFilter(MESHorSUBMESH).isOk( theDataOwner ) ||
-                 SMESH_TypeFilter(GROUP)        .isOk( theDataOwner ));
+          Ok = ( SMESH_TypeFilter(SMESH::MESHorSUBMESH).isOk( theDataOwner ) ||
+                 SMESH_TypeFilter(SMESH::GROUP)        .isOk( theDataOwner ));
           break;
         }
     }
@@ -220,7 +220,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
   return Ok;
 }
 
-MeshObjectType SMESH_TypeFilter::type() const
+SMESH::MeshObjectType SMESH_TypeFilter::type() const
 {
   return myType;
 }
index 0821917..7daf9b1 100644 (file)
@@ -34,14 +34,14 @@ class SUIT_DataOwner;
 class SMESHFILTERSSELECTION_EXPORT SMESH_TypeFilter : public SUIT_SelectionFilter
 {
 public:
-  SMESH_TypeFilter (MeshObjectType theType);
+  SMESH_TypeFilter (SMESH::MeshObjectType theType);
   ~SMESH_TypeFilter();
 
   virtual bool isOk (const SUIT_DataOwner*) const;
-  MeshObjectType type() const;
+  SMESH::MeshObjectType type() const;
 
 protected:
-  MeshObjectType myType;
+  SMESH::MeshObjectType myType;
 };
 
 #endif
index 9bfd599..e48d1e8 100644 (file)
@@ -97,6 +97,7 @@ salomeinclude_HEADERS = \
        SMESHGUI_PreviewDlg.h  \
        SMESHGUI_ReorientFacesDlg.h \
        SMESHGUI_PropertiesDlg.h \
+       SMESHGUI_Add0DElemsOnAllNodesDlg.h \
        SMESH_SMESHGUI.hxx
 
 # Libraries targets
@@ -173,7 +174,8 @@ dist_libSMESH_la_SOURCES = \
        SMESHGUI_FileValidator.cxx \
        SMESHGUI_PreviewDlg.cxx  \
        SMESHGUI_ReorientFacesDlg.cxx \
-       SMESHGUI_PropertiesDlg.cxx
+       SMESHGUI_PropertiesDlg.cxx \
+       SMESHGUI_Add0DElemsOnAllNodesDlg.cxx
 
 MOC_FILES = \
        SMESHGUI_moc.cxx \
@@ -233,7 +235,8 @@ MOC_FILES = \
        SMESHGUI_MeshOrderOp_moc.cxx \
        SMESHGUI_PreviewDlg_moc.cxx \
        SMESHGUI_ReorientFacesDlg_moc.cxx \
-       SMESHGUI_PropertiesDlg_moc.cxx
+       SMESHGUI_PropertiesDlg_moc.cxx \
+       SMESHGUI_Add0DElemsOnAllNodesDlg_moc.cxx
 
 nodist_libSMESH_la_SOURCES= \
        $(MOC_FILES)
index 28df5fd..86de4f3 100644 (file)
 #undef HAVE_FINITE            // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
 #endif
 #include "Python.h"
+
 //  SMESH includes
 #include "SMESHGUI.h"
+#include "SMESHGUI_Add0DElemsOnAllNodesDlg.h"
 #include "SMESHGUI_AddMeshElementDlg.h"
 #include "SMESHGUI_AddQuadraticElementDlg.h"
 #include "SMESHGUI_BuildCompoundDlg.h"
 #include "SMESHGUI_ClippingDlg.h"
 #include "SMESHGUI_ComputeDlg.h"
 #include "SMESHGUI_ConvToQuadOp.h"
+#include "SMESHGUI_CopyMeshDlg.h"
 #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
 #include "SMESHGUI_DeleteGroupDlg.h"
 #include "SMESHGUI_Displayer.h"
-#include "SMESHGUI_MergeDlg.h"
+#include "SMESHGUI_DuplicateNodesDlg.h"
 #include "SMESHGUI_ExtrusionAlongPathDlg.h"
 #include "SMESHGUI_ExtrusionDlg.h"
 #include "SMESHGUI_FileInfoDlg.h"
@@ -53,6 +56,7 @@
 #include "SMESHGUI_Make2DFrom3DOp.h"
 #include "SMESHGUI_MakeNodeAtPointDlg.h"
 #include "SMESHGUI_Measurements.h"
+#include "SMESHGUI_MergeDlg.h"
 #include "SMESHGUI_MeshInfo.h"
 #include "SMESHGUI_MeshOp.h"
 #include "SMESHGUI_MeshOrderOp.h"
 #include "SMESHGUI_RemoveElementsDlg.h"
 #include "SMESHGUI_RemoveNodesDlg.h"
 #include "SMESHGUI_RenumberingDlg.h"
+#include "SMESHGUI_ReorientFacesDlg.h"
 #include "SMESHGUI_RevolutionDlg.h"
 #include "SMESHGUI_RotationDlg.h"
+#include "SMESHGUI_ScaleDlg.h"
 #include "SMESHGUI_Selection.h"
 #include "SMESHGUI_SewingDlg.h"
 #include "SMESHGUI_SingleEditDlg.h"
 #include "SMESHGUI_SmoothingDlg.h"
 #include "SMESHGUI_SymmetryDlg.h"
 #include "SMESHGUI_TranslationDlg.h"
-#include "SMESHGUI_ScaleDlg.h"
 #include "SMESHGUI_TransparencyDlg.h"
-#include "SMESHGUI_DuplicateNodesDlg.h"
-#include "SMESHGUI_CopyMeshDlg.h"
-#include "SMESHGUI_ReorientFacesDlg.h"
 
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_GroupUtils.h"
 #include "SMESHGUI_FilterUtils.h"
+#include "SMESHGUI_GroupUtils.h"
+#include "SMESHGUI_HypothesesUtils.h"
+#include "SMESHGUI_MeshUtils.h"
 #include "SMESHGUI_PatternUtils.h"
+#include "SMESHGUI_Utils.h"
 #include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_HypothesesUtils.h"
 
 #include <SMESH_version.h>
 
-#include <SMESH_Client.hxx>
+#include "SMESH_ControlsDef.hxx"
 #include <SMESH_Actor.h>
-#include <SMESH_ScalarBarActor.h>
 #include <SMESH_ActorUtils.h>
+#include <SMESH_Client.hxx>
+#include <SMESH_ScalarBarActor.h>
 #include <SMESH_TypeFilter.hxx>
-#include "SMESH_ControlsDef.hxx"
 
 // SALOME GUI includes
-#include <SalomeApp_Tools.h>
-#include <SalomeApp_Study.h>
 #include <SalomeApp_Application.h>
 #include <SalomeApp_CheckFileDlg.h>
 #include <SalomeApp_DataObject.h>
+#include <SalomeApp_Study.h>
+#include <SalomeApp_Tools.h>
 
 #include <LightApp_DataOwner.h>
+#include <LightApp_NameDlg.h>
 #include <LightApp_Preferences.h>
 #include <LightApp_SelectionMgr.h>
 #include <LightApp_UpdateFlags.h>
-#include <LightApp_NameDlg.h>
 
-#include <SVTK_ViewWindow.h>
-#include <SVTK_ViewModel.h>
 #include <SVTK_ViewManager.h>
+#include <SVTK_ViewModel.h>
+#include <SVTK_ViewWindow.h>
 
 #include <VTKViewer_Algorithm.h>
 
-#include <SUIT_MessageBox.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_FileDlg.h>
 #include <SUIT_Desktop.h>
+#include <SUIT_FileDlg.h>
+#include <SUIT_MessageBox.h>
 #include <SUIT_OverrideCursor.h>
+#include <SUIT_ResourceMgr.h>
 #include <SUIT_Session.h>
 
 #include <QtxPopupMgr.h>
 #include <boost/shared_ptr.hpp>
 
 // VTK includes
-#include <vtkCamera.h>
-#include <vtkRenderer.h>
-#include <vtkPlane.h>
 #include <vtkCallbackCommand.h>
+#include <vtkCamera.h>
 #include <vtkLookupTable.h>
+#include <vtkPlane.h>
+#include <vtkRenderer.h>
 
 // SALOME KERNEL includes
-#include <SALOMEDS_Study.hxx>
-#include <SALOMEDSClient_StudyBuilder.hxx>
-#include <SALOMEDSClient_SComponent.hxx>
 #include <SALOMEDSClient_ClientFactory.hxx>
 #include <SALOMEDSClient_IParameters.hxx>
+#include <SALOMEDSClient_SComponent.hxx>
+#include <SALOMEDSClient_StudyBuilder.hxx>
+#include <SALOMEDS_Study.hxx>
 
 // OCCT includes
 #include <Standard_ErrorHandler.hxx>
 #include <NCollection_DataMap.hxx>
 
+#include <Basics_Utils.hxx>
+
 //To disable automatic genericobj management, the following line should be commented.
-//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx
+//Otherwise, it should be uncommented.
+//Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx
 #define WITHGENERICOBJ
 
 //namespace{
     std::string myExtension;
 
     if ( theCommandID == 113 ) {
-      filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.med)" );
+      filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.*med)" );
       filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
     }
     else if ( theCommandID == 112 ) {
       filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" );
     }
     else if ( theCommandID == 115 ) {
-      filter.append( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" );
+      filter.append( QObject::tr( "STL_FILES_FILTER" ) + " (*.stl)" );
     }
     else if ( theCommandID == 116 ) {
       filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
     if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
       anInitialPath = QDir::currentPath();
 
-    QStringList filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(),
-                                                            anInitialPath,
-                                                            filter,
-                                                            QObject::tr( "SMESH_IMPORT_MESH" ) );
+    QStringList filenames;
+    bool toCreateGroups = true;
+
+    // if ( theCommandID == 118 ) { // GMF
+    //   SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
+    //     ( SMESHGUI::desktop(), true, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true );
+    //   fd->setWindowTitle( QObject::tr( "SMESH_IMPORT_MESH" ) );
+    //   fd->setNameFilters( filter );
+    //   fd->SetChecked( true );
+    //   if ( fd->exec() )
+    //     filenames << fd->selectedFile();
+    //   toCreateGroups = fd->IsChecked();
+
+    //   delete fd;
+    // }
+    // else
+    {
+      filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(),
+                                                  anInitialPath,
+                                                  filter,
+                                                  QObject::tr( "SMESH_IMPORT_MESH" ) );
+    }
     if ( filenames.count() > 0 ) {
       SUIT_OverrideCursor wc;
       _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
               // GMF format
               SMESH::ComputeError_var res;
               aMeshes->length( 1 );
-              aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toLatin1().constData(), res.out() );
+              aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toLatin1().constData(),
+                                                                  toCreateGroups,
+                                                                  res.out() );
               if ( res->code != SMESH::DRS_OK ) {
                 errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
                                arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res->code ).toLatin1().data() ) ) );
       else if ( isGMF )
         aFilter = QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" +
           ";;" +  QObject::tr( "GMF_BINARY_FILES_FILTER" )  + " (*.meshb)";
-      if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
+     if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
       aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
                                             anInitialPath + QString("/") + aMeshName,
                                             aFilter, aTitle, false);
     }
+    // else if ( isGMF )// Export to GMF
+    // {
+      // SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
+      //   ( SMESHGUI::desktop(), false, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true );
+      // QStringList filters;
+      // filters << QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)"
+      //         << QObject::tr( "GMF_BINARY_FILES_FILTER" )  + " (*.meshb)";
+      // fd->setWindowTitle( aTitle );
+      // fd->setNameFilters( filters );
+
+      // if ( !aMeshOrGroup->_is_equivalent( aMesh ))
+      //   toCreateGroups = false;
+      // else
+      //   toCreateGroups = ( aMesh->NbGroups() > 0 );
+
+      // fd->SetChecked( true );
+      // if ( !anInitialPath.isEmpty() )
+      //   fd->setDirectory( anInitialPath );
+      // fd->selectFile(aMeshName);
+
+      // if ( fd->exec() )
+      //   aFilename = fd->selectedFile();
+      // toCreateGroups = fd->IsChecked();
+
+      // delete fd;
+    // }
     else if ( isCGNS )// Export to CGNS
     {
       SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
         }
         else if ( isGMF )
         {
-          aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data() );
+          toCreateGroups = true;
+          aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups );
         }
       }
       catch (const SALOME::SALOME_Exception& S_ex){
 
 
   bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
-                   MeshObjectType                           theType,
+                   SMESH::MeshObjectType                           theType,
                    const QString                            theInTypeName,
                    QString &                                theOutTypeName)
   {
 
     QString aTypeName;
     if (
-        CheckOIType ( theIO, HYPOTHESIS,    "Hypothesis", aTypeName ) ||
-        CheckOIType ( theIO, ALGORITHM,     "Algorithm",  aTypeName ) ||
-        CheckOIType ( theIO, MESH,          "Mesh",       aTypeName ) ||
-        CheckOIType ( theIO, SUBMESH,       "SubMesh",    aTypeName ) ||
-        CheckOIType ( theIO, GROUP,         "Group",      aTypeName )
+        CheckOIType ( theIO, SMESH::HYPOTHESIS,    "Hypothesis", aTypeName ) ||
+        CheckOIType ( theIO, SMESH::ALGORITHM,     "Algorithm",  aTypeName ) ||
+        CheckOIType ( theIO, SMESH::MESH,          "Mesh",       aTypeName ) ||
+        CheckOIType ( theIO, SMESH::SUBMESH,       "SubMesh",    aTypeName ) ||
+        CheckOIType ( theIO, SMESH::GROUP,         "Group",      aTypeName )
         )
       return aTypeName;
 
@@ -3018,7 +3070,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       if(checkLock(aStudy)) break;
       if ( vtkwnd ) {
         EmitSignalDeactivateDialog();
-        SMDSAbs_EntityType type;
+        SMDSAbs_EntityType type = SMDSEntity_Last;
 
         switch (theCommandID) {
         case 4034:
@@ -3036,13 +3088,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
         case 4039:
           type = SMDSEntity_Quad_Penta; break;
         case 4040:
-          type = SMDSEntity_Quad_Hexa;
+          type = SMDSEntity_Quad_Hexa; break;
         case 4140:
-          type = SMDSEntity_TriQuad_Hexa;
-          break;
-        default:;
+          type = SMDSEntity_TriQuad_Hexa; break;
+        default: break;
         }
-         ( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show();
+        if ( type != SMDSEntity_Last )
+          ( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show();
       }
       else {
         SUIT_MessageBox::warning(SMESHGUI::desktop(),
@@ -3293,6 +3345,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
       break;
     }
 
+  case 4070: // 0D_ON_ALL_NODES
+    startOperation( 4070 );
+    break;
+
   case 5105: // Library of selection filters
   {
     static QList<int> aTypes;
@@ -3493,12 +3549,8 @@ void SMESHGUI::createPopupItem( const int id,
                                 const QString& theRule,
                                 const int pId )
 {
-  int parentId = pId;
-  if( pId!=-1 )
-    parentId = popupMgr()->actionId( action( pId ) );
-
   if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) )
-    popupMgr()->insert( action( id ), parentId, 0 );
+    popupMgr()->insert( action( id ), pId, 0 );
 
   QString lc = "$";        // VSR : instead of QtxPopupSelection::defEquality();
   QString dc = "selcount"; // VSR : insetad of QtxPopupSelection::defSelCountParam()
@@ -3549,13 +3601,13 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction(  142, "CGNS");
   createSMESHAction(  144, "SAUV");
   createSMESHAction(  146, "GMF" );
-  createSMESHAction(  124, "EXPORT_DAT" );
-  createSMESHAction(  125, "EXPORT_MED" );
-  createSMESHAction(  126, "EXPORT_UNV" );
-  createSMESHAction(  141, "EXPORT_STL" );
-  createSMESHAction(  143, "EXPORT_CGNS");
-  createSMESHAction(  145, "EXPORT_SAUV");
-  createSMESHAction(  147, "EXPORT_GMF" );
+  createSMESHAction(  124, "DAT" );
+  createSMESHAction(  125, "MED" );
+  createSMESHAction(  126, "UNV" );
+  createSMESHAction(  141, "STL" );
+  createSMESHAction(  143, "CGNS");
+  createSMESHAction(  145, "SAUV");
+  createSMESHAction(  147, "GMF" );
   createSMESHAction(  150, "FILE_INFO" );
   createSMESHAction(   33, "DELETE",          "ICON_DELETE", Qt::Key_Delete );
   createSMESHAction( 5105, "SEL_FILTER_LIB" );
@@ -3647,6 +3699,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createSMESHAction( 4067, "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" );
   createSMESHAction( 4068, "SCALE",           "ICON_DLG_MESH_SCALE" );
   createSMESHAction( 4069, "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" );
+  createSMESHAction( 4070, "0D_ON_ALL_NODES", "ICON_0D_ON_ALL_NODES" );
   createSMESHAction(  407, "INV",             "ICON_DLG_MESH_DIAGONAL" );
   createSMESHAction(  408, "UNION2",          "ICON_UNION2TRI" );
   createSMESHAction(  409, "ORIENT",          "ICON_DLG_MESH_ORIENTATION" );
@@ -3809,6 +3862,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createMenu( 4000, addId, -1 );
   createMenu( 4009, addId, -1 );
+  createMenu( 4070, addId, -1 );
   createMenu( 4008, addId, -1 );
   createMenu( 4010, addId, -1 );
   createMenu( 4021, addId, -1 );
@@ -3934,6 +3988,7 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   createTool( 4000, addRemTb );
   createTool( 4009, addRemTb );
+  createTool( 4070, addRemTb );
   createTool( 4008, addRemTb );
   createTool( 4010, addRemTb );
   createTool( 4021, addRemTb );
@@ -3999,17 +4054,17 @@ void SMESHGUI::initialize( CAM_Application* app )
   QString OB = "'ObjectBrowser'",
           View = "'" + SVTK_Viewer::Type() + "'",
           pat = "'%1'",
-          mesh    = pat.arg( SMESHGUI_Selection::typeName( MESH ) ),
-          group   = pat.arg( SMESHGUI_Selection::typeName( GROUP ) ),
-          hypo    = pat.arg( SMESHGUI_Selection::typeName( HYPOTHESIS ) ),
-          algo    = pat.arg( SMESHGUI_Selection::typeName( ALGORITHM ) ),
+          mesh    = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
+          group   = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
+          hypo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
+          algo    = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
           elems   = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
-                       arg( SMESHGUI_Selection::typeName( SUBMESH_VERTEX ) ).
-                       arg( SMESHGUI_Selection::typeName( SUBMESH_EDGE ) ).
-                       arg( SMESHGUI_Selection::typeName( SUBMESH_FACE ) ).
-                       arg( SMESHGUI_Selection::typeName( SUBMESH_SOLID ) ).
-                       arg( SMESHGUI_Selection::typeName( SUBMESH_COMPOUND ) ).
-                       arg( SMESHGUI_Selection::typeName( SUBMESH ) ),
+                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
+                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
+                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
+                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
+                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
+                       arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
           subMesh = elems,
           mesh_part = mesh + " " + subMesh + " " + group,
           mesh_group = mesh + " " + group,
@@ -4065,14 +4120,16 @@ void SMESHGUI::initialize( CAM_Application* app )
   QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc );
   QString only_one_2D        = only_one_non_empty + " && dim>1";
 
-  createPopupItem( 125, OB, mesh_group, multiple_non_empty );   // EXPORT_MED
-  createPopupItem( 126, OB, mesh_group, only_one_non_empty );   // EXPORT_UNV
-  createPopupItem( 141, OB, mesh_group, only_one_2D );          // EXPORT_STL
+  int anId = popupMgr()->insert( tr( "MEN_EXPORT" ), -1, -1 );        // EXPORT submenu
+  createPopupItem( 125, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_MED
+  createPopupItem( 126, OB, mesh_group, only_one_non_empty, anId );   // EXPORT_UNV
+  createPopupItem( 141, OB, mesh_group, only_one_2D, anId );          // EXPORT_STL
 #ifdef WITH_CGNS
-  createPopupItem( 143, OB, mesh_group, multiple_non_empty );   // EXPORT_CGNS
+  createPopupItem( 143, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_CGNS
 #endif
-  createPopupItem( 145, OB, mesh_group, multiple_non_empty );   // EXPORT_SAUV
-  createPopupItem( 147, OB, mesh_group, multiple_non_empty );   // EXPORT_GMF
+  createPopupItem( 145, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_SAUV
+  createPopupItem( 147, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_GMF
+  createPopupItem( 124, OB, mesh_group, multiple_non_empty, anId );   // EXPORT_DAT
   createPopupItem(  33, OB, mesh_part + " " + hyp_alg );        // DELETE
   createPopupItem( 813, OB, group );                            // DEL_GROUP with contents
   popupMgr()->insert( separator(), -1, 0 );
@@ -4092,7 +4149,6 @@ void SMESHGUI::initialize( CAM_Application* app )
   createPopupItem( 1137, OB + " " + View, mesh, "&& isAutoColor" );       // DISABLE_AUTO_COLOR
   popupMgr()->insert( separator(), -1, 0 );
 
-  int anId;
   QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" );
   QString aType = QString( "%1type in {%2}" ).arg( lc );
   aType = aType.arg( mesh_part );
@@ -4752,7 +4808,7 @@ void SMESHGUI::createPreferences()
   int previewGroup = addPreference( tr( "SMESH_PREF_GROUP_PREVIEW" ), genTab );
   setPreferenceProperty( previewGroup, "columns", 2 );
   int chunkSize = addPreference( tr( "PREF_PREVIEW_CHUNK_SIZE" ), previewGroup, LightApp_Preferences::IntSpin, "SMESH", "preview_actor_chunk_size" );
-  setPreferenceProperty( chunkSize, "min",  0 );
+  setPreferenceProperty( chunkSize, "min",  1 );
   setPreferenceProperty( chunkSize, "max",  1000 );
   setPreferenceProperty( chunkSize, "step", 50 );
 
@@ -5131,9 +5187,12 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const
     case 904: // Find element
       op = new SMESHGUI_FindElemByPointOp();
       break;
-    case 4067: // make mesh pass through point
+    case 4067: // Make mesh pass through point
       op = new SMESHGUI_MakeNodeAtPointOp();
       break;
+    case 4070: // Create 0D elements on all nodes
+      op = new SMESHGUI_Add0DElemsOnAllNodesOp();
+      break;
     default:
     break;
   }
@@ -5215,9 +5274,9 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReser
   return aSColor;
 }
 
-const char gSeparator = '_'; // character used to separate parameter names
-const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b)
-const char gPathSep   = '|'; // character used to separate paths
+const char* gSeparator = "_"; // character used to separate parameter names
+const char* gDigitsSep = ":"; // character used to separate numeric parameter values (color = r:g:b)
+const char* gPathSep   = "|"; // character used to separate paths
 
 /*!
  * \brief Store visual parameters
@@ -5227,6 +5286,9 @@ const char gPathSep   = '|'; // character used to separate paths
  */
 void SMESHGUI::storeVisualParameters (int savePoint)
 {
+  // localizing
+  Kernel_Utils::Localizer loc;
+
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
   if (!appStudy || !appStudy->studyDS())
     return;
@@ -5367,9 +5429,11 @@ void SMESHGUI::storeVisualParameters (int savePoint)
 
                   // Displayed entities
                   unsigned int aMode = aSmeshActor->GetEntityMode();
-                  bool isE = aMode & SMESH_Actor::eEdges;
-                  bool isF = aMode & SMESH_Actor::eFaces;
-                  bool isV = aMode & SMESH_Actor::eVolumes;
+                  bool isE  = aMode & SMESH_Actor::eEdges;
+                  bool isF  = aMode & SMESH_Actor::eFaces;
+                  bool isV  = aMode & SMESH_Actor::eVolumes;
+                  bool is0d = aMode & SMESH_Actor::e0DElements;
+                  bool isB  = aMode & SMESH_Actor::eBallElem;
 
                   QString modeStr ("e");
                   modeStr += gDigitsSep; modeStr += QString::number(isE);
@@ -5377,53 +5441,92 @@ void SMESHGUI::storeVisualParameters (int savePoint)
                   modeStr += gDigitsSep; modeStr += QString::number(isF);
                   modeStr += gDigitsSep; modeStr += "v";
                   modeStr += gDigitsSep; modeStr += QString::number(isV);
+                  modeStr += gDigitsSep; modeStr += "0d";
+                  modeStr += gDigitsSep; modeStr += QString::number(is0d);
+                  modeStr += gDigitsSep; modeStr += "b";
+                  modeStr += gDigitsSep; modeStr += QString::number(isB);
 
                   param = vtkParam + "Entities";
                   ip->setParameter(entry, param, modeStr.toLatin1().data());
 
-                  // Colors (surface:edge:)
+                  // Colors
                   vtkFloatingPointType r, g, b;
                   int delta;
 
                   aSmeshActor->GetSufaceColor(r, g, b, delta);
-                  QString colorStr ("surface");
-                  colorStr += gDigitsSep; colorStr += QString::number(r);
-                  colorStr += gDigitsSep; colorStr += QString::number(g);
-                  colorStr += gDigitsSep; colorStr += QString::number(b);
-
-                  colorStr += gDigitsSep; colorStr += "backsurface";
-                  colorStr += gDigitsSep; colorStr += QString::number(delta);
-
+                  QStringList colorStr;
+                  colorStr << "surface";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
+
+                  colorStr << "backsurface";
+                  colorStr << QString::number(delta);
+
+                  aSmeshActor->GetVolumeColor(r, g, b, delta);
+                  colorStr << "volume";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
+                  colorStr << QString::number(delta);
 
                   aSmeshActor->GetEdgeColor(r, g, b);
-                  colorStr += gDigitsSep; colorStr += "edge";
-                  colorStr += gDigitsSep; colorStr += QString::number(r);
-                  colorStr += gDigitsSep; colorStr += QString::number(g);
-                  colorStr += gDigitsSep; colorStr += QString::number(b);
+                  colorStr << "edge";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
 
                   aSmeshActor->GetNodeColor(r, g, b);
-                  colorStr += gDigitsSep; colorStr += "node";
-                  colorStr += gDigitsSep; colorStr += QString::number(r);
-                  colorStr += gDigitsSep; colorStr += QString::number(g);
-                  colorStr += gDigitsSep; colorStr += QString::number(b);
+                  colorStr << "node";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
 
                   aSmeshActor->GetOutlineColor(r, g, b);
-                  colorStr += gDigitsSep; colorStr += "outline";
-                  colorStr += gDigitsSep; colorStr += QString::number(r);
-                  colorStr += gDigitsSep; colorStr += QString::number(g);
-                  colorStr += gDigitsSep; colorStr += QString::number(b);
+                  colorStr << "outline";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
+
+                  aSmeshActor->Get0DColor(r, g, b);
+                  colorStr << "elem0d";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
+
+                  aSmeshActor->GetBallColor(r, g, b);
+                  colorStr << "ball";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
+
+                  aSmeshActor->GetFacesOrientationColor(r, g, b);
+                  colorStr << "orientation";
+                  colorStr << QString::number(r);
+                  colorStr << QString::number(g);
+                  colorStr << QString::number(b);
 
                   param = vtkParam + "Colors";
-                  ip->setParameter(entry, param, colorStr.toLatin1().data());
-
-                  // Sizes of lines and points
-                  QString sizeStr ("line");
-                  sizeStr += gDigitsSep; sizeStr += QString::number((int)aSmeshActor->GetLineWidth());
-                  sizeStr += gDigitsSep; sizeStr += "shrink";
-                  sizeStr += gDigitsSep; sizeStr += QString::number(aSmeshActor->GetShrinkFactor());
+                  ip->setParameter(entry, param, qPrintable(colorStr.join(gDigitsSep)));
+
+                  // Sizes
+                  QStringList sizeStr;
+                  sizeStr << "line";
+                  sizeStr << QString::number((int)aSmeshActor->GetLineWidth());
+                  sizeStr << "outline";
+                  sizeStr << QString::number((int)aSmeshActor->GetOutlineWidth());
+                  sizeStr << "elem0d";
+                  sizeStr << QString::number((int)aSmeshActor->Get0DSize());
+                  sizeStr << "ball";
+                  sizeStr << QString::number((int)aSmeshActor->GetBallSize());
+                  sizeStr << "shrink";
+                  sizeStr << QString::number(aSmeshActor->GetShrinkFactor());
+                  sizeStr << "orientation";
+                  sizeStr << QString::number(aSmeshActor->GetFacesOrientationScale());
+                  sizeStr << QString::number(aSmeshActor->GetFacesOrientation3DVectors());
 
                   param = vtkParam + "Sizes";
-                  ip->setParameter(entry, param, sizeStr.toLatin1().data());
+                  ip->setParameter(entry, param, qPrintable(sizeStr.join(gDigitsSep)));
 
                   // Point marker
                   QString markerStr;
@@ -5509,6 +5612,9 @@ typedef std::map<int, TPlaneInfoList> TPlaneInfoMap;
  */
 void SMESHGUI::restoreVisualParameters (int savePoint)
 {
+  // localizing
+  Kernel_Utils::Localizer loc;
+
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
   if (!appStudy || !appStudy->studyDS())
     return;
@@ -5745,95 +5851,279 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
             // Displayed entities
             else if (paramNameStr == "Entities") {
               QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts);
-              if (mode.count() == 6) {
-                if (mode[0] != "e" || mode[2]  != "f" || mode[4] != "v") {
-                  MESSAGE("Invalid order of data in Entities, must be: "
-                          "e:0/1:f:0/1:v:0/1");
-                }
-                else {
-                  unsigned int aMode = aSmeshActor->GetEntityMode();
-                  unsigned int aNewMode =
-                    (int(SMESH_Actor::eEdges  ) * mode[1].toInt()) |
-                    (int(SMESH_Actor::eFaces  ) * mode[3].toInt()) |
-                    (int(SMESH_Actor::eVolumes) * mode[5].toInt());
-                  if (aNewMode != aMode)
-                    aSmeshActor->SetEntityMode(aNewMode);
+              int aEntityMode = SMESH_Actor::eAllEntity;
+              for ( int i = 0; i < mode.count(); i+=2 ) {
+                if ( i < mode.count()-1 ) {
+                  QString type = mode[i];
+                  bool val = mode[i+1].toInt();
+                  if      ( type == "e" && !val )
+                    aEntityMode = aEntityMode & ~SMESH_Actor::eEdges;
+                  else if ( type == "f" && !val )
+                    aEntityMode = aEntityMode & ~SMESH_Actor::eFaces;
+                  else if ( type == "v" && !val )
+                    aEntityMode = aEntityMode & ~SMESH_Actor::eVolumes;
+                  else if ( type == "0d" && !val )
+                    aEntityMode = aEntityMode & ~SMESH_Actor::e0DElements;
+                  else if ( type == "b" && !val )
+                    aEntityMode = aEntityMode & ~SMESH_Actor::eBallElem;
                 }
               }
+              aSmeshActor->SetEntityMode( aEntityMode );
             }
             // Colors
             else if (paramNameStr == "Colors") {
               QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts);
-              if (colors.count() == 16 || colors.count() == 18 ) {
-                if (colors[0] != "surface" || colors[4]  != "backsurface" ||
-                    (colors[8] != "edge" && colors[6] != "edge" ) || (colors[12] != "node" && colors[10] != "node") ||
-                    (colors.count() == 18 && colors[14] != "outline")) {
-                  MESSAGE("Invalid order of data in Colors, must be: "
-                          "surface:r:g:b:backsurface:r:g:b:edge:r:g:b:node:r:g:b or surface:r:g:b:backsurface:delta:edge:r:g:b:node:r:g:b:outline:r:g:b");
+              QColor nodeColor;
+              QColor edgeColor;
+              QColor faceColor;
+              QColor volumeColor;
+              QColor elem0dColor;
+              QColor ballColor;
+              QColor outlineColor;
+              QColor orientationColor;
+              int deltaF;
+              int deltaV;
+              QColor c;
+              double r, g, b;
+              bool bOk;
+              // below lines are required to get default values for delta coefficients
+              // of backface color for faces and color of reversed volumes
+              SMESH::GetColor( "SMESH", "fill_color",   c, deltaF, "0,170,255|-100" );
+              SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" );
+              for ( int i = 0; i < colors.count(); i++ ) {
+                QString type = colors[i];
+                if ( type == "surface" ) {
+                  // face color is set by 3 values r:g:b, where
+                  // - r,g,b - is rgb color components
+                  if ( i+1 >= colors.count() ) break;                  // format error
+                  r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
+                  if ( i+2 >= colors.count() ) break;                  // format error
+                  g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
+                  if ( i+3 >= colors.count() ) break;                  // format error
+                  b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
+                  faceColor.setRgbF( r, g, b );
+                  i += 3;
                 }
-                else {
-                  int delta = 0;
-                  float er,eg,eb;
-                  float nr,ng,nb;
-                  vtkFloatingPointType otr,otg,otb;
-                  //Old case backsurface color is independent
-                  if( colors.count() == 16 ) {
-                    QColor ffc;
-                    SMESH::GetColor( "SMESH", "fill_color", ffc, delta, "0,170,255|-100" ) ;
-                    er = colors[9].toFloat();
-                    eg = colors[10].toFloat();
-                    eb = colors[11].toFloat();
-
-                    nr = colors[13].toFloat();
-                    ng = colors[14].toFloat();
-                    nb = colors[15].toFloat();
-                    SMESH::GetColor("SMESH", "outline_color", otr, otg, otb, QColor( 0, 70, 0 ) );
-                  } else {
-                    //New case backsurface color depends on surface color
-                    delta = colors[5].toInt();
-
-                    er = colors[7].toFloat();
-                    eg = colors[8].toFloat();
-                    eb = colors[9].toFloat();
-
-                    nr = colors[11].toFloat();
-                    ng = colors[12].toFloat();
-                    nb = colors[13].toFloat();
-
-                    otr = colors[15].toFloat();
-                    otg = colors[16].toFloat();
-                    otb = colors[17].toFloat();
-                  }
-                  aSmeshActor->SetSufaceColor(colors[1].toFloat(), colors[2].toFloat(), colors[3].toFloat(), delta);
-                  aSmeshActor->SetEdgeColor(er,eg,eb);
-                  aSmeshActor->SetNodeColor(nr,ng,nb);
-                  aSmeshActor->SetOutlineColor(otr,otg,otb);
+                else if ( type == "backsurface" ) {
+                  // backface color can be defined in several ways
+                  // - in old versions, it is set as rgb triple r:g:b - this was is unsupported now
+                  // - in latest versions, it is set as delta coefficient
+                  bool rgbOk = false, deltaOk;
+                  if ( i+1 >= colors.count() ) break;                  // format error
+                  r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
+                  int delta = colors[i+1].toInt( &deltaOk );
+                  i++;                                 // shift index
+                  if ( i+1 < colors.count() )          // index is shifted to 1
+                    g = colors[i+1].toDouble( &rgbOk );
+                  if ( rgbOk ) i++;                    // shift index
+                  if ( rgbOk && i+1 < colors.count() ) // index is shifted to 2
+                    b = colors[i+1].toDouble( &rgbOk );
+                  if ( rgbOk ) i++;
+                  // - as currently there's no way to set directly backsurface color as it was before,
+                  // we ignore old dump where r,g,b triple was set
+                  // - also we check that delta parameter is set properly
+                  if ( !rgbOk && deltaOk )
+                    deltaF = delta;
+                }
+                else if ( type == "volume" ) {
+                  // volume color is set by 4 values r:g:b:delta, where
+                  // - r,g,b - is