]> SALOME platform Git repositories - modules/smesh.git/commitdiff
Salome HOME
Merge from V6_main (04/10/2012)
authorvsr <vsr@opencascade.com>
Mon, 8 Oct 2012 11:56:59 +0000 (11:56 +0000)
committervsr <vsr@opencascade.com>
Mon, 8 Oct 2012 11:56:59 +0000 (11:56 +0000)
176 files changed:
configure.ac
doc/salome/gui/SMESH/Makefile.am
doc/salome/gui/SMESH/collect_mesh_methods.py [new file with mode: 0755]
doc/salome/gui/SMESH/doxyfile_py.in
doc/salome/gui/SMESH/images/choose_geom_selection_way.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/colors_size.png
doc/salome/gui/SMESH/images/find_geom_by_mesh_elem.png [new file with mode: 0644]
doc/salome/gui/SMESH/images/point_marker_widget1.png
doc/salome/gui/SMESH/images/point_marker_widget2.png
doc/salome/gui/SMESH/images/show_bad_mesh.png [new file with mode: 0644]
doc/salome/gui/SMESH/input/about_meshes.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/cutting_quadrangles.doc
doc/salome/gui/SMESH/input/importing_exporting_meshes.doc
doc/salome/gui/SMESH/input/point_marker.doc
doc/salome/gui/SMESH/input/smeshpy_interface.doc
doc/salome/gui/SMESH/input/tui_cartesian_algo.doc
doc/salome/gui/SMESH/input/tui_defining_hypotheses.doc
doc/salome/gui/SMESH/input/tui_grouping_elements.doc
doc/salome/gui/SMESH/input/tui_quality_controls.doc
doc/salome/gui/SMESH/input/uniting_set_of_triangles.doc
idl/SMESH_Gen.idl
idl/SMESH_Hypothesis.idl
idl/SMESH_Mesh.idl
idl/SMESH_MeshEditor.idl
resources/SalomeApp.xml.in
resources/StdMeshers.xml
src/Controls/SMESH_Controls.cxx
src/Driver/Driver_Mesh.cxx
src/Driver/Driver_Mesh.h
src/Driver/Makefile.am
src/DriverCGNS/DriverCGNS_Write.cxx
src/DriverDAT/Makefile.am
src/DriverGMF/DriverGMF_Read.cxx [new file with mode: 0644]
src/DriverGMF/DriverGMF_Read.hxx [new file with mode: 0644]
src/DriverGMF/DriverGMF_Write.cxx [new file with mode: 0644]
src/DriverGMF/DriverGMF_Write.hxx [new file with mode: 0644]
src/DriverGMF/Makefile.am [new file with mode: 0644]
src/DriverGMF/SMESH_DriverGMF.hxx [new file with mode: 0755]
src/DriverGMF/libmesh5.c [new file with mode: 0644]
src/DriverGMF/libmesh5.h [new file with mode: 0644]
src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx
src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx
src/DriverMED/Makefile.am
src/DriverUNV/Makefile.am
src/DriverUNV/UNV164_Structure.cxx
src/Makefile.am
src/OBJECT/Makefile.am
src/OBJECT/SMESH_Actor.cxx
src/OBJECT/SMESH_Actor.h
src/OBJECT/SMESH_ActorDef.h
src/OBJECT/SMESH_DeviceActor.cxx
src/OBJECT/SMESH_DeviceActor.h
src/OBJECT/SMESH_Object.cxx
src/OBJECT/SMESH_SVTKActor.cxx [new file with mode: 0644]
src/OBJECT/SMESH_SVTKActor.h [new file with mode: 0644]
src/SMDS/SMDS_Downward.hxx
src/SMDS/SMDS_MeshNode.hxx
src/SMDS/SMDS_UnstructuredGrid.cxx
src/SMDS/SMDS_UnstructuredGrid.hxx
src/SMDS/SMDS_VolumeTool.cxx
src/SMDS/SMDS_VolumeTool.hxx
src/SMESH/Makefile.am
src/SMESH/SMESH_0D_Algo.cxx [deleted file]
src/SMESH/SMESH_0D_Algo.hxx [deleted file]
src/SMESH/SMESH_1D_Algo.cxx [deleted file]
src/SMESH/SMESH_1D_Algo.hxx [deleted file]
src/SMESH/SMESH_2D_Algo.cxx [deleted file]
src/SMESH/SMESH_2D_Algo.hxx [deleted file]
src/SMESH/SMESH_3D_Algo.cxx [deleted file]
src/SMESH/SMESH_3D_Algo.hxx [deleted file]
src/SMESH/SMESH_Algo.cxx
src/SMESH/SMESH_Algo.hxx
src/SMESH/SMESH_Gen.cxx
src/SMESH/SMESH_Gen.hxx
src/SMESH/SMESH_Group.cxx
src/SMESH/SMESH_Group.hxx
src/SMESH/SMESH_Hypothesis.cxx
src/SMESH/SMESH_Hypothesis.hxx
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_MesherHelper.hxx
src/SMESH/SMESH_subMesh.cxx
src/SMESH/SMESH_subMesh.hxx
src/SMESH/SMESH_subMeshEventListener.hxx
src/SMESHClient/Makefile.am
src/SMESHDS/SMESHDS_Document.hxx
src/SMESHDS/SMESHDS_Hypothesis.hxx
src/SMESHGUI/Makefile.am
src/SMESHGUI/SMESHGUI.cxx
src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx
src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx
src/SMESHGUI/SMESHGUI_ClippingDlg.cxx
src/SMESHGUI/SMESHGUI_ClippingDlg.h
src/SMESHGUI/SMESHGUI_ComputeDlg.cxx
src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx
src/SMESHGUI/SMESHGUI_ConvToQuadOp.h
src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx
src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx
src/SMESHGUI/SMESHGUI_ExtrusionDlg.h
src/SMESHGUI/SMESHGUI_FilterDlg.cxx
src/SMESHGUI/SMESHGUI_FilterDlg.h
src/SMESHGUI/SMESHGUI_GroupDlg.cxx
src/SMESHGUI/SMESHGUI_GroupOnShapeDlg.cxx
src/SMESHGUI/SMESHGUI_Hypotheses.cxx
src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx
src/SMESHGUI/SMESHGUI_MeshInfosBox.cxx
src/SMESHGUI/SMESHGUI_NodesDlg.cxx
src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx [deleted file]
src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h [deleted file]
src/SMESHGUI/SMESHGUI_PropertiesDlg.cxx [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_PropertiesDlg.h [new file with mode: 0644]
src/SMESHGUI/SMESHGUI_VTKUtils.cxx
src/SMESHGUI/SMESHGUI_XmlHandler.cxx
src/SMESHGUI/SMESH_msg_en.ts
src/SMESHGUI/SMESH_msg_fr.ts
src/SMESHUtils/SMESH_ComputeError.hxx
src/SMESH_I/Makefile.am
src/SMESH_I/SMESH_2smeshpy.cxx
src/SMESH_I/SMESH_2smeshpy.hxx
src/SMESH_I/SMESH_DumpPython.cxx
src/SMESH_I/SMESH_Gen_i.cxx
src/SMESH_I/SMESH_Gen_i.hxx
src/SMESH_I/SMESH_Hypothesis_i.cxx
src/SMESH_I/SMESH_Hypothesis_i.hxx
src/SMESH_I/SMESH_MeshEditor_i.cxx
src/SMESH_I/SMESH_MeshEditor_i.hxx
src/SMESH_I/SMESH_MeshPartDS.hxx [new file with mode: 0644]
src/SMESH_I/SMESH_Mesh_i.cxx
src/SMESH_I/SMESH_Mesh_i.hxx
src/SMESH_I/SMESH_PreMeshInfo.cxx
src/SMESH_SWIG/Makefile.am
src/SMESH_SWIG/StdMeshersDC.py
src/SMESH_SWIG/smesh.py
src/SMESH_SWIG/smeshDC.py
src/SMESH_SWIG/smesh_algorithm.py [new file with mode: 0644]
src/SMESH_SWIG_WITHIHM/libSMESH_Swig.cxx
src/SMESH_SWIG_WITHIHM/libSMESH_Swig.h
src/SMESH_SWIG_WITHIHM/libSMESH_Swig.i
src/StdMeshers/StdMeshers_Cartesian_3D.cxx
src/StdMeshers/StdMeshers_Cartesian_3D.hxx
src/StdMeshers/StdMeshers_CompositeHexa_3D.hxx
src/StdMeshers/StdMeshers_HexaFromSkin_3D.hxx
src/StdMeshers/StdMeshers_Hexa_3D.hxx
src/StdMeshers/StdMeshers_Import_1D.cxx
src/StdMeshers/StdMeshers_Import_1D.hxx
src/StdMeshers/StdMeshers_Import_1D2D.hxx
src/StdMeshers/StdMeshers_MEFISTO_2D.cxx
src/StdMeshers/StdMeshers_MEFISTO_2D.hxx
src/StdMeshers/StdMeshers_Penta_3D.hxx
src/StdMeshers/StdMeshers_Prism_3D.hxx
src/StdMeshers/StdMeshers_ProjectionUtils.cxx
src/StdMeshers/StdMeshers_Projection_1D.hxx
src/StdMeshers/StdMeshers_Projection_1D2D.cxx
src/StdMeshers/StdMeshers_Projection_2D.cxx
src/StdMeshers/StdMeshers_Projection_2D.hxx
src/StdMeshers/StdMeshers_Projection_3D.cxx
src/StdMeshers/StdMeshers_Projection_3D.hxx
src/StdMeshers/StdMeshers_QuadToTriaAdaptor.cxx
src/StdMeshers/StdMeshers_Quadrangle_2D.hxx
src/StdMeshers/StdMeshers_RadialPrism_3D.hxx
src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx
src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.hxx
src/StdMeshers/StdMeshers_Regular_1D.cxx
src/StdMeshers/StdMeshers_Regular_1D.hxx
src/StdMeshers/StdMeshers_SegmentAroundVertex_0D.hxx
src/StdMeshers/StdMeshers_UseExisting_1D2D.hxx
src/StdMeshers/StdMeshers_ViscousLayers.cxx
src/StdMeshersGUI/StdMeshersGUI_CartesianParamCreator.cxx
src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx
src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx

index 20278673661a9843707dbd08348ed5bd5fbc58d5..51899e35e1e63be7c097f3ba3b628800d9c9f16f 100644 (file)
@@ -553,6 +553,7 @@ AC_OUTPUT([ \
   src/DriverMED/Makefile \
   src/DriverSTL/Makefile \
   src/DriverUNV/Makefile \
+  src/DriverGMF/Makefile \
   src/DriverCGNS/Makefile \
   src/MEFISTO2/Makefile \
   src/OBJECT/Makefile \
index cc3ddb25155e64ff5e38d01cbc7aa4b6c3a13495..5b3adb2fbcf76e9c9430128cb6e0f7d3f6881fbb 100755 (executable)
@@ -26,25 +26,26 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 EXTRA_DIST += images input static/footer.html static/doxygen.css
 
+dist_salomescript_PYTHON = collect_mesh_methods.py
+
 guidocdir = $(docdir)/gui/SMESH
 guidoc_DATA = images/head.png
 
+DOC_PYTHONPATH=$(prefix)/bin/salome:$(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)/lib/python$(PYTHON_VERSION)/site-packages:$(OMNIORB_ROOT)/lib64/python$(PYTHON_VERSION)/site-packages
+DOC_SMESH_MeshersList=StdMeshers
+
+# to have smesh.py in the documentation instead of smeshDC.py
+# we create dummy smesh.py from the smeshDC.py
+smesh.py: ../../../../src/SMESH_SWIG/smeshDC.py
+       @awk '/^class Mesh:/ { mesh_found=1 } // { if (mesh_found) {print $$0; next} } /^ +(def|#)/ { match( $$0, /^ +/); print substr( $$0, 1+RLENGTH ); next } /^class smeshDC/ { next } //' \
+         $< > $@
+
+tmp/smesh.py: $(top_srcdir)/src/SMESH_SWIG/StdMeshersDC.py $(srcdir)/collect_mesh_methods.py
+       @mkdir -p tmp && PYTHONPATH=$(DOC_PYTHONPATH):${PYTHONPATH} SMESH_MeshersList=$(DOC_SMESH_MeshersList) $(PYTHON) $(srcdir)/collect_mesh_methods.py -o $@ StdMeshers
 
-usr_docs: doxyfile_py doxyfile 
-       echo "===========================================" ;                    \
-       echo "Replacing smeshDC by smesh" ;                                     \
-       echo "===========================================" ;                    \
-       awk '/^class Mesh:/ { mesh_found=1 } // { if (mesh_found) {print $$0; next} } /^ +(def|#)/ { match( $$0, /^ +/); print substr( $$0, 1+RLENGTH ); next } /^class smeshDC/ { next } //' \
-         $(top_srcdir)/src/SMESH_SWIG/smeshDC.py > ./smesh.py ;                \
-       echo "===========================================" ;                    \
-       echo "Generating Python interface documentation";                       \
-       echo "===========================================" ;                    \
-       $(DOXYGEN) doxyfile_py ;                                                \
-       echo "===========================================" ;                    \
-       echo "Generating GUI documentation" ;                                   \
-       echo "===========================================" ;                    \
-       $(DOXYGEN) doxyfile ;                                                   \
-       rm -f ./smesh.py
+usr_docs: doxyfile_py doxyfile smesh.py tmp/smesh.py
+       @$(DOXYGEN) doxyfile_py ;                                               \
+       $(DOXYGEN) doxyfile
 
 docs: usr_docs
 
diff --git a/doc/salome/gui/SMESH/collect_mesh_methods.py b/doc/salome/gui/SMESH/collect_mesh_methods.py
new file mode 100755 (executable)
index 0000000..24fd318
--- /dev/null
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+#################################################################################
+#
+# File:   collect_mesh_methods.py
+# Author: Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com)
+#
+#################################################################################
+#
+# Extraction of the meshing algorithm classes
+# dynamically added by the plug-in to the Mesh
+# class.
+# 
+# This script is intended for internal usage - only
+# for generatation of the extra developer documentation for
+# the meshing plug-in(s).
+# 
+# Usage:
+#       collect_mesh_methods.py <plugin_name>
+# where
+#   <plugin_name> is a name of the plug-in module
+#
+# Notes:
+# - the script is supposed to be run in correct environment
+# i.e. PYTHONPATH, SMESH_MeshersList and other important
+# variables are set properly; otherwise the script will fail.
+#
+################################################################################
+
+import sys
+
+def main(plugin, dummymeshhelp = True, output_file = "smesh.py"):
+    plugin_module = plugin + "DC"
+    try:
+        mod = __import__(plugin_module)
+        methods = {}
+        for attr in dir( mod ):
+            if attr.startswith( '_' ): continue
+            algo = getattr( mod, attr )
+            if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod" ):
+                method = getattr( algo, "meshMethod" )
+                if method not in methods: methods[ method ] = []
+                methods[ method ].append( algo )
+                pass
+            pass
+        if methods:
+            output = []
+            if dummymeshhelp:
+                output.append( "## @package smesh" )
+                output.append( "#  Documentation of the methods dynamically added by the " + plugin + " meshing plug-in to the Mesh class." )
+                output.append( "" )
+                pass
+            output.append( "## This class allows defining and managing a mesh." )
+            output.append( "#" )
+            if dummymeshhelp:
+                # Add dummy Mesh help
+                # This is supposed to be done when generating documentation for meshing plug-ins
+                output.append( "#  @note The documentation below does not provide complete description of class @b %Mesh" )
+                output.append( "#  from @b %smesh.py package. This documentation provides only information about" )
+                output.append( "#  the methods dynamically added to the %Mesh class by the " + plugin + " plugin" )
+                output.append( "#  For more details on the %Mesh class, please refer to the SALOME %Mesh module" )
+                output.append( "#  documentation." )
+                pass
+            else:
+                # Extend documentation for Mesh class with information about dynamically added methods.
+                # This is supposed to be done only when building documentation for SMESH module
+                output.append( "#  @note Some methods are dynamically added to the @b %Mesh class in runtime by meshing " )
+                output.append( "#  plug-in modules. If you fail to find help on some methods in the documentation of SMESH module, " )
+                output.append( "#  try to look into the documentation for the meshing plug-ins." )
+                pass
+            output.append( "class Mesh:" )
+            for method in methods:
+                docHelper = ""
+                for algo in methods[ method ]:
+                    if hasattr( algo, "docHelper" ): docHelper = getattr( algo, "docHelper" )
+                    if docHelper: break
+                    pass
+                if not docHelper: docHelper = "Creates new algorithm."
+                output.append( " ## %s" % docHelper )
+                output.append( " #" )
+                output.append( " #  This method is dynamically added to %Mesh class by the meshing plug-in(s). " )
+                output.append( " #" )
+                output.append( " #  If the optional @a geom_shape parameter is not set, this algorithm is global (applied to whole mesh)." )
+                output.append( " #  Otherwise, this algorithm defines a submesh based on @a geom_shape subshape." )
+                output.append( " #  @param algo_type type of algorithm to be created; allowed values are specified by classes implemented by plug-in (see below)" )
+                output.append( " #  @param geom_shape if defined, the subshape to be meshed (GEOM_Object)" )
+                output.append( " #  @return An instance of Mesh_Algorithm sub-class according to the specified @a algo_type, see " )
+                output.append( " #  %s" % ", ".join( [ "%s.%s" % ( plugin_module, algo.__name__ ) for algo in methods[ method ] ] ) )
+                output.append( " def %s(algo_type, geom_shape=0):" % method )
+                output.append( "   pass" )
+                pass
+            f = open(output_file, "w")
+            for line in output: f.write( line + "\n" )
+            f.close()
+            pass
+        pass
+    except Exception, e:
+        print e
+        pass
+    pass
+    
+if __name__ == "__main__":
+    import optparse
+    parser = optparse.OptionParser(usage="%prog [options] plugin")
+    h  = "Output file (smesh.py by default)"
+    parser.add_option("-o", "--output", dest="output",
+                      action="store", default=None, metavar="file",
+                      help=h)
+    h  = "If this option is True, dummy help for Mesh class is added. "
+    h += "This option should be False (default) when building documentation for SMESH module "
+    h += "and True when building documentation for meshing plug-ins."
+    parser.add_option("-d", "--dummy-mesh-help", dest="dummymeshhelp",
+                      action="store_true", default=False,
+                      help=h)
+    (options, args) = parser.parse_args()
+
+    if len( args ) < 1: sys.exit("Plugin name is not specified")
+    main( args[0], options.dummymeshhelp, options.output )
+    pass
index 19e21b96ec198ad2784ad4a63dad853128e23138..da25d092b2ea65ee3521a584baeee0df72d6b7ab 100755 (executable)
@@ -99,7 +99,10 @@ EXAMPLE_RECURSIVE      = NO
 #---------------------------------------------------------------------------
 #Input related options
 #---------------------------------------------------------------------------
-INPUT             = smesh.py @top_srcdir@/src/SMESH_SWIG/StdMeshersDC.py
+INPUT             = smesh.py \
+                    @top_srcdir@/src/SMESH_SWIG/smesh_algorithm.py \
+                    @top_srcdir@/src/SMESH_SWIG/StdMeshersDC.py \
+                    tmp/smesh.py
 FILE_PATTERNS     = 
 IMAGE_PATH        = @srcdir@/images
 RECURSIVE         = NO
@@ -132,24 +135,24 @@ GENERATE_RTF      = NO
 #---------------------------------------------------------------------------
 CLASS_DIAGRAMS         = NO
 HIDE_UNDOC_RELATIONS   = NO
-HAVE_DOT               = NO
-CLASS_GRAPH            = NO
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
 COLLABORATION_GRAPH    = NO
 GROUP_GRAPHS           = NO
 UML_LOOK               = NO
-TEMPLATE_RELATIONS     = NO
-INCLUDE_GRAPH          = NO
-INCLUDED_BY_GRAPH      = NO
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
 CALL_GRAPH             = NO
-GRAPHICAL_HIERARCHY    = NO
-DIRECTORY_GRAPH        = NO
-DOT_IMAGE_FORMAT       = jpg
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
 DOT_FONTNAME           = Arial
 DOT_PATH               = 
 DOTFILE_DIRS           = 
 MAX_DOT_GRAPH_WIDTH    = 1024
-MAX_DOT_GRAPH_HEIGHT   = 1200
-MAX_DOT_GRAPH_DEPTH    = 0
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 1000
 DOT_TRANSPARENT        = NO
 DOT_MULTI_TARGETS      = NO
 GENERATE_LEGEND        = NO
diff --git a/doc/salome/gui/SMESH/images/choose_geom_selection_way.png b/doc/salome/gui/SMESH/images/choose_geom_selection_way.png
new file mode 100644 (file)
index 0000000..ffee00d
Binary files /dev/null and b/doc/salome/gui/SMESH/images/choose_geom_selection_way.png differ
index 15060edfef697143200dba9de8c262936adb2ebb..213652e79922998e425c972ce5a860a7d4f36edd 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/colors_size.png and b/doc/salome/gui/SMESH/images/colors_size.png differ
diff --git a/doc/salome/gui/SMESH/images/find_geom_by_mesh_elem.png b/doc/salome/gui/SMESH/images/find_geom_by_mesh_elem.png
new file mode 100644 (file)
index 0000000..d71495e
Binary files /dev/null and b/doc/salome/gui/SMESH/images/find_geom_by_mesh_elem.png differ
index 13b8e6dab33764fef3c125991f07fe5234819bc7..3d788cd96016dfad57a445ad28016ee9955b6ea9 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/point_marker_widget1.png and b/doc/salome/gui/SMESH/images/point_marker_widget1.png differ
index dbb81b40e5c958d24445a250c540fc82b959a277..d44f3888fb2b59a0d422598a2ef2a0abb3d481f7 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/point_marker_widget2.png and b/doc/salome/gui/SMESH/images/point_marker_widget2.png differ
diff --git a/doc/salome/gui/SMESH/images/show_bad_mesh.png b/doc/salome/gui/SMESH/images/show_bad_mesh.png
new file mode 100644 (file)
index 0000000..17dfb38
Binary files /dev/null and b/doc/salome/gui/SMESH/images/show_bad_mesh.png differ
index 7474e0f62424458d96beff79accac29676926db9..411fc30b55728aa7a436d4fa71540caa326826b7 100644 (file)
@@ -5,14 +5,16 @@
 \n \b MESH represents a discretization of a geometrical CAD model into
 a set of entities with a simple topology. 
 
-Meshes are stored in DAT, MED, UNV, STL, CGNS and SAUVE formats and can be
+Meshes are stored in DAT, MED, UNV, STL, CGNS, GMF and SAUVE formats and can be
 \subpage importing_exporting_meshes_page "imported from and exported to"
  the file in these formats.
 
 It is possible to \subpage constructing_meshes_page "construct meshes" 
 on the basis of geometrical shapes produced in the GEOM module.
-It is also possible to \subpage constructing_submeshes_page "mesh on a part of the geometrical object", 
-for example, a face, with different meshing parameters than the whole mesh.
+It is also possible to \subpage constructing_submeshes_page "construct
+mesh on a part of the geometrical object", for example, a face, with
+different meshing parameters than the whole mesh.
+
 
 Several created meshes can be \subpage building_compounds_page "combined into another mesh".
 
index f953b37c671d9cd639204ff61756325ac126115b..c0953ff09d6aed9961a6bb52ca5acda29b338541 100644 (file)
@@ -4,34 +4,48 @@
 
 \image html colors_size.png
 
-Using this dialog you can define the following set of mesh visualization
-parameters:
-<ul>
-<li><b>Elements</b></li>
-<ul>
-<li><b>Surface color</b> - surface color of elements (seen in Shading mode).</li>
-<li><b>Back surface color</b> - interior surface color of elements. Use slider to select this color 
-generated on base of the <b>Surface color</b> by changing its brightness and saturation.</li>
-<li><b>Outline color</b> - color of element borders.</li>
-<li><b>Wireframe color</b> - color of element borders in wireframe mode.</li>
-<li><b>0D slements</b> - color of 0D elements.</li>
-<li><b>Size of 0D slements</b> - size of 0D elements.</li>
-<li><b>Line width</b> - width of lines (edges and borders of elements).</li>
-<li><b>Shrink coef.</b> - relative space of elements compared to gaps between
-       them in shrink mode.</li>
-</ul>
-<li><b>Nodes</b></li>
-<ul>
-<li><b>Color</b> - color of nodes.</li>
-<li><b>Marker</b> - group of options allowing to change the representation of
-       points (see \subpage point_marker_page "Point Marker" page).</li>
-</ul>
-<li><b>Orientation of faces</b></li>
-<ul>
-<li><b>Color</b> - color of orientation vertors.</li>
-<li><b>Scale</b> - size of orientation vectors.</li>
-<li><b>3D vectors</b> - allows to choose between 2D planar and 3D vectors.</li>
-</ul>
-</ul>
+Using this dialog you can customize different properties of the mesh visualization
+parameters.
+
+The GUI elements in the "Properties" dialog box are grouped according
+to the entity types of mesh data. If some data entities are not
+present in the mesh object, the corresponding GUI elements are not
+shown.
+
+- \b Nodes:
+  - \b Color - color of nodes.
+  - \b Type and \b Scale - these options allow changing of the nodes
+    representation (see \subpage point_marker_page "Point Marker" page
+    for more details).
+- <b>Edges / wireframe</b>:
+  - \b Color - color of element borders in wireframe mode.
+  - \b Width - width of lines (edges and borders of elements
+    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
+    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
+    changing its brightness and saturation. 
+- \b Outlines:
+  - \b Color - color of element borders in shading mode.
+  - \b Width - width of outlines (borders of elements
+    in shading mode).
+- <b>0D elements</b>:
+  - \b Color - color of 0D elements.
+  - \b Size - size of 0D elements.
+- \b Balls:
+  - \b Color - color of discrete ball elements.
+  - \b Size - size of discrete ball elements.
+- <b>Orientation vectors</b>:
+  - \b Color - color of orientation vectors.
+  - \b Scale - size of orientation vectors.
+  - <b>3D vectors</b> - allows to choose between 2D planar and 3D vectors.
+- <b>Shrink coef.</b> - relative space of elements compared to gaps between
+  them in shrink mode.
 
 */
index adf63c6a1505385e6c706af72a77c28d58389ddd..23349d0c154d6580aba2f28cd25b7e7f55e564e6 100644 (file)
@@ -34,6 +34,27 @@ written in Python.
     \subpage about_hypo_page "hypotheses" which will be used at computation of
     this mesh.
 
+    "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
+    that affect 3D geometrical objects (solids).
+
+    \note
+    - 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,
+    \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
+    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).
+
     For example, you need to mesh a 3D object.
 
     First, type the name for your mesh in the \b Name box, by default,
@@ -284,6 +305,11 @@ 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).
 
+\image html show_bad_mesh.png
+<em>Too close nodes causing meshing failure are shown in magenta using <b>Show
+    bad Mesh</b> button</em>
+<br><br>
+
 \anchor use_existing_anchor
 <h2>"Use existing edges" and "Use existing faces" algorithms</h2>
 
index f300d6f50e125a426e201beabb7fb09452c6b277..9f6254cb2f21de45f05494dc1c16618e077c5337 100644 (file)
@@ -36,12 +36,15 @@ at computation of this sub-mesh</li>
 From the \b Mesh menu select <b>Create Sub-mesh</b> or click <em>"Create
 Sum-mesh"</em> button in the toolbar.
 
-\image html image33.gif
-<center><em>"Create Sub-mesh" button</em></center>
+<center>
+  \image html image33.gif
+  <em>"Create Sub-mesh" button</em>
+</center>
 
 \par
 The following dialog box will appear:
 
+\par
 \image html createmesh-inv2.png
 
 \par
@@ -50,6 +53,33 @@ Geometry (e.g. a face if the parent mesh has been built on box) of the
 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 
+\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
+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
+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.
+
+\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.
+
+
 \par
 In the Object Browser the structure of the new sub-mesh will be
 displayed as follows:
index cbc4128557c5ab8ab06ac8edd3c04cc8b447711a..2865835a582bcf73c119607f044811dca0c1c6b8 100644 (file)
@@ -8,7 +8,7 @@ corners.
 
 <em>To cut quadrangles:</em>
 <ol>
-<li>Display a mesh or a submesh in the 3D viewer.</li>
+<li>Display a mesh or a sub-mesh in the 3D viewer.</li>
 <li>In the \b Modification menu select the <b>Cutting of quadrangles</b> item or
 click <em>"Cutting of quadrangles"</em> button in the toolbar.
 
@@ -29,7 +29,7 @@ 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
-quadrangles of the currently displayed mesh or submesh.</li>
+quadrangles of the currently displayed mesh or sub-mesh.</li>
 <li>\b Preview - provides a preview of cutting in the viewer.</li>
 </ul>
 
@@ -39,12 +39,11 @@ quadrangles of the currently displayed mesh or submesh.</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 apply the operation only to
-those objects which meet the chosen criterion (from the list of
-Quality Controls, i.e. Skew, Warping, Minimum Angle, etc.)</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>
 </ul>
 </li>
-<li><b>Select from</b> - allows to choose a submesh or an existing
+<li><b>Select from</b> - allows to choose a sub-mesh or an existing
 group whose quadrangle elements will be automatically added to the
 list.</li>
 </ul>
@@ -60,4 +59,4 @@ list.</li>
 <br><b>See Also</b> a sample TUI Script of a 
 \ref tui_cutting_quadrangles "Cutting Quadrangles" operation.  
 
-*/
\ No newline at end of file
+*/
index 52ff261e3369b7ab05245de380fa92049d434aa9..7c8eeb79024bb14acb97267fc0d1194b23431d00 100644 (file)
@@ -3,15 +3,15 @@
 \page importing_exporting_meshes_page Importing and exporting meshes
 
 \n In MESH there is a functionality allowing importation/exportation
-of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (Nastran), \b STL
-and \b CGNS format files. You can also export a group as a whole mesh.
+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.
 
 
 <em>To import a mesh:</em>
 
 <ol>
 <li>From the \b File menu choose the \b Import item, from its sub-menu
-select the corresponding format (MED, UNV, DAT, STL and CGNS) of the file containing
+select the corresponding format (MED, UNV, STL, GMF and CGNS) of the file containing
 your mesh.</li>
 <li>In the standard <b>Search File</b> dialog box find the file for
 importation. It is possible to select multiple files to be imported all at once. </li>
@@ -26,7 +26,7 @@ importation. It is possible to select multiple files to be imported all at once.
 <ol>
 <li>Select the object you wish to export.</li>
 <li>From the \b File menu choose the \b Export item, from its sub-menu
-select the format (MED, UNV, DAT, STL and CGNS) of the file which will
+select the format (MED, UNV, DAT, STL, GMF and CGNS) of the file which will
 contain your exported mesh.</li>
 <li>In the standard <b>Search File</b> select a location for the
 exported file and enter its name.</li>
index 40c2b932bb79df041cb3bce4acb0da74ad0aaa5d..0a7b88e3bc05320f163dfb5e37e17c9c3b05fa5b 100644 (file)
@@ -33,14 +33,14 @@ lines in the file. Note that missing symbols are replaced by "0".
 Here is a texture file sample:
 
 <pre>
-00111100
-00111100
 11111111
+10000001
+10011001
+10111101
+10111101
+10011001
+10000001
 11111111
-11111111
-11111111
-00111100
-00111100
 </pre>
 
 \image html point_marker_widget2.png
index e725ef99cf237c4d8d012ac6cd3f0752efb768f4..29ff056b79125addfb5905f84be623cdbc22be15 100644 (file)
@@ -2,44 +2,37 @@
 
 \page smeshpy_interface_page Python interface
 
-Python package smesh defines several classes, destined for easy and
-clear mesh creation and edition.
+Python API for SALOME %Mesh module defines several classes that can
+be used for easy mesh creation and edition.
 
-Documentation for smesh package is available in two forms:
-
-The <a href="smeshpy_doc/modules.html"> structured
-documentation for smesh package</a>, where all methods and
+Documentation for SALOME %Mesh module Python API is available in two forms:
+- <a href="smeshpy_doc/modules.html">Structured documentation</a>, where all methods and
 classes are grouped by their functionality, like it is done in the GUI documentation
-and the \ref smeshDC "linear documentation for smesh package"
-grouped only by classes, declared in the smesh.py file.
-
-The main page of the \ref smeshDC "linear documentation for smesh package"
-contains a list of data structures and a list of
-functions, provided by the package smesh.py. The first item in
-the list of data structures (\ref smeshDC::smeshDC "class smesh")
-also represents documentation for the methods of the package smesh.py itself.
+- <a href="smeshpy_doc/namespaces.html">Linear documentation</a> grouped only by classes, declared
+in the \ref smesh and StdMeshersDC Python packages.
 
-The package smesh.py provides an interface to create and handle
-meshes. Use it to create an empty mesh or to import it from the data file.
+Python package \ref smesh provides an interface to create and handle
+meshes. It can be used to create an empty mesh or to import mesh from the data file.
 
-Once a mesh has been created, it is possible to  manage it via its own
-methods, described at \ref smeshDC::Mesh "class Mesh" documentation
-(it is also accessible by the second item "class Mesh" in the list of data structures).
+As soon as mesh is created, it is possible to manage it via its own
+methods, described in \ref smesh.Mesh "class Mesh" documentation.
 
-Class \b Mesh allows assigning algorithms to a mesh.
-Please note, that some algorithms, included in the standard SALOME
-distribution are always available:
+Class \ref smesh.Mesh "Mesh" allows assigning algorithms to a mesh.
+Please note that some algorithms, included in the standard SALOME
+distribution are always available. Python package \ref StdMeshersDC
+provides an interface for standard meshing algorithms included into
+the SALOME %Mesh module distribution, like:
 - REGULAR (1D)
 - COMPOSITE (1D)
 - MEFISTO (2D)
 - Quadrangle (2D)
 - Hexa(3D)
-- etc...
+- etc ...
 
-To add hypotheses, use the interfaces, provided by the assigned
-algorithms.
+To add meshing hypotheses, it is possible to use the functions provided by the
+algorithms interfaces.
 
-Below you can see an example of usage of the package smesh for 3d mesh generation. 
+An example below demonstrates usage of the Python API for 3d mesh generation. 
 
 \anchor example_3d_mesh
 <h2>Example of 3d mesh generation:</h2>
@@ -118,7 +111,7 @@ tetra.Group(group)
 
 \endcode
 
-Examples of Python scripts for all Mesh operations are available by
+Examples of Python scripts for Mesh operations are available by
 the following links:
 
 - \subpage tui_creating_meshes_page
index f1218439b689e7882f37c047c81c3a4364867cb0..3eb7f0fe2f16756effd5dcdb397534fe95c4c3b4 100644 (file)
@@ -25,7 +25,7 @@ print "nb tetrahedra",mesh.NbTetras()
 print "nb polyhedra",mesh.NbPolyhedrons()
 print
 
-# define the grid by sitting constant spacing
+# define the grid by setting constant spacing
 cartHyp = cartAlgo.SetGrid( "10","10","10", 1000000)
 
 mesh.Compute()
@@ -34,9 +34,9 @@ print "nb tetrahedra",mesh.NbTetras()
 print "nb polyhedra",mesh.NbPolyhedrons()
 
 
-# define the grid by sitting different spacing in 2 sub-ranges of geometry
+# define the grid by setting different spacing in 2 sub-ranges of geometry
 spaceFuns = ["5","10+10*t"]
-cartAlgo.SetGrid( [spaceFuns, [0.5]], [spaceFuns, [0.5]], [spaceFuns, [0.25]], 2 )
+cartAlgo.SetGrid( [spaceFuns, [0.5]], [spaceFuns, [0.5]], [spaceFuns, [0.25]], 10 )
 
 mesh.Compute()
 print "nb hexahedra",mesh.NbHexas()
index e98eca6b4ec10dc5f73f9c9a1b48328b6a19db08..d9e2b31f9cc56400922037e515cb0fbe7d7743de 100644 (file)
@@ -2,11 +2,48 @@
 
 \page tui_defining_hypotheses_page Defining Hypotheses and Algorithms
 
+This page provides example codes of \ref tui_defining_meshing_algos
+"defining algorithms" and hypotheses. 
+<ul>
+<li>Wire discretisation 1D algorithm
+  <ul>
+    <li>\ref tui_1d_arithmetic "Arithmetic 1D" hypothesis</li>
+    <li>\ref tui_deflection_1d "Deflection 1D and Number of Segments" hypotheses</li>
+    <li>\ref tui_start_and_end_length "Start and End Length" hypotheses</li>
+    <li>\ref tui_average_length "Local Length"</li>
+    <li>\ref tui_propagation "Propagation" additional hypothesis </li>
+    <li>\ref tui_fixed_points "Fixed Points 1D" hypothesis</li>
+  </ul>
+</li>
+<li>Triangle (Mefisto) 2D algorithm
+  <ul>
+    <li>\ref tui_max_element_area "Max Element Area" hypothesis </li>
+    <li>\ref tui_length_from_edges "Length from Edges"
+    hypothesis </li>
+  </ul>
+</li>
+<li>Tetrahedron (Netgen) 3D algorithm
+  <ul>
+    <li> \ref tui_max_element_volume "Max. Element Volume"hypothesis </li>
+    <li> \ref tui_viscous_layers "Viscous layers"</li>
+  </ul>
+</li>
+<li>\ref tui_projection "Projection Algorithms"</li>
+<li>\ref tui_radial_quadrangle "Radial Quadrangle 1D2D" algorithm</li>
+<li>Quadrangle (Mapping) 2D algorithm
+  <ul>
+    <li> \ref tui_quadrangle_parameters "Quadrangle Parameters" hypothesis </li>
+  </ul>
+</li>
+<li>\ref tui_import "Use Existing Elements" algorithm</li>
+</ul>
+<br>
+
 <h2>Defining 1D Hypotheses</h2>
 
 <br>
 \anchor tui_1d_arithmetic
-<h3>1D Arithmetic</h3>
+<h3>Arithmetic 1D</h3>
 
 \code
 import geompy
@@ -457,6 +494,40 @@ src_mesh.TranslateObject( src_mesh, MakeDirStruct( 210, 0, 0 ), Copy=False)
 
 \endcode
 
+<h3>Projection 1D2D</h3>
+
+\code
+# Project triangles from one meshed face to another mesh on the same box
+
+from smesh import *
+
+# Prepare geometry
+
+# Create a box
+box = geompy.MakeBoxDXDYDZ(100, 100, 100)
+
+# Get geom faces to mesh with triangles in the 1ts and 2nd meshes
+faces = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
+# 2 adjacent faces of the box
+Face_1 = faces[2]
+Face_2 = faces[0]
+
+geompy.addToStudy( box, 'box' )
+geompy.addToStudyInFather( box, Face_1, 'Face_1' )
+geompy.addToStudyInFather( box, Face_2, 'Face_2' )
+
+# Make the source mesh with Netgem2D
+src_mesh = Mesh(Face_1, "Source mesh")
+src_mesh.Segment().NumberOfSegments(15)
+src_mesh.Triangle()
+src_mesh.Compute()
+
+# Mesh the target mesh using the algoritm Projection1D2D
+tgt_mesh = smesh.Mesh(Face_2, "Target mesh")
+tgt_mesh.Projection1D2D().SourceFace(Face_1,src_mesh)
+tgt_mesh.Compute()
+\endcode
+
 <br>
 
 \anchor tui_fixed_points
index a163d13f5891cd4f35f334b09c3c447d35c7e665..3b769060a0599551902f575523467b7573c2b5a2 100644 (file)
@@ -98,23 +98,23 @@ critaria = [ \
     ]
 filt = GetFilterFromCriteria( critaria )
 filtGroup = mesh.GroupOnFilter( FACE, "group on filter", filt )
-print "Group on filter conatains %s elemens" % filtGroup.Size()
+print "Group on filter contains %s elemens" % filtGroup.Size()
 
 # group on filter is updated if the mesh is modified
 hyp1D.SetStartLength( 2.5 )
 hyp1D.SetEndLength( 2.5 )
 mesh.Compute()
-print "After mesh change, group on filter conatains %s elemens" % filtGroup.Size()
+print "After mesh change, group on filter contains %s elemens" % filtGroup.Size()
 
 # set a new filter defining the group
 filt2 = GetFilter( FACE, FT_RangeOfIds, "1-50" )
 filtGroup.SetFilter( filt2 )
-print "With a new filter, group on filter conatains %s elemens" % filtGroup.Size()
+print "With a new filter, group on filter contains %s elemens" % filtGroup.Size()
 
 # group is updated at modification of the filter
 filt2.SetCriteria( [ GetCriterion( FACE, FT_RangeOfIds, "1-70" )])
 filtIDs3 = filtGroup.GetIDs()
-print "After filter modification, group on filter conatains %s elemens" % filtGroup.Size()
+print "After filter modification, group on filter contains %s elemens" % filtGroup.Size()
 
 salome.sg.updateObjBrowser(1)
 \endcode
index bc99172aaec77fceb5ec25b114f2eb7d1caf1939..2991eb521fe8b6116ec834492b5799460137234b 100644 (file)
@@ -164,8 +164,8 @@ mesh.RemoveElements(anIds)
 aBorders = mesh.GetFreeBorders() 
 
 # create groups
-aGroupF = mesh.CreateGroup(SMESH.FACE, "Faces with free edges")
-aGroupN = mesh.CreateGroup(SMESH.NODE, "Nodes on free edges")
+aGroupF = mesh.CreateEmptyGroup(smesh.FACE, "Faces with free edges")
+aGroupN = mesh.CreateEmptyGroup(smesh.NODE, "Nodes on free edges")
 
 # fill groups with elements, corresponding to the criterion
 print ""
index bcf1531192c313aea60032a1f29b5b66b348116c..74e2ab2cd0626b5a569719c7c1e8a6a33218459b 100644 (file)
@@ -7,7 +7,7 @@ once many triangles if they have adjacent edges.
 
 <em>To union several triangles:</em>
 <ol>
-<li>Display a mesh or a submesh in the 3D viewer.</li>
+<li>Display a mesh or a sub-mesh in the 3D viewer.</li>
 <li>In the \b Modification menu select the <b>Union of triangles</b>
 item or click <em>"Union of triangles"</em> button in the toolbar.
 
@@ -27,11 +27,10 @@ elements from the list click the \b Remove button. The \b Sort button allows
 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 submesh.</li>
-<li>\b Criterion menu allows to apply the operation only to those
-object which meet the chosen criterion (from the list of Quality
-Controls, i.e. Skew, Warping, Minimum Angle, etc.)</li>
-<li><b>Select from</b> set of fields allows to choose a submesh or an
+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>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>
 </ul>
index f6e9f89adb4a842a1e94907e9249353c52121fd9..b8d3176f2c7d32e12eb66350aff58329f8d552ae 100644 (file)
@@ -101,7 +101,8 @@ module SMESH
     COMPERR_ALGO_FAILED   ,  // computation failed
     COMPERR_BAD_SHAPE     ,  // bad geometry
     COMPERR_WARNING       ,  // algo reports error but sub-mesh is computed anyway
-    COMPERR_CANCELED         // compute canceled
+    COMPERR_CANCELED      ,  // compute canceled
+    COMPERR_NO_MESH_ON_SHAPE // no mesh elements assigned to sub-mesh
   };
   struct ComputeError
   {
@@ -237,6 +238,13 @@ module SMESH
                                      out SMESH::DriverMED_ReadStatus theStatus )
       raises ( SALOME::SALOME_Exception );
 
+    /*!
+     * Create Mesh object importing data from given GMF file
+     */
+    SMESH_Mesh CreateMeshesFromGMF( in string               theFileName,
+                                    out SMESH::ComputeError theError)
+      raises ( SALOME::SALOME_Exception );
+
     /*!
      * Create a mesh by copying a part of another mesh
      *  \param meshPart - a part of mesh to copy
index 8d18789baea37cc21e49dca776d1bae6fbc2b69d..f2e43788e0ff0ab97dd789704f3cc6c6f7be50cd 100644 (file)
@@ -80,29 +80,29 @@ module SMESH
      *  \param theParameters is a string containing the notebook variables separated by ":" symbol,
      *         used for Hypothesis creation
      */
-    void SetParameters (in string theParameters);
-
-    /*!
-     *  Return list of notebook variables used for Hypothesis creation separated by ":" symbol
-     */
-    string GetParameters();
-
-    /*!
-     *  Return list of last notebook variables used for Hypothesis creation.
-     */
-    ListOfParameters GetLastParameters();
-
-    /*!
-     *  Set list of parameters
-     *  \param theParameters is a string containing the last notebook variables separated by ":" symbol,
-     *         used for Hypothesis creation
-     */
-    void SetLastParameters(in string theParameters);
+    // void SetParameters (in string theParameters);
+
+    // /*!
+    //  *  Return list of notebook variables used for Hypothesis creation separated by ":" symbol
+    //  */
+    // string GetParameters();
+
+    // /*!
+    //  *  Return list of last notebook variables used for Hypothesis creation.
+    //  */
+    // ListOfParameters GetLastParameters();
+
+    // /*!
+    //  *  Set list of parameters
+    //  *  \param theParameters is a string containing the last notebook variables separated by ":" symbol,
+    //  *         used for Hypothesis creation
+    //  */
+    // void SetLastParameters(in string theParameters);
     
-    /*!
-     * Clear parameters list
-     */
-    void ClearParameters();
+    // /*!
+    //  * Clear parameters list
+    //  */
+    // void ClearParameters();
 
     /*!
      * Verify whether hypothesis supports given entity type 
index 409bb4e6ec4ac3ded80a66a86a00e08a1152545f..b8d2b5e63e3a822a72ad65543e9c67d750fb999d 100644 (file)
@@ -652,7 +652,7 @@ module SMESH
     string GetVersionString(in MED_VERSION version, in short nbDigits);
 
     /*!
-     * Export Mesh to DAT, UNV and STL Formats
+     * Export Mesh to different Formats
      * (UNV supported version is I-DEAS 10)
      */
     void ExportDAT( in string file ) raises (SALOME::SALOME_Exception);
@@ -662,6 +662,8 @@ module SMESH
     void ExportCGNS( in SMESH_IDSource meshPart, 
                      in string         file,
                      in boolean        overwrite ) raises (SALOME::SALOME_Exception);
+    void ExportGMF( in SMESH_IDSource  meshPart, 
+                    in string          file ) raises (SALOME::SALOME_Exception);
     void ExportPartToDAT( in SMESH_IDSource meshPart, 
                           in string         file ) raises (SALOME::SALOME_Exception);
     void ExportPartToUNV( in SMESH_IDSource meshPart, 
index 561c5b8841b4945d60160daafac2eceaa1eba64a..08f2b70f2c4f3f9f3ace7257c839346f83eb5ae1 100644 (file)
@@ -25,6 +25,7 @@
 #define _SMESH_MESHEDITOR_IDL_
 
 #include "SMESH_Mesh.idl"
+#include "SMESH_Gen.idl"
 
 module SMESH
 {
@@ -34,8 +35,34 @@ module SMESH
    * This interface makes modifications on the Mesh - removing elements and nodes etc.
    */
   interface NumericalFunctor;
+
   interface SMESH_MeshEditor
   {
+   /*!
+    * Return data of mesh edition preview which is computed provided
+    * that the editor was obtained trough SMESH_Mesh::GetMeshEditPreviewer()
+    */
+    MeshPreviewStruct GetPreviewData();
+
+   /*!
+    * If during last operation of MeshEditor some nodes were
+    * created this method returns list of their IDs, if new nodes
+    * not created - returns empty list
+    */
+    long_array GetLastCreatedNodes();
+
+   /*!
+    * If during last operation of MeshEditor some elements were
+    * created this method returns list of their IDs, if new elements
+    * not created - returns empty list
+    */
+    long_array GetLastCreatedElems();
+
+    /*!
+     * \brief Returns description of an error/warning occured during the last operation
+     */
+    ComputeError GetLastError();
+
     /*!
      * \brief Wrap a sequence of ids in a SMESH_IDSource
      * \param IDsOfElements list of mesh elements identifiers
@@ -802,26 +829,6 @@ module SMESH
     */
     boolean ChangeElemNodes(in long ide, in long_array newIDs);
 
-   /*!
-    * Return data of mesh edition preview which is computed provided
-    * that the editor was obtained trough SMESH_Mesh::GetMeshEditPreviewer()
-    */
-    MeshPreviewStruct GetPreviewData();
-
-   /*!
-    * If during last operation of MeshEditor some nodes were
-    * created this method returns list of it's IDs, if new nodes
-    * not creared - returns empty list
-    */
-    long_array GetLastCreatedNodes();
-
-   /*!
-    * If during last operation of MeshEditor some elements were
-    * created this method returns list of it's IDs, if new elements
-    * not creared - returns empty list
-    */
-    long_array GetLastCreatedElems();
-
     /*!
      * \brief Creates a hole in a mesh by doubling the nodes of some particular elements
      * \param theNodes - identifiers of nodes to be doubled
@@ -1038,6 +1045,21 @@ module SMESH
                                           in ListOfGroups theNodesNot,
                                           in GEOM::GEOM_Object theShape );
 
+    /*!
+     * \brief Identify the elements that will be affected by node duplication (actual duplication is not performed).
+     * This method is the first step of DoubleNodeElemGroupsInRegion.
+     * \param theElems - list of groups of elements (edges or faces) to be replicated
+     * \param theNodesNot - list of groups of nodes not to replicated
+     * \param theShape - shape to detect affected elements (element which geometric center
+     *        located on or inside shape).
+     *        The replicated nodes should be associated to affected elements.
+     * \return groups of affected elements
+     * \sa DoubleNodeElemGroupsInRegion()
+     */
+    ListOfGroups AffectedElemGroupsInRegion( in ListOfGroups theElems,
+                                             in ListOfGroups theNodesNot,
+                                             in GEOM::GEOM_Object theShape );
+
     /*!
      * \brief Generates skin mesh (containing 2D cells) from 3D mesh
      * The created 2D mesh elements based on nodes of free faces of boundary volumes
@@ -1117,6 +1139,18 @@ module SMESH
      * \return TRUE if operation has been completed successfully, FALSE otherwise
      */
     boolean CreateFlatElementsOnFacesGroups( in ListOfGroups theGroupsOfFaces ); 
+
+    /*!
+     *  \brief identify all the elements around a geom shape, get the faces delimiting the hole
+     *  Build groups of volume to remove, groups of faces to replace on the skin of the object,
+     *  groups of faces to remove insidethe object, (idem edges).
+     *  Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+     */
+    void CreateHoleSkin(in double radius,
+                        in GEOM::GEOM_Object theShape,
+                        in string groupName,
+                        in double_array theNodesCoords,
+                        out array_of_long_array GroupsOfNodes) raises (SALOME::SALOME_Exception);
   };
 };
 
index 0dbcc2e8839737648fb994390381f4cee3ab2368..20be2291777f1f731c46d505c9288e9a44a232f0 100644 (file)
     <parameter name="icon" value="ModuleMesh.png"/>
     <parameter name="version" value="@VERSION@"/>
     <!-- Other module preferences -->
+    <parameter name="default_grp_color"            value="255, 170, 0"/>
     <parameter name="node_color"                   value="255, 0,   0"/>
     <parameter name="fill_color"                   value="0, 170, 255|-100"/>
+    <parameter name="volume_color"                 value="255, 0, 170|-100"/>
     <parameter name="wireframe_color"              value="0, 170, 255"/>
     <parameter name="outline_color"                value="0,  70,   0"/>
     <parameter name="elem0d_color"                 value="0, 255,   0"/>
-    <parameter name="ball_elem_color"              value="100, 255,   0"/>
+    <parameter name="ball_elem_color"              value="0, 85,   255"/>
     <parameter name="highlight_color"              value="0, 255, 255"/>
     <parameter name="group_name_color"             value="255, 255, 255"/>
     <parameter name="type_of_marker"               value="1"  />
@@ -41,6 +43,7 @@
     <parameter name="elem0d_size"                  value="5" />
     <parameter name="ball_elem_size"               value="10" />
     <parameter name="element_width"                value="1" />
+    <parameter name="outline_width"                value="1" />
     <parameter name="shrink_coeff"                 value="75"/>
     <parameter name="orientation_color"            value="255, 255, 255"/>
     <parameter name="orientation_scale"            value="0.1"/>
index 0d519fc574f21a5ca809d7ec8e1490c937bdd598..b82d6a441b1a8bd4090379e523cffc169da03044 100644 (file)
@@ -55,7 +55,7 @@
                 dim="1"/>
 
     <hypothesis type="FixedPoints1D"
-                label-id="Fixed points 1D"
+                label-id="Fixed Points 1D"
                 icon-id="mesh_hypo_length.png"
                 dim="1"/>
 
                 dim="1"/>
 
     <hypothesis type="Propagation"
-                label-id="Propagation of 1D Hyp. on opposite edges"
+                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"
+                label-id="Automatic Length"
                 icon-id="mesh_hypo_length.png"
                 dim="1"/>
 
     <hypothesis type="LengthFromEdges"
-                label-id="Length From Edges (2D Hyp. for Triangulator)"
+                label-id="Length From Edges"
                 icon-id="mesh_hypo_length.png"
                 dim="2"/>
 
   <algorithms>
 
     <algorithm type="SegmentAroundVertex_0D"
-              label-id="Segments around vertex"
+              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"
+              label-id="Wire Discretisation"
               icon-id="mesh_algo_regular.png"
                hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
                opt-hypos="Propagation,QuadraticMesh"
     </algorithm>
 
     <algorithm type="CompositeSegment_1D"
-              label-id="Composite side discretisation"
+              label-id="Composite Side Discretisation"
               icon-id="mesh_algo_regular.png"
                hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
                opt-hypos="Propagation,QuadraticMesh"
                dim="2">
       <python-wrap>
         <algo>Projection_2D=Projection2D()</algo>
-        <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2),SetVertexAssociation(3),SetVertexAssociation(4))</hypo>
+        <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
       </python-wrap>
     </algorithm>
 
                dim="3">
       <python-wrap>
         <algo>Projection_3D=Projection3D()</algo>
-        <hypo>ProjectionSource3D=SourceShape3D(SetSource3DShape(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2),SetVertexAssociation(3),SetVertexAssociation(4))</hypo>
+        <hypo>ProjectionSource3D=SourceShape3D(SetSource3DShape(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
       </python-wrap>
     </algorithm>
 
     <algorithm type="Import_1D"
-               label-id="Use existing 1D elements"
+               label-id="Use Existing 1D Elements"
                icon-id="mesh_algo_regular.png"
                hypos="ImportSource1D"
                output="EDGE"
     </algorithm>
 
     <algorithm type="Import_1D2D"
-               label-id="Use existing 2D elements"
+               label-id="Use Existing 2D Elements"
                icon-id="mesh_algo_quad.png"
                hypos="ImportSource2D"
                output="QUAD,TRIA"
     </algorithm>
 
     <algorithm type="Prism_3D"
-               label-id="3D extrusion"
+               label-id="3D Extrusion"
                icon-id="mesh_algo_hexa.png"
                input="QUAD,TRIA"
                dim="3">
     </algorithm>
 
     <algorithm type="UseExisting_1D"
-               label-id="Use existing edges"
+               label-id="Use Existing Edges"
                icon-id="mesh_algo_regular.png"
                input="VERTEX"
                output="EDGE"
     </algorithm>
 
     <algorithm type="UseExisting_2D"
-               label-id="Use existing faces"
+               label-id="Use Existing Faces"
                icon-id="mesh_algo_quad.png"
                input="EDGE"
                output="QUAD,TRIA"
     </algorithm>
 
     <algorithm type="RadialQuadrangle_1D2D"
-               label-id="Radial quadrangle 1D2D"
+               label-id="Radial Quadrangle 1D2D"
                icon-id="mesh_algo_quad.png"
                hypos="NumberOfLayers2D, LayerDistribution2D"
                input="EDGE"
index f9540e0046d526846c6e05291de07438572c5509..66601f3dfd478a4841ff615dab6905aadd3d2b16 100644 (file)
@@ -2737,30 +2737,37 @@ void CoplanarFaces::SetMesh( const SMDS_Mesh* theMesh )
       return;
 
     const double radianTol = myToler * M_PI / 180.;
-    typedef SMDS_StdIterator< const SMDS_MeshElement*, SMDS_ElemIteratorPtr > TFaceIt;
-    std::set<const SMDS_MeshElement*> checkedFaces, checkedNodes;
-    std::list<const SMDS_MeshElement*> faceQueue( 1, face );
+    std::set< SMESH_TLink > checkedLinks;
+
+    std::list< pair< const SMDS_MeshElement*, gp_Vec > > faceQueue;
+    faceQueue.push_back( make_pair( face, myNorm ));
     while ( !faceQueue.empty() )
     {
-      face = faceQueue.front();
-      if ( checkedFaces.insert( face ).second )
+      face   = faceQueue.front().first;
+      myNorm = faceQueue.front().second;
+      faceQueue.pop_front();
+
+      for ( int i = 0, nbN = face->NbCornerNodes(); i < nbN; ++i )
       {
-        gp_Vec norm = getNormale( static_cast<const SMDS_MeshFace*>(face), &normOK );
-        if (!normOK || myNorm.Angle( norm ) <= radianTol)
+        const SMDS_MeshNode*  n1 = face->GetNode( i );
+        const SMDS_MeshNode*  n2 = face->GetNode(( i+1 )%nbN);
+        if ( !checkedLinks.insert( SMESH_TLink( n1, n2 )).second )
+          continue;
+        SMDS_ElemIteratorPtr fIt = n1->GetInverseElementIterator(SMDSAbs_Face);
+        while ( fIt->more() )
         {
-          myCoplanarIDs.insert( face->GetID() );
-          std::set<const SMDS_MeshElement*> neighborFaces;
-          for ( int i = 0; i < face->NbCornerNodes(); ++i )
+          const SMDS_MeshElement* f = fIt->next();
+          if ( f->GetNodeIndex( n2 ) > -1 )
           {
-            const SMDS_MeshNode* n = face->GetNode( i );
-            if ( checkedNodes.insert( n ).second )
-              neighborFaces.insert( TFaceIt( n->GetInverseElementIterator(SMDSAbs_Face)),
-                                    TFaceIt());
+            gp_Vec norm = getNormale( static_cast<const SMDS_MeshFace*>(f), &normOK );
+            if (!normOK || myNorm.Angle( norm ) <= radianTol)
+            {
+              myCoplanarIDs.insert( f->GetID() );
+              faceQueue.push_back( make_pair( f, norm ));
+            }
           }
-          faceQueue.insert( faceQueue.end(), neighborFaces.begin(), neighborFaces.end() );
         }
       }
-      faceQueue.pop_front();
     }
   }
 }
@@ -2770,7 +2777,7 @@ bool CoplanarFaces::IsSatisfy( long theElementId )
 }
 
 /*
 *Class       : RangeOfIds
+ *Class       : RangeOfIds
   *Description : Predicate for Range of Ids.
   *              Range may be specified with two ways.
   *              1. Using AddToRange method
index 73895176fe7faa33672b36a5a1c9221a762de713..c04008f9477f5ea7053e4655182fa2cc972f1107 100644 (file)
 //
 #include "Driver_Mesh.h"
 
+#include "SMESH_Comment.hxx"
+
 #include <utilities.h>
 
 using namespace std;
 
 Driver_Mesh::Driver_Mesh():
   myFile(""),
-  myMeshId(-1)
+  myMeshId(-1),
+  myStatus( DRS_OK )
 {}
 
 
@@ -78,5 +81,23 @@ Driver_Mesh::Status Driver_Mesh::addMessage(const std::string& msg,
 #ifdef _DEBUG_
   cout << msg << endl;
 #endif
-  return isFatal ? DRS_FAIL : DRS_WARN_SKIP_ELEM;
+  return ( myStatus = isFatal ? DRS_FAIL : DRS_WARN_SKIP_ELEM );
+}
+
+//================================================================================
+/*!
+ * \brief Return a structure containing description of errors
+ */
+//================================================================================
+
+SMESH_ComputeErrorPtr Driver_Mesh::GetError()
+{
+  SMESH_Comment msg;
+  for ( size_t i = 0; i < myErrorMessages.size(); ++i )
+  {
+    msg << myErrorMessages[i];
+    if ( i+1 < myErrorMessages.size() )
+      msg << "\n";
+  }
+  return SMESH_ComputeError::New( myStatus == DRS_OK ? int(COMPERR_OK) : int(myStatus), msg );
 }
index 45861a82a784b15b22d4467fb4f373721894d346..fcaea2b3e6f0e54c4206aa30ee91d9a82ad918bb 100644 (file)
@@ -27,6 +27,8 @@
 #ifndef _INCLUDE_DRIVER_MESH
 #define _INCLUDE_DRIVER_MESH
 
+#include "SMESH_ComputeError.hxx"
+
 #include <string>
 #include <vector>
 
@@ -55,19 +57,26 @@ class MESHDRIVER_EXPORT Driver_Mesh
     DRS_FAIL            // general failure (exception etc.)
   };
 
-  virtual Status Perform() = 0;
-  void SetMeshId(int theMeshId);
-  void SetFile(const std::string& theFileName);
-  virtual void SetMeshName(const std::string& theMeshName);
+  void                SetMeshId(int theMeshId);
+  void                SetFile(const std::string& theFileName);
+  virtual void        SetMeshName(const std::string& theMeshName);
   virtual std::string GetMeshName() const;
 
+  virtual void        SetOption(const std::string& optionName,
+                                const std::string& optionValue) {}
+
+  virtual Status Perform() = 0;
+
+  virtual SMESH_ComputeErrorPtr GetError();
+
  protected:
   std::string myFile;
   std::string myMeshName;
-  int myMeshId;
+  int         myMeshId;
 
   Status addMessage(const std::string& msg, const bool isFatal=false);
   std::vector< std::string > myErrorMessages;
+  Status                     myStatus;
 };
 
 #endif
index 0062ee7744cec38f8eaee42768e7ba2f1626dd9a..a088c773a75ecab364db7bf60599330b27134e3c 100644 (file)
@@ -44,8 +44,10 @@ dist_libMeshDriver_la_SOURCES = \
 
 # additionnal information to compil and link file
 libMeshDriver_la_CPPFLAGS = \
+        $(BOOST_CPPFLAGS) \
        $(CAS_CPPFLAGS) \
        $(KERNEL_CXXFLAGS) \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS  
 
 libMeshDriver_la_LDFLAGS  = \
index 517a56f25afe361d8d45c93e042b7fd11926fcdc..edc474163b16f1616b63caf4a6502ab4990054e6 100644 (file)
@@ -139,7 +139,7 @@ namespace
       }
       {
         static int ids[] = { 0,3,2,1,4,7,6,5,11,10,9,8,12,15,14,13,19,18,17,16,
-                             20, 24,23,22,21, 25};
+                             20, 24,23,22,21, 25, 26};
         interlaces[SMDSEntity_TriQuad_Hexa] = ids;
         cgTypes   [SMDSEntity_TriQuad_Hexa] = CGNS_ENUMV( HEXA_27 );
       }
index 338bc1d17e5bcdc0c75cad22901a109fc9f3071b..232551eb34eef1f14ff3e533c101be981f04d809 100644 (file)
@@ -52,6 +52,7 @@ libMeshDriverDAT_la_CPPFLAGS = \
        $(BOOST_CPPFLAGS) \
        -I$(srcdir)/../Driver \
        -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS
 
 libMeshDriverDAT_la_LDFLAGS  = \
diff --git a/src/DriverGMF/DriverGMF_Read.cxx b/src/DriverGMF/DriverGMF_Read.cxx
new file mode 100644 (file)
index 0000000..332519b
--- /dev/null
@@ -0,0 +1,357 @@
+// 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, Read 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_Read.cxx
+// Created   : Mon Sep 17 17:03:02 2012
+// Author    : Edward AGAPOV (eap)
+
+#include "DriverGMF_Read.hxx"
+#include "DriverGMF_Write.hxx"
+
+#include "SMESHDS_Group.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_Comment.hxx"
+
+extern "C"
+{
+#include "libmesh5.h"
+}
+
+#include <stdarg.h>
+
+// --------------------------------------------------------------------------------
+// Closing GMF mesh at destruction
+DriverGMF_MeshCloser::~DriverGMF_MeshCloser()
+{
+  if ( _gmfMeshID )
+    GmfCloseMesh( _gmfMeshID );
+}
+// --------------------------------------------------------------------------------
+DriverGMF_Read::DriverGMF_Read():
+  Driver_SMESHDS_Mesh()
+{
+}
+// --------------------------------------------------------------------------------
+DriverGMF_Read::~DriverGMF_Read()
+{
+}
+
+//================================================================================
+/*!
+ * \brief Read a GMF file
+ */
+//================================================================================
+
+Driver_Mesh::Status DriverGMF_Read::Perform()
+{
+  Status status = DRS_OK;
+
+  int dim, version;
+
+  // 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
+
+  // Read nodes
+
+  int nbNodes = GmfStatKwd(meshID, GmfVertices);
+  if ( nbNodes < 1 )
+    return addMessage( "No nodes in the mesh", /*fatal=*/true );
+
+  GmfGotoKwd(meshID, GmfVertices);
+
+  int ref;
+
+  const int nodeIDShift = myMesh->GetMeshInfo().NbNodes();
+  if ( version != GmfFloat )
+  {
+    double x, y, z;
+    for ( int i = 1; i <= nbNodes; ++i )
+    {
+      GmfGetLin(meshID, GmfVertices, &x, &y, &z, &ref);
+      myMesh->AddNodeWithID( x,y,z, nodeIDShift + i);
+    }
+  }
+  else
+  {
+    float x, y, z;
+    for ( int i = 1; i <= nbNodes; ++i )
+    {
+      GmfGetLin(meshID, GmfVertices, &x, &y, &z, &ref);
+      myMesh->AddNodeWithID( x,y,z, nodeIDShift + i);
+    }
+  }
+
+  // Read elements
+
+  int iN[28];
+
+  /* Read edges */
+  const int edgeIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbEdges = GmfStatKwd(meshID, GmfEdges))
+  {
+    GmfGotoKwd(meshID, GmfEdges);
+    for ( int i = 1; i <= nbEdges; ++i )
+    {
+      GmfGetLin(meshID, GmfEdges, &iN[0], &iN[1], &ref);
+      if ( !myMesh->AddEdgeWithID( iN[0], iN[1], edgeIDShift + i ))
+        status = storeBadNodeIds( "GmfEdges",i, 2, iN[0], iN[1] );
+    }
+  }
+  /* Read quadratic edges */
+  const int edge2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbEdges = GmfStatKwd(meshID, GmfEdgesP2))
+  {
+    GmfGotoKwd(meshID, GmfEdgesP2);
+    for ( int i = 1; i <= nbEdges; ++i )
+    {
+      GmfGetLin(meshID, GmfEdgesP2, &iN[0], &iN[1], &iN[2], &ref);
+      if ( !myMesh->AddEdgeWithID( iN[0], iN[1], iN[2], edge2IDShift + i ))
+        status = storeBadNodeIds( "GmfEdgesP2",i, 3, iN[0], iN[1], iN[2] );
+    }
+  }
+  /* Read triangles */
+  const int triaIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTria = GmfStatKwd(meshID, GmfTriangles))
+  {
+    GmfGotoKwd(meshID, GmfTriangles);
+    for ( int i = 1; i <= nbTria; ++i )
+    {
+      GmfGetLin(meshID, GmfTriangles, &iN[0], &iN[1], &iN[2], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], triaIDShift + i ))
+        status = storeBadNodeIds( "GmfTriangles",i, 3, iN[0], iN[1], iN[2] );
+    }
+  }
+  /* Read quadratic triangles */
+  const int tria2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTria = GmfStatKwd(meshID, GmfTrianglesP2))
+  {
+    GmfGotoKwd(meshID, GmfTrianglesP2);
+    for ( int i = 1; i <= nbTria; ++i )
+    {
+      GmfGetLin(meshID, GmfTrianglesP2,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],
+                                   tria2IDShift + i ))
+        status = storeBadNodeIds( "GmfTrianglesP2",i, 6, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5] );
+    }
+  }
+  /* Read quadrangles */
+  const int quadIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilaterals))
+  {
+    GmfGotoKwd(meshID, GmfQuadrilaterals);
+    for ( int i = 1; i <= nbQuad; ++i )
+    {
+      GmfGetLin(meshID, GmfQuadrilaterals, &iN[0], &iN[1], &iN[2], &iN[3], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], iN[3], quadIDShift + i ))
+        status = storeBadNodeIds( "GmfQuadrilaterals",i, 4, iN[0], iN[1],iN[2], iN[3] );
+    }
+  }
+  /* Read bi-quadratic quadrangles */
+  const int quad2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilateralsQ2))
+  {
+    GmfGotoKwd(meshID, GmfQuadrilateralsQ2);
+    for ( int i = 1; i <= nbQuad; ++i )
+    {
+      GmfGetLin(meshID, GmfQuadrilateralsQ2,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8],
+                                   quad2IDShift + i ))
+        status = storeBadNodeIds( "GmfQuadrilateralsQ2",i,
+                                  9, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8] );
+    }
+  }
+  /* Read terahedra */
+  const int tetIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedra))
+  {
+    GmfGotoKwd(meshID, GmfTetrahedra);
+    for ( int i = 1; i <= nbTet; ++i )
+    {
+      GmfGetLin(meshID, GmfTetrahedra, &iN[0], &iN[1], &iN[2], &iN[3], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], tetIDShift + i ))
+        status = storeBadNodeIds( "GmfTetrahedra",i, 4, iN[0], iN[1],iN[2], iN[3] );
+    }
+  }
+  /* Read quadratic terahedra */
+  const int tet2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedraP2))
+  {
+    GmfGotoKwd(meshID, GmfTetrahedraP2);
+    for ( int i = 1; i <= nbTet; ++i )
+    {
+      GmfGetLin(meshID, GmfTetrahedraP2, &iN[0], &iN[1], &iN[2],
+                &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &iN[9], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0],iN[2],iN[1],iN[3],
+                                     iN[6],iN[5],iN[4],
+                                     iN[7],iN[9],iN[8], tet2IDShift + i ))
+        status = storeBadNodeIds( "GmfTetrahedraP2",i, 10, iN[0],iN[1],iN[2],iN[3],
+                                  iN[4],iN[5],iN[6],iN[7],iN[8],iN[9] );
+    }
+  }
+  /* Read pyramids */
+  const int pyrIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbPyr = GmfStatKwd(meshID, GmfPyramids))
+  {
+    GmfGotoKwd(meshID, GmfPyramids);
+    for ( int i = 1; i <= nbPyr; ++i )
+    {
+      GmfGetLin(meshID, GmfPyramids, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[4], pyrIDShift + i ))
+        status = storeBadNodeIds( "GmfPyramids",i, 5, iN[0], iN[1],iN[2], iN[3], iN[4] );
+    }
+  }
+  /* Read hexahedra */
+  const int hexIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbHex = GmfStatKwd(meshID, GmfHexahedra))
+  {
+    GmfGotoKwd(meshID, GmfHexahedra);
+    for ( int i = 1; i <= nbHex; ++i )
+    {
+      GmfGetLin(meshID, GmfHexahedra,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[3], iN[2], iN[1], iN[4], iN[7], iN[6], iN[5],
+                                     hexIDShift + i))
+        status = storeBadNodeIds( "GmfHexahedra",i,
+                                  8, iN[0], iN[1],iN[2], iN[3], iN[4], iN[7], iN[6], iN[5] );
+    }
+  }
+  /* Read tri-quadratic hexahedra */
+  const int hex2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbHex = GmfStatKwd(meshID, GmfHexahedraQ2))
+  {
+    GmfGotoKwd(meshID, GmfHexahedraQ2);
+    for ( int i = 1; i <= nbHex; ++i )
+    {
+      GmfGetLin(meshID, GmfHexahedraQ2, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5],
+                &iN[6], &iN[7], &iN[8],&iN[9],&iN[10],&iN[11],&iN[12],&iN[13],&iN[14],
+                &iN[15],&iN[16],&iN[17],&iN[18],&iN[19],&iN[20],&iN[21],&iN[22],&iN[23],
+                &iN[24],&iN[25],&iN[26], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0],iN[3],iN[2],iN[1],iN[4],iN[7],iN[6],iN[5],iN[11],iN[10],
+                                     iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17],
+                                     iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26],
+                                     hex2IDShift + i ))
+        status = storeBadNodeIds( "GmfHexahedraQ2",i, 27,
+                                  iN[0],iN[3],iN[2],iN[1],iN[4], iN[7],iN[6],iN[5],iN[11],iN[10],
+                                  iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17],
+                                  iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26]);
+    }
+  }
+  /* Read prism */
+  const int prismIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbPrism = GmfStatKwd(meshID, GmfPrisms))
+  {
+    GmfGotoKwd(meshID, GmfPrisms);
+    for ( int i = 1; i <= nbPrism; ++i )
+    {
+      GmfGetLin(meshID, GmfPrisms,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[5], iN[4], prismIDShift + i))
+        status = storeBadNodeIds( "GmfPrisms",i,
+                                  6, iN[0], iN[1],iN[2], iN[3], iN[4], iN[5] );
+    }
+  }
+
+  // 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 )
+  {
+    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 );
+
+      GmfGotoKwd(meshID, gmfKwd);
+      for ( int i = 0; i < nb; ++i )
+      {
+        GmfGetLin(meshID, gmfKwd, &iN[0] );
+        group->Add( shift + iN[0] );
+      }
+    }
+  }
+
+  return status;
+}
+
+//================================================================================
+/*!
+ * \brief Store a message about invalid IDs of nodes
+ */
+//================================================================================
+
+Driver_Mesh::Status DriverGMF_Read::storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...)
+{
+  if ( myStatus != DRS_OK )
+    return myStatus;
+
+  SMESH_Comment msg;
+
+  va_list VarArg;
+  va_start(VarArg, nb);
+
+  for ( int i = 0; i < nb; ++i )
+  {
+    int id = va_arg(VarArg, int );
+    if ( !myMesh->FindNode( id ))
+      msg << " " << id;
+  }
+  va_end(VarArg);
+
+  if ( !msg.empty() )
+  {
+    std::string nbStr;
+    const char* nbNames[] = { "1-st ", "2-nd ", "3-d " };
+    if ( elemNb < 3 ) nbStr = nbNames[ elemNb-1 ];
+    else              nbStr = SMESH_Comment(elemNb) << "-th ";
+
+    return addMessage
+      ( SMESH_Comment("Wrong node IDs of ")<< nbStr << gmfKwd << ":" << msg,
+        /*fatal=*/false );
+  }
+  return DRS_OK;
+}
diff --git a/src/DriverGMF/DriverGMF_Read.hxx b/src/DriverGMF/DriverGMF_Read.hxx
new file mode 100644 (file)
index 0000000..a003804
--- /dev/null
@@ -0,0 +1,57 @@
+// 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, Read 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_Read.hxx
+// Created   : Mon Sep 17 15:36:47 2012
+// Author    : Edward AGAPOV (eap)
+
+
+#ifndef __DriverGMF_Read_HXX__
+#define __DriverGMF_Read_HXX__
+
+#include "SMESH_DriverGMF.hxx"
+
+#include "Driver_SMESHDS_Mesh.h"
+
+#include <vector>
+#include <string>
+
+/*!
+ * \brief Driver reading a mesh from the GMF file. The mesh to read is selected by 
+ *  an index (counted form 0) set via SetMeshId()
+ */
+class MESHDriverGMF_EXPORT DriverGMF_Read : public Driver_SMESHDS_Mesh
+{
+public:
+
+  DriverGMF_Read();
+  ~DriverGMF_Read();
+
+  virtual Status Perform();
+
+ private:
+
+  Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...);
+
+};
+
+
+#endif
diff --git a/src/DriverGMF/DriverGMF_Write.cxx b/src/DriverGMF/DriverGMF_Write.cxx
new file mode 100644 (file)
index 0000000..cdddd62
--- /dev/null
@@ -0,0 +1,317 @@
+// 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_Write.cxx
+// Created   : Mon Sep 17 17:03:02 2012
+// Author    : Edward AGAPOV (eap)
+
+#include "DriverGMF_Write.hxx"
+
+#include "SMESHDS_GroupBase.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_Comment.hxx"
+
+extern "C"
+{
+#include "libmesh5.h"
+}
+
+#include <vector>
+
+#define BEGIN_ELEM_WRITE( SMDSEntity, GmfKwd, elem )                    \
+  elemIt = myMesh->elementEntityIterator( SMDSEntity );                 \
+  if ( elemIt->more() )                                                 \
+  {                                                                     \
+  GmfSetKwd(meshID, GmfKwd, myMesh->GetMeshInfo().NbEntities( SMDSEntity )); \
+  for ( int gmfID = 1; elemIt->more(); ++gmfID )                        \
+  {                                                                     \
+  const SMDS_MeshElement* elem = elemIt->next();                        \
+  GmfSetLin(meshID, GmfKwd,
+
+#define END_ELEM_WRITE( elem )                  \
+  elem->getshapeId() );                         \
+  }}                                            \
+
+#define END_ELEM_WRITE_ADD_TO_MAP( elem, e2id )         \
+  elem->getshapeId() );                                 \
+  e2id.insert( e2id.end(), make_pair( elem, gmfID ));   \
+  }}                                                    \
+
+
+DriverGMF_Write::DriverGMF_Write():
+  Driver_SMESHDS_Mesh()
+{
+}
+DriverGMF_Write::~DriverGMF_Write()
+{
+}
+
+Driver_Mesh::Status DriverGMF_Write::Perform()
+{
+  const int dim = 3, version = 3;
+
+  int meshID = GmfOpenMesh( myFile.c_str(), GmfWrite, version, dim );
+  if ( !meshID )
+    return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true );
+
+  DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
+
+  // nodes
+  std::map< const SMDS_MeshNode* , int > node2IdMap;
+  int iN = 0, nbNodes = myMesh->NbNodes();
+  GmfSetKwd( meshID, GmfVertices, nbNodes );
+  double xyz[3];
+  SMDS_NodeIteratorPtr nodeIt = myMesh->nodesIterator();
+  while ( nodeIt->more() )
+  {
+    const SMDS_MeshNode* n = nodeIt->next();
+    n->GetXYZ( xyz );
+    GmfSetLin( meshID, GmfVertices, xyz[0], xyz[1], xyz[2], n->getshapeId() );
+    node2IdMap.insert( node2IdMap.end(), make_pair( n, ++iN ));
+  }
+  if ( iN != nbNodes )
+    return addMessage("Wrong nb of nodes returned by nodesIterator", /*fatal=*/true);
+
+
+  SMDS_ElemIteratorPtr elemIt;
+  typedef std::map< const SMDS_MeshElement*, size_t, TIDCompare > TElem2IDMap;
+
+  // edges
+  TElem2IDMap edge2IDMap;
+  BEGIN_ELEM_WRITE( SMDSEntity_Edge, GmfEdges, edge )
+    node2IdMap[ edge->GetNode( 0 )],
+    node2IdMap[ edge->GetNode( 1 )],
+    END_ELEM_WRITE_ADD_TO_MAP( edge, edge2IDMap );
+    
+  // quadratic edges
+  BEGIN_ELEM_WRITE( SMDSEntity_Quad_Edge, GmfEdgesP2, edge )
+    node2IdMap[ edge->GetNode( 0 )],
+    node2IdMap[ edge->GetNode( 1 )],
+    node2IdMap[ edge->GetNode( 2 )],
+    END_ELEM_WRITE( edge );
+    
+  // triangles
+  TElem2IDMap tria2IDMap;
+  BEGIN_ELEM_WRITE( SMDSEntity_Triangle, GmfTriangles, tria )
+    node2IdMap[ tria->GetNode( 0 )],
+    node2IdMap[ tria->GetNode( 1 )],
+    node2IdMap[ tria->GetNode( 2 )],
+    END_ELEM_WRITE_ADD_TO_MAP( tria, tria2IDMap );
+    
+  // quadratic triangles
+  BEGIN_ELEM_WRITE( SMDSEntity_Quad_Triangle, GmfTrianglesP2, tria )
+    node2IdMap[ tria->GetNode( 0 )],
+    node2IdMap[ tria->GetNode( 1 )],
+    node2IdMap[ tria->GetNode( 2 )],
+    node2IdMap[ tria->GetNode( 3 )],
+    node2IdMap[ tria->GetNode( 4 )],
+    node2IdMap[ tria->GetNode( 5 )],
+    END_ELEM_WRITE( tria );
+    
+  // quadrangles
+  TElem2IDMap quad2IDMap;
+  BEGIN_ELEM_WRITE( SMDSEntity_Quadrangle, GmfQuadrilaterals, quad )
+    node2IdMap[ quad->GetNode( 0 )],
+    node2IdMap[ quad->GetNode( 1 )],
+    node2IdMap[ quad->GetNode( 2 )],
+    node2IdMap[ quad->GetNode( 3 )],
+    END_ELEM_WRITE_ADD_TO_MAP( quad, quad2IDMap );
+
+  // bi-quadratic quadrangles
+  BEGIN_ELEM_WRITE( SMDSEntity_BiQuad_Quadrangle, GmfQuadrilateralsQ2, quad )
+    node2IdMap[ quad->GetNode( 0 )],
+    node2IdMap[ quad->GetNode( 3 )],
+    node2IdMap[ quad->GetNode( 2 )],
+    node2IdMap[ quad->GetNode( 1 )],
+    node2IdMap[ quad->GetNode( 7 )],
+    node2IdMap[ quad->GetNode( 6 )],
+    node2IdMap[ quad->GetNode( 5 )],
+    node2IdMap[ quad->GetNode( 4 )],
+    node2IdMap[ quad->GetNode( 8 )],
+    END_ELEM_WRITE( quad );
+    
+  // terahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_Tetra, GmfTetrahedra, tetra )
+    node2IdMap[ tetra->GetNode( 0 )],
+    node2IdMap[ tetra->GetNode( 2 )],
+    node2IdMap[ tetra->GetNode( 1 )],
+    node2IdMap[ tetra->GetNode( 3 )],
+    END_ELEM_WRITE( tetra );
+    
+  // quadratic terahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_Quad_Tetra, GmfTetrahedraP2, tetra )
+    node2IdMap[ tetra->GetNode( 0 )],
+    node2IdMap[ tetra->GetNode( 2 )],
+    node2IdMap[ tetra->GetNode( 1 )],
+    node2IdMap[ tetra->GetNode( 3 )],
+    node2IdMap[ tetra->GetNode( 6 )],
+    node2IdMap[ tetra->GetNode( 5 )],
+    node2IdMap[ tetra->GetNode( 4 )],
+    node2IdMap[ tetra->GetNode( 7 )],
+    node2IdMap[ tetra->GetNode( 9 )],
+    node2IdMap[ tetra->GetNode( 8 )],
+    END_ELEM_WRITE( tetra );
+    
+  // pyramids
+  BEGIN_ELEM_WRITE( SMDSEntity_Pyramid, GmfPyramids, pyra )
+    node2IdMap[ pyra->GetNode( 0 )],
+    node2IdMap[ pyra->GetNode( 2 )],
+    node2IdMap[ pyra->GetNode( 1 )],
+    node2IdMap[ pyra->GetNode( 3 )],
+    node2IdMap[ pyra->GetNode( 4 )],
+    END_ELEM_WRITE( pyra );
+
+  // hexahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_Hexa, GmfHexahedra, hexa )
+    node2IdMap[ hexa->GetNode( 0 )],
+    node2IdMap[ hexa->GetNode( 3 )],
+    node2IdMap[ hexa->GetNode( 2 )],
+    node2IdMap[ hexa->GetNode( 1 )],
+    node2IdMap[ hexa->GetNode( 4 )],
+    node2IdMap[ hexa->GetNode( 7 )],
+    node2IdMap[ hexa->GetNode( 6 )],
+    node2IdMap[ hexa->GetNode( 5 )],
+    END_ELEM_WRITE( hexa );
+
+  // tri-quadratic hexahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_TriQuad_Hexa, GmfHexahedraQ2, hexa )
+    node2IdMap[ hexa->GetNode( 0 )],
+    node2IdMap[ hexa->GetNode( 3 )],
+    node2IdMap[ hexa->GetNode( 2 )],
+    node2IdMap[ hexa->GetNode( 1 )],
+    node2IdMap[ hexa->GetNode( 4 )],
+    node2IdMap[ hexa->GetNode( 7 )],
+    node2IdMap[ hexa->GetNode( 6 )],
+    node2IdMap[ hexa->GetNode( 5 )],
+    node2IdMap[ hexa->GetNode( 11 )],
+    node2IdMap[ hexa->GetNode( 10 )],
+    node2IdMap[ hexa->GetNode( 9 )],
+    node2IdMap[ hexa->GetNode( 8 )],
+    node2IdMap[ hexa->GetNode( 12 )],
+    node2IdMap[ hexa->GetNode( 15 )],
+    node2IdMap[ hexa->GetNode( 14 )],
+    node2IdMap[ hexa->GetNode( 13 )],
+    node2IdMap[ hexa->GetNode( 19 )],
+    node2IdMap[ hexa->GetNode( 18 )],
+    node2IdMap[ hexa->GetNode( 17 )],
+    node2IdMap[ hexa->GetNode( 16 )],
+    node2IdMap[ hexa->GetNode( 20 )],
+    node2IdMap[ hexa->GetNode( 24 )],
+    node2IdMap[ hexa->GetNode( 23 )],
+    node2IdMap[ hexa->GetNode( 22 )],
+    node2IdMap[ hexa->GetNode( 21 )],
+    node2IdMap[ hexa->GetNode( 25 )],
+    node2IdMap[ hexa->GetNode( 26 )],
+    END_ELEM_WRITE( hexa );
+
+  // prism
+  BEGIN_ELEM_WRITE( SMDSEntity_Penta, GmfPrisms, prism )
+    node2IdMap[ prism->GetNode( 0 )],
+    node2IdMap[ prism->GetNode( 2 )],
+    node2IdMap[ prism->GetNode( 1 )],
+    node2IdMap[ prism->GetNode( 3 )],
+    node2IdMap[ prism->GetNode( 5 )],
+    node2IdMap[ prism->GetNode( 4 )],
+    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 )
+  {
+    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 )
+    {
+      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 ] );
+      }
+    else
+      for ( int gmfID = 1; elemIt->more(); ++gmfID)
+      {
+        const SMDS_MeshElement* elem = elemIt->next();
+        if ( elem->GetEntityType() == smdsEntity )
+          GmfSetLin( meshID, gmfKwd, gmfID );
+      }
+
+  } // loop on groups
+
+  if ( !badGroups.empty() )
+    addMessage( SMESH_Comment("Groups of elements of inappropriate geometry:")
+                << badGroups, /*fatal=*/false );
+
+  return DRS_OK;
+}
diff --git a/src/DriverGMF/DriverGMF_Write.hxx b/src/DriverGMF/DriverGMF_Write.hxx
new file mode 100644 (file)
index 0000000..fd0918d
--- /dev/null
@@ -0,0 +1,59 @@
+// 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_Write.hxx
+// Created   : Mon Sep 17 15:36:47 2012
+// Author    : Edward AGAPOV (eap)
+
+
+#ifndef __DriverGMF_Write_HXX__
+#define __DriverGMF_Write_HXX__
+
+#include "SMESH_DriverGMF.hxx"
+
+#include "Driver_SMESHDS_Mesh.h"
+#include "SMDSAbs_ElementType.hxx"
+
+/*!
+ * \brief Driver Writing a mesh into a GMF file.
+ */
+class MESHDriverGMF_EXPORT DriverGMF_Write : public Driver_SMESHDS_Mesh
+{
+public:
+
+  DriverGMF_Write();
+  ~DriverGMF_Write();
+
+  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();
+};
+
+
+#endif
diff --git a/src/DriverGMF/Makefile.am b/src/DriverGMF/Makefile.am
new file mode 100644 (file)
index 0000000..895c83a
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright (C) 2007-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 $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+# header files 
+salomeinclude_HEADERS = \
+       DriverGMF_Read.hxx \
+       DriverGMF_Write.hxx \
+       SMESH_DriverGMF.hxx \
+       libmesh5.h
+
+# Libraries targets
+lib_LTLIBRARIES = libMeshDriverGMF.la
+dist_libMeshDriverGMF_la_SOURCES = \
+       DriverGMF_Read.cxx \
+       DriverGMF_Write.cxx \
+       libmesh5.c
+
+# additionnal information to compil and link file
+libMeshDriverGMF_la_CPPFLAGS = \
+       $(KERNEL_CXXFLAGS) \
+       $(CAS_CPPFLAGS) \
+        $(VTK_INCLUDES) \
+       $(BOOST_CPPFLAGS) \
+       -I$(srcdir)/../Driver \
+       -I$(srcdir)/../SMESHUtils \
+       -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHDS
+
+libMeshDriverGMF_la_LDFLAGS  = \
+       $(BOOST_LIBS) \
+       ../Driver/libMeshDriver.la \
+       ../SMESHUtils/libSMESHUtils.la
diff --git a/src/DriverGMF/SMESH_DriverGMF.hxx b/src/DriverGMF/SMESH_DriverGMF.hxx
new file mode 100755 (executable)
index 0000000..dd901a3
--- /dev/null
@@ -0,0 +1,40 @@
+// 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   : SMESH_DriverGMF.hxx
+//  Author : Alexander A. BORODIN
+//  Module : SMESH
+//
+#ifndef _SMESH_DriverGMF_HXX_
+#define _SMESH_DriverGMF_HXX_
+
+#ifdef WNT
+ #if defined MESHDriverGMF_EXPORTS || defined MeshDriverGMF_EXPORTS
+  #define MESHDriverGMF_EXPORT __declspec( dllexport )
+ #else
+  #define MESHDriverGMF_EXPORT __declspec( dllimport )
+ #endif
+#else
+ #define MESHDriverGMF_EXPORT
+#endif
+
+#endif
diff --git a/src/DriverGMF/libmesh5.c b/src/DriverGMF/libmesh5.c
new file mode 100644 (file)
index 0000000..b16c39c
--- /dev/null
@@ -0,0 +1,1346 @@
+
+
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*                                             LIBMESH V 5.46                                          */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*     Description:            handle .meshb file format I/O           */
+/*     Author:                         Loic MARECHAL                                           */
+/*     Creation date:          feb 16 2007                                                     */
+/*     Last modification:      apr 03 2012                                                     */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+
+
+/*----------------------------------------------------------*/
+/* Includes                                                                                                    */
+/*----------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+#include <math.h>
+#include <ctype.h>
+#include "libmesh5.h"
+
+
+/*----------------------------------------------------------*/
+/* Defines                                                                                                     */
+/*----------------------------------------------------------*/
+
+#define Asc 1
+#define Bin 2
+#define MshFil 4
+#define SolFil 8
+#define MaxMsh 100
+#define InfKwd 1
+#define RegKwd 2
+#define SolKwd 3
+#define WrdSiz 4
+#define BufSiz 10000
+
+
+/*----------------------------------------------------------*/
+/* Structures                                                                                          */
+/*----------------------------------------------------------*/
+
+typedef struct
+{
+       int typ, SolSiz, NmbWrd, NmbLin, NmbTyp, TypTab[ GmfMaxTyp ];
+       long pos;
+       char fmt[ GmfMaxTyp*9 ];
+}KwdSct;
+
+typedef struct
+{
+       int dim, ver, mod, typ, cod, pos;
+       long NexKwdPos, siz;
+       KwdSct KwdTab[ GmfMaxKwd + 1 ];
+       FILE *hdl;
+       int *IntBuf;
+       float *FltBuf;
+       unsigned char *buf;
+       char FilNam[ GmfStrSiz ];
+       double DblBuf[1000/8];
+       unsigned char blk[ BufSiz + 1000 ];
+}GmfMshSct;
+
+
+/*----------------------------------------------------------*/
+/* Global variables                                                                                    */
+/*----------------------------------------------------------*/
+
+static int GmfIniFlg=0;
+static GmfMshSct *GmfMshTab[ MaxMsh + 1 ];
+static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] = 
+{      {"Reserved", "", "", ""},
+       {"MeshVersionFormatted", "", "", "i"},
+       {"Reserved", "", "", ""},
+       {"Dimension", "", "", "i"},
+       {"Vertices", "Vertex", "i", "dri"},
+       {"Edges", "Edge", "i", "iii"},
+       {"Triangles", "Triangle", "i", "iiii"},
+       {"Quadrilaterals", "Quadrilateral", "i", "iiiii"},
+       {"Tetrahedra", "Tetrahedron", "i", "iiiii"},
+       {"Prisms", "Prism", "i", "iiiiiii"},
+       {"Hexahedra", "Hexahedron", "i", "iiiiiiiii"},
+       {"IterationsAll", "IterationAll","","i"},
+       {"TimesAll", "TimeAll","","r"},                                 
+       {"Corners", "Corner", "i", "i"},
+       {"Ridges", "Ridge", "i", "i"},
+       {"RequiredVertices", "RequiredVertex", "i", "i"},
+       {"RequiredEdges", "RequiredEdge", "i", "i"},
+       {"RequiredTriangles", "RequiredTriangle", "i", "i"},
+       {"RequiredQuadrilaterals", "RequiredQuadrilateral", "i", "i"},
+       {"TangentAtEdgeVertices", "TangentAtEdgeVertex", "i", "iii"},
+       {"NormalAtVertices", "NormalAtVertex", "i", "ii"},
+       {"NormalAtTriangleVertices", "NormalAtTriangleVertex", "i", "iii"},
+       {"NormalAtQuadrilateralVertices", "NormalAtQuadrilateralVertex", "i", "iiii"},
+       {"AngleOfCornerBound", "", "", "r"},
+       {"TrianglesP2", "TriangleP2", "i", "iiiiiii"},
+       {"EdgesP2", "EdgeP2", "i", "iiii"},
+       {"SolAtPyramids", "SolAtPyramid", "i", "sr"},
+       {"QuadrilateralsQ2", "QuadrilateralQ2", "i", "iiiiiiiiii"},
+       {"ISolAtPyramids", "ISolAtPyramid", "i", "iiiii"},
+       {"SubDomainFromGeom", "SubDomainFromGeom", "i", "iiii"},
+       {"TetrahedraP2", "TetrahedronP2", "i", "iiiiiiiiiii"},
+       {"Fault_NearTri", "Fault_NearTri", "i", "i"},
+       {"Fault_Inter", "Fault_Inter", "i", "i"},
+       {"HexahedraQ2", "HexahedronQ2", "i", "iiiiiiiiiiiiiiiiiiiiiiiiiiii"},
+       {"ExtraVerticesAtEdges", "ExtraVerticesAtEdge", "i", "in"},
+       {"ExtraVerticesAtTriangles", "ExtraVerticesAtTriangle", "i", "in"},
+       {"ExtraVerticesAtQuadrilaterals", "ExtraVerticesAtQuadrilateral", "i", "in"},
+       {"ExtraVerticesAtTetrahedra", "ExtraVerticesAtTetrahedron", "i", "in"},
+       {"ExtraVerticesAtPrisms", "ExtraVerticesAtPrism", "i", "in"},
+       {"ExtraVerticesAtHexahedra", "ExtraVerticesAtHexahedron", "i", "in"},
+       {"VerticesOnGeometricVertices", "VertexOnGeometricVertex", "i", "iir"},
+       {"VerticesOnGeometricEdges", "VertexOnGeometricEdge", "i", "iirr"},
+       {"VerticesOnGeometricTriangles", "VertexOnGeometricTriangle", "i", "iirrr"},
+       {"VerticesOnGeometricQuadrilaterals", "VertexOnGeometricQuadrilateral", "i", "iirrr"},
+       {"EdgesOnGeometricEdges", "EdgeOnGeometricEdge", "i", "iir"},
+       {"Fault_FreeEdge", "Fault_FreeEdge", "i", "i"},
+       {"Polyhedra", "Polyhedron", "i", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"},
+       {"Polygons", "Polygon", "", "iiiiiiiii"},
+       {"Fault_Overlap", "Fault_Overlap", "i", "i"},
+       {"Pyramids", "Pyramid", "i", "iiiiii"},
+       {"BoundingBox", "", "", "drdr"},
+       {"Body","i", "drdrdrdr"},
+       {"PrivateTable", "PrivateTable", "i", "i"},
+       {"Fault_BadShape", "Fault_BadShape", "i", "i"},
+       {"End", "", "", ""},
+       {"TrianglesOnGeometricTriangles", "TriangleOnGeometricTriangle", "i", "iir"},
+       {"TrianglesOnGeometricQuadrilaterals", "TriangleOnGeometricQuadrilateral", "i", "iir"},
+       {"QuadrilateralsOnGeometricTriangles", "QuadrilateralOnGeometricTriangle", "i", "iir"},
+       {"QuadrilateralsOnGeometricQuadrilaterals", "QuadrilateralOnGeometricQuadrilateral", "i", "iir"},
+       {"Tangents", "Tangent", "i", "dr"},
+       {"Normals", "Normal", "i", "dr"},
+       {"TangentAtVertices", "TangentAtVertex", "i", "ii"},
+       {"SolAtVertices", "SolAtVertex", "i", "sr"},
+       {"SolAtEdges", "SolAtEdge", "i", "sr"},
+       {"SolAtTriangles", "SolAtTriangle", "i", "sr"},
+       {"SolAtQuadrilaterals", "SolAtQuadrilateral", "i", "sr"},
+       {"SolAtTetrahedra", "SolAtTetrahedron", "i", "sr"},
+       {"SolAtPrisms", "SolAtPrism", "i", "sr"},
+       {"SolAtHexahedra", "SolAtHexahedron", "i", "sr"},
+       {"DSolAtVertices", "DSolAtVertex", "i", "sr"},
+       {"ISolAtVertices", "ISolAtVertex", "i", "i"},
+       {"ISolAtEdges", "ISolAtEdge", "i", "ii"},
+       {"ISolAtTriangles", "ISolAtTriangle", "i", "iii"},
+       {"ISolAtQuadrilaterals", "ISolAtQuadrilateral", "i", "iiii"},
+       {"ISolAtTetrahedra", "ISolAtTetrahedron", "i", "iiii"},
+       {"ISolAtPrisms", "ISolAtPrism", "i", "iiiiii"},
+       {"ISolAtHexahedra", "ISolAtHexahedron", "i", "iiiiiiii"},
+       {"Iterations", "","","i"},
+       {"Time", "","","r"},
+       {"Fault_SmallTri", "Fault_SmallTri","i","i"},
+       {"CoarseHexahedra", "CoarseHexahedron", "i", "i"}
+ };
+
+
+/*----------------------------------------------------------*/
+/* Prototypes of local procedures                                                      */
+/*----------------------------------------------------------*/
+
+static void ScaWrd(GmfMshSct *, unsigned char *);
+static void ScaDblWrd(GmfMshSct *, unsigned char *);
+static void ScaBlk(GmfMshSct *, unsigned char *, int);
+static long GetPos(GmfMshSct *);
+static void RecWrd(GmfMshSct *, unsigned char *);
+static void RecDblWrd(GmfMshSct *, unsigned char *);
+static void RecBlk(GmfMshSct *, unsigned char *, int);
+static void SetPos(GmfMshSct *, long);
+static int ScaKwdTab(GmfMshSct *);
+static void ExpFmt(GmfMshSct *, int);
+static void ScaKwdHdr(GmfMshSct *, int);
+
+
+/*----------------------------------------------------------*/
+/* Open a mesh file in read or write mod                                       */
+/*----------------------------------------------------------*/
+
+int GmfOpenMesh(const char *FilNam, int mod, ...)
+{
+       int i, KwdCod, res, *PtrVer, *PtrDim, MshIdx=0;
+       char str[ GmfStrSiz ];
+       va_list VarArg;
+       GmfMshSct *msh;
+       char *ptr;
+       int k;
+
+       if(!GmfIniFlg)
+       {
+               for(i=0;i<=MaxMsh;i++)
+                       GmfMshTab[i] = NULL;
+
+               GmfIniFlg = 1;
+       }
+
+       /*---------------------*/
+       /* MESH STRUCTURE INIT */
+       /*---------------------*/
+
+       for(i=1;i<=MaxMsh;i++)
+               if(!GmfMshTab[i])
+               {
+                       MshIdx = i;
+                       break;
+               }
+
+       if( !MshIdx || !(msh = calloc(1, sizeof(GmfMshSct))) )
+               return(0);
+
+       /* Copy the FilNam into the structure */
+
+       if(strlen(FilNam) + 7 >= GmfStrSiz)
+        {
+                free (msh);
+               return(0);
+        }
+
+       strcpy(msh->FilNam, FilNam);
+
+       /* Store the opening mod (read or write) and guess the filetype (binary or ascii) depending on the extension */
+
+       msh->mod = mod;
+       msh->buf = (unsigned char *)msh->DblBuf;
+       msh->FltBuf = (float *)msh->DblBuf;
+       msh->IntBuf = (int *)msh->DblBuf;
+
+       k = strlen(msh->FilNam) - 6;
+       if(k < 0)
+               k = 0;
+       ptr = msh->FilNam+k;
+       if(strstr(ptr, ".meshb"))
+               msh->typ |= (Bin | MshFil);
+       else if(strstr(ptr, ".mesh"))
+               msh->typ |= (Asc | MshFil);
+       else if(strstr(ptr, ".solb"))
+               msh->typ |= (Bin | SolFil);
+       else if(strstr(ptr, ".sol"))
+               msh->typ |= (Asc | SolFil);
+       else {
+               free (msh);
+               return(0);
+       }
+
+       /* Open the file in the required mod and initialyse the mesh structure */
+
+       if(msh->mod == GmfRead)
+       {
+
+               /*-----------------------*/
+               /* OPEN FILE FOR READING */
+               /*-----------------------*/
+
+               va_start(VarArg, mod);
+               PtrVer = va_arg(VarArg, int *);
+               PtrDim = va_arg(VarArg, int *);
+               va_end(VarArg);
+
+               /* Create the name string and open the file */
+
+               if(!(msh->hdl = fopen(msh->FilNam, "rb")))
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               /* Read the endian coding tag, the mesh version and the mesh dimension (mandatory kwd) */
+
+               if(msh->typ & Bin)
+               {
+                       fread((unsigned char *)&msh->cod, WrdSiz, 1, msh->hdl);
+
+                       if( (msh->cod != 1) && (msh->cod != 16777216) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       ScaWrd(msh, (unsigned char *)&msh->ver);
+
+                       if( (msh->ver < 1) || (msh->ver > 3) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       if( (msh->ver == 3) && (sizeof(long) == 4) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       ScaWrd(msh, (unsigned char *)&KwdCod);
+
+                       if(KwdCod != GmfDimension)
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       GetPos(msh);
+                       ScaWrd(msh, (unsigned char *)&msh->dim);
+               }
+               else
+               {
+                       do
+                       {
+                               res = fscanf(msh->hdl, "%s", str);
+                       }while( (res != EOF) && strcmp(str, "MeshVersionFormatted") );
+
+                       if(res == EOF)
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       fscanf(msh->hdl, "%d", &msh->ver);
+
+                       if( (msh->ver < 1) || (msh->ver > 3) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       do
+                       {
+                               res = fscanf(msh->hdl, "%s", str);
+                       }while( (res != EOF) && strcmp(str, "Dimension") );
+
+                       if(res == EOF)
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       fscanf(msh->hdl, "%d", &msh->dim);
+               }
+
+               if( (msh->dim != 2) && (msh->dim != 3) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               (*PtrVer) = msh->ver;
+               (*PtrDim) = msh->dim;
+
+               /*------------*/
+               /* KW READING */
+               /*------------*/
+
+               /* Read the list of kw present in the file */
+
+               if(!ScaKwdTab(msh))
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               GmfMshTab[ MshIdx ] = msh;
+
+               return(MshIdx);
+       }
+       else if(msh->mod == GmfWrite)
+       {
+
+               /*-----------------------*/
+               /* OPEN FILE FOR WRITING */
+               /*-----------------------*/
+
+               msh->cod = 1;
+
+               /* Check if the user provided a valid version number and dimension */
+
+               va_start(VarArg, mod);
+               msh->ver = va_arg(VarArg, int);
+               msh->dim = va_arg(VarArg, int);
+               va_end(VarArg);
+
+               if( (msh->ver < 1) || (msh->ver > 3) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               if( (msh->ver == 3) && (sizeof(long) == 4) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               if( (msh->dim != 2) && (msh->dim != 3) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               /* Create the mesh file */
+
+               if(!(msh->hdl = fopen(msh->FilNam, "wb")))
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               GmfMshTab[ MshIdx ] = msh;
+
+
+               /*------------*/
+               /* KW WRITING */
+               /*------------*/
+
+               /* Write the mesh version and dimension */
+
+               if(msh->typ & Asc)
+               {
+                       fprintf(msh->hdl, "%s %d\n\n", GmfKwdFmt[ GmfVersionFormatted ][0], msh->ver);
+                       fprintf(msh->hdl, "%s %d\n", GmfKwdFmt[ GmfDimension ][0], msh->dim);
+               }
+               else
+               {
+                       RecWrd(msh, (unsigned char *)&msh->cod);
+                       RecWrd(msh, (unsigned char *)&msh->ver);
+                       GmfSetKwd(MshIdx, GmfDimension, 0);
+                       RecWrd(msh, (unsigned char *)&msh->dim);
+               }
+
+               return(MshIdx);
+       }
+       else
+       {
+                free (msh);
+               return(0);
+        }
+}
+
+
+/*----------------------------------------------------------*/
+/* Close a meshfile in the right way                                           */
+/*----------------------------------------------------------*/
+
+int GmfCloseMesh(int MshIdx)
+{
+       int res = 1;
+       GmfMshSct *msh;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+       RecBlk(msh, msh->buf, 0);
+
+       /* In write down the "End" kw in write mode */
+
+       if(msh->mod == GmfWrite){
+               if(msh->typ & Asc)
+                       fprintf(msh->hdl, "\n%s\n", GmfKwdFmt[ GmfEnd ][0]);
+               else
+                       GmfSetKwd(MshIdx, GmfEnd, 0);
+       }
+       /* Close the file and free the mesh structure */
+
+       if(fclose(msh->hdl))
+               res = 0;
+
+       free(msh);
+       GmfMshTab[ MshIdx ] = NULL;
+
+       return(res);
+}
+
+
+/*----------------------------------------------------------*/
+/* Read the number of lines and set the position to this kwd*/
+/*----------------------------------------------------------*/
+
+int GmfStatKwd(int MshIdx, int KwdCod, ...)
+{
+       int i, *PtrNmbTyp, *PtrSolSiz, *TypTab;
+       GmfMshSct *msh;
+       KwdSct *kwd;
+       va_list VarArg;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+
+       if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) )
+               return(0);
+
+       kwd = &msh->KwdTab[ KwdCod ];
+
+       if(!kwd->NmbLin)
+               return(0);
+
+       /* Read further arguments if this kw is a sol */
+
+       if(kwd->typ == SolKwd)
+       {
+               va_start(VarArg, KwdCod);
+
+               PtrNmbTyp = va_arg(VarArg, int *);
+               *PtrNmbTyp = kwd->NmbTyp;
+
+               PtrSolSiz = va_arg(VarArg, int *);
+               *PtrSolSiz = kwd->SolSiz;
+
+               TypTab = va_arg(VarArg, int *);
+
+               for(i=0;i<kwd->NmbTyp;i++)
+                       TypTab[i] = kwd->TypTab[i];
+
+               va_end(VarArg);
+       }
+
+       return(kwd->NmbLin);
+}
+
+
+/*----------------------------------------------------------*/
+/* Set the current file position to a given kwd                                */
+/*----------------------------------------------------------*/
+
+int GmfGotoKwd(int MshIdx, int KwdCod)
+{
+       GmfMshSct *msh;
+       KwdSct *kwd;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+
+       if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) )
+               return(0);
+
+       kwd = &msh->KwdTab[ KwdCod ];
+
+       if(!kwd->NmbLin)
+               return(0);
+
+       return(fseek(msh->hdl, kwd->pos, SEEK_SET));
+}
+
+
+/*----------------------------------------------------------*/
+/* Write the kwd and set the number of lines                           */
+/*----------------------------------------------------------*/
+
+int GmfSetKwd(int MshIdx, int KwdCod, ...)
+{
+       int i, NmbLin=0, *TypTab;
+       long CurPos;
+       va_list VarArg;
+       GmfMshSct *msh;
+       KwdSct *kwd;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+       RecBlk(msh, msh->buf, 0);
+
+       if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) )
+               return(0);
+
+       kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Read further arguments if this kw has a header */
+
+       if(strlen(GmfKwdFmt[ KwdCod ][2]))
+       {
+               va_start(VarArg, KwdCod);
+               NmbLin = va_arg(VarArg, int);
+
+               if(!strcmp(GmfKwdFmt[ KwdCod ][3], "sr"))
+               {
+                       kwd->NmbTyp = va_arg(VarArg, int);
+                       TypTab = va_arg(VarArg, int *);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               kwd->TypTab[i] = TypTab[i];
+               }
+
+               va_end(VarArg);
+       }
+
+       /* Setup the kwd info */
+
+       ExpFmt(msh, KwdCod);
+
+       if(!kwd->typ)
+               return(0);
+       else if(kwd->typ == InfKwd)
+               kwd->NmbLin = 1;
+       else
+               kwd->NmbLin = NmbLin;
+
+       /* Store the next kwd position in binary file */
+
+       if( (msh->typ & Bin) && msh->NexKwdPos )
+       {
+               CurPos = ftell(msh->hdl);
+               fseek(msh->hdl, msh->NexKwdPos, SEEK_SET);
+               SetPos(msh, CurPos);
+               fseek(msh->hdl, CurPos, SEEK_SET);
+       }
+
+       /* Write the header */
+
+       if(msh->typ & Asc)
+       {
+               fprintf(msh->hdl, "\n%s\n", GmfKwdFmt[ KwdCod ][0]);
+
+               if(kwd->typ != InfKwd)
+                       fprintf(msh->hdl, "%d\n", kwd->NmbLin);
+
+               /* In case of solution field, write the extended header */
+
+               if(kwd->typ == SolKwd)
+               {
+                       fprintf(msh->hdl, "%d ", kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               fprintf(msh->hdl, "%d ", kwd->TypTab[i]);
+
+                       fprintf(msh->hdl, "\n\n");
+               }
+       }
+       else
+       {
+               RecWrd(msh, (unsigned char *)&KwdCod);
+               msh->NexKwdPos = ftell(msh->hdl);
+               SetPos(msh, 0);
+
+               if(kwd->typ != InfKwd)
+                       RecWrd(msh, (unsigned char *)&kwd->NmbLin);
+
+               /* In case of solution field, write the extended header at once */
+
+               if(kwd->typ == SolKwd)
+               {
+                       RecWrd(msh, (unsigned char *)&kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               RecWrd(msh, (unsigned char *)&kwd->TypTab[i]);
+               }
+       }
+
+       /* Reset write buffer position */
+       msh->pos = 0;
+
+       /* Estimate the total file size and check whether it crosses the 2GB threshold */
+
+       msh->siz += kwd->NmbLin * kwd->NmbWrd * WrdSiz;
+
+       if(msh->siz > 2E9)
+               return(0);
+       else
+               return(kwd->NmbLin);
+}
+
+
+/*----------------------------------------------------------*/
+/* Read a full line from the current kwd                                       */
+/*----------------------------------------------------------*/
+
+void GmfGetLin(int MshIdx, int KwdCod, ...)
+{
+       int i, j;
+       float *FltSolTab;
+       double *DblSolTab;
+       va_list VarArg;
+       GmfMshSct *msh = GmfMshTab[ MshIdx ];
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Start decoding the arguments */
+
+       va_start(VarArg, KwdCod);
+
+       if(kwd->typ != SolKwd)
+       {
+               int k, nb_repeat = 0;
+
+               if(msh->ver == 1)
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fscanf(msh->hdl, "%f", va_arg(VarArg, float *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               fscanf(msh->hdl, "%d", &nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                       }
+                       else
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               ScaWrd(msh, (unsigned char *)va_arg(VarArg, float *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               ScaWrd(msh, (unsigned char *)&nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+                       }
+               }
+               else
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fscanf(msh->hdl, "%lf", va_arg(VarArg, double *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               fscanf(msh->hdl, "%d", &nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                       }
+                       else
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               ScaDblWrd(msh, (unsigned char *)va_arg(VarArg, double *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               ScaWrd(msh, (unsigned char *)&nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+               }
+       }
+       else
+       {
+               if(msh->ver == 1)
+               {
+                       FltSolTab = va_arg(VarArg, float *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fscanf(msh->hdl, "%f", &FltSolTab[j]);
+                       else
+                               ScaBlk(msh, (unsigned char *)FltSolTab, kwd->NmbWrd);
+               }
+               else
+               {
+                       DblSolTab = va_arg(VarArg, double *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fscanf(msh->hdl, "%lf", &DblSolTab[j]);
+                       else
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       ScaDblWrd(msh, (unsigned char *)&DblSolTab[j]);
+               }
+       }
+
+       va_end(VarArg);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a full line from the current kwd                                      */
+/*----------------------------------------------------------*/
+
+void GmfSetLin(int MshIdx, int KwdCod, ...)
+{
+       int i, j, pos, *IntBuf;
+       float *FltSolTab;
+       double *DblSolTab, *DblBuf;
+       va_list VarArg;
+       GmfMshSct *msh = GmfMshTab[ MshIdx ];
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Start decoding the arguments */
+
+       va_start(VarArg, KwdCod);
+
+       if(kwd->typ != SolKwd)
+       {
+               int k, nb_repeat = 0;
+
+               if(msh->ver == 1)
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fprintf(msh->hdl, "%g ", (float)va_arg(VarArg, double));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               nb_repeat = va_arg(VarArg, int);
+                                               fprintf(msh->hdl, "%d ", nb_repeat);
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                                       }
+                                       else
+                                               fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                       }
+                       else
+                       {
+                               int size_of_block = kwd->SolSiz;
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               msh->FltBuf[i] = va_arg(VarArg, double);
+                                       else if(kwd->fmt[i] == 'n') {
+                                               nb_repeat = va_arg(VarArg, int);
+                                               msh->FltBuf[i] = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++) {
+                                                       msh->IntBuf[i+1+k] = va_arg(VarArg, int);
+                                                       size_of_block ++;
+                                               }
+                                       }
+                                       else
+                                               msh->IntBuf[i] = va_arg(VarArg, int);
+
+                               RecBlk(msh, msh->buf, size_of_block);
+                       }
+               }
+               else
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fprintf(msh->hdl, "%.15lg ", va_arg(VarArg, double));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               nb_repeat = va_arg(VarArg, int);
+                                               fprintf(msh->hdl, "%d ", nb_repeat);
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                                       }
+                                       else
+                                               fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                       }
+                       else
+                       {
+                               pos = 0;
+
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                       {
+                                               DblBuf = (double *)&msh->buf[ pos ];
+                                               *DblBuf = va_arg(VarArg, double);
+                                               pos += 8;
+                                       }
+                                       else if(kwd->fmt[i] == 'n')
+                                       {
+                                               IntBuf = (int *)&msh->buf[ pos ];
+                                               nb_repeat = va_arg(VarArg, int);
+                                               *IntBuf = nb_repeat;
+                                               pos += 4;
+                                               for(k=0;k<nb_repeat;k++) {
+                                                       IntBuf = (int *)&msh->buf[ pos ];
+                                                       *IntBuf = va_arg(VarArg, int);
+                                                       pos += 4;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               IntBuf = (int *)&msh->buf[ pos ];
+                                               *IntBuf = va_arg(VarArg, int);
+                                               pos += 4;
+                                       }
+                               RecBlk(msh, msh->buf, pos/4);
+                       }
+               }
+       }
+       else
+       {
+               if(msh->ver == 1)
+               {
+                       FltSolTab = va_arg(VarArg, float *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fprintf(msh->hdl, "%g ", FltSolTab[j]);
+                       else
+                               RecBlk(msh, (unsigned char *)FltSolTab, kwd->NmbWrd);
+               }
+               else
+               {
+                       DblSolTab = va_arg(VarArg, double *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fprintf(msh->hdl, "%.15lg ", DblSolTab[j]);
+                       else
+                               RecBlk(msh, (unsigned char *)DblSolTab, kwd->NmbWrd);
+               }
+       }
+
+       va_end(VarArg);
+
+       if(msh->typ & Asc)
+               fprintf(msh->hdl, "\n");
+}
+
+
+/*----------------------------------------------------------*/
+/* Private procedure for transmesh : copy a whole line         */
+/*----------------------------------------------------------*/
+
+void GmfCpyLin(int InpIdx, int OutIdx, int KwdCod)
+{
+       double d;
+       float f;
+       int i, a;
+       GmfMshSct *InpMsh = GmfMshTab[ InpIdx ], *OutMsh = GmfMshTab[ OutIdx ];
+       KwdSct *kwd = &InpMsh->KwdTab[ KwdCod ];
+
+       for(i=0;i<kwd->SolSiz;i++)
+       {
+               if(kwd->fmt[i] == 'r')
+               {
+                       if(InpMsh->ver == 1)
+                       {
+                               if(InpMsh->typ & Asc)
+                                       fscanf(InpMsh->hdl, "%f", &f);
+                               else
+                                       ScaWrd(InpMsh, (unsigned char *)&f);
+
+                               d = f;
+                       }
+                       else
+                       {
+                               if(InpMsh->typ & Asc)
+                                       fscanf(InpMsh->hdl, "%lf", &d);
+                               else
+                                       ScaDblWrd(InpMsh, (unsigned char *)&d);
+
+                               f = (float)d;
+                       }
+
+                       if(OutMsh->ver == 1)
+                               if(OutMsh->typ & Asc)
+                                       fprintf(OutMsh->hdl, "%g ", f);
+                               else
+                                       RecWrd(OutMsh, (unsigned char *)&f);
+                       else
+                               if(OutMsh->typ & Asc)
+                                       fprintf(OutMsh->hdl, "%.15g ", d);
+                               else
+                                       RecDblWrd(OutMsh, (unsigned char *)&d);
+               }
+               else if(kwd->fmt[i] == 'n')
+               {
+                       int k, nb_repeat = 0;
+
+                       if(InpMsh->typ & Asc)
+                               fscanf(InpMsh->hdl, "%d", &a);
+                       else
+                               ScaWrd(InpMsh, (unsigned char *)&a);
+
+                       nb_repeat = a;
+
+                       if(OutMsh->typ & Asc)
+                               fprintf(OutMsh->hdl, "%d ", a);
+                       else
+                               RecWrd(OutMsh, (unsigned char *)&a);
+
+                       for(k=0;k<nb_repeat;k++) {
+                               if(InpMsh->typ & Asc)
+                                       fscanf(InpMsh->hdl, "%d", &a);
+                               else
+                                       ScaWrd(InpMsh, (unsigned char *)&a);
+
+                               if(OutMsh->typ & Asc)
+                                       fprintf(OutMsh->hdl, "%d ", a);
+                               else
+                                       RecWrd(OutMsh, (unsigned char *)&a);
+                       }
+               }
+               else
+               {
+                       if(InpMsh->typ & Asc)
+                               fscanf(InpMsh->hdl, "%d", &a);
+                       else
+                               ScaWrd(InpMsh, (unsigned char *)&a);
+
+                       if(OutMsh->typ & Asc)
+                               fprintf(OutMsh->hdl, "%d ", a);
+                       else
+                               RecWrd(OutMsh, (unsigned char *)&a);
+               }
+       }
+
+       if(OutMsh->typ & Asc)
+               fprintf(OutMsh->hdl, "\n");
+}
+
+
+/*----------------------------------------------------------*/
+/* Find every kw present in a meshfile                                         */
+/*----------------------------------------------------------*/
+
+static int ScaKwdTab(GmfMshSct *msh)
+{
+       int KwdCod;
+       long  NexPos, CurPos, EndPos;
+       char str[ GmfStrSiz ];
+
+       if(msh->typ & Asc)
+       {
+               /* Scan each string in the file until the end */
+
+               while(fscanf(msh->hdl, "%s", str) != EOF)
+               {
+                       /* Fast test in order to reject quickly the numeric values */
+
+                       if(isalpha(str[0]))
+                       {
+                               /* Search which kwd code this string is associated with, 
+                                       then get its header and save the curent position in file (just before the data) */
+
+                               for(KwdCod=1; KwdCod<= GmfMaxKwd; KwdCod++)
+                                       if(!strcmp(str, GmfKwdFmt[ KwdCod ][0]))
+                                       {
+                                               ScaKwdHdr(msh, KwdCod);
+                                               break;
+                                       }
+                       }
+                       else if(str[0] == '#')
+                               while(fgetc(msh->hdl) != '\n');
+               }
+       }
+       else
+       {
+               /* Get file size */
+
+               CurPos = ftell(msh->hdl);
+               fseek(msh->hdl, 0, SEEK_END);
+               EndPos = ftell(msh->hdl);
+               fseek(msh->hdl, CurPos, SEEK_SET);
+
+               /* Jump through kwd positions in the file */
+
+               do
+               {
+                       /* Get the kwd code and the next kwd position */
+
+                       ScaWrd(msh, (unsigned char *)&KwdCod);
+                       NexPos = GetPos(msh);
+
+                       if(NexPos > EndPos)
+                               return(0);
+
+                       /* Check if this kwd belongs to this mesh version */
+
+                       if( (KwdCod >= 1) && (KwdCod <= GmfMaxKwd) )
+                               ScaKwdHdr(msh, KwdCod);
+
+                       /* Go to the next kwd */
+
+                       if(NexPos)
+                               fseek(msh->hdl, NexPos, SEEK_SET);
+               }while(NexPos && (KwdCod != GmfEnd));
+       }
+
+       return(1);
+}
+
+
+/*----------------------------------------------------------*/
+/* Read and setup the keyword's header                                         */
+/*----------------------------------------------------------*/
+
+static void ScaKwdHdr(GmfMshSct *msh, int KwdCod)
+{
+       int i;
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       if(!strcmp("i", GmfKwdFmt[ KwdCod ][2]))
+       {
+               if(msh->typ & Asc)
+                       fscanf(msh->hdl, "%d", &kwd->NmbLin);
+               else
+                       ScaWrd(msh, (unsigned char *)&kwd->NmbLin);
+       }
+       else
+               kwd->NmbLin = 1;
+
+       if(!strcmp("sr", GmfKwdFmt[ KwdCod ][3]))
+       {
+               if(msh->typ & Asc)
+               {
+                       fscanf(msh->hdl, "%d", &kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               fscanf(msh->hdl, "%d", &kwd->TypTab[i]);
+               }
+               else
+               {
+                       ScaWrd(msh, (unsigned char *)&kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               ScaWrd(msh, (unsigned char *)&kwd->TypTab[i]);
+               }
+       }
+
+       ExpFmt(msh, KwdCod);
+       kwd->pos = ftell(msh->hdl);
+}
+
+
+/*----------------------------------------------------------*/
+/* Expand the compacted format and compute the line size       */
+/*----------------------------------------------------------*/
+
+static void ExpFmt(GmfMshSct *msh, int KwdCod)
+{
+       int i, j, TmpSiz=0;
+       char chr;
+       const char *InpFmt = GmfKwdFmt[ KwdCod ][3];
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Set the kwd's type */
+
+       if(!strlen(GmfKwdFmt[ KwdCod ][2]))
+               kwd->typ = InfKwd;
+       else if(!strcmp(InpFmt, "sr"))
+               kwd->typ = SolKwd;
+       else
+               kwd->typ = RegKwd;
+
+       /* Get the solution-field's size */
+
+       if(kwd->typ == SolKwd)
+               for(i=0;i<kwd->NmbTyp;i++)
+                       switch(kwd->TypTab[i])
+                       {
+                               case GmfSca    : TmpSiz += 1; break;
+                               case GmfVec    : TmpSiz += msh->dim; break;
+                               case GmfSymMat : TmpSiz += (msh->dim * (msh->dim+1)) / 2; break;
+                               case GmfMat    : TmpSiz += msh->dim * msh->dim; break;
+                       }
+
+       /* Scan each character from the format string */
+
+       i = kwd->SolSiz = kwd->NmbWrd = 0;
+
+       while(i < strlen(InpFmt))
+       {
+               chr = InpFmt[ i++ ];
+
+               if(chr == 'd')
+               {
+                       chr = InpFmt[i++];
+
+                       for(j=0;j<msh->dim;j++)
+                               kwd->fmt[ kwd->SolSiz++ ] = chr;
+               }
+               else if(chr == 's')
+               {
+                       chr = InpFmt[i++];
+
+                       for(j=0;j<TmpSiz;j++)
+                               kwd->fmt[ kwd->SolSiz++ ] = chr;
+               }
+               else
+                       kwd->fmt[ kwd->SolSiz++ ] = chr;
+       }
+
+       for(i=0;i<kwd->SolSiz;i++)
+               if(kwd->fmt[i] == 'i')
+                       kwd->NmbWrd++;
+               else if(msh->ver >= 2)
+                       kwd->NmbWrd += 2;
+               else
+                       kwd->NmbWrd++;
+}
+
+
+/*----------------------------------------------------------*/
+/* Read a four bytes word from a mesh file                                     */
+/*----------------------------------------------------------*/
+
+static void ScaWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       unsigned char swp;
+
+       fread(wrd, WrdSiz, 1, msh->hdl);
+
+       if(msh->cod == 1)
+               return;
+
+       swp = wrd[3];
+       wrd[3] = wrd[0];
+       wrd[0] = swp;
+
+       swp = wrd[2];
+       wrd[2] = wrd[1];
+       wrd[1] = swp;
+}
+
+
+/*----------------------------------------------------------*/
+/* Read an eight bytes word from a mesh file                           */
+/*----------------------------------------------------------*/
+
+static void ScaDblWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       int i;
+       unsigned char swp;
+
+       fread(wrd, WrdSiz, 2, msh->hdl);
+
+       if(msh->cod == 1)
+               return;
+
+       for(i=0;i<4;i++)
+       {
+               swp = wrd[7-i];
+               wrd[7-i] = wrd[i];
+               wrd[i] = swp;
+       }
+}
+
+
+/*----------------------------------------------------------*/
+/* Read ablock of four bytes word from a mesh file                     */
+/*----------------------------------------------------------*/
+
+static void ScaBlk(GmfMshSct *msh, unsigned char *blk, int siz)
+{
+       int i, j;
+       unsigned char swp, *wrd;
+
+       fread(blk, WrdSiz, siz, msh->hdl);
+
+       if(msh->cod == 1)
+               return;
+
+       for(i=0;i<siz;i++)
+       {
+               wrd = &blk[ i * 4 ];
+
+               for(j=0;j<2;j++)
+               {
+                       swp = wrd[ 3-j ];
+                       wrd[ 3-j ] = wrd[j];
+                       wrd[j] = swp;
+               }
+       }
+}
+
+
+/*----------------------------------------------------------*/
+/* Read a 4 or 8 bytes position in mesh file                           */
+/*----------------------------------------------------------*/
+
+static long GetPos(GmfMshSct *msh)
+{
+       int IntVal;
+       long pos;
+
+       if(msh->ver >= 3)
+               ScaDblWrd(msh, (unsigned char*)&pos);
+       else
+       {
+               ScaWrd(msh, (unsigned char*)&IntVal);
+               pos = IntVal;
+       }
+
+       return(pos);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a four bytes word to a mesh file                                      */
+/*----------------------------------------------------------*/
+
+static void RecWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       fwrite(wrd, WrdSiz, 1, msh->hdl);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write an eight bytes word to a mesh file                                    */
+/*----------------------------------------------------------*/
+
+static void RecDblWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       fwrite(wrd, WrdSiz, 2, msh->hdl);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a block of four bytes word to a mesh file                     */
+/*----------------------------------------------------------*/
+
+static void RecBlk(GmfMshSct *msh, unsigned char *blk, int siz)
+{
+       /* Copy this line-block into the main mesh buffer */
+
+       if(siz)
+       {
+               memcpy(&msh->blk[ msh->pos ], blk, siz * WrdSiz);
+               msh->pos += siz * WrdSiz;
+       }
+
+       /* When the buffer is full or this procedure is called with a 0 size, flush the cache on disk */
+
+       if( (msh->pos > BufSiz) || (!siz && msh->pos) )
+       {
+               fwrite(msh->blk, 1, msh->pos, msh->hdl);
+               msh->pos = 0;
+       }
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a 4 or 8 bytes position in a mesh file                                */
+/*----------------------------------------------------------*/
+
+static void SetPos(GmfMshSct *msh, long pos)
+{
+       int IntVal;
+
+       if(msh->ver >= 3)
+               RecDblWrd(msh, (unsigned char*)&pos);
+       else
+       {
+               IntVal = pos;
+               RecWrd(msh, (unsigned char*)&IntVal);
+       }
+}
diff --git a/src/DriverGMF/libmesh5.h b/src/DriverGMF/libmesh5.h
new file mode 100644 (file)
index 0000000..6657957
--- /dev/null
@@ -0,0 +1,155 @@
+
+
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*                                             LIBMESH V 5.46                                          */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*     Description:            handle .meshb file format I/O           */
+/*     Author:                         Loic MARECHAL                                           */
+/*     Creation date:          feb 16 2007                                                     */
+/*     Last modification:      dec 09 2011                                                     */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+
+
+/*----------------------------------------------------------*/
+/* Defines                                                                                                     */
+/*----------------------------------------------------------*/
+
+#include "SMESH_DriverGMF.hxx"
+
+#define GmfStrSiz 1024
+#define GmfMaxTyp 1000
+#define GmfMaxKwd 80
+#define GmfMshVer 1
+#define GmfRead 1
+#define GmfWrite 2
+#define GmfSca 1
+#define GmfVec 2
+#define GmfSymMat 3
+#define GmfMat 4
+#define GmfFloat 1
+#define GmfDouble 2
+
+enum GmfKwdCod
+{
+       GmfReserved1, \
+       GmfVersionFormatted, \
+       GmfReserved2, \
+       GmfDimension, \
+       GmfVertices, \
+       GmfEdges, \
+       GmfTriangles, \
+       GmfQuadrilaterals, \
+       GmfTetrahedra, \
+       GmfPrisms, \
+       GmfHexahedra, \
+       GmfIterationsAll, \
+       GmfTimesAll, \
+       GmfCorners, \
+       GmfRidges, \
+       GmfRequiredVertices, \
+       GmfRequiredEdges, \
+       GmfRequiredTriangles, \
+       GmfRequiredQuadrilaterals, \
+       GmfTangentAtEdgeVertices, \
+       GmfNormalAtVertices, \
+       GmfNormalAtTriangleVertices, \
+       GmfNormalAtQuadrilateralVertices, \
+       GmfAngleOfCornerBound, \
+       GmfTrianglesP2, \
+       GmfEdgesP2, \
+       GmfSolAtPyramids, \
+       GmfQuadrilateralsQ2, \
+       GmfISolAtPyramids, \
+       GmfSubDomainFromGeom, \
+       GmfTetrahedraP2, \
+       GmfFault_NearTri, \
+       GmfFault_Inter, \
+       GmfHexahedraQ2, \
+       GmfExtraVerticesAtEdges, \
+       GmfExtraVerticesAtTriangles, \
+       GmfExtraVerticesAtQuadrilaterals, \
+       GmfExtraVerticesAtTetrahedra, \
+       GmfExtraVerticesAtPrisms, \
+       GmfExtraVerticesAtHexahedra, \
+       GmfVerticesOnGeometricVertices, \
+       GmfVerticesOnGeometricEdges, \
+       GmfVerticesOnGeometricTriangles, \
+       GmfVerticesOnGeometricQuadrilaterals, \
+       GmfEdgesOnGeometricEdges, \
+       GmfFault_FreeEdge, \
+       GmfPolyhedra, \
+       GmfPolygons, \
+       GmfFault_Overlap, \
+       GmfPyramids, \
+       GmfBoundingBox, \
+       GmfBody, \
+       GmfPrivateTable, \
+       GmfFault_BadShape, \
+       GmfEnd, \
+       GmfTrianglesOnGeometricTriangles, \
+       GmfTrianglesOnGeometricQuadrilaterals, \
+       GmfQuadrilateralsOnGeometricTriangles, \
+       GmfQuadrilateralsOnGeometricQuadrilaterals, \
+       GmfTangents, \
+       GmfNormals, \
+       GmfTangentAtVertices, \
+       GmfSolAtVertices, \
+       GmfSolAtEdges, \
+       GmfSolAtTriangles, \
+       GmfSolAtQuadrilaterals, \
+       GmfSolAtTetrahedra, \
+       GmfSolAtPrisms, \
+       GmfSolAtHexahedra, \
+       GmfDSolAtVertices, \
+       GmfISolAtVertices, \
+       GmfISolAtEdges, \
+       GmfISolAtTriangles, \
+       GmfISolAtQuadrilaterals, \
+       GmfISolAtTetrahedra, \
+       GmfISolAtPrisms, \
+       GmfISolAtHexahedra, \
+       GmfIterations, \
+       GmfTime, \
+       GmfFault_SmallTri, \
+       GmfCoarseHexahedra
+};
+
+
+/*----------------------------------------------------------*/
+/* External procedures                                                                         */
+/*----------------------------------------------------------*/
+
+MESHDriverGMF_EXPORT extern int GmfOpenMesh(const char *, int, ...);
+MESHDriverGMF_EXPORT extern int GmfCloseMesh(int);
+MESHDriverGMF_EXPORT extern int GmfStatKwd(int, int, ...);
+MESHDriverGMF_EXPORT extern int GmfGotoKwd(int, int);
+MESHDriverGMF_EXPORT extern int GmfSetKwd(int, int, ...);
+MESHDriverGMF_EXPORT extern void GmfGetLin(int, int, ...);
+MESHDriverGMF_EXPORT extern void GmfSetLin(int, int, ...);
+
+
+/*----------------------------------------------------------*/
+/* Fortran 77 API                                                                                      */
+/*----------------------------------------------------------*/
+
+#if defined(F77_NO_UNDER_SCORE)
+#define call(x) x
+#else
+#define call(x) x ## _
+#endif
+
+
+/*----------------------------------------------------------*/
+/* Transmesh private API                                                                       */
+/*----------------------------------------------------------*/
+
+#ifdef TRANSMESH
+
+MESHDriverGMF_EXPORT extern char *GmfKwdFmt[ GmfMaxKwd + 1 ][4];
+MESHDriverGMF_EXPORT extern int GmfCpyLin(int, int, int);
+
+#endif
index a60b77ca9e33cde6123d5eb35e4c5c0f5d6a133b..35caa0286e17d144444063469d93701754119c82 100644 (file)
@@ -205,7 +205,7 @@ DriverMED_R_SMESHDS_Mesh
                 aNodeIds.resize( aNbBalls );
                 for(TInt iBall = 0; iBall < aNbBalls && anIsNodeNum; iBall++)
                 {
-                  aNodeIds[iBall] = aNodeInfo->GetElemNum(iBall);
+                  aNodeIds[iBall] = aNodeInfo->GetElemNum( (*aBallInfo->myConn)[ iBall ]-1 );
                   anIsNodeNum = myMesh->FindNode( aNodeIds[iBall] ) ? eVRAI : eFAUX;
                 }
               }
index 39b03f2d619cd4435c71d253ee0d0967f0ebc71f..9d1bf4adf7461c8b7c0c4482b1013f5bb82bb133 100644 (file)
@@ -411,7 +411,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
     if (myDoGroupOfFaces && nbFaces) myFacesDefaultFamilyId = REST_FACES_FAMILY;
     if (myDoGroupOfVolumes && nbVolumes) myVolumesDefaultFamilyId = REST_VOLUMES_FAMILY;
     if (myDoGroupOf0DElems && nb0DElements) my0DElementsDefaultFamilyId = REST_0DELEM_FAMILY;
-    if (myDoGroupOfVolumes && nbVolumes) myBallsDefaultFamilyId = REST_BALL_FAMILY;
+    if (myDoGroupOfBalls && nbBalls) myBallsDefaultFamilyId = REST_BALL_FAMILY;
 
     MESSAGE("Perform - aFamilyInfo");
     //cout << " DriverMED_Family::MakeFamilies() " << endl;
index 0e6d83571d93e754605fe18c5f8180b48c551076..7fbced58b7684e20e0ac7d3c84d2485551cc1b2c 100644 (file)
@@ -55,6 +55,7 @@ libMeshDriverMED_la_CPPFLAGS = \
        $(BOOST_CPPFLAGS) \
        -I$(srcdir)/../Driver \
        -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS
 
 libMeshDriverMED_la_LDFLAGS  = \
index 0e05ad76112e69364e0e7129a873f35d5337cdb2..c66dea1bc7a16abba183146b4c15870b721a093f 100644 (file)
@@ -67,6 +67,7 @@ libMeshDriverUNV_la_CPPFLAGS = \
        $(BOOST_CPPFLAGS) \
        -I$(srcdir)/../Driver \
        -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS
 
 libMeshDriverUNV_la_LDFLAGS  = \
index 0fff1bdc541cd6795c079895d29ea5bb1650960e..a48520cdb5a24f61bf10832cfbe745bd091829e1 100644 (file)
@@ -62,7 +62,7 @@ void UNV164::Write(std::ofstream& out_stream)
     EXCEPTION(runtime_error,"ERROR: Output file not good.");
   
   out_stream<<"    -1" << endl;
-  out_stream<<"  "<<_label_dataset << endl;
+  out_stream<<"   "<<_label_dataset << endl;
 
   out_stream<<"         1  SI: Meter (newton)         2"                                    << endl;
   out_stream<<"    1.0000000000000000E+0    1.0000000000000000E+0    1.0000000000000000E+0" << endl;
index b969674a181e6e8f3953ac794aa908348ae1e059..5276980b912dea34daa7c5a1e145b2d0a14a517c 100644 (file)
@@ -21,7 +21,6 @@
 #  Author : Patrick GOLDBRONN (CEA)
 #  Modified by : Alexander BORODIN (OCN) - autotools usage
 #  Module : SMESH
-#  $Header$
 #
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
@@ -39,6 +38,7 @@ SUBDIRS = \
        DriverDAT \
        DriverUNV \
        DriverSTL \
+       DriverGMF \
        $(DriverCGNS_SUDIR) \
        SMESH \
        SMESH_I \
@@ -61,5 +61,6 @@ if SMESH_ENABLE_GUI
 endif
 
 DIST_SUBDIRS =         SMDS SMESHDS Controls Driver DriverMED DriverDAT DriverUNV DriverSTL DriverCGNS \
+               DriverGMF \
                SMESHUtils SMESH SMESH_I SMESHClient SMESH_SWIG MEFISTO2 StdMeshers StdMeshers_I OBJECT         \
                SMESHFiltersSelection SMESHGUI PluginUtils SMESH_SWIG_WITHIHM StdMeshersGUI SMESH_PY Tools
index 31cb50d27f5889b295cf2979181de257d1be387d..59cf1400c2bdd61cc5c0753eca4e910990ca5146 100644 (file)
@@ -37,7 +37,9 @@ salomeinclude_HEADERS = \
        SMESH_FaceOrientationFilter.h \
        SMESH_ScalarBarActor.h \
        SMESH_NodeLabelActor.h \
-       SMESH_CellLabelActor.h
+       SMESH_CellLabelActor.h \
+       SMESH_SVTKActor.h 
+
 
 # Libraries targets
 
@@ -52,7 +54,8 @@ dist_libSMESHObject_la_SOURCES = \
        SMESH_FaceOrientationFilter.cxx \
        SMESH_ScalarBarActor.cxx \
        SMESH_NodeLabelActor.cxx \
-       SMESH_CellLabelActor.cxx 
+       SMESH_CellLabelActor.cxx \
+       SMESH_SVTKActor.cxx 
 
 libSMESHObject_la_CPPFLAGS = \
         $(QT_INCLUDES) \
index 4daba11f8575cdb82ec8ed052654fa09dfb902c5..1463f03fe5d96aebeeddd5550a01377c3a6db7cb 100644 (file)
@@ -37,6 +37,7 @@
 #include "VTKViewer_ExtractUnstructuredGrid.h"
 #include "VTKViewer_FramedTextActor.h"
 #include "SALOME_InteractiveObject.hxx"
+#include "SMESH_SVTKActor.h"
 
 #include "SUIT_Session.h"
 #include "SUIT_ResourceMgr.h"
@@ -127,6 +128,12 @@ SMESH_ActorDef::SMESH_ActorDef()
   myIsPointsVisible = false;
   myIsEntityModeCache = false;
 
+  myHighlightActor = SMESH_SVTKActor::New();
+  myHighlightActor->Initialize();
+
+  myPreHighlightActor = SMESH_SVTKActor::New();
+  myPreHighlightActor->Initialize();
+
   myIsShrinkable = false;
   myIsShrunk = false;
 
@@ -141,6 +148,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   vtkFloatingPointType aElem0DSize   = SMESH::GetFloat("SMESH:elem0d_size",5);
   vtkFloatingPointType aBallElemSize = SMESH::GetFloat("SMESH:ball_elem_size",10);
   vtkFloatingPointType aLineWidth    = SMESH::GetFloat("SMESH:element_width",1);
+  vtkFloatingPointType aOutlineWidth = SMESH::GetFloat("SMESH:outline_width",1);
 
   vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New();
   VTKViewer_ExtractUnstructuredGrid* aFilter = NULL;
@@ -159,6 +167,15 @@ SMESH_ActorDef::SMESH_ActorDef()
   bfc = Qtx::mainColorToSecondary(ffc, delta);
   myBackSurfaceProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
 
+  myNormalVProp = vtkProperty::New();
+  SMESH::GetColor( "SMESH", "volume_color", ffc, delta, "255,0,170|-100" );
+  myNormalVProp->SetColor( ffc.redF(), ffc.greenF(), ffc.blueF() );
+  myDeltaVBrightness = delta;
+
+  myReversedVProp = vtkProperty::New();
+  bfc = Qtx::mainColorToSecondary(ffc, delta);
+  myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
+
   my2DActor = SMESH_CellLabelActor::New();
   my2DActor->SetStoreGemetryMapping(true);
   my2DActor->SetUserMatrix(aMatrix);
@@ -201,8 +218,8 @@ SMESH_ActorDef::SMESH_ActorDef()
   my3DActor->SetStoreGemetryMapping(true);
   my3DActor->SetUserMatrix(aMatrix);
   my3DActor->PickableOff();
-  my3DActor->SetProperty(mySurfaceProp);
-  my3DActor->SetBackfaceProperty(myBackSurfaceProp);
+  my3DActor->SetProperty(myNormalVProp);
+  my3DActor->SetBackfaceProperty(myReversedVProp);
   my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
   my3DActor->SetCoincident3DAllowed(true);
   aFilter = my3DActor->GetExtractUnstructuredGrid();
@@ -224,11 +241,19 @@ SMESH_ActorDef::SMESH_ActorDef()
   aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
 //#endif
 
+  my3DExtProp = vtkProperty::New();
+  my3DExtProp->DeepCopy(myNormalVProp);
+  SMESH::GetColor( "SMESH", "volume_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 170 ) );
+  anRGB[0] = 1 - anRGB[0];
+  anRGB[1] = 1 - anRGB[1];
+  anRGB[2] = 1 - anRGB[2];
+  my3DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
+
   my3DExtActor = SMESH_DeviceActor::New();
   my3DExtActor->SetUserMatrix(aMatrix);
   my3DExtActor->PickableOff();
-  my3DExtActor->SetProperty(my2DExtProp);
-  my3DExtActor->SetBackfaceProperty(my2DExtProp);
+  my3DExtActor->SetProperty(my3DExtProp);
+  my3DExtActor->SetBackfaceProperty(my3DExtProp);
   my3DExtActor->SetRepresentation(SMESH_DeviceActor::eSurface);
   my3DExtActor->SetCoincident3DAllowed(true);
   aFilter = my3DExtActor->GetExtractUnstructuredGrid();
@@ -318,7 +343,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   //Definition 0D device of the actor (ball elements)
   //-----------------------------------------------
   myBallProp = vtkProperty::New();
-  SMESH::GetColor( "SMESH", "ball_elem_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 0 ) );
+  SMESH::GetColor( "SMESH", "ball_elem_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 85, 255 ) );
   myBallProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
   myBallProp->SetPointSize(aBallElemSize);
 
@@ -330,9 +355,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   myBallActor->SetProperty(myBallProp);
   myBallActor->SetRepresentation(SMESH_DeviceActor::eSurface);
   aFilter = myBallActor->GetExtractUnstructuredGrid();
-  //aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
   aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
-  aFilter->RegisterCellsWithType(VTK_VERTEX);
   aFilter->RegisterCellsWithType(VTK_POLY_VERTEX);
   
   //my0DExtProp = vtkProperty::New();
@@ -410,14 +433,18 @@ SMESH_ActorDef::SMESH_ActorDef()
   myHighlightProp->SetLineWidth(aLineWidth);
   myHighlightProp->SetRepresentation(1);
 
+  myBallHighlightProp = vtkProperty::New();
+  myBallHighlightProp->DeepCopy(myHighlightProp);
+  myBallHighlightProp->SetPointSize(aBallElemSize);
+  
+
   myOutLineProp = vtkProperty::New();
   myOutLineProp->SetAmbient(1.0);
   myOutLineProp->SetDiffuse(0.0);
   myOutLineProp->SetSpecular(0.0);
   SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 70, 0 ) );
   myOutLineProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
-  myOutLineProp->SetPointSize(aElem0DSize); // ??
-  myOutLineProp->SetLineWidth(aLineWidth);
+  myOutLineProp->SetLineWidth(aOutlineWidth);
   myOutLineProp->SetRepresentation(1);
 
   myPreselectProp = vtkProperty::New();
@@ -430,6 +457,10 @@ SMESH_ActorDef::SMESH_ActorDef()
   myPreselectProp->SetLineWidth(aLineWidth);
   myPreselectProp->SetRepresentation(1);
 
+  myBallPreselectProp = vtkProperty::New();
+  myBallPreselectProp->DeepCopy(myPreselectProp);
+  myBallPreselectProp->SetPointSize(aBallElemSize);
+
   myHighlitableActor = SMESH_DeviceActor::New();
   myHighlitableActor->SetUserMatrix(aMatrix);
   myHighlitableActor->PickableOff();
@@ -490,7 +521,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   my2DActor->SetQuadraticArcAngle(aQuadraticAngle);
   
   // Set colors of the name actor
-  SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
+  SMESH::GetColor( "SMESH", "default_grp_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
   myNameActor->SetBackgroundColor(anRGB[0], anRGB[1], anRGB[2]);
   SMESH::GetColor( "SMESH", "group_name_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) );
   myNameActor->SetForegroundColor(anRGB[0], anRGB[1], anRGB[2]);
@@ -499,6 +530,8 @@ SMESH_ActorDef::SMESH_ActorDef()
   my2dHistogram = 0;
 #endif
 
+  SetBallSize(aBallElemSize);
+  Set0DSize(aElem0DSize);
 }
 
 
@@ -518,6 +551,8 @@ SMESH_ActorDef::~SMESH_ActorDef()
 
   mySurfaceProp->Delete();
   myBackSurfaceProp->Delete();
+  myNormalVProp->Delete();
+  myReversedVProp->Delete();
   myOutLineProp->Delete();
 
   myEdgeProp->Delete();
@@ -544,6 +579,7 @@ SMESH_ActorDef::~SMESH_ActorDef()
   my2DExtProp->Delete();
   my2DExtActor->Delete();
   my3DActor->Delete();
+  my3DExtProp->Delete();
   my3DExtActor->Delete();
 
   myNodeActor->Delete();
@@ -555,6 +591,9 @@ SMESH_ActorDef::~SMESH_ActorDef()
   myImplicitBoolean->Delete();
 
   myTimeStamp->Delete();
+  myBallHighlightProp->Delete();
+  myBallPreselectProp->Delete();
+          
 }
 
 void SMESH_ActorDef::Delete()
@@ -639,15 +678,15 @@ bool SMESH_ActorDef::GetFacesOriented()
   return myIsFacesOriented;
 }
 
-void SMESH_ActorDef::SetFacesOrientationColor(vtkFloatingPointType theColor[3])
+void SMESH_ActorDef::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b)
 {
-  my2DActor->SetFacesOrientationColor( theColor );
-  my3DActor->SetFacesOrientationColor( theColor );
+  my2DActor->SetFacesOrientationColor( r, g, b );
+  my3DActor->SetFacesOrientationColor( r, g, b );
 }
 
-void SMESH_ActorDef::GetFacesOrientationColor(vtkFloatingPointType theColor[3])
+void SMESH_ActorDef::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b)
 {
-  my3DActor->GetFacesOrientationColor( theColor );
+  my3DActor->GetFacesOrientationColor( r, g, b );
 }
 
 void SMESH_ActorDef::SetFacesOrientationScale(vtkFloatingPointType theScale)
@@ -957,6 +996,9 @@ SetControlMode(eControl theMode,
 
 
 void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
+  
+  //myHighlightActor->AddToRender(theRenderer);
+
   theRenderer->AddActor(myBaseActor);  
   theRenderer->AddActor(myNodeExtActor);
   theRenderer->AddActor(my1DExtActor);
@@ -1053,6 +1095,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj,
   my2DActor->GetPolygonOffsetParameters(aFactor,aUnits);
   my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75);
   my2DExtActor->SetPolygonOffsetParameters(aFactor,aUnits*0.5);
+  my3DActor->SetPolygonOffsetParameters(2*aFactor,aUnits);
 
   SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
   if( !mgr )
@@ -1307,10 +1350,10 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
       myNodeActor->VisibilityOn();
     }
 
-    if(myEntityMode & e0DElements){
+    if(myEntityMode & e0DElements && GetRepresentation() != ePoint ){
       my0DActor->VisibilityOn();
     }
-    if(myEntityMode & eBallElem){
+    if(myEntityMode & eBallElem && GetRepresentation() != ePoint ){
       myBallActor->VisibilityOn();
     }
 
@@ -1492,6 +1535,8 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge);
   int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face);
   int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume);
+  int aNb0Ds       = myVisualObj->GetNbEntities(SMDSAbs_0DElement);
+  int aNbBalls       = myVisualObj->GetNbEntities(SMDSAbs_Ball);
 
   if (theMode < 0) {
     myRepresentation = eSurface;
@@ -1503,10 +1548,10 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   } else {
     switch (theMode) {
     case eEdge:
-      if (!aNbFaces && !aNbVolumes && !aNbEdges) return;
+      if (!aNbFaces && !aNbVolumes && !aNbEdges && !aNb0Ds && !aNbBalls) return;
       break;
     case eSurface:
-      if (!aNbFaces && !aNbVolumes) return;
+      if (!aNbFaces && !aNbVolumes && !aNb0Ds && !aNbBalls) return;
       break;
     }    
     myRepresentation = theMode;
@@ -1528,6 +1573,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   myNodeActor->SetVisibility(false);
   myNodeExtActor->SetVisibility(false);
   vtkProperty *aProp = NULL, *aBackProp = NULL;
+  vtkProperty *aPropVN = NULL, *aPropVR = NULL;
   SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1);
   SMESH_Actor::EQuadratic2DRepresentation aQuadraticMode = GetQuadratic2DRepresentation();
   switch (myRepresentation) {
@@ -1535,16 +1581,18 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
     myPickableActor = myNodeActor;
     myNodeActor->SetVisibility(true);
     aQuadraticMode = SMESH_Actor::eLines;
-    aProp = aBackProp = myNodeProp;
+    aProp = aBackProp = aPropVN = aPropVR = myNodeProp;
     aReperesent = SMESH_DeviceActor::ePoint;
     break;
   case eEdge:
-    aProp = aBackProp = myEdgeProp;
+    aProp = aBackProp = aPropVN = aPropVR = myEdgeProp;
     aReperesent = SMESH_DeviceActor::eInsideframe;
     break;
   case eSurface:
     aProp = mySurfaceProp;
     aBackProp = myBackSurfaceProp;
+    aPropVN = myNormalVProp;
+    aPropVR = myReversedVProp;
     aReperesent = SMESH_DeviceActor::eSurface;
     break;
   }
@@ -1560,8 +1608,8 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
 
   my2DExtActor->SetRepresentation(aReperesent);
   
-  my3DActor->SetProperty(aProp);
-  my3DActor->SetBackfaceProperty(aBackProp);
+  my3DActor->SetProperty(aPropVN);
+  my3DActor->SetBackfaceProperty(aPropVR);
   my3DActor->SetRepresentation(aReperesent);
 
   //my0DExtActor->SetVisibility(false);
@@ -1633,9 +1681,12 @@ void SMESH_ActorDef::UpdateHighlight(){
     {
       if(myIsHighlighted) {
         myHighlitableActor->SetProperty(myHighlightProp);
+       myBallActor->SetProperty(myBallHighlightProp);
       }else if(myIsPreselected){
         myHighlitableActor->SetProperty(myPreselectProp);
+       myBallActor->SetProperty(myBallPreselectProp);
       } else if(anIsVisible){
+       myBallActor->SetProperty(myBallProp);
         (myRepresentation == eSurface) ? 
           myHighlitableActor->SetProperty(myOutLineProp) : myHighlitableActor->SetProperty(myEdgeProp);
       }
@@ -1777,10 +1828,15 @@ static void GetColor(vtkProperty *theProperty, vtkFloatingPointType& r,vtkFloati
 void SMESH_ActorDef::SetOpacity(vtkFloatingPointType theValue){
   mySurfaceProp->SetOpacity(theValue);
   myBackSurfaceProp->SetOpacity(theValue);
+  myNormalVProp->SetOpacity(theValue);
+  myReversedVProp->SetOpacity(theValue);
   myEdgeProp->SetOpacity(theValue);
+  myOutLineProp->SetOpacity(theValue);
   myNodeProp->SetOpacity(theValue);
 
   my1DProp->SetOpacity(theValue);
+  my0DProp->SetOpacity(theValue);
+  myBallProp->SetOpacity(theValue);
 }
 
 
@@ -1791,9 +1847,9 @@ vtkFloatingPointType SMESH_ActorDef::GetOpacity(){
 
 void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){
   mySurfaceProp->SetColor(r,g,b);
+  my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
   if( SMESH_GroupObj* aGroupObj = dynamic_cast<SMESH_GroupObj*>( myVisualObj.get() ) )
-    if( aGroupObj->GetElementType() == SMDSAbs_Face ||
-        aGroupObj->GetElementType() == SMDSAbs_Volume )
+    if( aGroupObj->GetElementType() == SMDSAbs_Face )
       myNameActor->SetBackgroundColor(r,g,b);
   
   myDeltaBrightness = delta;
@@ -1804,10 +1860,27 @@ void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType
 
 void SMESH_ActorDef::GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){
   ::GetColor(mySurfaceProp,r,g,b);
-  my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
   delta = myDeltaBrightness;
 }
 
+void SMESH_ActorDef::SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){
+  myNormalVProp->SetColor(r,g,b);
+  my3DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
+  if( SMESH_GroupObj* aGroupObj = dynamic_cast<SMESH_GroupObj*>( myVisualObj.get() ) )
+    if( aGroupObj->GetElementType() == SMDSAbs_Volume )
+      myNameActor->SetBackgroundColor(r,g,b);
+  
+  myDeltaVBrightness = delta;
+  QColor bfc = Qtx::mainColorToSecondary(QColor(int(r*255),int(g*255),int(b*255)), delta);
+  myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
+  Modified();
+}
+
+void SMESH_ActorDef::GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){
+  ::GetColor(myNormalVProp,r,g,b);
+  delta = myDeltaVBrightness;
+}
+
 void SMESH_ActorDef::SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){
   myEdgeProp->SetColor(r,g,b);
   my1DProp->SetColor(r,g,b);
@@ -1871,6 +1944,7 @@ void SMESH_ActorDef::GetBallColor(vtkFloatingPointType& r,vtkFloatingPointType&
 
 void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ 
   myHighlightProp->SetColor(r,g,b);
+  myBallHighlightProp->SetColor(r,g,b);
   Modified();
 }
 
@@ -1880,6 +1954,7 @@ void SMESH_ActorDef::GetHighlightColor(vtkFloatingPointType& r,vtkFloatingPointT
 
 void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ 
   myPreselectProp->SetColor(r,g,b);
+  myBallPreselectProp->SetColor(r,g,b);
   Modified();
 }
 
@@ -1899,15 +1974,36 @@ void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){
   my1DProp->SetLineWidth(theVal + aLineWidthInc);
   my1DExtProp->SetLineWidth(theVal + aLineWidthInc);    
   my2DExtProp->SetLineWidth(theVal + aLineWidthInc);
+  my3DExtProp->SetLineWidth(theVal + aLineWidthInc);
   myOutLineProp->SetLineWidth(theVal);
   myHighlightProp->SetLineWidth(theVal);
   myPreselectProp->SetLineWidth(theVal);
   Modified();
 }
 
+vtkFloatingPointType SMESH_ActorDef::GetOutlineWidth()
+{
+  return myOutLineProp->GetLineWidth();
+}
+
+void SMESH_ActorDef::SetOutlineWidth(vtkFloatingPointType theVal)
+{
+  myOutLineProp->SetLineWidth(theVal);
+  Modified();
+}
 
 void SMESH_ActorDef::Set0DSize(vtkFloatingPointType theVal){
   my0DProp->SetPointSize(theVal);
+  myHighlightProp->SetPointSize(theVal);
+  myPreselectProp->SetPointSize(theVal);
+
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) {
+    aCustom->Set0DSize(theVal);
+  }
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) {
+    aCustom->Set0DSize(theVal);
+  }
+
   Modified();
 }
 
@@ -1917,6 +2013,15 @@ vtkFloatingPointType SMESH_ActorDef::Get0DSize(){
 
 void SMESH_ActorDef::SetBallSize(vtkFloatingPointType theVal){
   myBallProp->SetPointSize(theVal);
+  myBallHighlightProp->SetPointSize(theVal);
+  myBallPreselectProp->SetPointSize(theVal);
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) {
+    aCustom->SetBallSize(theVal);
+  }
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) {
+    aCustom->SetBallSize(theVal);
+  }
+
   Modified();
 }
 
index 4e04546f42237bb77bfd10fb74bfb149a8d9c2dd..fc954253d052994d1848ef53fa1602e750fb52bd 100644 (file)
@@ -64,6 +64,9 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
   virtual void SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta ) = 0;
   virtual void GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta ) = 0;
     
+  virtual void SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta ) = 0;
+  virtual void GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta) = 0;
+
   virtual void SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) = 0;
   virtual void GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) = 0;
 
@@ -88,6 +91,9 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
   virtual vtkFloatingPointType GetLineWidth() = 0;
   virtual void SetLineWidth(vtkFloatingPointType theVal) = 0;
 
+  virtual vtkFloatingPointType GetOutlineWidth() = 0;
+  virtual void SetOutlineWidth(vtkFloatingPointType theVal) = 0;
+
   virtual void Set0DSize(vtkFloatingPointType size) = 0;
   virtual vtkFloatingPointType Get0DSize() = 0;
 
@@ -122,8 +128,8 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
   virtual void SetFacesOriented(bool theIsFacesOriented) = 0;
   virtual bool GetFacesOriented() = 0;
 
-  virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]) = 0;
-  virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]) = 0;
+  virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) = 0;
+  virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) = 0;
 
   virtual void SetFacesOrientationScale(vtkFloatingPointType theScale) = 0;
   virtual vtkFloatingPointType GetFacesOrientationScale() = 0;
index b346e68b467d50648abb1cbdf18b952d137e12b2..11d7fe41ac030f0ae2fa35d61108dc60a9a49b73 100644 (file)
@@ -106,6 +106,9 @@ class SMESH_ActorDef : public SMESH_Actor
   virtual void SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta );
   virtual void GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta);
 
+  virtual void SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta );
+  virtual void GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta);
+
   virtual void SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
   virtual void GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
 
@@ -131,6 +134,9 @@ class SMESH_ActorDef : public SMESH_Actor
   virtual vtkFloatingPointType GetLineWidth();
   virtual void SetLineWidth(vtkFloatingPointType theVal);
 
+  virtual vtkFloatingPointType GetOutlineWidth();
+  virtual void SetOutlineWidth(vtkFloatingPointType theVal);
+
   virtual void Set0DSize(vtkFloatingPointType size);
   virtual vtkFloatingPointType Get0DSize();
 
@@ -180,8 +186,8 @@ class SMESH_ActorDef : public SMESH_Actor
   virtual void SetFacesOriented(bool theIsFacesOriented);
   virtual bool GetFacesOriented();
 
-  virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]);
-  virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]);
+  virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
+  virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
 
   virtual void SetFacesOrientationScale(vtkFloatingPointType theScale);
   virtual vtkFloatingPointType GetFacesOrientationScale();
@@ -233,6 +239,8 @@ class SMESH_ActorDef : public SMESH_Actor
 
   vtkProperty* mySurfaceProp;
   vtkProperty* myBackSurfaceProp;
+  vtkProperty* myNormalVProp;
+  vtkProperty* myReversedVProp;
   vtkProperty* myEdgeProp;
   vtkProperty* myNodeProp;
 
@@ -243,12 +251,16 @@ class SMESH_ActorDef : public SMESH_Actor
   vtkProperty* myHighlightProp;
   vtkProperty* myOutLineProp;
   vtkProperty* myPreselectProp;
+
+  vtkProperty* myBallHighlightProp;
+  vtkProperty* myBallPreselectProp;
           
   SMESH_DeviceActor* myHighlitableActor;
 
   eControl myControlMode;
   SMESH::Controls::FunctorPtr myFunctor;
   vtkProperty* my2DExtProp;
+  vtkProperty* my3DExtProp;
   SMESH_CellLabelActor* my2DActor;
   SMESH_DeviceActor* my2DExtActor;
   SMESH_CellLabelActor* my3DActor;
@@ -292,6 +304,7 @@ class SMESH_ActorDef : public SMESH_Actor
   bool myIsFacesOriented;
   
   int myDeltaBrightness;
+  int myDeltaVBrightness;
 
   VTK::MarkerTexture myMarkerTexture;
 
index 7a88f701b6751579b33bba7b74e96f3924701c0b..d53765d79baf12703c580dad0c702028a1d3c08c 100644 (file)
@@ -642,16 +642,16 @@ SMESH_DeviceActor
 
 void
 SMESH_DeviceActor
-::SetFacesOrientationColor(vtkFloatingPointType theColor[3])
+::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b)
 {
-  myFaceOrientation->GetProperty()->SetColor( theColor );
+  myFaceOrientation->GetProperty()->SetColor( r, g, b );
 }
 
 void
 SMESH_DeviceActor
-::GetFacesOrientationColor(vtkFloatingPointType theColor[3])
+::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b)
 {
-  myFaceOrientation->GetProperty()->GetColor( theColor );
+  myFaceOrientation->GetProperty()->GetColor( r, g, b );
 }
 
 void
index 8c3abb7ae87f956077a9cf2e02171513a8ab01b1..554af35d9462d64691e611ec5de367a04f561bea 100644 (file)
@@ -79,8 +79,8 @@ class SMESHOBJECT_EXPORT SMESH_DeviceActor: public vtkLODActor{
   virtual void SetFacesOriented(bool theIsFacesOriented);
   virtual bool GetFacesOriented() { return myIsFacesOriented; }
 
-  virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]);
-  virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]);
+  virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
+  virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
 
   virtual void SetFacesOrientationScale(vtkFloatingPointType theScale);
   virtual vtkFloatingPointType GetFacesOrientationScale();
index e137a1c6d202d47ec858db715030421bd8653246..30bef057940ff267aebc4eed6203d4e94baf83a5 100644 (file)
@@ -82,14 +82,14 @@ static int MYDEBUGWITHFILES = 0;
 // purpose  : Get type of VTK cell
 //=================================================================================
 static inline vtkIdType getCellType( const SMDSAbs_ElementType theType,
-                                     const bool thePoly,
-                                     const int theNbNodes )
+                                     const bool                thePoly,
+                                     const int                 theNbNodes )
 {
   switch( theType )
   {
     case SMDSAbs_0DElement:         return VTK_VERTEX;
 
-    case SMDSAbs_Ball:   return VTK_POLY_VERTEX;
+    case SMDSAbs_Ball:              return VTK_POLY_VERTEX;
 
     case SMDSAbs_Edge: 
       if( theNbNodes == 2 )         return VTK_LINE;
@@ -345,16 +345,21 @@ void SMESH_VisualObjDef::buildElemPrs()
 
   // Calculate cells size
 
-  static SMDSAbs_ElementType aTypes[ 5 ] =
-    { SMDSAbs_Ball, SMDSAbs_0DElement, SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume };
+  const int nbTypes = 5;
+  static SMDSAbs_ElementType aTypes[ nbTypes ] =
+    { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume, SMDSAbs_Ball, SMDSAbs_0DElement };
 
   // get entity data
   map<SMDSAbs_ElementType,int> nbEnts;
   map<SMDSAbs_ElementType,TEntityList> anEnts;
 
-  for ( int i = 0; i <= 3; i++ )
-    nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
+  vtkIdType aNbCells = 0;
 
+  for ( int i = 0; i < nbTypes; i++ )
+  {
+    nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
+    aNbCells += nbEnts[ aTypes [ i ]];
+  }
   // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead,
   // so check remaining memory size for safety
   SMDS_Mesh::CheckMemory(); // PAL16631
@@ -362,7 +367,7 @@ void SMESH_VisualObjDef::buildElemPrs()
   vtkIdType aCellsSize =  2 * nbEnts[ SMDSAbs_0DElement ] + 3 * nbEnts[ SMDSAbs_Edge ];
   aCellsSize += 2 * nbEnts[ SMDSAbs_Ball ];
 
-  for ( int i = 2; i <= 3; i++ ) // iterate through faces and volumes
+  for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes
   {
     if ( nbEnts[ aTypes[ i ] ] )
     {
@@ -388,11 +393,6 @@ void SMESH_VisualObjDef::buildElemPrs()
       }
     }
   }
-  
-  vtkIdType aNbCells =
-    nbEnts[ SMDSAbs_0DElement ] + nbEnts[ SMDSAbs_Ball ] + nbEnts[ SMDSAbs_Edge ] +
-    nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ];
-
   if ( MYDEBUG )
     MESSAGE( "Update - aNbCells = "<<aNbCells<<"; aCellsSize = "<<aCellsSize );
 
@@ -417,7 +417,7 @@ void SMESH_VisualObjDef::buildElemPrs()
 
   SMDS_Mesh::CheckMemory(); // PAL16631
 
-  for ( int i = 0; i <= 3; i++ ) // iterate through 0d elements, edges, faces and volumes
+  for ( int i = 0; i < nbTypes; i++ ) // iterate through all types of elements
   {
     if ( nbEnts[ aTypes[ i ] ] > 0 ) {
       
diff --git a/src/OBJECT/SMESH_SVTKActor.cxx b/src/OBJECT/SMESH_SVTKActor.cxx
new file mode 100644 (file)
index 0000000..b86c81d
--- /dev/null
@@ -0,0 +1,184 @@
+// 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
+//
+
+//  SMESH OBJECT : interactive object for SMESH visualization
+//  File   : SMESH_SVTKActor.cxx
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+
+#include "SMESH_SVTKActor.h"
+
+#include <SVTK_Utils.h>
+#include <SALOME_Actor.h>
+
+
+#include <SVTK_DeviceActor.h>
+#include <vtkPoints.h>
+#include <vtkRenderer.h>
+#include <vtkObjectFactory.h>
+#include <vtkUnstructuredGrid.h>
+#include <vtkCell.h>
+#include <vtkDataSetMapper.h>
+
+vtkStandardNewMacro(SMESH_SVTKActor);
+
+/*!
+  Constructor
+*/
+SMESH_SVTKActor::SMESH_SVTKActor():
+  my0DGrid(vtkUnstructuredGrid::New()),
+  myBallGrid(vtkUnstructuredGrid::New())
+{
+  my0DActor = SVTK_DeviceActor::New();
+  myBallActor = SVTK_DeviceActor::New();
+
+  myBallActor->SetResolveCoincidentTopology(false);
+  myBallActor->SetCoincident3DAllowed(true);
+  myBallActor->PickableOff();
+  my0DActor->SetResolveCoincidentTopology(false);
+  my0DActor->SetCoincident3DAllowed(true);
+  my0DActor->PickableOff();
+
+  my0DGrid->Allocate();
+  myBallGrid->Allocate();
+}
+
+/*!
+  Constructor
+*/
+SMESH_SVTKActor::~SMESH_SVTKActor() {
+  my0DActor->Delete();
+  myBallActor->Delete();
+  my0DGrid->Delete();
+  myBallGrid->Delete();
+}
+
+/*!
+  Publishes the actor in all its internal devices
+*/
+void SMESH_SVTKActor::AddToRender(vtkRenderer* theRenderer) {
+  Superclass::AddToRender(theRenderer);
+  float a0D = my0DActor->GetProperty()->GetPointSize();
+  float aBall = myBallActor->GetProperty()->GetPointSize();
+  my0DActor->GetProperty()->DeepCopy(GetProperty());
+  myBallActor->GetProperty()->DeepCopy(GetProperty());
+  my0DActor->GetProperty()->SetPointSize(a0D);
+  myBallActor->GetProperty()->SetPointSize(aBall);
+  theRenderer->AddActor(my0DActor);
+  theRenderer->AddActor(myBallActor);
+  
+}
+
+/*!
+  Removes the actor from all its internal devices
+*/
+void 
+SMESH_SVTKActor
+::RemoveFromRender(vtkRenderer* theRenderer)
+{
+  Superclass::RemoveFromRender(theRenderer);
+  theRenderer->RemoveActor( myBallActor );
+  theRenderer->RemoveActor( my0DActor );
+}
+
+void
+SMESH_SVTKActor
+::MapCells(SALOME_Actor* theMapActor,
+           const TColStd_IndexedMapOfInteger& theMapIndex)
+{
+  myUnstructuredGrid->Initialize();
+  myUnstructuredGrid->Allocate();
+
+  my0DGrid->Initialize();
+  my0DGrid->Allocate();
+
+  myBallGrid->Initialize();
+  myBallGrid->Allocate();
+
+  vtkDataSet *aSourceDataSet = theMapActor->GetInput();
+  SVTK::CopyPoints( GetSource(), aSourceDataSet );
+  SVTK::CopyPoints( myBallGrid, aSourceDataSet );
+  SVTK::CopyPoints( my0DGrid,    aSourceDataSet );
+
+  int aNbOfParts = theMapIndex.Extent();
+  for(int ind = 1; ind <= aNbOfParts; ind++){
+    int aPartId = theMapIndex( ind );
+    if(vtkCell* aCell = theMapActor->GetElemCell(aPartId))
+      {
+#if VTK_XVERSION > 50700
+      if (aCell->GetCellType() != VTK_POLYHEDRON)
+#endif
+      if(aCell->GetCellType() == VTK_VERTEX ) {
+       my0DGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+      } else if(aCell->GetCellType() == VTK_POLY_VERTEX ) {
+       myBallGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+      } else {
+        myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+      }
+#if VTK_XVERSION > 50700
+      else
+        {
+          vtkPolyhedron *polyhedron = dynamic_cast<vtkPolyhedron*>(aCell);
+          if (!polyhedron)
+            throw SALOME_Exception(LOCALIZED ("not a polyhedron"));
+          vtkIdType *pts = polyhedron->GetFaces();
+          myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),pts[0], pts+1);
+        }
+#endif
+      }
+    
+  UnShrink();
+  if(theMapActor->IsShrunk()){
+    SetShrinkFactor(theMapActor->GetShrinkFactor());
+    SetShrink();
+  }
+
+  myMapIndex = theMapIndex;
+  }
+}
+  
+void
+SMESH_SVTKActor
+::Initialize()
+{
+  Superclass::Initialize();
+  my0DActor->SetInput(my0DGrid);
+  myBallActor->SetInput(myBallGrid);
+}
+
+
+void SMESH_SVTKActor::SetVisibility( int theVisibility ) {
+  Superclass::SetVisibility( theVisibility );  
+  my0DActor->SetVisibility( theVisibility );
+  myBallActor->SetVisibility( theVisibility );
+}
+
+
+void SMESH_SVTKActor::Set0DSize(float theSize) {
+  my0DActor->GetProperty()->SetPointSize(theSize);  
+}
+
+void SMESH_SVTKActor::SetBallSize(float theSize) {
+  myBallActor->GetProperty()->SetPointSize(theSize);
+}
+
diff --git a/src/OBJECT/SMESH_SVTKActor.h b/src/OBJECT/SMESH_SVTKActor.h
new file mode 100644 (file)
index 0000000..54b3ad3
--- /dev/null
@@ -0,0 +1,82 @@
+// 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
+//
+
+//  SMESH OBJECT : interactive object for SMESH visualization
+//  File   : SMESH_SVTKActor.h
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+#ifndef SMESH_SVTKACTOR_H
+#define SMESH_SVTKACTOR_H
+
+#include "SMESH_Object.h"
+#include <SVTK_Actor.h>
+
+
+class SVTK_Actor;
+class vtkUnstructureGrid;
+class vtkDataSetMapper;
+
+class SMESHOBJECT_EXPORT SMESH_SVTKActor : public SVTK_Actor {
+
+public:
+  static SMESH_SVTKActor* New();
+
+  vtkTypeMacro(SMESH_SVTKActor, SVTK_Actor);
+
+  void SetBallSize(float theSize);
+  void Set0DSize(float theSize);
+
+  //! To publish the actor an all its internal devices
+  virtual
+  void
+  AddToRender(vtkRenderer* theRendere); 
+
+  virtual void SetVisibility( int theVisibility );
+
+  //! Initialiaze the instance completely
+  virtual void
+  Initialize();
+
+  //! Allow to recostruct selected cells from source SALOME_Actor and map of subindexes
+  virtual void
+  MapCells(SALOME_Actor* theMapActor,
+           const TColStd_IndexedMapOfInteger& theMapIndex);
+
+
+  //! To remove the actor an all its internal devices
+  virtual
+  void
+  RemoveFromRender(vtkRenderer* theRendere);
+
+ protected:
+  SVTK_DeviceActor* my0DActor;
+  SVTK_DeviceActor* myBallActor;
+
+  vtkUnstructuredGrid* my0DGrid;
+  vtkUnstructuredGrid* myBallGrid;
+  
+  SMESH_SVTKActor();
+  virtual ~SMESH_SVTKActor();
+};
+
+#endif
index 56854fd1da7e00dfc8236684b898740517eaca9c..c4557b2361ed42188d8c4f99e849c8d83c532031 100644 (file)
@@ -42,7 +42,7 @@ typedef struct
   int nbElems;
 } ListElemByNodesType; // TODO resize for polyhedrons
 
-class DownIdType
+class SMDS_EXPORT DownIdType
 {
 public:
   DownIdType(int a, unsigned char b) :
@@ -64,7 +64,7 @@ struct DownIdCompare
   }
 };
 
-class SMDS_Downward
+class SMDS_EXPORT SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
   friend class SMDS_Down2D;
@@ -109,7 +109,7 @@ protected:
   static std::vector<int> _cellDimension; //!< conversion table: type --> dimension
 };
 
-class SMDS_Down1D: public SMDS_Downward
+class SMDS_EXPORT SMDS_Down1D: public SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -140,7 +140,7 @@ protected:
   std::vector<int> _upCellIndex; //!< compacted storage after connectivity calculation
 };
 
-class SMDS_Down2D: public SMDS_Downward
+class SMDS_EXPORT SMDS_Down2D: public SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
   friend class SMDS_Down1D;
@@ -171,7 +171,7 @@ protected:
   int _nbNodes; //!< number of nodes in a face
 };
 
-class SMDS_Down3D: public SMDS_Downward
+class SMDS_EXPORT SMDS_Down3D: public SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -188,7 +188,7 @@ protected:
   int FindFaceByNodes(int cellId, ElemByNodesType& faceByNodes);
 };
 
-class SMDS_DownEdge: public SMDS_Down1D
+class SMDS_EXPORT SMDS_DownEdge: public SMDS_Down1D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -197,7 +197,7 @@ protected:
   ~SMDS_DownEdge();
 };
 
-class SMDS_DownQuadEdge: public SMDS_Down1D
+class SMDS_EXPORT SMDS_DownQuadEdge: public SMDS_Down1D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -206,7 +206,7 @@ protected:
   ~SMDS_DownQuadEdge();
 };
 
-class SMDS_DownTriangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownTriangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -217,7 +217,7 @@ protected:
   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
 };
 
-class SMDS_DownQuadTriangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownQuadTriangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -228,7 +228,7 @@ protected:
   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
 };
 
-class SMDS_DownQuadrangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownQuadrangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -239,7 +239,7 @@ protected:
   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
 };
 
-class SMDS_DownQuadQuadrangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownQuadQuadrangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -266,7 +266,7 @@ protected:
 //protected:
 //};
 
-class SMDS_DownTetra: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownTetra: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -278,7 +278,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadTetra: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadTetra: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -290,7 +290,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownPyramid: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownPyramid: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -302,7 +302,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadPyramid: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadPyramid: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -314,7 +314,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownPenta: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownPenta: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -326,7 +326,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadPenta: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadPenta: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -338,7 +338,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownHexa: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownHexa: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -350,7 +350,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadHexa: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadHexa: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
index 78966bc5795fda355d610bb51f09ce9069995d02..1f6712a74b9ce5d29dca2a3488b3e3ef80f613bd 100644 (file)
@@ -45,7 +45,7 @@ public:
   double X() const; // ! NOT thread safe methods !
   double Y() const;
   double Z() const;
-  void   GetXYZ(double xyx[3]) const; // thread safe getting coords
+  void   GetXYZ(double xyz[3]) const; // thread safe getting coords
   SMDS_ElemIteratorPtr    GetInverseElementIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
   int                     NbInverseElements(SMDSAbs_ElementType type=SMDSAbs_All) const;
   const SMDS_PositionPtr& GetPosition() const;
index 0d9b1e6c3c458775feb84294a542778c70e26bf4..1eb5c445d60e5e13ed1af797359a7f258ceb53d5 100644 (file)
@@ -763,7 +763,7 @@ void SMDS_UnstructuredGrid::BuildDownwardConnectivity(bool withEdges)
  * @param vtkId the vtk id of the cell
  * @return number of neighbors
  */
-int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId)
+int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId, bool getSkin)
 {
   int vtkType = this->GetCellType(vtkId);
   int cellDim = SMDS_Downward::getCellDimension(vtkType);
@@ -798,9 +798,27 @@ int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsi
           downIds[nb] = downId;
           downTypes[nb] = cellType;
           nb++;
+          if (nb >= NBMAXNEIGHBORS)
+            {
+              INFOS("SMDS_UnstructuredGrid::GetNeighbors problem: NBMAXNEIGHBORS=" <<NBMAXNEIGHBORS << " not enough");
+              return nb;
+            }
+        }
+      if (getSkin)
+        {
+          if (cellDim == 3 && nbUp == 1) // this face is on the skin of the volume
+            {
+              neighborsVtkIds[nb] = _downArray[cellType]->getVtkCellId(downId); // OK if skin present
+              downIds[nb] = downId;
+              downTypes[nb] = cellType;
+              nb++;
+              if (nb >= NBMAXNEIGHBORS)
+                {
+                  INFOS("SMDS_UnstructuredGrid::GetNeighbors problem: NBMAXNEIGHBORS=" <<NBMAXNEIGHBORS << " not enough");
+                  return nb;
+                }
+            }
         }
-      if (nb >= NBMAXNEIGHBORS)
-        assert(0);
     }
   return nb;
 }
index 4c1cc7b80934ba768daedd1f73e4287421c11831..774c54e2780ce100982b60448ff76e38da556eb4 100644 (file)
@@ -83,7 +83,7 @@ public:
   void setCellIdToDownId(int vtkCellId, int downId);
   void CleanDownwardConnectivity();
   void BuildDownwardConnectivity(bool withEdges);
-  int GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId);
+  int GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId, bool getSkin=false);
   int GetParentVolumes(int* volVtkIds, int vtkId);
   int GetParentVolumes(int* volVtkIds, int downId, unsigned char downType);
   void GetNodeIds(std::set<int>& nodeSet, int downId, unsigned char downType);
index 841d2354078e16761d4f199c4c189b93391d6c91..2c7c401cb00ecdb4ce3f64d4393b4b927a97804d 100644 (file)
@@ -1452,6 +1452,45 @@ double SMDS_VolumeTool::MinLinearSize2() const
   return minSize;
 }
 
+//================================================================================
+/*!
+ * \brief Return maximal square distance between connected corner nodes
+ */
+//================================================================================
+
+double SMDS_VolumeTool::MaxLinearSize2() const
+{
+  double maxSize = -1e+100;
+  int iQ = myVolume->IsQuadratic() ? 2 : 1;
+
+  // store current face data
+  int curFace = myCurFace, nbN = myFaceNbNodes;
+  int* ind = myFaceNodeIndices;
+  myFaceNodeIndices = NULL;
+  const SMDS_MeshNode** nodes = myFaceNodes;
+  myFaceNodes = NULL;
+  
+  // it seems that compute distance twice is faster than organization of a sole computing
+  myCurFace = -1;
+  for ( int iF = 0; iF < myNbFaces; ++iF )
+  {
+    setFace( iF );
+    for ( int iN = 0; iN < myFaceNbNodes; iN += iQ )
+    {
+      XYZ n1( myFaceNodes[ iN ]);
+      XYZ n2( myFaceNodes[(iN + iQ) % myFaceNbNodes]);
+      maxSize = std::max( maxSize, (n1 - n2).SquareMagnitude());
+    }
+  }
+  // restore current face data
+  myCurFace         = curFace;
+  myFaceNbNodes     = nbN;
+  myFaceNodeIndices = ind;
+  delete [] myFaceNodes; myFaceNodes = nodes;
+
+  return maxSize;
+}
+
 //================================================================================
 /*!
  * \brief check that only one volume is build on the face nodes
index 5c22c3edab61f1063f2c9e118ea0daccf5a69e2e..ff067eb3a94bed4913814c1444725d92d282c883 100644 (file)
@@ -128,6 +128,9 @@ class SMDS_EXPORT SMDS_VolumeTool
   double MinLinearSize2() const;
   // Return minimal square distance between connected corner nodes
 
+  double MaxLinearSize2() const;
+  // Return maximal square distance between connected corner nodes
+
   // -------------
   // info on faces
   // -------------
index 3008e024fe790155b5fff9483b1339205a00a2c2..72cc31ce1895d328def29aaf40b7cecc1e2c5f4b 100644 (file)
@@ -34,10 +34,6 @@ salomeinclude_HEADERS = \
        SMESH_Hypothesis.hxx \
        SMESH_HypoFilter.hxx \
        SMESH_Algo.hxx \
-       SMESH_0D_Algo.hxx \
-       SMESH_1D_Algo.hxx \
-       SMESH_2D_Algo.hxx \
-       SMESH_3D_Algo.hxx \
        SMESH_Group.hxx \
        SMESH_MeshEditor.hxx \
        SMESH_Pattern.hxx \
@@ -56,10 +52,6 @@ dist_libSMESHimpl_la_SOURCES = \
        SMESH_subMesh.cxx \
        SMESH_Hypothesis.cxx \
        SMESH_Algo.cxx \
-       SMESH_0D_Algo.cxx \
-       SMESH_1D_Algo.cxx \
-       SMESH_2D_Algo.cxx \
-       SMESH_3D_Algo.cxx \
        SMESH_Group.cxx \
        SMESH_MeshEditor.cxx \
        SMESH_Pattern.cxx \
@@ -83,6 +75,7 @@ libSMESHimpl_la_CPPFLAGS = \
        -I$(srcdir)/../DriverUNV \
        -I$(srcdir)/../DriverSTL \
        -I$(srcdir)/../DriverCGNS \
+       -I$(srcdir)/../DriverGMF \
        -I$(srcdir)/../SMDS \
        -I$(srcdir)/../SMESHDS \
        -I$(srcdir)/../SMESHUtils
@@ -98,8 +91,9 @@ libSMESHimpl_la_LDFLAGS = \
        ../DriverSTL/libMeshDriverSTL.la \
        ../DriverMED/libMeshDriverMED.la \
        ../DriverUNV/libMeshDriverUNV.la \
+       ../DriverGMF/libMeshDriverGMF.la \
        $(DriverCGNS_LIB) \
        ../SMESHUtils/libSMESHUtils.la \
        $(BOOST_LIB_THREAD)  \
        $(GEOM_LDFLAGS) -lNMTTools \
-       $(CAS_LDPATH) -lTKShHealing -lTKPrim -lTKG2d
+       $(CAS_LDPATH) -lTKShHealing -lTKPrim -lTKG2d -lTKCDF
diff --git a/src/SMESH/SMESH_0D_Algo.cxx b/src/SMESH/SMESH_0D_Algo.cxx
deleted file mode 100644 (file)
index bc3461d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_0D_Algo.cxx
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_0D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_0D_Algo::SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-  _type = ALGO_0D;
-  gen->_map0D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_0D_Algo::~SMESH_0D_Algo()
-{
-}
-
diff --git a/src/SMESH/SMESH_0D_Algo.hxx b/src/SMESH/SMESH_0D_Algo.hxx
deleted file mode 100644 (file)
index d7ba782..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_0D_Algo.hxx
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_0D_ALGO_HXX_
-#define _SMESH_0D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
-{
-public:
-  SMESH_0D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
-  virtual ~SMESH_0D_Algo();
-};
-
-#endif
diff --git a/src/SMESH/SMESH_1D_Algo.cxx b/src/SMESH/SMESH_1D_Algo.cxx
deleted file mode 100644 (file)
index 3027f82..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_1D_Algo.cxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_1D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_subMesh.hxx"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-//   _compatibleHypothesis.push_back("hypothese_1D_bidon");
-  _type = ALGO_1D;
-  gen->_map1D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_1D_Algo::~SMESH_1D_Algo()
-{
-}
-
diff --git a/src/SMESH/SMESH_1D_Algo.hxx b/src/SMESH/SMESH_1D_Algo.hxx
deleted file mode 100644 (file)
index e10aa19..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_1D_Algo.hxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_1D_ALGO_HXX_
-#define _SMESH_1D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_EXPORT SMESH_1D_Algo:
-  public SMESH_Algo
-{
-public:
-  SMESH_1D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
-  virtual ~SMESH_1D_Algo();
-};
-
-#endif
diff --git a/src/SMESH/SMESH_2D_Algo.cxx b/src/SMESH/SMESH_2D_Algo.cxx
deleted file mode 100644 (file)
index a4feece..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_2D_Algo.cxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_2D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "utilities.h"
-
-#include <TopExp_Explorer.hxx>
-#include <TopExp.hxx>
-#include <TopoDS.hxx>
-
-using namespace std;
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-//   _compatibleHypothesis.push_back("hypothese_2D_bidon");
-  _type = ALGO_2D;
-  gen->_map2D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_2D_Algo::~SMESH_2D_Algo()
-{
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-int SMESH_2D_Algo::NumberOfWires(const TopoDS_Shape& S)
-{
-  int i = 0;
-  for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
-    i++;
-  return i;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-int SMESH_2D_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
-{
-  int nbPoints = 0;
-  for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) {
-    const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
-    int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
-    if(_quadraticMesh)
-      nb = nb/2;
-    nbPoints += nb + 1; // internal points plus 1 vertex of 2 (last point ?)
-  }
-  return nbPoints;
-}
-
-
diff --git a/src/SMESH/SMESH_2D_Algo.hxx b/src/SMESH/SMESH_2D_Algo.hxx
deleted file mode 100644 (file)
index 0a2a127..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_2D_Algo.hxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_2D_ALGO_HXX_
-#define _SMESH_2D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-#include "SMESH_subMesh.hxx"
-#include "TopoDS_Wire.hxx"
-
-class SMESH_EXPORT SMESH_2D_Algo:
-  public SMESH_Algo
-{
-public:
-  SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
-  virtual ~SMESH_2D_Algo();
-
-  int NumberOfWires(const TopoDS_Shape& S);
-  int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
-
-};
-
-#endif
diff --git a/src/SMESH/SMESH_3D_Algo.cxx b/src/SMESH/SMESH_3D_Algo.cxx
deleted file mode 100644 (file)
index d7a0ed8..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_3D_Algo.cxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_3D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-//   _compatibleHypothesis.push_back("hypothese_3D_bidon");
-  _type = ALGO_3D;
-  gen->_map3D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_3D_Algo::~SMESH_3D_Algo()
-{
-}
-
-
diff --git a/src/SMESH/SMESH_3D_Algo.hxx b/src/SMESH/SMESH_3D_Algo.hxx
deleted file mode 100644 (file)
index 2b64d9e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_3D_Algo.hxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_3D_ALGO_HXX_
-#define _SMESH_3D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_EXPORT SMESH_3D_Algo:
-  public SMESH_Algo
-{
-public:
-  SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
-  virtual ~SMESH_3D_Algo();
-
-};
-
-#endif
index 9768eb04976821b7074851e63a137942747a2409..f7bd7f9bf3b2bf85824bab37264a6da3a0453e12 100644 (file)
@@ -39,6 +39,7 @@
 #include "SMESH_HypoFilter.hxx"
 #include "SMESH_Mesh.hxx"
 #include "SMESH_TypeDefs.hxx"
+#include "SMESH_subMesh.hxx"
 
 #include <Basics_OCCTVersion.hxx>
 
@@ -49,6 +50,7 @@
 #include <GeomAdaptor_Curve.hxx>
 #include <Geom_Surface.hxx>
 #include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
 #include <TopLoc_Location.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <TopTools_ListOfShape.hxx>
@@ -56,6 +58,7 @@
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Vertex.hxx>
+#include <TopoDS_Wire.hxx>
 #include <gp_Pnt.hxx>
 #include <gp_Pnt2d.hxx>
 #include <gp_Vec.hxx>
@@ -96,6 +99,41 @@ SMESH_Algo::~SMESH_Algo()
 {
 }
 
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+SMESH_0D_Algo::SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_VERTEX);
+  _type = ALGO_0D;
+  gen->_map0D_Algo[hypId] = this;
+}
+SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_EDGE);
+  _type = ALGO_1D;
+  gen->_map1D_Algo[hypId] = this;
+}
+SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_FACE);
+  _type = ALGO_2D;
+  gen->_map2D_Algo[hypId] = this;
+}
+SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_SOLID);
+  _type = ALGO_3D;
+  gen->_map3D_Algo[hypId] = this;
+}
+
 //=============================================================================
 /*!
  * Usually an algoritm has nothing to save
@@ -309,7 +347,14 @@ bool SMESH_Algo::IsReversedSubMesh (const TopoDS_Face&  theFace,
   // face normal at node position
   TopLoc_Location loc;
   Handle(Geom_Surface) surf = BRep_Tool::Surface( theFace, loc );
-  if ( surf.IsNull() || surf->Continuity() < GeomAbs_C1 ) return isReversed;
+  // if ( surf.IsNull() || surf->Continuity() < GeomAbs_C1 )
+  // some surfaces not detected as GeomAbs_C1 are nevertheless correct for meshing
+  if ( surf.IsNull() || surf->Continuity() < GeomAbs_C0 )
+    {
+      if (!surf.IsNull())
+        MESSAGE("surf->Continuity() < GeomAbs_C1 " << (surf->Continuity() < GeomAbs_C1));
+      return isReversed;
+    }
   gp_Vec d1u, d1v;
   surf->D1( u, v, nPnt[0], d1u, d1v );
   gp_Vec Nf = (d1u ^ d1v).Transformed( loc );
@@ -777,3 +822,38 @@ void SMESH_Algo::addBadInputElement(const SMDS_MeshElement* elem)
   if ( elem )
     _badInputElements.push_back( elem );
 }
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+int SMESH_Algo::NumberOfWires(const TopoDS_Shape& S)
+{
+  int i = 0;
+  for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
+    i++;
+  return i;
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+int SMESH_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
+{
+  int nbPoints = 0;
+  for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) {
+    const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
+    int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
+    if(_quadraticMesh)
+      nb = nb/2;
+    nbPoints += nb + 1; // internal points plus 1 vertex of 2 (last point ?)
+  }
+  return nbPoints;
+}
+
+
index 580445b48057b0cc1c100d6ef30f66ce65cbdde0..1a3be0876eb8dc012a137455948ae486836bff51 100644 (file)
@@ -47,6 +47,7 @@ class SMESH_Gen;
 class SMESH_Mesh;
 class SMESH_HypoFilter;
 class TopoDS_Vertex;
+class TopoDS_Wire;
 class TopoDS_Face;
 class TopoDS_Shape;
 class SMESHDS_Mesh;
@@ -301,6 +302,9 @@ public:
    */
   static bool FaceNormal(const SMDS_MeshElement* F, gp_XYZ& normal, bool normalized=true);
 
+  static int NumberOfWires(const TopoDS_Shape& S);
+  int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
+
   /*!
    * \brief Return continuity of two edges
     * \param E1 - the 1st edge
@@ -373,8 +377,8 @@ protected:
   bool _requireShape;           // work with GetDim()-1 mesh bound to geom only. Default TRUE
   bool _supportSubmeshes;       // if !_requireDiscreteBoundary. Default FALSE
 
-  // quadratic mesh creation required,
-  // is usually set trough SMESH_MesherHelper::IsQuadraticSubMesh()
+  // indicates if quadratic mesh creation is required,
+  // is usually set like this: _quadraticMesh = SMESH_MesherHelper::IsQuadraticSubMesh(shape)
   bool _quadraticMesh;
 
   int         _error;    //!< SMESH_ComputeErrorName or anything algo specific
@@ -384,4 +388,28 @@ protected:
   volatile bool _computeCanceled; //!< is set to True while computing to stop it
 };
 
+class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_0D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_1D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_1D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_2D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_3D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
 #endif
index dae945eec5e6b328942f1f362a686f9df6e1184b..c18ace19422797d527205633cda50237eff59425 100644 (file)
 #include "Utils_ExceptHandlers.hxx"
 
 #include <TopoDS_Iterator.hxx>
+#include <LDOMParser.hxx>
 
 #include "memoire.h"
 
+#ifdef WNT
+  #include <windows.h>
+#endif\r
+
 using namespace std;
 
 //=============================================================================
@@ -374,7 +379,9 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
   {
     SMESH_MesherHelper aHelper( aMesh );
     if ( aHelper.IsQuadraticMesh() != SMESH_MesherHelper::LINEAR )
-      aHelper.FixQuadraticElements();
+    {
+      aHelper.FixQuadraticElements( sm->GetComputeError() );
+    }
   }
   return ret;
 }
@@ -645,7 +652,8 @@ static bool checkMissing(SMESH_Gen*                aGen,
                          set<SMESH_subMesh*>&      aCheckedMap,
                          list< SMESH_Gen::TAlgoStateError > & theErrors)
 {
-  if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX)
+  if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX ||
+       aCheckedMap.count( aSubMesh ))
     return true;
 
   //MESSAGE("=====checkMissing");
@@ -701,8 +709,15 @@ static bool checkMissing(SMESH_Gen*                aGen,
     break;
   }
   case SMESH_subMesh::HYP_OK:
-    algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() );
+    algo = aSubMesh->GetAlgo();
     ret = true;
+    if (!algo->NeedDiscreteBoundary())
+    {
+      SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false,
+                                                                       /*complexShapeFirst=*/false);
+      while ( itsub->more() )
+        aCheckedMap.insert( itsub->next() );
+    }
     break;
   default: ASSERT(0);
   }
@@ -721,7 +736,6 @@ static bool checkMissing(SMESH_Gen*                aGen,
     {
       // sub-meshes should not be checked further more
       SMESH_subMesh* sm = itsub->next();
-      aCheckedMap.insert( sm );
 
       if (isTopLocalAlgo)
       {
@@ -735,6 +749,7 @@ static bool checkMissing(SMESH_Gen*                aGen,
             checkNoAlgo2 = false;
         }
       }
+      aCheckedMap.insert( sm );
     }
   }
   return ret;
@@ -768,9 +783,9 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh&               theMesh,
   bool ret = true;
   bool hasAlgo = false;
 
-  SMESH_subMesh* sm = theMesh.GetSubMesh(theShape);
+  SMESH_subMesh*          sm = theMesh.GetSubMesh(theShape);
   const SMESHDS_Mesh* meshDS = theMesh.GetMeshDS();
-  TopoDS_Shape mainShape = meshDS->ShapeToMesh();
+  TopoDS_Shape     mainShape = meshDS->ShapeToMesh();
 
   // -----------------
   // get global algos
@@ -896,6 +911,177 @@ bool SMESH_Gen::IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& a
   return aMesh.GetHypothesis( aMesh.GetMeshDS()->ShapeToMesh(), filter, false );
 }
 
+//================================================================================
+/*!
+ * \brief Return paths to xml files of plugins
+ */
+//================================================================================
+
+std::vector< std::string > SMESH_Gen::GetPluginXMLPaths()
+{
+  // Get paths to xml files of plugins
+  vector< string > xmlPaths;
+  string sep;
+  if ( const char* meshersList = getenv("SMESH_MeshersList") )
+  {
+    string meshers = meshersList, plugin;
+    string::size_type from = 0, pos;
+    while ( from < meshers.size() )
+    {
+      // cut off plugin name
+      pos = meshers.find( ':', from );
+      if ( pos != string::npos )
+        plugin = meshers.substr( from, pos-from );
+      else
+        plugin = meshers.substr( from ), pos = meshers.size();
+      from = pos + 1;
+
+      // get PLUGIN_ROOT_DIR path
+      string rootDirVar, pluginSubDir = plugin;
+      if ( plugin == "StdMeshers" )
+        rootDirVar = "SMESH", pluginSubDir = "smesh";
+      else
+        for ( pos = 0; pos < plugin.size(); ++pos )
+          rootDirVar += toupper( plugin[pos] );
+      rootDirVar += "_ROOT_DIR";
+
+      const char* rootDir = getenv( rootDirVar.c_str() );
+      if ( !rootDir || strlen(rootDir) == 0 )
+      {
+        rootDirVar = plugin + "_ROOT_DIR"; // HexoticPLUGIN_ROOT_DIR
+        rootDir = getenv( rootDirVar.c_str() );
+        if ( !rootDir || strlen(rootDir) == 0 ) continue;
+      }
+
+      // get a separator from rootDir
+      for ( pos = strlen( rootDir )-1; pos >= 0 && sep.empty(); --pos )
+        if ( rootDir[pos] == '/' || rootDir[pos] == '\\' )
+        {
+          sep = rootDir[pos];
+          break;
+        }
+#ifdef WNT
+      if (sep.empty() ) sep = "\\";
+#else
+      if (sep.empty() ) sep = "/";
+#endif
+
+      // get a path to resource file
+      string xmlPath = rootDir;
+      if ( xmlPath[ xmlPath.size()-1 ] != sep[0] )
+        xmlPath += sep;
+      xmlPath += "share" + sep + "salome" + sep + "resources" + sep;
+      for ( pos = 0; pos < pluginSubDir.size(); ++pos )
+        xmlPath += tolower( pluginSubDir[pos] );
+      xmlPath += sep + plugin + ".xml";
+      bool fileOK;
+#ifdef WNT
+      fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES);
+#else
+      fileOK = (access(xmlPath.c_str(), F_OK) == 0);
+#endif
+      if ( fileOK )
+        xmlPaths.push_back( xmlPath );
+    }
+  }
+
+  return xmlPaths;
+}
+
+//=======================================================================
+namespace // Access to type of input and output of an algorithm
+//=======================================================================
+{
+  struct AlgoData
+  {
+    int                       _dim;
+    set<SMDSAbs_GeometryType> _inElemTypes; // acceptable types of input mesh element
+    set<SMDSAbs_GeometryType> _outElemTypes; // produced types of mesh elements
+
+    bool IsCompatible( const AlgoData& algo2 ) const
+    {
+      if ( _dim > algo2._dim ) return algo2.IsCompatible( *this );
+      // algo2 is of highter dimension
+      if ( _outElemTypes.empty() || algo2._inElemTypes.empty() )
+        return false;
+      bool compatible = true;
+      set<SMDSAbs_GeometryType>::const_iterator myOutType = _outElemTypes.begin();
+      for ( ; myOutType != _outElemTypes.end() && compatible; ++myOutType )
+        compatible = algo2._inElemTypes.count( *myOutType );
+      return compatible;
+    }
+  };
+
+  //================================================================================
+  /*!
+   * \brief Return AlgoData of the algorithm
+   */
+  //================================================================================
+
+  const AlgoData& getAlgoData( const SMESH_Algo* algo )
+  {
+    static map< string, AlgoData > theDataByName;
+    if ( theDataByName.empty() )
+    {
+      // Read Plugin.xml files
+      vector< string > xmlPaths = SMESH_Gen::GetPluginXMLPaths();
+      LDOMParser xmlParser;
+      for ( size_t iXML = 0; iXML < xmlPaths.size(); ++iXML )
+      {
+        bool error = xmlParser.parse( xmlPaths[iXML].c_str() );
+        if ( error )
+        {
+          TCollection_AsciiString data;
+          INFOS( xmlParser.GetError(data) );
+          continue;
+        }
+        // <algorithm type="Regular_1D"
+        //            ...
+        //            input="EDGE"
+        //            output="QUAD,TRIA">
+        //
+        LDOM_Document xmlDoc = xmlParser.getDocument();
+        LDOM_NodeList algoNodeList = xmlDoc.getElementsByTagName( "algorithm" );
+        for ( int i = 0; i < algoNodeList.getLength(); ++i )
+        {
+          LDOM_Node     algoNode           = algoNodeList.item( i );
+          LDOM_Element& algoElem           = (LDOM_Element&) algoNode;
+          TCollection_AsciiString algoType = algoElem.getAttribute("type");
+          TCollection_AsciiString input    = algoElem.getAttribute("input");
+          TCollection_AsciiString output   = algoElem.getAttribute("output");
+          TCollection_AsciiString dim      = algoElem.getAttribute("dim");
+          if ( algoType.IsEmpty() ) continue;
+          AlgoData & data                  = theDataByName[ algoType.ToCString() ];
+          data._dim = dim.IntegerValue();
+          for ( int isInput = 0; isInput < 2; ++isInput )
+          {
+            TCollection_AsciiString&   typeStr = isInput ? input : output;
+            set<SMDSAbs_GeometryType>& typeSet = isInput ? data._inElemTypes : data._outElemTypes;
+            int beg = 1, end;
+            while ( beg <= typeStr.Length() )
+            {
+              while ( beg < typeStr.Length() && !isalpha( typeStr.Value( beg ) ))
+                ++beg;
+              end = beg;
+              while ( end < typeStr.Length() && isalpha( typeStr.Value( end + 1 ) ))
+                ++end;
+              if ( end > beg )
+              {
+                TCollection_AsciiString typeName = typeStr.SubString( beg, end );
+                if      ( typeName == "EDGE" ) typeSet.insert( SMDSGeom_EDGE );
+                else if ( typeName == "TRIA" ) typeSet.insert( SMDSGeom_TRIANGLE );
+                else if ( typeName == "QUAD" ) typeSet.insert( SMDSGeom_QUADRANGLE );
+              }
+              beg = end + 1;
+            }
+          }
+        }
+      }
+    }
+    return theDataByName[ algo->GetName() ];
+  }
+}
+
 //=============================================================================
 /*!
  * Finds algo to mesh a shape. Optionally returns a shape the found algo is bound to
@@ -909,7 +1095,63 @@ SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_Mesh &         aMesh,
   SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
   filter.And( filter.IsApplicableTo( aShape ));
 
-  return (SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, assignedTo );
+  TopoDS_Shape assignedToShape;
+  SMESH_Algo* algo =
+    (SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, &assignedToShape );
+
+  if ( algo &&
+       aShape.ShapeType() == TopAbs_FACE &&
+       !aShape.IsSame( assignedToShape ) &&
+       SMESH_MesherHelper::NbAncestors( aShape, aMesh, TopAbs_SOLID ) > 1 )
+  {
+    // Issue 0021559. If there is another 2D algo with different types of output
+    // elements that can be used to mesh aShape, and 3D algos on adjacent SOLIDs
+    // have different types of input elements, we choose a most appropriate 2D algo.
+
+    // try to find a concurrent 2D algo
+    filter.AndNot( filter.Is( algo ));
+    TopoDS_Shape assignedToShape2;
+    SMESH_Algo* algo2 =
+      (SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, &assignedToShape2 );
+    if ( algo2 &&                                                  // algo found
+         !assignedToShape2.IsSame( aMesh.GetShapeToMesh() ) &&     // algo is local
+         ( SMESH_MesherHelper::GetGroupType( assignedToShape2 ) == // algo of the same level
+           SMESH_MesherHelper::GetGroupType( assignedToShape )) &&
+         aMesh.IsOrderOK( aMesh.GetSubMesh( assignedToShape2 ),    // no forced order
+                          aMesh.GetSubMesh( assignedToShape  )))
+    {
+      // get algos on the adjacent SOLIDs
+      filter.Init( filter.IsAlgo() ).And( filter.HasDim( 3 ));
+      vector< SMESH_Algo* > algos3D;
+      PShapeIteratorPtr solidIt = SMESH_MesherHelper::GetAncestors( aShape, aMesh,
+                                                                    TopAbs_SOLID );
+      while ( const TopoDS_Shape* solid = solidIt->next() )
+        if ( SMESH_Algo* algo3D = (SMESH_Algo*) aMesh.GetHypothesis( *solid, filter, true ))
+        {
+          algos3D.push_back( algo3D );
+          filter.AndNot( filter.HasName( algo3D->GetName() ));
+        }
+      // check compatibility of algos
+      if ( algos3D.size() > 1 )
+      {
+        const AlgoData& algoData    = getAlgoData( algo );
+        const AlgoData& algoData2   = getAlgoData( algo2 );
+        const AlgoData& algoData3d0 = getAlgoData( algos3D[0] );
+        const AlgoData& algoData3d1 = getAlgoData( algos3D[1] );
+        if (( algoData2.IsCompatible( algoData3d0 ) &&
+              algoData2.IsCompatible( algoData3d1 ))
+            &&
+            !(algoData.IsCompatible( algoData3d0 ) &&
+              algoData.IsCompatible( algoData3d1 )))
+          algo = algo2;
+      }
+    }
+  }
+
+  if ( assignedTo && algo )
+    * assignedTo = assignedToShape;
+
+  return algo;
 }
 
 //=============================================================================
index 353cba6df6c66568b8e0dac8dc3413d02581d51c..b7854786fc072753e187141e1b6014bba1ae255a 100644 (file)
 #include "SMESH_Hypothesis.hxx"
 #include "SMESH_ComputeError.hxx"
 #include "SMESH_Algo.hxx"
-#include "SMESH_0D_Algo.hxx"
-#include "SMESH_1D_Algo.hxx"
-#include "SMESH_2D_Algo.hxx"
-#include "SMESH_3D_Algo.hxx"
 #include "SMESH_Mesh.hxx"
 
 #include "chrono.hxx"
@@ -47,6 +43,8 @@
 
 #include <map>
 #include <list>
+#include <vector>
+#include <string>
 
 class SMESHDS_Document;
 
@@ -144,9 +142,13 @@ public:
   static int GetShapeDim(const TopAbs_ShapeEnum & aShapeType);
   static int GetShapeDim(const TopoDS_Shape & aShape)
   { return GetShapeDim( aShape.ShapeType() ); }
+
   SMESH_Algo* GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, TopoDS_Shape* assignedTo=0);
+
   static bool IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& aMesh);
 
+  static std::vector< std::string > GetPluginXMLPaths();
+
   int GetANewId();
 
   std::map < int, SMESH_Algo * >_mapAlgo;
index 7ef568593a2f492f535a7fb6a1b0934fa444a11f..dae4e3188a91d31d9013538df35bf7222b062b57 100644 (file)
@@ -24,7 +24,6 @@
 //  File   : SMESH_Group.cxx
 //  Author : Michael Sazonov (OCC)
 //  Module : SMESH
-//  $Header$
 //
 #include "SMESH_Group.hxx"
 #include "SMESH_Mesh.hxx"
@@ -60,6 +59,7 @@ SMESH_Group::SMESH_Group (int                       theID,
     myGroupDS = new SMESHDS_Group (theID,
                                    const_cast<SMESH_Mesh*>(theMesh)->GetMeshDS(),
                                    theType);
+  myGroupDS->SetStoreName( theName );
 }
 
 //================================================================================
@@ -76,7 +76,7 @@ SMESH_Group::SMESH_Group (SMESHDS_GroupBase* groupDS): myGroupDS( groupDS )
 
 //=============================================================================
 /*!
- *  
+ *  Destructor deletes myGroupDS
  */
 //=============================================================================
 
@@ -84,3 +84,15 @@ SMESH_Group::~SMESH_Group ()
 {
   delete myGroupDS; myGroupDS=0;
 }
+
+//================================================================================
+/*!
+ * \brief Sets a new name
+ */
+//================================================================================
+
+void SMESH_Group::SetName (const char* theName)
+{
+  myName = theName;
+  myGroupDS->SetStoreName( theName );
+}
index f378be29696008a32361cbc0a2c04536b002abf5..edb14b900522e2b4c901770ae4e047d0a0e7b5db 100644 (file)
@@ -52,7 +52,7 @@ class SMESH_EXPORT  SMESH_Group
   SMESH_Group (SMESHDS_GroupBase* groupDS);
   ~SMESH_Group ();
 
-  void SetName (const char* theName) { myName = theName; }
+  void SetName (const char* theName);
 
   const char* GetName () const { return myName.c_str(); }
 
index fee310f27caa8a44af2a462ba3b359f0074b916a..48f293a565c8ddba91f58dc7b02e3013922438da 100644 (file)
@@ -43,7 +43,6 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
                                    int studyId,
                                    SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId)
 {
-  //MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis");
   _gen = gen;
   _studyId = studyId;
   StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
@@ -51,9 +50,8 @@ 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();
-  _libName = string();
+  //_parameters = string();
+  //_lastParameters = string();
 }
 
 //=============================================================================
@@ -65,6 +63,8 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
 SMESH_Hypothesis::~SMESH_Hypothesis()
 {
   MESSAGE("SMESH_Hypothesis::~SMESH_Hypothesis");
+  StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
+  myStudyContext->mapHypothesis[_hypId] = 0;
 }
 
 //=============================================================================
@@ -177,53 +177,53 @@ SMESH_Mesh* SMESH_Hypothesis::GetMeshByPersistentID(int id)
  * 
  */
 //=============================================================================
-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);
-}
+// 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 0c81caac7a248b7785cae8af9ff5660e6126b9fe..4c29ff333f7923fe42f6d59b168a4c639464aa5e 100644 (file)
@@ -51,7 +51,7 @@ public:
   {
     HYP_OK = 0,
     HYP_MISSING,      // algo misses a hypothesis
-    HYP_CONCURENT,    // several applicable hypotheses
+    HYP_CONCURENT,    // several applicable hypotheses assigned to father shapes
     HYP_BAD_PARAMETER,// hypothesis has a bad parameter value
     HYP_HIDDEN_ALGO,  // an algo is hidden by an upper dim algo generating all-dim elements
     HYP_HIDING_ALGO,  // an algo hides lower dim algos by generating all-dim elements
@@ -59,7 +59,7 @@ public:
                       //      for Add/RemoveHypothesis operations
     HYP_INCOMPATIBLE, // hypothesis does not fit algo
     HYP_NOTCONFORM,   // not conform mesh is produced appling a hypothesis
-    HYP_ALREADY_EXIST,// such hypothesis already exist
+    HYP_ALREADY_EXIST,// several applicable hypothesis of same priority assigned
     HYP_BAD_DIM,      // bad dimension
     HYP_BAD_SUBSHAPE, // shape is neither the main one, nor its sub-shape, nor a group
     HYP_BAD_GEOMETRY, // shape geometry mismatches algorithm's expectation
@@ -77,12 +77,12 @@ public:
   virtual const char* GetLibName() const;
   void  SetLibName(const char* theLibName);
 
-  void  SetParameters(const char *theParameters);
-  char* GetParameters() const;
+  //void  SetParameters(const char *theParameters);
+  //char* GetParameters() const;
 
-  void SetLastParameters(const char* theParameters);
-  char* GetLastParameters() const;
-  void ClearParameters();
+  // void SetLastParameters(const char* theParameters);
+  // char* GetLastParameters() const;
+  // void ClearParameters();
   
   /*!
    * \brief Initialize my parameter values by the mesh built on the geometry
@@ -122,14 +122,14 @@ public:
 
 protected:
   SMESH_Gen* _gen;
-  int _studyId;
-  int _shapeType;
-  int _param_algo_dim; // to be set at descendant hypothesis constructor
+  int        _studyId;
+  int        _shapeType;
+  int        _param_algo_dim; // to be set at descendant hypothesis constructor
 
 private:
-  std::string _libName;
-  std::string _parameters;
-  std::string _lastParameters;
+  std::string _libName; // name of library of plug-in Engine
+  //std::string _parameters;
+  //std::string _lastParameters;
 };
 
 #endif
index 1057d3deee69e87f7e9ea71f983b7a9638267865..0b171a6efbb293fddecff2e4c8f44059ca114d11 100644 (file)
 
 #include "utilities.h"
 
-#include "DriverMED_W_SMESHDS_Mesh.h"
 #include "DriverDAT_W_SMDS_Mesh.h"
-#include "DriverUNV_W_SMDS_Mesh.h"
-#include "DriverSTL_W_SMDS_Mesh.h"
-
+#include "DriverGMF_Read.hxx"
+#include "DriverGMF_Write.hxx"
 #include "DriverMED_R_SMESHDS_Mesh.h"
-#include "DriverUNV_R_SMDS_Mesh.h"
+#include "DriverMED_W_SMESHDS_Mesh.h"
 #include "DriverSTL_R_SMDS_Mesh.h"
+#include "DriverSTL_W_SMDS_Mesh.h"
+#include "DriverUNV_R_SMDS_Mesh.h"
+#include "DriverUNV_W_SMDS_Mesh.h"
 #ifdef WITH_CGNS
 #include "DriverCGNS_Read.hxx"
 #include "DriverCGNS_Write.hxx"
@@ -538,6 +539,26 @@ int SMESH_Mesh::CGNSToMesh(const char*  theFileName,
   return res;
 }
 
+//================================================================================
+/*!
+ * \brief Fill its data by reading a GMF file
+ */
+//================================================================================
+
+SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName)
+{
+  DriverGMF_Read myReader;
+  myReader.SetMesh(_myMeshDS);
+  myReader.SetFile(theFileName);
+  myReader.Perform();
+  //theMeshName = myReader.GetMeshName();
+
+  // create groups
+  SynchronizeGroups();
+
+  return myReader.GetError();
+}
+
 //=============================================================================
 /*!
  * 
@@ -1391,6 +1412,21 @@ void SMESH_Mesh::ExportCGNS(const char *        file,
     throw SALOME_Exception("Export failed");
 }
 
+//================================================================================
+/*!
+ * \brief Export the mesh to a GMF file
+ */
+//================================================================================
+
+void SMESH_Mesh::ExportGMF(const char *        file,
+                           const SMESHDS_Mesh* meshDS)
+{
+  DriverGMF_Write myWriter;
+  myWriter.SetFile( file );
+  myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS ));
+  myWriter.Perform();
+}
+
 //================================================================================
 /*!
  * \brief Return number of nodes in the mesh
@@ -1651,6 +1687,35 @@ SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType,
   return aGroup;
 }
 
+//================================================================================
+/*!
+ * \brief Creates a group based on an existing SMESHDS group. Group ID should be unique
+ */
+//================================================================================
+
+SMESH_Group* SMESH_Mesh::AddGroup (SMESHDS_GroupBase* groupDS) throw(SALOME_Exception)
+{
+  if ( !groupDS ) 
+    throw SALOME_Exception(LOCALIZED ("SMESH_Mesh::AddGroup(): NULL SMESHDS_GroupBase"));
+
+  map <int, SMESH_Group*>::iterator i_g = _mapGroup.find( groupDS->GetID() );
+  if ( i_g != _mapGroup.end() && i_g->second )
+  {
+    if ( i_g->second->GetGroupDS() == groupDS )
+      return i_g->second;
+    else
+      throw SALOME_Exception(LOCALIZED ("SMESH_Mesh::AddGroup() wrong ID of SMESHDS_GroupBase"));
+  }
+  SMESH_Group* aGroup = new SMESH_Group (groupDS);
+  _mapGroup[ groupDS->GetID() ] = aGroup;
+  GetMeshDS()->AddGroup( aGroup->GetGroupDS() );
+
+  _groupId = 1 + _mapGroup.rbegin()->first;
+
+  return aGroup;
+}
+
+
 //================================================================================
 /*!
  * \brief Creates SMESH_Groups for not wrapped SMESHDS_Groups
@@ -1955,6 +2020,13 @@ void SMESH_Mesh::fillAncestorsMap(const TopoDS_Shape& theShape)
                                         (TopAbs_ShapeEnum) ancType,
                                         _mapAncestors );
   }
+  // visit COMPOUNDs inside a COMPOUND that are not reachable by TopExp_Explorer
+  if ( theShape.ShapeType() == TopAbs_COMPOUND )
+  {
+    for ( TopoDS_Iterator sIt(theShape); sIt.More(); sIt.Next() )
+      if ( sIt.Value().ShapeType() == TopAbs_COMPOUND )
+        fillAncestorsMap( sIt.Value() );
+  }
 }
 
 //=============================================================================
@@ -1977,9 +2049,9 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
   typedef list<SMESH_subMesh*>::iterator TPosInList;
   map< int, TPosInList > sortedPos;
   TPosInList smBeg = theListToSort.begin(), smEnd = theListToSort.end();
-  TListOfListOfInt::const_iterator listIddIt = _mySubMeshOrder.begin();
-  for( ; listIddIt != _mySubMeshOrder.end(); listIddIt++) {
-    const TListOfInt& listOfId = *listIddIt;
+  TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin();
+  for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++) {
+    const TListOfInt& listOfId = *listIdsIt;
     TListOfInt::const_iterator idIt = listOfId.begin();
     for ( ; idIt != listOfId.end(); idIt++ ) {
       if ( SMESH_subMesh * sm = GetSubMeshContaining( *idIt )) {
@@ -2006,6 +2078,30 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
   return res;
 }
 
+//================================================================================
+/*!
+ * \brief Return true if given order of sub-meshes is OK
+ */
+//================================================================================
+
+bool SMESH_Mesh::IsOrderOK( const SMESH_subMesh* smBefore,
+                            const SMESH_subMesh* smAfter ) const
+{
+  TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin();
+  TListOfInt::const_iterator idBef, idAft;
+  for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++)
+  {
+    const TListOfInt& listOfId = *listIdsIt;
+    idBef = std::find( listOfId.begin(), listOfId.end(), smBefore->GetId() );
+    if ( idBef != listOfId.end() )
+      idAft = std::find( listOfId.begin(), listOfId.end(), smAfter->GetId() );
+    if ( idAft != listOfId.end () )
+      return ( std::distance( listOfId.begin(), idBef ) <
+               std::distance( listOfId.begin(), idAft )   );
+  }
+  return true; // no order imposed to given submeshes
+} 
+
 //=============================================================================
 /*!
  * \brief sort submeshes according to stored mesh order
@@ -2014,8 +2110,8 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
  */
 //=============================================================================
 
-list<SMESH_subMesh*> SMESH_Mesh::getAncestorsSubMeshes
-  (const TopoDS_Shape& theSubShape) const
+list<SMESH_subMesh*>
+SMESH_Mesh::getAncestorsSubMeshes (const TopoDS_Shape& theSubShape) const
 {
   list<SMESH_subMesh*> listOfSubMesh;
   TopTools_ListIteratorOfListOfShape it( GetAncestors( theSubShape ));
index 5ae3cc61c74899b386205e1231d7e81a630e89c6..5bd9b9c14476db90d122ac265088b584205e1460 100644 (file)
 
 #include "SMESH_SMESH.hxx"
 
-#include "SMESH_Hypothesis.hxx"
-#include "SMESH_Controls.hxx"
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_Command.hxx"
 #include "SMDSAbs_ElementType.hxx"
+#include "SMESHDS_Command.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_ComputeError.hxx"
+#include "SMESH_Controls.hxx"
+#include "SMESH_Hypothesis.hxx"
 
 #include "Utils_SALOME_Exception.hxx"
 
@@ -44,6 +44,7 @@
 #include <map>
 #include <list>
 
+
 #ifdef WNT
 #pragma warning(disable:4251) // Warning DLL Interface ...
 #pragma warning(disable:4290) // Warning Exception ...
@@ -121,6 +122,8 @@ public:
 
   int CGNSToMesh(const char* theFileName, const int theMeshIndex, std::string& theMeshName);
   
+  SMESH_ComputeErrorPtr GMFToMesh(const char* theFileName);
+
   SMESH_Hypothesis::Hypothesis_Status
   AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
     throw(SALOME_Exception);
@@ -240,6 +243,8 @@ public:
                  const SMESHDS_Mesh* meshPart = 0) throw(SALOME_Exception);
   void ExportCGNS(const char *        file,
                   const SMESHDS_Mesh* mesh);
+  void ExportGMF(const char *        file,
+                 const SMESHDS_Mesh* mesh);
   void ExportSAUV(const char *file, 
                   const char* theMeshName = NULL, 
                   bool theAutoGroups = true) throw(SALOME_Exception);
@@ -287,7 +292,9 @@ public:
                          int&                      theId,
                          const TopoDS_Shape&       theShape=TopoDS_Shape(),
                          const SMESH_PredicatePtr& thePredicate=SMESH_PredicatePtr());
-  
+
+  SMESH_Group* AddGroup (SMESHDS_GroupBase* groupDS) throw(SALOME_Exception);
+
   typedef boost::shared_ptr< SMDS_Iterator<SMESH_Group*> > GroupIteratorPtr;
   GroupIteratorPtr GetGroups() const;
   
@@ -317,15 +324,13 @@ public:
   void SetMeshOrder(const TListOfListOfInt& theOrder );
   const TListOfListOfInt& GetMeshOrder() const;
 
-  /*!
-   * \brief sort submeshes according to stored mesh order
-   * \param theListToSort in out list to be sorted
-   * \return FALSE if nothing sorted
-   */
+  // sort submeshes according to stored mesh order
   bool SortByMeshOrder(std::list<SMESH_subMesh*>& theListToSort) const;
 
-  //
-  
+  // return true if given order of sub-meshes is OK
+  bool IsOrderOK( const SMESH_subMesh* smBefore,
+                  const SMESH_subMesh* smAfter ) const;
+
   ostream& Dump(ostream & save);
   
 private:
index 324b6b81dabf7a55c2d5b9085717e9d949de8ae6..9a821ab80c4e221cc4b32ccaad50fca18265b09d 100644 (file)
@@ -496,10 +496,10 @@ static void ShiftNodesQuadTria(const SMDS_MeshNode* aNodes[])
 
 //=======================================================================
 //function : edgeConnectivity
-//purpose  : auxilary 
+//purpose  : auxilary
 //           return number of the edges connected with the theNode.
 //           if theEdges has connections with the other type of the
-//           elements, return -1 
+//           elements, return -1
 //=======================================================================
 static int nbEdgeConnectivity(const SMDS_MeshNode* theNode)
 {
@@ -1741,7 +1741,7 @@ void SMESH_MeshEditor::SplitVolumesIntoTetra (const TIDSortedElemSet & theElems,
 
   SMESHDS_SubMesh* subMesh = 0;//GetMeshDS()->MeshElements(1);
   SMESHDS_SubMesh* fSubMesh = 0;//subMesh;
-  
+
   SMESH_SequenceOfElemPtr newNodes, newElems;
 
   // map face of volume to it's baricenrtic node
@@ -2854,7 +2854,7 @@ void SMESH_MeshEditor::GetLinkedNodes( const SMDS_MeshNode* theNode,
     const SMDS_MeshElement* elem = elemIt->next();
     if(elem->GetType() == SMDSAbs_0DElement)
       continue;
-    
+
     SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
     if ( elem->GetType() == SMDSAbs_Volume )
     {
@@ -3581,9 +3581,9 @@ void SMESH_MeshEditor::sweepElement(const SMDS_MeshElement*               elem,
   //MESSAGE("sweepElement " << nbSteps);
   SMESHDS_Mesh* aMesh = GetMeshDS();
 
-  const int           nbNodes = elem->NbNodes();          
+  const int           nbNodes = elem->NbNodes();
   const int         nbCorners = elem->NbCornerNodes();
-  SMDSAbs_EntityType baseType = elem->GetEntityType(); /* it can change in case of 
+  SMDSAbs_EntityType baseType = elem->GetEntityType(); /* it can change in case of
                                                           polyhedron creation !!! */
   // Loop on elem nodes:
   // find new nodes and detect same nodes indices
@@ -3861,7 +3861,7 @@ void SMESH_MeshEditor::sweepElement(const SMDS_MeshElement*               elem,
                                        midlNod[0], midlNod[1], midlNod[2], midlNod[3]);
         }
         else if(nbSame==1) {
-          // ---> pyramid + pentahedron - can not be created since it is needed 
+          // ---> pyramid + pentahedron - can not be created since it is needed
           // additional middle node at the center of face
           INFOS( " Sweep for face " << elem->GetID() << " can not be created" );
           return;
@@ -4031,6 +4031,8 @@ void SMESH_MeshEditor::makeWalls (TNodeOfNodeListMap &     mapNewNodes,
   {
     const SMDS_MeshNode* node =
       static_cast<const SMDS_MeshNode*>( nList->first );
+    if ( newElemsMap.count( node ))
+      continue; // node was extruded into edge
     SMDS_ElemIteratorPtr eIt = node->GetInverseElementIterator();
     int nbInitElems = 0;
     const SMDS_MeshElement* el = 0;
@@ -4822,7 +4824,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
     list< list<SMESH_MeshEditor_PathPoint> > LLPPs;
     int startNid = theN1->GetID();
     TColStd_MapOfInteger UsedNums;
-    
+
     int NbEdges = Edges.Length();
     int i = 1;
     for(; i<=NbEdges; i++) {
@@ -4973,7 +4975,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
     if( !theTrack->GetMeshDS()->Contains(theN1) ) {
       return EXTR_BAD_STARTING_NODE;
     }
-    
+
     conn = nbEdgeConnectivity(theN1);
     if(conn > 2)
       return EXTR_PATH_NOT_EDGE;
@@ -4988,14 +4990,14 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
       if(currentNode == prevNode)
         currentNode = static_cast<const SMDS_MeshNode*>(nIt->next());
       aNodesList.push_back(currentNode);
-    } else { 
+    } else {
       nIt = currentElem->nodesIterator();
       while( nIt->more() ) {
         currentNode = static_cast<const SMDS_MeshNode*>(nIt->next());
         if(currentNode == prevNode)
           currentNode = static_cast<const SMDS_MeshNode*>(nIt->next());
         aNodesList.push_back(currentNode);
-        
+
         //case of the closed mesh
         if(currentNode == theN1) {
           nbEdges++;
@@ -5004,7 +5006,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
 
         conn = nbEdgeConnectivity(currentNode);
         if(conn > 2) {
-          return EXTR_PATH_NOT_EDGE;    
+          return EXTR_PATH_NOT_EDGE;
         }else if( conn == 1 && nbEdges > 0 ) {
           //End of the path
           nbEdges++;
@@ -5020,8 +5022,8 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
           nbEdges++;
         }
       }
-    } 
-    
+    }
+
     if(nbEdges != totalNbEdges)
       return EXTR_PATH_NOT_EDGE;
 
@@ -5033,7 +5035,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
       x1 = aNodesList[i-1]->X();x2 = aNodesList[i]->X();
       y1 = aNodesList[i-1]->Y();y2 = aNodesList[i]->Y();
       z1 = aNodesList[i-1]->Z();z2 = aNodesList[i]->Z();
-      TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp_Pnt(x1,y1,z1),gp_Pnt(x2,y2,z2));  
+      TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp_Pnt(x1,y1,z1),gp_Pnt(x2,y2,z2));
       list<SMESH_MeshEditor_PathPoint> LPP;
       aPrms.clear();
       MakeEdgePathPoints(aPrms, e, (aNodesList[i-1]->GetID()==startNid), LPP);
@@ -5072,7 +5074,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet &   theElements,
       fullList.pop_back();
     }
     fullList.push_back(PP1);
-    
+
   } // Sub-shape for the Pattern must be an Edge or Wire
   else if( aS.ShapeType() == TopAbs_EDGE ) {
     aTrackEdge = TopoDS::Edge( aS );
@@ -5707,7 +5709,7 @@ SMESH_MeshEditor::Transform (TIDSortedElemSet & theElems,
 
     SMDSAbs_GeometryType geomType = elem->GetGeomType();
     int                  nbNodes  = elem->NbNodes();
-    if ( geomType == SMDSGeom_POINT ) continue; // node
+    if ( geomType == SMDSGeom_NONE ) continue; // node
 
     switch ( geomType ) {
 
@@ -5884,26 +5886,32 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
   // Sort existing groups by types and collect their names
 
   // to store an old group and a generated new one
-  typedef pair< SMESHDS_GroupBase*, SMDS_MeshGroup* > TOldNewGroup;
+  typedef pair< SMESHDS_GroupBase*, SMESHDS_Group* > TOldNewGroup;
   vector< list< TOldNewGroup > > groupsByType( SMDSAbs_NbElementTypes );
+  vector< TOldNewGroup* > orderedOldNewGroups; // in order of old groups
   // group names
   set< string > groupNames;
-  //
-  SMDS_MeshGroup* nullNewGroup = (SMDS_MeshGroup*) 0;
+  
   SMESH_Mesh::GroupIteratorPtr groupIt = GetMesh()->GetGroups();
-  while ( groupIt->more() ) {
+  if ( !groupIt->more() ) return newGroupIDs;
+
+  int newGroupID = mesh->GetGroupIds().back()+1;
+  while ( groupIt->more() )
+  {
     SMESH_Group * group = groupIt->next();
     if ( !group ) continue;
     SMESHDS_GroupBase* groupDS = group->GetGroupDS();
     if ( !groupDS || groupDS->IsEmpty() ) continue;
     groupNames.insert( group->GetName() );
     groupDS->SetStoreName( group->GetName() );
-    groupsByType[ groupDS->GetType() ].push_back( make_pair( groupDS, nullNewGroup ));
+    SMESHDS_Group* newGroup = new SMESHDS_Group( newGroupID++, mesh->GetMeshDS(),
+                                                 groupDS->GetType() );
+    groupsByType[ groupDS->GetType() ].push_back( make_pair( groupDS, newGroup ));
+    orderedOldNewGroups.push_back( & groupsByType[ groupDS->GetType() ].back() );
   }
 
-  // Groups creation
+  // Loop on nodes and elements to add them in new groups
 
-  // loop on nodes and elements
   for ( int isNodes = 0; isNodes < 2; ++isNodes )
   {
     const SMESH_SequenceOfElemPtr& gens  = isNodes ? nodeGens : elemGens;
@@ -5920,7 +5928,7 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
         continue;
       }
       list< TOldNewGroup > & groupsOldNew = groupsByType[ sourceElem->GetType() ];
-      if ( groupsOldNew.empty() ) {
+      if ( groupsOldNew.empty() ) { // no groups of this type at all
         while ( iElem < gens.Length() && gens( iElem+1 ) == sourceElem )
           ++iElem; // skip all elements made by sourceElem
         continue;
@@ -5934,58 +5942,56 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
         if ( const SMDS_MeshElement* resElem = elems( ++iElem ))
           if ( resElem != sourceElem )
             resultElems.push_back( resElem );
-      // do not generate element groups from node ones
-//      if ( sourceElem->GetType() == SMDSAbs_Node &&
-//           elems( iElem )->GetType() != SMDSAbs_Node )
-//        continue;
 
       // add resultElems to groups made by ones the sourceElem belongs to
       list< TOldNewGroup >::iterator gOldNew, gLast = groupsOldNew.end();
       for ( gOldNew = groupsOldNew.begin(); gOldNew != gLast; ++gOldNew )
       {
         SMESHDS_GroupBase* oldGroup = gOldNew->first;
-        if ( oldGroup->Contains( sourceElem )) // sourceElem in oldGroup
+        if ( oldGroup->Contains( sourceElem )) // sourceElem is in oldGroup
         {
-          SMDS_MeshGroup* & newGroup = gOldNew->second;
-          if ( !newGroup )// create a new group
-          {
-            // make a name
-            string name = oldGroup->GetStoreName();
-            if ( !targetMesh ) {
-              name += "_";
-              name += postfix;
-              int nb = 0;
-              while ( !groupNames.insert( name ).second ) // name exists
-              {
-                if ( nb == 0 ) {
-                  name += "_1";
-                }
-                else {
-                  TCollection_AsciiString nbStr(nb+1);
-                  name.resize( name.rfind('_')+1 );
-                  name += nbStr.ToCString();
-                }
-                ++nb;
-              }
-            }
-            // make a group
-            int id;
-            SMESH_Group* group = mesh->AddGroup( resultElems.back()->GetType(),
-                                                 name.c_str(), id );
-            SMESHDS_Group* groupDS = static_cast<SMESHDS_Group*>(group->GetGroupDS());
-            newGroup = & groupDS->SMDSGroup();
-            newGroupIDs->push_back( id );
-          }
-
           // fill in a new group
+          SMDS_MeshGroup & newGroup = gOldNew->second->SMDSGroup();
           list< const SMDS_MeshElement* >::iterator resLast = resultElems.end(), resElemIt;
           for ( resElemIt = resultElems.begin(); resElemIt != resLast; ++resElemIt )
-            newGroup->Add( *resElemIt );
+            newGroup.Add( *resElemIt );
         }
       }
     } // loop on created elements
   }// loop on nodes and elements
 
+  // Create new SMESH_Groups from SMESHDS_Groups and remove empty SMESHDS_Groups
+
+  for ( size_t i = 0; i < orderedOldNewGroups.size(); ++i )
+  {
+    SMESHDS_GroupBase* oldGroupDS = orderedOldNewGroups[i]->first;
+    SMESHDS_Group*     newGroupDS = orderedOldNewGroups[i]->second;
+    if ( newGroupDS->IsEmpty() )
+    {
+      mesh->GetMeshDS()->RemoveGroup( newGroupDS );
+    }
+    else
+    {
+      // make a name
+      string name = oldGroupDS->GetStoreName();
+      if ( !targetMesh ) {
+        name += "_";
+        name += postfix;
+        int nb = 1;
+        while ( !groupNames.insert( name ).second ) // name exists
+          name = SMESH_Comment( oldGroupDS->GetStoreName() ) << "_" << postfix << "_" << nb++;
+      }
+      newGroupDS->SetStoreName( name.c_str() );
+
+      // make a SMESH_Groups
+      mesh->AddGroup( newGroupDS );
+      newGroupIDs->push_back( newGroupDS->GetID() );
+
+      // set group type
+      newGroupDS->SetType( newGroupDS->GetElements()->next()->GetType() );
+    }
+  }
+
   return newGroupIDs;
 }
 
@@ -6159,7 +6165,7 @@ private:
  */
 //=======================================================================
 
-SMESH_NodeSearcher* SMESH_MeshEditor::GetNodeSearcher() 
+SMESH_NodeSearcher* SMESH_MeshEditor::GetNodeSearcher()
 {
   return new SMESH_NodeSearcherImpl( GetMeshDS() );
 }
@@ -6524,12 +6530,12 @@ bool SMESH_ElementSearcherImpl::getIntersParamOnLine(const gp_Lin&           lin
 
   GeomAPI_ExtremaCurveCurve anExtCC;
   Handle(Geom_Curve) lineCurve = new Geom_Line( line );
-  
+
   int nbNodes = face->IsQuadratic() ? face->NbNodes()/2 : face->NbNodes();
   for ( int i = 0; i < nbNodes && nbInts < 2; ++i )
   {
     GC_MakeSegment edge( SMESH_TNodeXYZ( face->GetNode( i )),
-                         SMESH_TNodeXYZ( face->GetNode( (i+1)%nbNodes) )); 
+                         SMESH_TNodeXYZ( face->GetNode( (i+1)%nbNodes) ));
     anExtCC.Init( lineCurve, edge);
     if ( anExtCC.NbExtrema() > 0 && anExtCC.LowerDistance() <= tol)
     {
@@ -6578,7 +6584,7 @@ void SMESH_ElementSearcherImpl::findOuterBoundary(const SMDS_MeshElement* outerF
     while (( f = SMESH_MeshEditor::FindFaceInSet(link.node1(), link.node2(), emptySet, faces )))
       faces.insert( f );
 
-    // select another outer face among the found 
+    // select another outer face among the found
     const SMDS_MeshElement* outerFace2 = 0;
     if ( faces.size() == 2 )
     {
@@ -6638,7 +6644,7 @@ void SMESH_ElementSearcherImpl::findOuterBoundary(const SMDS_MeshElement* outerF
     // There are internal boundaries touching the outher one,
     // find all faces of internal boundaries in order to find
     // faces of boundaries of holes, if any.
-    
+
   }
   else
   {
@@ -6857,7 +6863,7 @@ TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
 
     int nbInter = u2inters.size();
     if ( nbInter == 0 )
-      return TopAbs_OUT; 
+      return TopAbs_OUT;
 
     double f = u2inters.begin()->first, l = u2inters.rbegin()->first;
     if ( nbInter == 1 ) // not closed mesh
@@ -6991,7 +6997,7 @@ TopAbs_State SMESH_ElementSearcherImpl::GetPointState(const gp_Pnt& point)
           return TopAbs_ON;
 
         if ( nbIntBeforePoint == 0  || nbIntAfterPoint == 0)
-          return TopAbs_OUT; 
+          return TopAbs_OUT;
 
         if ( nbIntBeforePoint + nbIntAfterPoint == 1 ) // not closed mesh
           return fabs( f ) < tolerance ? TopAbs_ON : TopAbs_UNKNOWN;
@@ -9629,7 +9635,7 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d)
   if ( !theForce3d )
   { // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
     aHelper.SetSubShape(0); // apply FixQuadraticElements() to the whole mesh
-    aHelper.FixQuadraticElements();
+    aHelper.FixQuadraticElements(myError);
   }
 }
 
@@ -9637,7 +9643,7 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d)
 /*!
  * \brief Makes given elements quadratic
  *  \param theForce3d - if true, the medium nodes will be placed in the middle of link
- *  \param theElements - elements to make quadratic 
+ *  \param theElements - elements to make quadratic
  */
 //================================================================================
 
@@ -9648,7 +9654,7 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool        theForce3d,
 
   // we believe that all theElements are of the same type
   const SMDSAbs_ElementType elemType = (*theElements.begin())->GetType();
-  
+
   // get all nodes shared by theElements
   TIDSortedNodeSet allNodes;
   TIDSortedElemSet::iterator eIt = theElements.begin();
@@ -9769,7 +9775,7 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool        theForce3d,
   if ( !theForce3d  && !getenv("NO_FixQuadraticElements"))
   { // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
     helper.SetSubShape(0); // apply FixQuadraticElements() to the whole mesh
-    helper.FixQuadraticElements();
+    helper.FixQuadraticElements( myError );
   }
 }
 
@@ -10633,7 +10639,7 @@ SMESH_MeshEditor::FindMatchingNodes(set<const SMDS_MeshElement*>& theSide1,
   \param theElems - the list of elements (edges or faces) to be replicated
   The nodes for duplication could be found from these elements
   \param theNodesNot - list of nodes to NOT replicate
-  \param theAffectedElems - the list of elements (cells and edges) to which the 
+  \param theAffectedElems - the list of elements (cells and edges) to which the
   replicated nodes should be associated to.
   \return TRUE if operation has been completed successfully, FALSE otherwise
 */
@@ -10696,8 +10702,8 @@ bool SMESH_MeshEditor::doubleNodes( SMESHDS_Mesh*     theMeshDS,
     std::vector<const SMDS_MeshNode*> newNodes( anElem->NbNodes() );
     SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
     int ind = 0;
-    while ( anIter->more() ) 
-    { 
+    while ( anIter->more() )
+    {
 
       SMDS_MeshNode* aCurrNode = (SMDS_MeshNode*)anIter->next();
       SMDS_MeshNode* aNewNode = aCurrNode;
@@ -10732,14 +10738,14 @@ bool SMESH_MeshEditor::doubleNodes( SMESHDS_Mesh*     theMeshDS,
 /*!
   \brief Creates a hole in a mesh by doubling the nodes of some particular elements
   \param theNodes - identifiers of nodes to be doubled
-  \param theModifiedElems - identifiers of elements to be updated by the new (doubled) 
-         nodes. If list of element identifiers is empty then nodes are doubled but 
+  \param theModifiedElems - identifiers of elements to be updated by the new (doubled)
+         nodes. If list of element identifiers is empty then nodes are doubled but
          they not assigned to elements
   \return TRUE if operation has been completed successfully, FALSE otherwise
 */
 //================================================================================
 
-bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes, 
+bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes,
                                     const std::list< int >& theListOfModifiedElems )
 {
   MESSAGE("DoubleNodes");
@@ -10780,7 +10786,7 @@ bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes,
   std::map< SMDS_MeshElement*, vector<const SMDS_MeshNode*> > anElemToNodes;
 
   std::list< int >::const_iterator anElemIter;
-  for ( anElemIter = theListOfModifiedElems.begin(); 
+  for ( anElemIter = theListOfModifiedElems.begin();
         anElemIter != theListOfModifiedElems.end(); ++anElemIter )
   {
     int aCurr = *anElemIter;
@@ -10792,8 +10798,8 @@ bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes,
 
     SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
     int ind = 0;
-    while ( anIter->more() ) 
-    { 
+    while ( anIter->more() )
+    {
       SMDS_MeshNode* aCurrNode = (SMDS_MeshNode*)anIter->next();
       if ( aCurr && anOldNodeToNewNode.find( aCurrNode ) != anOldNodeToNewNode.end() )
       {
@@ -10806,7 +10812,7 @@ bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes,
     anElemToNodes[ anElem ] = aNodeArr;
   }
 
-  // Change nodes of elements  
+  // Change nodes of elements
 
   std::map< SMDS_MeshElement*, vector<const SMDS_MeshNode*> >::iterator
     anElemToNodesIter = anElemToNodes.begin();
@@ -10888,6 +10894,70 @@ namespace {
   };
 }
 
+//================================================================================
+/*!
+  \brief Identify the elements that will be affected by node duplication (actual duplication is not performed.
+  This method is the first step of DoubleNodeElemGroupsInRegion.
+  \param theElems - list of groups of elements (edges or faces) to be replicated
+  \param theNodesNot - list of groups of nodes not to replicated
+  \param theShape - shape to detect affected elements (element which geometric center
+         located on or inside shape).
+         The replicated nodes should be associated to affected elements.
+  \return groups of affected elements
+  \sa DoubleNodeElemGroupsInRegion()
+ */
+//================================================================================
+
+bool SMESH_MeshEditor::AffectedElemGroupsInRegion( const TIDSortedElemSet& theElems,
+                                                   const TIDSortedElemSet& theNodesNot,
+                                                   const TopoDS_Shape&     theShape,
+                                                   TIDSortedElemSet&       theAffectedElems)
+{
+  if ( theShape.IsNull() )
+    return false;
+
+  const double aTol = Precision::Confusion();
+  auto_ptr< BRepClass3d_SolidClassifier> bsc3d;
+  auto_ptr<_FaceClassifier>              aFaceClassifier;
+  if ( theShape.ShapeType() == TopAbs_SOLID )
+  {
+    bsc3d.reset( new BRepClass3d_SolidClassifier(theShape));;
+    bsc3d->PerformInfinitePoint(aTol);
+  }
+  else if (theShape.ShapeType() == TopAbs_FACE )
+  {
+    aFaceClassifier.reset( new _FaceClassifier(TopoDS::Face(theShape)));
+  }
+
+  // iterates on indicated elements and get elements by back references from their nodes
+  TIDSortedElemSet::const_iterator elemItr = theElems.begin();
+  for ( ;  elemItr != theElems.end(); ++elemItr )
+  {
+    SMDS_MeshElement* anElem = (SMDS_MeshElement*)*elemItr;
+    if (!anElem)
+      continue;
+
+    SMDS_ElemIteratorPtr nodeItr = anElem->nodesIterator();
+    while ( nodeItr->more() )
+    {
+      const SMDS_MeshNode* aNode = cast2Node(nodeItr->next());
+      if ( !aNode || theNodesNot.find(aNode) != theNodesNot.end() )
+        continue;
+      SMDS_ElemIteratorPtr backElemItr = aNode->GetInverseElementIterator();
+      while ( backElemItr->more() )
+      {
+        const SMDS_MeshElement* curElem = backElemItr->next();
+        if ( curElem && theElems.find(curElem) == theElems.end() &&
+             ( bsc3d.get() ?
+               isInside( curElem, *bsc3d, aTol ) :
+               isInside( curElem, *aFaceClassifier, aTol )))
+          theAffectedElems.insert( curElem );
+      }
+    }
+  }
+  return true;
+}
+
 //================================================================================
 /*!
   \brief Creates a hole in a mesh by doubling the nodes of some particular elements
@@ -11018,7 +11088,7 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
       // --- build a map (face to duplicate --> volume to modify)
       //     with all the faces shared by 2 domains (group of elements)
       //     and corresponding volume of this domain, for each shared face.
-      //     a volume has a face shared by 2 domains if it has a neighbor which is not in is domain.
+      //     a volume has a face shared by 2 domains if it has a neighbor which is not in his domain.
 
       //MESSAGE("Domain " << idom);
       const TIDSortedElemSet& domain = theElems[idom];
@@ -11081,8 +11151,6 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
             {
               int oldId = *itn;
               //MESSAGE("     node " << oldId);
-              std::set<int> cells;
-              cells.clear();
               vtkCellLinks::Link l = grid->GetCellLinks()->GetLink(oldId);
               for (int i=0; i<l.ncells; i++)
                 {
@@ -11099,8 +11167,8 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
                                 //no cells created after BuildDownWardConnectivity
                     }
                   DownIdType aCell(downId, vtkType);
-                  if (celldom.count(vtkId))
-                    continue;
+                  if (!cellDomains.count(aCell))
+                    cellDomains[aCell] = emptyMap; // create an empty entry for cell
                   cellDomains[aCell][idomain] = vtkId;
                   celldom[vtkId] = idomain;
                   //MESSAGE("       cell " << vtkId << " domain " << idomain);
@@ -11134,16 +11202,18 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
           std::set<int> oldNodes;
           oldNodes.clear();
           grid->GetNodeIds(oldNodes, face.cellId, face.cellType);
-          bool isMultipleDetected = false;
           std::set<int>::iterator itn = oldNodes.begin();
           for (; itn != oldNodes.end(); ++itn)
             {
               int oldId = *itn;
-              //MESSAGE("     node " << oldId);
+              //MESSAGE("-+-+-a node " << oldId);
               if (!nodeDomains.count(oldId))
                 nodeDomains[oldId] = emptyMap; // create an empty entry for node
               if (nodeDomains[oldId].empty())
-                nodeDomains[oldId][idomain] = oldId; // keep the old node in the first domain
+                {
+                  nodeDomains[oldId][idomain] = oldId; // keep the old node in the first domain
+                  //MESSAGE("-+-+-b     oldNode " << oldId << " domain " << idomain);
+                }
               std::map<int, int>::iterator itdom = domvol.begin();
               for (; itdom != domvol.end(); ++itdom)
                 {
@@ -11155,7 +11225,6 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
                         {
                           vector<int> orderedDoms;
                           //MESSAGE("multiple node " << oldId);
-                          isMultipleDetected =true;
                           if (mutipleNodes.count(oldId))
                             orderedDoms = mutipleNodes[oldId];
                           else
@@ -11175,16 +11244,35 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
                       SMDS_MeshNode *newNode = meshDS->AddNode(coords[0], coords[1], coords[2]);
                       int newId = newNode->getVtkId();
                       nodeDomains[oldId][idom] = newId; // cloned node for other domains
-                      //MESSAGE("   newNode " << newId << " oldNode " << oldId << " size=" <<nodeDomains[oldId].size());
-                    }
-                  if (nodeDomains[oldId].size() >= 3)
-                    {
-                      //MESSAGE("confirm multiple node " << oldId);
-                      isMultipleDetected =true;
+                      //MESSAGE("-+-+-c     oldNode " << oldId << " domain " << idomain << " newNode " << newId << " domain " << idom << " size=" <<nodeDomains[oldId].size());
                     }
                 }
             }
-          if (isMultipleDetected) // check if an edge of the face is shared between 3 or more domains
+        }
+    }
+
+  for (int idomain = 0; idomain < theElems.size(); idomain++)
+    {
+      itface = faceDomains.begin();
+      for (; itface != faceDomains.end(); ++itface)
+        {
+          std::map<int, int> domvol = itface->second;
+          if (!domvol.count(idomain))
+            continue;
+          DownIdType face = itface->first;
+          //MESSAGE(" --- face " << face.cellId);
+          std::set<int> oldNodes;
+          oldNodes.clear();
+          grid->GetNodeIds(oldNodes, face.cellId, face.cellType);
+          int nbMultipleNodes = 0;
+          std::set<int>::iterator itn = oldNodes.begin();
+          for (; itn != oldNodes.end(); ++itn)
+            {
+              int oldId = *itn;
+              if (mutipleNodes.count(oldId))
+                nbMultipleNodes++;
+            }
+          if (nbMultipleNodes > 1) // check if an edge of the face is shared between 3 or more domains
             {
               //MESSAGE("multiple Nodes detected on a shared face");
               int downId = itface->first.cellId;
@@ -11198,7 +11286,7 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
                     if (mutipleNodes.count(nodes[i]))
                       if (!mutipleNodesToFace.count(nodes[i]))
                         mutipleNodesToFace[nodes[i]] = mutipleNodes[nodes[i]];
-               }
+                }
               else // shared face (between two volumes)
                 {
                   int nbEdges = grid->getDownArray(cellType)->getNumberOfDownCells(downId);
@@ -11212,9 +11300,12 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
                         {
                           vector<int> vn0 = mutipleNodes[nodes[0]];
                           vector<int> vn1 = mutipleNodes[nodes[nbNodes - 1]];
-                          sort( vn0.begin(), vn0.end() );
-                          sort( vn1.begin(), vn1.end() );
-                          if (vn0 == vn1)
+                          vector<int> doms;
+                          for (int i0 = 0; i0 < vn0.size(); i0++)
+                            for (int i1 = 0; i1 < vn1.size(); i1++)
+                              if (vn0[i0] == vn1[i1])
+                                doms.push_back(vn0[i0]);
+                          if (doms.size() >2)
                             {
                               //MESSAGE(" detect edgesMultiDomains " << nodes[0] << " " << nodes[nbNodes - 1]);
                               double *coords = grid->GetPoint(nodes[0]);
@@ -11226,9 +11317,9 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
                               map<int, SMDS_VtkVolume*> domvol; // domain --> a volume with the edge
                               map<int, double> angleDom; // oriented angles between planes defined by edge and volume centers
                               int nbvol = grid->GetParentVolumes(vtkVolIds, downEdgeIds[ie], edgeType[ie]);
-                              for (int id=0; id < vn0.size(); id++)
+                              for (int id=0; id < doms.size(); id++)
                                 {
-                                  int idom = vn0[id];
+                                  int idom = doms[id];
                                   for (int ivol=0; ivol<nbvol; ivol++)
                                     {
                                       int smdsId = meshDS->fromVtkToSmds(vtkVolIds[ivol]);
@@ -11291,6 +11382,14 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
 
   if (createJointElems)
     {
+      int idg;
+      string joints2DName = "joints2D";
+      mapOfJunctionGroups[joints2DName] = this->myMesh->AddGroup(SMDSAbs_Face, joints2DName.c_str(), idg);
+      SMESHDS_Group *joints2DGrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[joints2DName]->GetGroupDS());
+      string joints3DName = "joints3D";
+      mapOfJunctionGroups[joints3DName] = this->myMesh->AddGroup(SMDSAbs_Volume, joints3DName.c_str(), idg);
+      SMESHDS_Group *joints3DGrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[joints3DName]->GetGroupDS());
+
       itface = faceDomains.begin();
       for (; itface != faceDomains.end(); ++itface)
         {
@@ -11314,13 +11413,16 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
             grpname << dom1 << "_" << dom2;
           else
             grpname << dom2 << "_" << dom1;
-          int idg;
           string namegrp = grpname.str();
           if (!mapOfJunctionGroups.count(namegrp))
             mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(vol->GetType(), namegrp.c_str(), idg);
           SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[namegrp]->GetGroupDS());
           if (sgrp)
             sgrp->Add(vol->GetID());
+          if (vol->GetType() == SMDSAbs_Volume)
+            joints3DGrp->Add(vol->GetID());
+          else if (vol->GetType() == SMDSAbs_Face)
+            joints2DGrp->Add(vol->GetID());
         }
     }
 
@@ -11374,11 +11476,8 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
                     orderedNodes.push_back( nodeDomains[nodes[ino]][orderDom[idom]] );
               SMDS_MeshVolume* vol = this->GetMeshDS()->AddVolumeFromVtkIds(orderedNodes);
 
-              stringstream grpname;
-              grpname << "mj_";
-              grpname << 0 << "_" << 0;
               int idg;
-              string namegrp = grpname.str();
+              string namegrp = "jointsMultiples";
               if (!mapOfJunctionGroups.count(namegrp))
                 mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(SMDSAbs_Volume, namegrp.c_str(), idg);
               SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[namegrp]->GetGroupDS());
@@ -11387,7 +11486,7 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
             }
           else
             {
-              MESSAGE("Quadratic multiple joints not implemented");
+              INFOS("Quadratic multiple joints not implemented");
               // TODO quadratic nodes
             }
         }
@@ -11645,6 +11744,532 @@ bool SMESH_MeshEditor::CreateFlatElementsOnFacesGroups(const std::vector<TIDSort
   return true;
 }
 
+/*!
+ *  \brief identify all the elements around a geom shape, get the faces delimiting the hole
+ *  Build groups of volume to remove, groups of faces to replace on the skin of the object,
+ *  groups of faces to remove inside the object, (idem edges).
+ *  Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+ */
+void SMESH_MeshEditor::CreateHoleSkin(double radius,
+                                      const TopoDS_Shape& theShape,
+                                      SMESH_NodeSearcher* theNodeSearcher,
+                                      const char* groupName,
+                                      std::vector<double>&   nodesCoords,
+                                      std::vector<std::vector<int> >& listOfListOfNodes)
+{
+  MESSAGE("--------------------------------");
+  MESSAGE("SMESH_MeshEditor::CreateHoleSkin");
+  MESSAGE("--------------------------------");
+
+  // --- zone of volumes to remove is given :
+  //     1 either by a geom shape (one or more vertices) and a radius,
+  //     2 either by a group of nodes (representative of the shape)to use with the radius,
+  //     3 either by a group of nodes where all the elements build on one of this nodes are to remove,
+  //     In the case 2, the group of nodes is an external group of nodes from another mesh,
+  //     In the case 3, the group of nodes is an internal group of the mesh (obtained for instance by a filter),
+  //     defined by it's name.
+
+  SMESHDS_GroupBase* groupDS = 0;
+  SMESH_Mesh::GroupIteratorPtr groupIt = this->myMesh->GetGroups();
+  while ( groupIt->more() )
+    {
+      groupDS = 0;
+      SMESH_Group * group = groupIt->next();
+      if ( !group ) continue;
+      groupDS = group->GetGroupDS();
+      if ( !groupDS || groupDS->IsEmpty() ) continue;
+      std::string grpName = group->GetName();
+      if (grpName == groupName)
+        break;
+    }
+
+  bool isNodeGroup = false;
+  bool isNodeCoords = false;
+  if (groupDS)
+    {
+      if (groupDS->GetType() != SMDSAbs_Node)
+        return;
+      isNodeGroup = true;     // a group of nodes exists and it is in this mesh
+    }
+
+  if (nodesCoords.size() > 0)
+    isNodeCoords = true; // a list o nodes given by their coordinates
+
+  // --- define groups to build
+
+  int idg; // --- group of SMDS volumes
+  string grpvName = groupName;
+  grpvName += "_vol";
+  SMESH_Group *grp = this->myMesh->AddGroup(SMDSAbs_Volume, grpvName.c_str(), idg);
+  if (!grp)
+    {
+      MESSAGE("group not created " << grpvName);
+      return;
+    }
+  SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(grp->GetGroupDS());
+
+  int idgs; // --- group of SMDS faces on the skin
+  string grpsName = groupName;
+  grpsName += "_skin";
+  SMESH_Group *grps = this->myMesh->AddGroup(SMDSAbs_Face, grpsName.c_str(), idgs);
+  if (!grps)
+    {
+      MESSAGE("group not created " << grpsName);
+      return;
+    }
+  SMESHDS_Group *sgrps = dynamic_cast<SMESHDS_Group*>(grps->GetGroupDS());
+
+  int idgi; // --- group of SMDS faces internal (several shapes)
+  string grpiName = groupName;
+  grpiName += "_internalFaces";
+  SMESH_Group *grpi = this->myMesh->AddGroup(SMDSAbs_Face, grpiName.c_str(), idgi);
+  if (!grpi)
+    {
+      MESSAGE("group not created " << grpiName);
+      return;
+    }
+  SMESHDS_Group *sgrpi = dynamic_cast<SMESHDS_Group*>(grpi->GetGroupDS());
+
+  int idgei; // --- group of SMDS faces internal (several shapes)
+  string grpeiName = groupName;
+  grpeiName += "_internalEdges";
+  SMESH_Group *grpei = this->myMesh->AddGroup(SMDSAbs_Edge, grpeiName.c_str(), idgei);
+  if (!grpei)
+    {
+      MESSAGE("group not created " << grpeiName);
+      return;
+    }
+  SMESHDS_Group *sgrpei = dynamic_cast<SMESHDS_Group*>(grpei->GetGroupDS());
+
+  // --- build downward connectivity
+
+  SMESHDS_Mesh *meshDS = this->myMesh->GetMeshDS();
+  meshDS->BuildDownWardConnectivity(true);
+  SMDS_UnstructuredGrid* grid = meshDS->getGrid();
+
+  // --- set of volumes detected inside
+
+  std::set<int> setOfInsideVol;
+  std::set<int> setOfVolToCheck;
+
+  std::vector<gp_Pnt> gpnts;
+  gpnts.clear();
+
+  if (isNodeGroup) // --- a group of nodes is provided : find all the volumes using one or more of this nodes
+    {
+      MESSAGE("group of nodes provided");
+      SMDS_ElemIteratorPtr elemIt = groupDS->GetElements();
+      while ( elemIt->more() )
+        {
+          const SMDS_MeshElement* elem = elemIt->next();
+          if (!elem)
+            continue;
+          const SMDS_MeshNode* node = dynamic_cast<const SMDS_MeshNode*>(elem);
+          if (!node)
+            continue;
+          SMDS_MeshElement* vol = 0;
+          SMDS_ElemIteratorPtr volItr = node->GetInverseElementIterator(SMDSAbs_Volume);
+          while (volItr->more())
+            {
+              vol = (SMDS_MeshElement*)volItr->next();
+              setOfInsideVol.insert(vol->getVtkId());
+              sgrp->Add(vol->GetID());
+            }
+        }
+    }
+  else if (isNodeCoords)
+    {
+      MESSAGE("list of nodes coordinates provided");
+      int i = 0;
+      int k = 0;
+      while (i < nodesCoords.size()-2)
+        {
+          double x = nodesCoords[i++];
+          double y = nodesCoords[i++];
+          double z = nodesCoords[i++];
+          gp_Pnt p = gp_Pnt(x, y ,z);
+          gpnts.push_back(p);
+          MESSAGE("TopoDS_Vertex " << k++ << " " << p.X() << " " << p.Y() << " " << p.Z());
+        }
+    }
+  else // --- no group, no coordinates : use the vertices of the geom shape provided, and radius
+    {
+      MESSAGE("no group of nodes provided, using vertices from geom shape, and radius");
+      TopTools_IndexedMapOfShape vertexMap;
+      TopExp::MapShapes( theShape, TopAbs_VERTEX, vertexMap );
+      gp_Pnt p = gp_Pnt(0,0,0);
+      if (vertexMap.Extent() < 1)
+        return;
+
+      for ( int i = 1; i <= vertexMap.Extent(); ++i )
+        {
+          const TopoDS_Vertex& vertex = TopoDS::Vertex( vertexMap( i ));
+          p = BRep_Tool::Pnt(vertex);
+          gpnts.push_back(p);
+          MESSAGE("TopoDS_Vertex " << i << " " << p.X() << " " << p.Y() << " " << p.Z());
+        }
+    }
+
+  if (gpnts.size() > 0)
+    {
+      int nodeId = 0;
+      const SMDS_MeshNode* startNode = theNodeSearcher->FindClosestTo(gpnts[0]);
+      if (startNode)
+        nodeId = startNode->GetID();
+      MESSAGE("nodeId " << nodeId);
+
+      double radius2 = radius*radius;
+      MESSAGE("radius2 " << radius2);
+
+      // --- volumes on start node
+
+      setOfVolToCheck.clear();
+      SMDS_MeshElement* startVol = 0;
+      SMDS_ElemIteratorPtr volItr = startNode->GetInverseElementIterator(SMDSAbs_Volume);
+      while (volItr->more())
+        {
+          startVol = (SMDS_MeshElement*)volItr->next();
+          setOfVolToCheck.insert(startVol->getVtkId());
+        }
+      if (setOfVolToCheck.empty())
+        {
+          MESSAGE("No volumes found");
+          return;
+        }
+
+      // --- starting with central volumes then their neighbors, check if they are inside
+      //     or outside the domain, until no more new neighbor volume is inside.
+      //     Fill the group of inside volumes
+
+      std::map<int, double> mapOfNodeDistance2;
+      mapOfNodeDistance2.clear();
+      std::set<int> setOfOutsideVol;
+      while (!setOfVolToCheck.empty())
+        {
+          std::set<int>::iterator it = setOfVolToCheck.begin();
+          int vtkId = *it;
+          MESSAGE("volume to check,  vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+          bool volInside = false;
+          vtkIdType npts = 0;
+          vtkIdType* pts = 0;
+          grid->GetCellPoints(vtkId, npts, pts);
+          for (int i=0; i<npts; i++)
+            {
+              double distance2 = 0;
+              if (mapOfNodeDistance2.count(pts[i]))
+                {
+                  distance2 = mapOfNodeDistance2[pts[i]];
+                  MESSAGE("point " << pts[i] << " distance2 " << distance2);
+                }
+              else
+                {
+                  double *coords = grid->GetPoint(pts[i]);
+                  gp_Pnt aPoint = gp_Pnt(coords[0], coords[1], coords[2]);
+                  distance2 = 1.E40;
+                  for (int j=0; j<gpnts.size(); j++)
+                    {
+                      double d2 = aPoint.SquareDistance(gpnts[j]);
+                      if (d2 < distance2)
+                        {
+                          distance2 = d2;
+                          if (distance2 < radius2)
+                            break;
+                        }
+                    }
+                  mapOfNodeDistance2[pts[i]] = distance2;
+                  MESSAGE("  point "  << pts[i]  << " distance2 " << distance2 << " coords " << coords[0] << " " << coords[1] << " " <<  coords[2]);
+                }
+              if (distance2 < radius2)
+                {
+                  volInside = true; // one or more nodes inside the domain
+                  sgrp->Add(meshDS->fromVtkToSmds(vtkId));
+                  break;
+                }
+            }
+          if (volInside)
+            {
+              setOfInsideVol.insert(vtkId);
+              MESSAGE("  volume inside,  vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+              int neighborsVtkIds[NBMAXNEIGHBORS];
+              int downIds[NBMAXNEIGHBORS];
+              unsigned char downTypes[NBMAXNEIGHBORS];
+              int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+              for (int n = 0; n < nbNeighbors; n++)
+                if (!setOfInsideVol.count(neighborsVtkIds[n]) ||setOfOutsideVol.count(neighborsVtkIds[n]))
+                  setOfVolToCheck.insert(neighborsVtkIds[n]);
+            }
+          else
+            {
+              setOfOutsideVol.insert(vtkId);
+              MESSAGE("  volume outside, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+            }
+          setOfVolToCheck.erase(vtkId);
+        }
+    }
+
+  // --- for outside hexahedrons, check if they have more than one neighbor volume inside
+  //     If yes, add the volume to the inside set
+
+  bool addedInside = true;
+  std::set<int> setOfVolToReCheck;
+  while (addedInside)
+    {
+      MESSAGE(" --------------------------- re check");
+      addedInside = false;
+      std::set<int>::iterator itv = setOfInsideVol.begin();
+      for (; itv != setOfInsideVol.end(); ++itv)
+        {
+          int vtkId = *itv;
+          int neighborsVtkIds[NBMAXNEIGHBORS];
+          int downIds[NBMAXNEIGHBORS];
+          unsigned char downTypes[NBMAXNEIGHBORS];
+          int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+          for (int n = 0; n < nbNeighbors; n++)
+            if (!setOfInsideVol.count(neighborsVtkIds[n]))
+              setOfVolToReCheck.insert(neighborsVtkIds[n]);
+        }
+      setOfVolToCheck = setOfVolToReCheck;
+      setOfVolToReCheck.clear();
+      while  (!setOfVolToCheck.empty())
+        {
+          std::set<int>::iterator it = setOfVolToCheck.begin();
+          int vtkId = *it;
+          if (grid->GetCellType(vtkId) == VTK_HEXAHEDRON)
+            {
+              MESSAGE("volume to recheck,  vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+              int countInside = 0;
+              int neighborsVtkIds[NBMAXNEIGHBORS];
+              int downIds[NBMAXNEIGHBORS];
+              unsigned char downTypes[NBMAXNEIGHBORS];
+              int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+              for (int n = 0; n < nbNeighbors; n++)
+                if (setOfInsideVol.count(neighborsVtkIds[n]))
+                  countInside++;
+              MESSAGE("countInside " << countInside);
+              if (countInside > 1)
+                {
+                  MESSAGE("  volume inside,  vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+                  setOfInsideVol.insert(vtkId);
+                  sgrp->Add(meshDS->fromVtkToSmds(vtkId));
+                  addedInside = true;
+                }
+              else
+                setOfVolToReCheck.insert(vtkId);
+            }
+          setOfVolToCheck.erase(vtkId);
+        }
+    }
+
+  // --- map of Downward faces at the boundary, inside the global volume
+  //     map of Downward faces on the skin of the global volume (equivalent to SMDS faces on the skin)
+  //     fill group of SMDS faces inside the volume (when several volume shapes)
+  //     fill group of SMDS faces on the skin of the global volume (if skin)
+
+  std::map<DownIdType, int, DownIdCompare> boundaryFaces; // boundary faces inside the volume --> corresponding cell
+  std::map<DownIdType, int, DownIdCompare> skinFaces;     // faces on the skin of the global volume --> corresponding cell
+  std::set<int>::iterator it = setOfInsideVol.begin();
+  for (; it != setOfInsideVol.end(); ++it)
+    {
+      int vtkId = *it;
+      //MESSAGE("  vtkId " << vtkId  << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+      int neighborsVtkIds[NBMAXNEIGHBORS];
+      int downIds[NBMAXNEIGHBORS];
+      unsigned char downTypes[NBMAXNEIGHBORS];
+      int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId, true);
+      for (int n = 0; n < nbNeighbors; n++)
+        {
+          int neighborDim = SMDS_Downward::getCellDimension(grid->GetCellType(neighborsVtkIds[n]));
+          if (neighborDim == 3)
+            {
+              if (! setOfInsideVol.count(neighborsVtkIds[n])) // neighbor volume is not inside : face is boundary
+                {
+                  DownIdType face(downIds[n], downTypes[n]);
+                  boundaryFaces[face] = vtkId;
+                }
+              // if the face between to volumes is in the mesh, get it (internal face between shapes)
+              int vtkFaceId = grid->getDownArray(downTypes[n])->getVtkCellId(downIds[n]);
+              if (vtkFaceId >= 0)
+                {
+                  sgrpi->Add(meshDS->fromVtkToSmds(vtkFaceId));
+                  // find also the smds edges on this face
+                  int nbEdges = grid->getDownArray(downTypes[n])->getNumberOfDownCells(downIds[n]);
+                  const int* dEdges = grid->getDownArray(downTypes[n])->getDownCells(downIds[n]);
+                  const unsigned char* dTypes = grid->getDownArray(downTypes[n])->getDownTypes(downIds[n]);
+                  for (int i = 0; i < nbEdges; i++)
+                    {
+                      int vtkEdgeId = grid->getDownArray(dTypes[i])->getVtkCellId(dEdges[i]);
+                      if (vtkEdgeId >= 0)
+                        sgrpei->Add(meshDS->fromVtkToSmds(vtkEdgeId));
+                    }
+                }
+            }
+          else if (neighborDim == 2) // skin of the volume
+            {
+              DownIdType face(downIds[n], downTypes[n]);
+              skinFaces[face] = vtkId;
+              int vtkFaceId = grid->getDownArray(downTypes[n])->getVtkCellId(downIds[n]);
+              if (vtkFaceId >= 0)
+                sgrps->Add(meshDS->fromVtkToSmds(vtkFaceId));
+            }
+        }
+    }
+
+  // --- identify the edges constituting the wire of each subshape on the skin
+  //     define polylines with the nodes of edges, equivalent to wires
+  //     project polylines on subshapes, and partition, to get geom faces
+
+  std::map<int, std::set<int> > shapeIdToVtkIdSet; // shapeId --> set of vtkId on skin
+  std::set<int> emptySet;
+  emptySet.clear();
+  std::set<int> shapeIds;
+
+  SMDS_ElemIteratorPtr itelem = sgrps->GetElements();
+  while (itelem->more())
+    {
+      const SMDS_MeshElement *elem = itelem->next();
+      int shapeId = elem->getshapeId();
+      int vtkId = elem->getVtkId();
+      if (!shapeIdToVtkIdSet.count(shapeId))
+        {
+          shapeIdToVtkIdSet[shapeId] = emptySet;
+          shapeIds.insert(shapeId);
+        }
+      shapeIdToVtkIdSet[shapeId].insert(vtkId);
+    }
+
+  std::map<int, std::set<DownIdType, DownIdCompare> > shapeIdToEdges; // shapeId --> set of downward edges
+  std::set<DownIdType, DownIdCompare> emptyEdges;
+  emptyEdges.clear();
+
+  std::map<int, std::set<int> >::iterator itShape =  shapeIdToVtkIdSet.begin();
+  for (; itShape != shapeIdToVtkIdSet.end(); ++itShape)
+    {
+      int shapeId = itShape->first;
+      MESSAGE(" --- Shape ID --- "<< shapeId);
+      shapeIdToEdges[shapeId] = emptyEdges;
+
+      std::vector<int> nodesEdges;
+
+      std::set<int>::iterator its = itShape->second.begin();
+      for (; its != itShape->second.end(); ++its)
+        {
+          int vtkId = *its;
+          MESSAGE("     " << vtkId);
+          int neighborsVtkIds[NBMAXNEIGHBORS];
+          int downIds[NBMAXNEIGHBORS];
+          unsigned char downTypes[NBMAXNEIGHBORS];
+          int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+          for (int n = 0; n < nbNeighbors; n++)
+            {
+              if (neighborsVtkIds[n]<0) // only smds faces are considered as neighbors here
+                continue;
+              int smdsId = meshDS->fromVtkToSmds(neighborsVtkIds[n]);
+              const SMDS_MeshElement* elem = meshDS->FindElement(smdsId);
+              if ( shapeIds.count(elem->getshapeId()) && !sgrps->Contains(elem)) // edge : neighbor in the set of shape, not in the group
+                {
+                  DownIdType edge(downIds[n], downTypes[n]);
+                  if (!shapeIdToEdges[shapeId].count(edge))
+                    {
+                      shapeIdToEdges[shapeId].insert(edge);
+                      int vtkNodeId[3];
+                      int nbNodes = grid->getDownArray(downTypes[n])->getNodes(downIds[n],vtkNodeId);
+                      nodesEdges.push_back(vtkNodeId[0]);
+                      nodesEdges.push_back(vtkNodeId[nbNodes-1]);
+                      MESSAGE("       --- nodes " << vtkNodeId[0]+1 << " " << vtkNodeId[nbNodes-1]+1);
+                    }
+                }
+            }
+        }
+
+      std::list<int> order;
+      order.clear();
+      if (nodesEdges.size() > 0)
+        {
+          order.push_back(nodesEdges[0]); MESSAGE("       --- back " << order.back()+1); // SMDS id = VTK id + 1;
+          nodesEdges[0] = -1;
+          order.push_back(nodesEdges[1]); MESSAGE("       --- back " << order.back()+1);
+          nodesEdges[1] = -1; // do not reuse this edge
+          bool found = true;
+          while (found)
+            {
+              int nodeTofind = order.back(); // try first to push back
+              int i = 0;
+              for (i = 0; i<nodesEdges.size(); i++)
+                if (nodesEdges[i] == nodeTofind)
+                  break;
+              if (i == nodesEdges.size())
+                found = false; // no follower found on back
+              else
+                {
+                  if (i%2) // odd ==> use the previous one
+                    if (nodesEdges[i-1] < 0)
+                      found = false;
+                    else
+                      {
+                        order.push_back(nodesEdges[i-1]); MESSAGE("       --- back " << order.back()+1);
+                        nodesEdges[i-1] = -1;
+                      }
+                  else // even ==> use the next one
+                    if (nodesEdges[i+1] < 0)
+                      found = false;
+                    else
+                      {
+                        order.push_back(nodesEdges[i+1]); MESSAGE("       --- back " << order.back()+1);
+                        nodesEdges[i+1] = -1;
+                      }
+                }
+              if (found)
+                continue;
+              // try to push front
+              found = true;
+              nodeTofind = order.front(); // try to push front
+              for (i = 0; i<nodesEdges.size(); i++)
+                if (nodesEdges[i] == nodeTofind)
+                  break;
+              if (i == nodesEdges.size())
+                {
+                  found = false; // no predecessor found on front
+                  continue;
+                }
+              if (i%2) // odd ==> use the previous one
+                if (nodesEdges[i-1] < 0)
+                  found = false;
+                else
+                  {
+                    order.push_front(nodesEdges[i-1]); MESSAGE("       --- front " << order.front()+1);
+                    nodesEdges[i-1] = -1;
+                  }
+              else // even ==> use the next one
+                if (nodesEdges[i+1] < 0)
+                  found = false;
+                else
+                  {
+                    order.push_front(nodesEdges[i+1]); MESSAGE("       --- front " << order.front()+1);
+                    nodesEdges[i+1] = -1;
+                  }
+            }
+        }
+
+
+      std::vector<int> nodes;
+      nodes.push_back(shapeId);
+      std::list<int>::iterator itl = order.begin();
+      for (; itl != order.end(); itl++)
+        {
+          nodes.push_back((*itl) + 1); // SMDS id = VTK id + 1;
+          MESSAGE("              ordered node " << nodes[nodes.size()-1]);
+        }
+      listOfListOfNodes.push_back(nodes);
+    }
+
+  //     partition geom faces with blocFissure
+  //     mesh blocFissure and geom faces of the skin (external wires given, triangle algo to choose)
+  //     mesh volume around blocFissure (skin triangles and quadrangle given, tetra algo to choose)
+
+  return;
+}
+
+
 //================================================================================
 /*!
  * \brief Generates skin mesh (containing 2D cells) from 3D mesh
@@ -11887,7 +12512,7 @@ int SMESH_MeshEditor::MakeBoundaryMesh(const TIDSortedElemSet& elements,
                                                                    missType,
                                                                    /*noMedium=*/false))
           continue;
-        SMDS_MeshElement* elem = 
+        SMDS_MeshElement* elem =
           tgtEditor.AddElement(nodes, missType, !iQuad && nodes.size()/(iQuad+1)>4);
         ++nbAddedBnd;
 
@@ -11937,7 +12562,7 @@ int SMESH_MeshEditor::MakeBoundaryMesh(const TIDSortedElemSet& elements,
       {
         presentEditor->myLastCreatedElems.Append(presentBndElems[i]);
       }
-      
+
   } // loop on given elements
 
   // ---------------------------------------------
index 4bd4558253c964e18cb991e05e8e98091fc5c443..1874360a79fdda983309e0359d18dea871d32e7e 100644 (file)
@@ -34,6 +34,7 @@
 #include "SMESH_Controls.hxx"
 #include "SMESH_Mesh.hxx"
 #include "SMESH_TypeDefs.hxx"
+#include "SMESH_ComputeError.hxx"
 
 #include <utilities.h>
 
@@ -110,6 +111,14 @@ public:
 
   SMESH_MeshEditor( SMESH_Mesh* theMesh );
 
+  SMESH_Mesh   *                 GetMesh()   { return myMesh; }
+  SMESHDS_Mesh *                 GetMeshDS() { return myMesh->GetMeshDS(); }
+
+  const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
+  const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
+
+  SMESH_ComputeErrorPtr &        GetError() { return myError; }
+
   /*!
    * \brief Add element
    */
@@ -561,14 +570,6 @@ public:
   // Return an index of the shape theElem is on
   // or zero if a shape not found
 
-  SMESH_Mesh * GetMesh() { return myMesh; }
-
-  SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
-
-  const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
-
-  const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
-
   bool DoubleNodes( const std::list< int >& theListOfNodes, 
                     const std::list< int >& theListOfModifiedElems );
   
@@ -576,6 +577,11 @@ public:
                     const TIDSortedElemSet& theNodesNot,
                     const TIDSortedElemSet& theAffectedElems );
 
+  bool AffectedElemGroupsInRegion( const TIDSortedElemSet& theElems,
+                                   const TIDSortedElemSet& theNodesNot,
+                                   const TopoDS_Shape&     theShape,
+                                   TIDSortedElemSet& theAffectedElems);
+
   bool DoubleNodesInRegion( const TIDSortedElemSet& theElems, 
                             const TIDSortedElemSet& theNodesNot,
                             const TopoDS_Shape&     theShape );
@@ -587,6 +593,13 @@ public:
 
   bool CreateFlatElementsOnFacesGroups( const std::vector<TIDSortedElemSet>& theElems );
 
+  void CreateHoleSkin(double radius,
+                      const TopoDS_Shape& theShape,
+                      SMESH_NodeSearcher* theNodeSearcher,
+                      const char* groupName,
+                      std::vector<double>&   nodesCoords,
+                      std::vector<std::vector<int> >& listOfListOfNodes);
+
   /*!
    * \brief Generated skin mesh (containing 2D cells) from 3D mesh
    * The created 2D mesh elements based on nodes of free faces of boundary volumes
@@ -709,18 +722,13 @@ public:
 
 private:
 
-  SMESH_Mesh * myMesh;
+  SMESH_Mesh *            myMesh;
 
-  /*!
-   * Sequence for keeping nodes created during last operation
-   */
-  SMESH_SequenceOfElemPtr myLastCreatedNodes;
-
-  /*!
-   * Sequence for keeping elements created during last operation
-   */
-  SMESH_SequenceOfElemPtr myLastCreatedElems;
+  // Nodes and elements created during last operation
+  SMESH_SequenceOfElemPtr myLastCreatedNodes, myLastCreatedElems;
 
+  // Description of error/warning occured during last operation
+  SMESH_ComputeErrorPtr   myError;
 };
 
 #endif
index efaf7a853362f95f3f2dc082aec184ab173b4e68..ffca47e6aa48d5dc3a864f35b634f2bbde2707d7 100644 (file)
 //
 #include "SMESH_MesherHelper.hxx"
 
-#include "SMDS_FacePosition.hxx" 
 #include "SMDS_EdgePosition.hxx"
+#include "SMDS_FaceOfNodes.hxx"
+#include "SMDS_FacePosition.hxx" 
+#include "SMDS_IteratorOnIterators.hxx"
 #include "SMDS_VolumeTool.hxx"
-#include "SMESH_subMesh.hxx"
 #include "SMESH_ProxyMesh.hxx"
+#include "SMESH_subMesh.hxx"
 
+#include <BRepAdaptor_Curve.hxx>
 #include <BRepAdaptor_Surface.hxx>
+#include <BRepClass3d_SolidClassifier.hxx>
 #include <BRepTools.hxx>
 #include <BRepTools_WireExplorer.hxx>
 #include <BRep_Tool.hxx>
@@ -403,7 +407,7 @@ void SMESH_MesherHelper::AddTLinks(const SMDS_MeshVolume* volume)
       {
         int iN1  = iNodes[i++];
         int iN12 = iNodes[i++];
-        int iN2  = iNodes[i++];
+        int iN2  = iNodes[i];
         if ( iN1 > iN2 ) std::swap( iN1, iN2 );
         int linkID = iN1 * vTool.NbNodes() + iN2;
         pair< set<int>::iterator, bool > it_isNew = addedLinks.insert( linkID );
@@ -1675,6 +1679,24 @@ SMESH_MesherHelper::AddPolyhedralVolume (const std::vector<const SMDS_MeshNode*>
   return elem;
 }
 
+namespace
+{
+  //================================================================================
+  /*!
+   * \brief Check if a node belongs to any face of sub-mesh
+   */
+  //================================================================================
+
+  bool isNodeInSubMesh( const SMDS_MeshNode* n, const SMESHDS_SubMesh* sm )
+  {
+    SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator( SMDSAbs_Face );
+    while ( fIt->more() )
+      if ( sm->Contains( fIt->next() ))
+        return true;
+    return false;
+  }
+}
+
 //=======================================================================
 //function : LoadNodeColumns
 //purpose  : Load nodes bound to face into a map of node columns
@@ -1746,13 +1768,36 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap &            theParam2
     SMESH_Algo::GetSortedNodesOnEdge( theMesh, *edge,/*noMedium=*/true, sortedBaseNodes);
     if ( sortedBaseNodes.empty() ) continue;
 
+    map< double, const SMDS_MeshNode*>::iterator u_n = sortedBaseNodes.begin();
+    if ( theProxyMesh ) // from sortedBaseNodes remove nodes not shared by faces of faceSubMesh
+    {
+      const SMDS_MeshNode* n1 = sortedBaseNodes.begin()->second;
+      const SMDS_MeshNode* n2 = sortedBaseNodes.rbegin()->second;
+      bool allNodesAreProxy = ( n1 != theProxyMesh->GetProxyNode( n1 ) &&
+                                n2 != theProxyMesh->GetProxyNode( n2 ));
+      if ( allNodesAreProxy )
+        for ( u_n = sortedBaseNodes.begin(); u_n != sortedBaseNodes.end(); u_n++ )
+          u_n->second = theProxyMesh->GetProxyNode( u_n->second );
+
+      if ( u_n = sortedBaseNodes.begin(), !isNodeInSubMesh( u_n->second, faceSubMesh ))
+      {
+        while ( ++u_n != sortedBaseNodes.end() && !isNodeInSubMesh( u_n->second, faceSubMesh ));
+        sortedBaseNodes.erase( sortedBaseNodes.begin(), u_n );
+      }
+      else if ( u_n = --sortedBaseNodes.end(), !isNodeInSubMesh( u_n->second, faceSubMesh ))
+      {
+        while ( u_n != sortedBaseNodes.begin() && !isNodeInSubMesh( (--u_n)->second, faceSubMesh ));
+        sortedBaseNodes.erase( ++u_n, sortedBaseNodes.end() );
+      }
+      if ( sortedBaseNodes.empty() ) continue;
+    }
+
     double f, l;
     BRep_Tool::Range( *edge, f, l );
     if ( edge->Orientation() == TopAbs_REVERSED ) std::swap( f, l );
     const double coeff = 1. / ( l - f ) * length[iE] / fullLen;
     const double prevPar = theParam2ColumnMap.empty() ? 0 : theParam2ColumnMap.rbegin()->first;
-    map< double, const SMDS_MeshNode*>::iterator u_n = sortedBaseNodes.begin();
-    for ( ; u_n != sortedBaseNodes.end(); u_n++ )
+    for ( u_n = sortedBaseNodes.begin(); u_n != sortedBaseNodes.end(); u_n++ )
     {
       double par = prevPar + coeff * ( u_n->first - f );
       TParam2ColumnMap::iterator u2nn =
@@ -1760,21 +1805,16 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap &            theParam2
       u2nn->second.push_back( u_n->second );
     }
   }
-  TParam2ColumnMap::iterator par_nVec_2, par_nVec_1 = theParam2ColumnMap.begin();
-  if ( theProxyMesh )
-  {
-    for ( ; par_nVec_1 != theParam2ColumnMap.end(); ++par_nVec_1 )
-    {
-      const SMDS_MeshNode* & n = par_nVec_1->second[0];
-      n = theProxyMesh->GetProxyNode( n );
-    }
-  }
+  if ( theParam2ColumnMap.empty() )
+    return false;
+
 
   int nbRows = 1 + faceSubMesh->NbElements() / ( theParam2ColumnMap.size()-1 );
 
   // fill theParam2ColumnMap column by column by passing from nodes on
   // theBaseEdge up via mesh faces on theFace
 
+  TParam2ColumnMap::iterator par_nVec_1, par_nVec_2;
   par_nVec_2 = theParam2ColumnMap.begin();
   par_nVec_1 = par_nVec_2++;
   TIDSortedElemSet emptySet, avoidSet;
@@ -1947,6 +1987,30 @@ TopoDS_Vertex SMESH_MesherHelper::IthVertex( const bool  is2nd,
   return ( vIt.More() ? TopoDS::Vertex(vIt.Value()) : TopoDS_Vertex() );
 }
 
+//================================================================================
+/*!
+ * \brief Return type of shape contained in a group 
+ *  \param group - a shape of type TopAbs_COMPOUND
+ *  \param avoidCompound - not to return TopAbs_COMPOUND
+ */
+//================================================================================
+
+TopAbs_ShapeEnum SMESH_MesherHelper::GetGroupType(const TopoDS_Shape& group,
+                                                  const bool          avoidCompound)
+{
+  if ( !group.IsNull() )
+  {
+    if ( group.ShapeType() != TopAbs_COMPOUND )
+      return group.ShapeType();
+
+    // iterate on a compound
+    TopoDS_Iterator it( group );
+    if ( it.More() )
+      return avoidCompound ? GetGroupType( it.Value() ) : it.Value().ShapeType();
+  }
+  return TopAbs_SHAPE;
+}
+
 //=======================================================================
 //function : IsQuadraticMesh
 //purpose  : Check mesh without geometry for: if all elements on this shape are quadratic,
@@ -1961,6 +2025,8 @@ SMESH_MesherHelper:: MType SMESH_MesherHelper::IsQuadraticMesh()
   int NbFacesAndEdges=0;
   //All faces and edges
   NbAllEdgsAndFaces = myMesh->NbEdges() + myMesh->NbFaces();
+  if ( NbAllEdgsAndFaces == 0 )
+    return SMESH_MesherHelper::LINEAR;
   
   //Quadratic faces and edges
   NbQuadFacesAndEdgs = myMesh->NbEdges(ORDER_QUADRATIC) + myMesh->NbFaces(ORDER_QUADRATIC);
@@ -3021,18 +3087,349 @@ namespace { // Structures used by FixQuadraticElements()
 
     return _OK;
   }
+
+  //================================================================================
+  /*!
+   * \brief Place medium nodes at the link middle for elements whose corner nodes
+   *        are out of geometrical boundary to prevent distorting elements.
+   *        Issue 0020982, note 0013990
+   */
+  //================================================================================
+
+  void force3DOutOfBoundary( SMESH_MesherHelper&    theHelper,
+                             SMESH_ComputeErrorPtr& theError)
+  {
+    SMESHDS_Mesh* meshDS = theHelper.GetMeshDS();
+    TopoDS_Shape  shape = theHelper.GetSubShape().Oriented( TopAbs_FORWARD );
+    if ( shape.IsNull() ) return;
+
+    if ( !theError ) theError = SMESH_ComputeError::New();
+
+    gp_XYZ faceNorm;
+
+    if ( shape.ShapeType() == TopAbs_FACE ) // 2D
+    {
+      if ( theHelper.GetMesh()->NbTriangles( ORDER_QUADRATIC ) < 1 ) return;
+
+      SMESHDS_SubMesh* faceSM = meshDS->MeshElements( shape );
+      if ( !faceSM ) return;
+
+      const TopoDS_Face&      face = TopoDS::Face( shape );
+      Handle(Geom_Surface) surface = BRep_Tool::Surface( face );
+
+      TopExp_Explorer edgeIt( face, TopAbs_EDGE );
+      for ( ; edgeIt.More(); edgeIt.Next() ) // loop on EDGEs of a FACE
+      {
+        // check if the EDGE needs checking
+        const TopoDS_Edge& edge = TopoDS::Edge( edgeIt.Current() );
+        if ( BRep_Tool::Degenerated( edge ) )
+          continue;
+        if ( theHelper.IsRealSeam( edge ) &&
+             edge.Orientation() == TopAbs_REVERSED )
+          continue;
+
+        SMESHDS_SubMesh* edgeSM = meshDS->MeshElements( edge );
+        if ( !edgeSM ) continue;
+
+        double f,l;
+        Handle(Geom2d_Curve) pcurve  = BRep_Tool::CurveOnSurface( edge, face, f, l );
+        BRepAdaptor_Curve    curve3D( edge );
+        switch ( curve3D.GetType() ) {
+        case GeomAbs_Line: continue;
+        case GeomAbs_Circle:
+        case GeomAbs_Ellipse:
+        case GeomAbs_Hyperbola:
+        case GeomAbs_Parabola:
+          try
+          {
+            gp_Vec D1, D2, Du1, Dv1; gp_Pnt p;
+            curve3D.D2( 0.5 * ( f + l ), p, D1, D2 );
+            gp_Pnt2d uv = pcurve->Value( 0.5 * ( f + l ) );
+            surface->D1( uv.X(), uv.Y(), p, Du1, Dv1 );
+            gp_Vec fNorm = Du1 ^ Dv1;
+            if ( fNorm.IsParallel( D2, M_PI * 25./180. ))
+              continue; // face is normal to the curve3D
+
+            gp_Vec curvNorm = fNorm ^ D1;
+            if ( edge.Orientation() == TopAbs_REVERSED ) curvNorm.Reverse();
+            if ( curvNorm * D2 > 0 )
+              continue; // convex edge
+          }
+          catch ( Standard_Failure )
+          {
+            continue;
+          }
+        }
+        // get nodes shared by faces that may be distorted
+        SMDS_NodeIteratorPtr nodeIt;
+        if ( edgeSM->NbNodes() > 0 ) {
+          nodeIt = edgeSM->GetNodes();
+        }
+        else {
+          SMESHDS_SubMesh* vertexSM = meshDS->MeshElements( theHelper.IthVertex( 0, edge ));
+          if ( !vertexSM )
+            vertexSM = meshDS->MeshElements( theHelper.IthVertex( 1, edge ));
+          if ( !vertexSM ) continue;
+          nodeIt = vertexSM->GetNodes();
+        }
+
+        // find suspicious faces
+        TIDSortedElemSet checkedFaces;
+        vector< const SMDS_MeshNode* > nOnEdge( 2 );
+        const SMDS_MeshNode*           nOnFace;
+        while ( nodeIt->more() )
+        {
+          const SMDS_MeshNode* n      = nodeIt->next();
+          SMDS_ElemIteratorPtr faceIt = n->GetInverseElementIterator( SMDSAbs_Face );
+          while ( faceIt->more() )
+          {
+            const SMDS_MeshElement* f = faceIt->next();
+            if ( !faceSM->Contains( f ) ||
+                 f->NbNodes() != 6      || // check quadratic triangles only
+                 !checkedFaces.insert( f ).second )
+              continue;
+
+            // get nodes on EDGE and on FACE of a suspicious face
+            nOnEdge.clear(); nOnFace = 0;
+            SMDS_MeshElement::iterator triNode = f->begin_nodes();
+            for ( int nbN = 0; nbN < 3; ++triNode, ++nbN )
+            {
+              n = *triNode;
+              if ( n->GetPosition()->GetDim() == 2 )
+                nOnFace = n;
+              else
+                nOnEdge.push_back( n );
+            }
+
+            // check if nOnFace is inside the FACE
+            if ( nOnFace && nOnEdge.size() == 2 )
+            {
+              theHelper.AddTLinks( static_cast< const SMDS_MeshFace* > ( f ));
+              if ( !SMESH_Algo::FaceNormal( f, faceNorm, /*normalized=*/false ))
+                continue;
+              gp_XYZ edgeDir  = SMESH_TNodeXYZ( nOnEdge[0] ) - SMESH_TNodeXYZ( nOnEdge[1] );
+              gp_XYZ edgeNorm = faceNorm ^ edgeDir;
+              n = theHelper.GetMediumNode( nOnEdge[0], nOnEdge[1], true );
+              gp_XYZ pN0     = SMESH_TNodeXYZ( nOnEdge[0] );
+              gp_XYZ pMedium = SMESH_TNodeXYZ( n );                   // on-edge node location
+              gp_XYZ pFaceN  = SMESH_TNodeXYZ( nOnFace );             // on-face node location
+              double hMedium = edgeNorm * gp_Vec( pN0, pMedium ).XYZ();
+              double hFace   = edgeNorm * gp_Vec( pN0, pFaceN ).XYZ();
+              if ( Abs( hMedium ) > Abs( hFace * 0.6 ))
+              {
+                // nOnFace is out of FACE, move a medium on-edge node to the middle
+                gp_XYZ pMid3D = 0.5 * ( pN0 + SMESH_TNodeXYZ( nOnEdge[1] ));
+                meshDS->MoveNode( n, pMid3D.X(), pMid3D.Y(), pMid3D.Z() );
+                MSG( "move OUT of face " << n );
+                theError->myBadElements.push_back( f );
+              }
+            }
+          }
+        }
+      }
+      if ( !theError->myBadElements.empty() )
+        theError->myName = EDITERR_NO_MEDIUM_ON_GEOM;
+      return;
+
+    } // 2D ==============================================================================
+
+    if ( shape.ShapeType() == TopAbs_SOLID ) // 3D
+    {
+      if ( theHelper.GetMesh()->NbTetras  ( ORDER_QUADRATIC ) < 1 &&
+           theHelper.GetMesh()->NbPyramids( ORDER_QUADRATIC ) < 1 ) return;
+
+      SMESHDS_SubMesh* solidSM = meshDS->MeshElements( shape );
+      if ( !solidSM ) return;
+
+      // check if the SOLID is bound by concave FACEs
+      vector< TopoDS_Face > concaveFaces;
+      TopExp_Explorer faceIt( shape, TopAbs_FACE );
+      for ( ; faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
+      {
+        const TopoDS_Face&  face = TopoDS::Face( faceIt.Current() );
+        if ( !meshDS->MeshElements( face )) continue;
+
+        BRepAdaptor_Surface surface( face );
+        switch ( surface.GetType() ) {
+        case GeomAbs_Plane: continue;
+        case GeomAbs_Cylinder:
+        case GeomAbs_Cone:
+        case GeomAbs_Sphere:
+          try
+          {
+            double u = 0.5 * ( surface.FirstUParameter() + surface.LastUParameter() );
+            double v = 0.5 * ( surface.FirstVParameter() + surface.LastVParameter() );
+            gp_Vec Du1, Dv1, Du2, Dv2, Duv2; gp_Pnt p;
+            surface.D2( u,v, p, Du1, Dv1, Du2, Dv2, Duv2 );
+            gp_Vec fNorm = Du1 ^ Dv1;
+            if ( face.Orientation() == TopAbs_REVERSED ) fNorm.Reverse();
+            bool concaveU = ( fNorm * Du2 > 1e-100 );
+            bool concaveV = ( fNorm * Dv2 > 1e-100 );
+            if ( concaveU || concaveV )
+              concaveFaces.push_back( face );
+          }
+          catch ( Standard_Failure )
+          {
+            concaveFaces.push_back( face );
+          }
+        }
+      }
+      if ( concaveFaces.empty() )
+        return;
+
+      // fix 2D mesh on the SOLID
+      for ( faceIt.ReInit(); faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
+      {
+        SMESH_MesherHelper faceHelper( *theHelper.GetMesh() );
+        faceHelper.SetSubShape( faceIt.Current() );
+        force3DOutOfBoundary( faceHelper, theError );
+      }
+
+      // get an iterator over faces on concaveFaces
+      vector< SMDS_ElemIteratorPtr > faceIterVec( concaveFaces.size() );
+      for ( size_t i = 0; i < concaveFaces.size(); ++i )
+        faceIterVec[i] = meshDS->MeshElements( concaveFaces[i] )->GetElements();
+      typedef SMDS_IteratorOnIterators
+        < const SMDS_MeshElement*, vector< SMDS_ElemIteratorPtr > > TIterOnIter;
+      SMDS_ElemIteratorPtr faceIter( new TIterOnIter( faceIterVec ));
+
+      // a seacher to check if a volume is close to a concave face
+      std::auto_ptr< SMESH_ElementSearcher > faceSearcher
+        ( SMESH_MeshEditor( theHelper.GetMesh() ).GetElementSearcher( faceIter ));
+
+      // classifier
+      //BRepClass3d_SolidClassifier solidClassifier( shape );
+
+      TIDSortedElemSet checkedVols, movedNodes;
+      for ( faceIt.ReInit(); faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
+      {
+        const TopoDS_Shape& face = faceIt.Current();
+        SMESHDS_SubMesh*  faceSM = meshDS->MeshElements( face );
+        if ( !faceSM ) continue;
+
+        // get nodes shared by volumes (tet and pyra) on the FACE that may be distorted
+        SMDS_NodeIteratorPtr nodeIt;
+        if ( faceSM->NbNodes() > 0 ) {
+          nodeIt = faceSM->GetNodes();
+        }
+        else {
+          TopExp_Explorer vertex( face, TopAbs_VERTEX );
+          SMESHDS_SubMesh* vertexSM = meshDS->MeshElements( vertex.Current() );
+          if ( !vertexSM ) continue;
+          nodeIt = vertexSM->GetNodes();
+        }
+
+        // find suspicious volumes adjacent to the FACE
+        vector< const SMDS_MeshNode* >    nOnFace( 4 );
+        const SMDS_MeshNode*              nInSolid;
+        //vector< const SMDS_MeshElement* > intersectedFaces;
+        while ( nodeIt->more() )
+        {
+          const SMDS_MeshNode* n     = nodeIt->next();
+          SMDS_ElemIteratorPtr volIt = n->GetInverseElementIterator( SMDSAbs_Volume );
+          while ( volIt->more() )
+          {
+            const SMDS_MeshElement* vol = volIt->next();
+            int nbN = vol->NbCornerNodes();
+            if ( ( nbN != 4 && nbN != 5 )  ||
+                 !solidSM->Contains( vol ) ||
+                 !checkedVols.insert( vol ).second )
+              continue;
+
+            // get nodes on FACE and in SOLID of a suspicious volume
+            nOnFace.clear(); nInSolid = 0;
+            SMDS_MeshElement::iterator volNode = vol->begin_nodes();
+            for ( int nb = nbN; nb > 0; ++volNode, --nb )
+            {
+              n = *volNode;
+              if ( n->GetPosition()->GetDim() == 3 )
+                nInSolid = n;
+              else
+                nOnFace.push_back( n );
+            }
+            if ( !nInSolid || nOnFace.size() != nbN - 1 )
+              continue;
+
+            // get size of the vol
+            SMESH_TNodeXYZ pInSolid( nInSolid ), pOnFace0( nOnFace[0] );
+            double volLength = pInSolid.SquareDistance( nOnFace[0] );
+            for ( size_t i = 1; i < nOnFace.size(); ++i )
+            {
+              volLength = Max( volLength, pOnFace0.SquareDistance( nOnFace[i] ));
+            }
+
+            // check if vol is close to concaveFaces
+            const SMDS_MeshElement* closeFace =
+              faceSearcher->FindClosestTo( pInSolid, SMDSAbs_Face );
+            if ( !closeFace ||
+                 pInSolid.SquareDistance( closeFace->GetNode(0) ) > 4 * volLength )
+              continue;
+
+            // check if vol is distorted, i.e. a medium node is much closer
+            // to nInSolid than the link middle
+            bool isDistorted = false;
+            SMDS_FaceOfNodes onFaceTria( nOnFace[0], nOnFace[1], nOnFace[2] );
+            if ( !SMESH_Algo::FaceNormal( &onFaceTria, faceNorm, /*normalized=*/false ))
+              continue;
+            theHelper.AddTLinks( static_cast< const SMDS_MeshVolume* > ( vol ));
+            vector< pair< SMESH_TLink, const SMDS_MeshNode* > > links;
+            for ( size_t i = 0; i < nOnFace.size(); ++i ) // loop on links between nOnFace
+              for ( size_t j = i+1; j < nOnFace.size(); ++j )
+              {
+                SMESH_TLink link( nOnFace[i], nOnFace[j] );
+                TLinkNodeMap::const_iterator linkIt =
+                  theHelper.GetTLinkNodeMap().find( link );
+                if ( linkIt != theHelper.GetTLinkNodeMap().end() )
+                {
+                  links.push_back( make_pair( linkIt->first, linkIt->second  ));
+                  if ( !isDistorted ) {
+                    // compare projections of nInSolid and nMedium to face normal
+                    gp_Pnt pMedium = SMESH_TNodeXYZ( linkIt->second );
+                    double hMedium = faceNorm * gp_Vec( pOnFace0, pMedium ).XYZ();
+                    double hVol    = faceNorm * gp_Vec( pOnFace0, pInSolid ).XYZ();
+                    isDistorted = ( Abs( hMedium ) > Abs( hVol * 0.5 ));
+                  }
+                }
+              }
+            // move medium nodes to link middle
+            if ( isDistorted )
+            {
+              for ( size_t i = 0; i < links.size(); ++i )
+              {
+                const SMDS_MeshNode* nMedium = links[i].second;
+                if ( movedNodes.insert( nMedium ).second )
+                {
+                  gp_Pnt pMid3D = 0.5 * ( SMESH_TNodeXYZ( links[i].first.node1() ) +
+                                          SMESH_TNodeXYZ( links[i].first.node2() ));
+                  meshDS->MoveNode( nMedium, pMid3D.X(), pMid3D.Y(), pMid3D.Z() );
+                  MSG( "move OUT of solid " << nMedium );
+                }
+              }
+              theError->myBadElements.push_back( vol );
+            }
+          } // loop on volumes sharing a node on FACE
+        } // loop on nodes on FACE
+      }  // loop on FACEs of a SOLID
+
+      if ( !theError->myBadElements.empty() )
+        theError->myName = EDITERR_NO_MEDIUM_ON_GEOM;
+    } // 3D case
+  }
+
 } //namespace
 
 //=======================================================================
 /*!
  * \brief Move medium nodes of faces and volumes to fix distorted elements
+ * \param error - container of fixed distorted elements
  * \param volumeOnly - to fix nodes on faces or not, if the shape is solid
  * 
  * Issue 0020307: EDF 992 SMESH : Linea/Quadratic with Medium Node on Geometry
  */
 //=======================================================================
 
-void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
+void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
+                                              bool                   volumeOnly)
 {
   // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
   if ( getenv("NO_FixQuadraticElements") )
@@ -3065,7 +3462,7 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
 #endif
         SMESH_MesherHelper h(*myMesh);
         h.SetSubShape( s.Current() );
-        h.FixQuadraticElements(false);
+        h.FixQuadraticElements( error, false );
       }
     }
     // fix nodes on geom faces
@@ -3076,10 +3473,13 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
       MSG("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key()));
       SMESH_MesherHelper h(*myMesh);
       h.SetSubShape( fIt.Key() );
-      h.FixQuadraticElements(true);
+      h.FixQuadraticElements( error, true);
       h.ToFixNodeParameters(true);
     }
     //perf_print_all_meters(1);
+    if ( error && error->myName == EDITERR_NO_MEDIUM_ON_GEOM )
+      error->myComment = "during conversion to quadratic, "
+        "some medium nodes were not placed on geometry to avoid distorting elements";
     return;
   }
 
@@ -3118,6 +3518,11 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
   TIDSortedNodeSet apexOfPyramid;
   const int apexIndex = 4;
 
+  // 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 );
+
   if ( elemType == SMDSAbs_Volume )
   {
     while ( elemIt->more() ) // loop on volumes
@@ -3392,109 +3797,73 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
         } // loop on chains of links
       } // loop on 2 directions of propagation from quadrangle
     } // loop on faces
-  }
+  } // fix faces and/or volumes
 
   // 4. Move nodes
   // -------------
 
-//   vector<const SMDS_MeshElement*> vols( 100 );
-//   vector<double>                  volSize( 100 );
-//   int nbVols;
-//   bool ok;
   for ( pLink = links.begin(); pLink != links.end(); ++pLink ) {
     if ( pLink->IsMoved() ) {
       gp_Pnt p = pLink->MiddlePnt() + pLink->Move();
       GetMeshDS()->MoveNode( pLink->_mediumNode, p.X(), p.Y(), p.Z());
-      //
-//       gp_Pnt pNew = pLink->MiddlePnt() + pLink->Move();
-//       if ( pLink->MediumPos() != SMDS_TOP_3DSPACE )
-//       {
-//         // avoid making distorted volumes near boundary
-//         SMDS_ElemIteratorPtr volIt =
-//           (*pLink)._mediumNode->GetInverseElementIterator( SMDSAbs_Volume );
-//         for ( nbVols = 0; volIt->more() && volTool.Set( volIt->next() ); ++nbVols )
-//         {
-//           vols   [ nbVols ] = volTool.Element();
-//           volSize[ nbVols ] = volTool.GetSize();
-//         }
-//         gp_Pnt pOld = pLink->MediumPnt();
-//         const_cast<SMDS_MeshNode*>( pLink->_mediumNode )->setXYZ( pNew.X(), pNew.Y(), pNew.Z() );
-//         ok = true;
-//         while ( nbVols-- && ok )
-//         {
-//           volTool.Set( vols[ nbVols ]);
-//           ok = ( volSize[ nbVols ] * volTool.GetSize() > 1e-20 ); 
-//         }
-//         if ( !ok )
-//         {
-//           const_cast<SMDS_MeshNode*>( pLink->_mediumNode )->setXYZ( pOld.X(), pOld.Y(), pOld.Z() );
-//           MSG( "Do NOT move \t" << pLink->_mediumNode->GetID()
-//                << " because of distortion of volume " << vols[ nbVols+1 ]->GetID());
-//           continue;
-//         }
-//       }
-//       GetMeshDS()->MoveNode( pLink->_mediumNode, pNew.X(), pNew.Y(), pNew.Z() );
-    }
-  }
-
-  //return;
-
-  // issue 0020982
-  // Move the apex of pyramid together with the most curved link
-
-  TIDSortedNodeSet::iterator apexIt = apexOfPyramid.begin();
-  for ( ; apexIt != apexOfPyramid.end(); ++apexIt )
-  {
-    SMESH_TNodeXYZ apex = *apexIt;
-
-    gp_Vec maxMove( 0,0,0 );
-    double maxMoveSize2 = 0;
-
-    // shift of node index to get medium nodes between the base nodes
-    const int base2MediumShift = 5;
-
-    // find maximal movement of medium node
-    SMDS_ElemIteratorPtr volIt = apex._node->GetInverseElementIterator( SMDSAbs_Volume );
-    vector< const SMDS_MeshElement* > pyramids;
-    while ( volIt->more() )
-    {
-      const SMDS_MeshElement* pyram = volIt->next();
-      if ( pyram->GetEntityType() != SMDSEntity_Quad_Pyramid ) continue;
-      pyramids.push_back( pyram );
-
-      for ( int iBase = 0; iBase < apexIndex; ++iBase )
-      {
-        SMESH_TNodeXYZ medium = pyram->GetNode( iBase + base2MediumShift );
-        if ( medium._node->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE )
-        {
-          SMESH_TNodeXYZ n1 = pyram->GetNode( iBase );
-          SMESH_TNodeXYZ n2 = pyram->GetNode( ( iBase+1 ) % 4 );
-          gp_Pnt middle = 0.5 * ( n1 + n2 );
-          gp_Vec move( middle, medium );
-          double moveSize2 = move.SquareMagnitude();
-          if ( moveSize2 > maxMoveSize2 )
-            maxMove = move, maxMoveSize2 = moveSize2;
-        }
-      }
-    }
-
-    // move the apex
-    if ( maxMoveSize2 > 1e-20 )
-    {
-      apex += maxMove.XYZ();
-      GetMeshDS()->MoveNode( apex._node, apex.X(), apex.Y(), apex.Z());
-
-      // move medium nodes neighboring the apex to the middle
-      const int base2MediumShift_2 = 9;
-      for ( unsigned i = 0; i < pyramids.size(); ++i )
-        for ( int iBase = 0; iBase < apexIndex; ++iBase )
-        {
-          SMESH_TNodeXYZ         base = pyramids[i]->GetNode( iBase );
-          const SMDS_MeshNode* medium = pyramids[i]->GetNode( iBase + base2MediumShift_2 );
-          gp_XYZ middle = 0.5 * ( apex + base );
-          GetMeshDS()->MoveNode( medium, middle.X(), middle.Y(), middle.Z());
-        }
     }
   }
+
+  // Issue 0020982
+  // Move the apex of pyramid together with the most curved link.
+  // TIDSortedNodeSet::iterator apexIt = apexOfPyramid.begin();
+  // for ( ; apexIt != apexOfPyramid.end(); ++apexIt )
+  // {
+  //   SMESH_TNodeXYZ apex = *apexIt;
+
+  //   gp_Vec maxMove( 0,0,0 );
+  //   double maxMoveSize2 = 0;
+
+  //   // shift of node index to get medium nodes between the base nodes
+  //   const int base2MediumShift = 5;
+
+  //   // find maximal movement of medium node
+  //   SMDS_ElemIteratorPtr volIt = apex._node->GetInverseElementIterator( SMDSAbs_Volume );
+  //   vector< const SMDS_MeshElement* > pyramids;
+  //   while ( volIt->more() )
+  //   {
+  //     const SMDS_MeshElement* pyram = volIt->next();
+  //     if ( pyram->GetEntityType() != SMDSEntity_Quad_Pyramid ) continue;
+  //     pyramids.push_back( pyram );
+
+  //     for ( int iBase = 0; iBase < apexIndex; ++iBase )
+  //     {
+  //       SMESH_TNodeXYZ medium = pyram->GetNode( iBase + base2MediumShift );
+  //       if ( medium._node->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE )
+  //       {
+  //         SMESH_TNodeXYZ n1 = pyram->GetNode( iBase );
+  //         SMESH_TNodeXYZ n2 = pyram->GetNode( ( iBase+1 ) % 4 );
+  //         gp_Pnt middle = 0.5 * ( n1 + n2 );
+  //         gp_Vec move( middle, medium );
+  //         double moveSize2 = move.SquareMagnitude();
+  //         if ( moveSize2 > maxMoveSize2 )
+  //           maxMove = move, maxMoveSize2 = moveSize2;
+  //       }
+  //     }
+  //   }
+
+  //   // move the apex
+  //   if ( maxMoveSize2 > 1e-20 )
+  //   {
+  //     apex += maxMove.XYZ();
+  //     GetMeshDS()->MoveNode( apex._node, apex.X(), apex.Y(), apex.Z());
+
+  //     // move medium nodes neighboring the apex to the middle
+  //     const int base2MediumShift_2 = 9;
+  //     for ( unsigned i = 0; i < pyramids.size(); ++i )
+  //       for ( int iBase = 0; iBase < apexIndex; ++iBase )
+  //       {
+  //         SMESH_TNodeXYZ         base = pyramids[i]->GetNode( iBase );
+  //         const SMDS_MeshNode* medium = pyramids[i]->GetNode( iBase + base2MediumShift_2 );
+  //         gp_XYZ middle = 0.5 * ( apex + base );
+  //         GetMeshDS()->MoveNode( medium, middle.X(), middle.Y(), middle.Z());
+  //       }
+  //   }
+  // }
 }
 
index c74dfb8583e122094edb5cda02d5706073122e1e..da6cfcbfb3efb5ed7e0ec86a00149c9514087217 100644 (file)
@@ -164,6 +164,9 @@ public:
 
   static TopoDS_Vertex IthVertex( const bool is2nd, TopoDS_Edge anEdge, const bool CumOri=true );
 
+  static TopAbs_ShapeEnum GetGroupType(const TopoDS_Shape& group,
+                                       const bool          avoidCompound=false);
+
 
 public:
   // ---------- PUBLIC INSTANCE METHODS ----------
@@ -192,9 +195,10 @@ public:
 
   /*!
    * \brief Move medium nodes of faces and volumes to fix distorted elements
+   * \param error - container of fixed distorted elements
    * \param volumeOnly - fix nodes on geom faces or not if the shape is solid
    */
-  void FixQuadraticElements(bool volumeOnly=true);
+  void FixQuadraticElements(SMESH_ComputeErrorPtr& error, bool volumeOnly=true);
 
   /*!
    * \brief To set created elements on the shape set by IsQuadraticSubMesh()
index 65ffac712f0240230d5e2296957ad7f026e09241..d048ce2b084f84c50483b021403bae449e92e6b0 100644 (file)
@@ -406,6 +406,10 @@ const map < int, SMESH_subMesh * >& SMESH_subMesh::DependsOn()
       {
         insertDependence(exp.Current());
       }
+      for (TopExp_Explorer exp(_subShape, TopAbs_VERTEX, TopAbs_EDGE); exp.More();exp.Next())
+      {
+        insertDependence(exp.Current());
+      }
       break;
     }
   case TopAbs_COMPSOLID:
@@ -1462,16 +1466,18 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
           else
             ret = false;
         }
+        // check if an error reported on any sub-shape
+        bool isComputeErrorSet = !checkComputeError( algo, ret, shape );
+        // check if anything was built
         TopExp_Explorer subS(shape, _subShape.ShapeType());
-        if (ret) // check if anything was built
+        if (ret)
         {
           for (; ret && subS.More(); subS.Next())
             ret = _father->GetSubMesh( subS.Current() )->IsMeshComputed();
         }
-        bool isComputeErrorSet = !checkComputeError( algo, shape );
+        // Set _computeError
         if (!ret && !isComputeErrorSet)
         {
-          // Set _computeError
           for (subS.ReInit(); subS.More(); subS.Next())
           {
             SMESH_subMesh* sm = _father->GetSubMesh( subS.Current() );
@@ -1723,7 +1729,9 @@ bool SMESH_subMesh::Evaluate(MapShapeNbElems& aResMap)
  */
 //=======================================================================
 
-bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& theShape)
+bool SMESH_subMesh::checkComputeError(SMESH_Algo*         theAlgo,
+                                      const bool          theComputeOK,
+                                      const TopoDS_Shape& theShape)
 {
   bool noErrors = true;
 
@@ -1734,7 +1742,7 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t
     {
       SMESH_subMeshIteratorPtr smIt = getDependsOnIterator(false,false);
       while ( smIt->more() )
-        if ( !smIt->next()->checkComputeError( theAlgo ))
+        if ( !smIt->next()->checkComputeError( theAlgo, theComputeOK ))
           noErrors = false;
     }
 
@@ -1746,7 +1754,7 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t
       for (TopoDS_Iterator subIt( theShape ); subIt.More(); subIt.Next()) {
         SMESH_subMesh* sm = _father->GetSubMesh( subIt.Value() );
         if ( sm != this ) {
-          if ( !sm->checkComputeError( theAlgo, sm->GetSubShape() ))
+          if ( !sm->checkComputeError( theAlgo, theComputeOK, sm->GetSubShape() ))
             noErrors = false;
           updateDependantsState( SUBMESH_COMPUTED ); // send event SUBMESH_COMPUTED
         }
@@ -1754,13 +1762,24 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t
     }
   }
   {
-    // Check my state
+
+    // Set my _computeState
+
     if ( !_computeError || _computeError->IsOK() )
     {
       // no error description is set to this sub-mesh, check if any mesh is computed
       _computeState = IsMeshComputed() ? COMPUTE_OK : FAILED_TO_COMPUTE;
+      if ( _computeState != COMPUTE_OK )
+      {
+        if ( _subShape.ShapeType() == TopAbs_EDGE &&
+             BRep_Tool::Degenerated( TopoDS::Edge( _subShape )) )
+          _computeState = COMPUTE_OK;
+        else if ( theComputeOK )
+          _computeError = SMESH_ComputeError::New(COMPERR_NO_MESH_ON_SHAPE,"",theAlgo);
+      }
     }
-    else
+
+    if ( _computeError && !_computeError->IsOK() )
     {
       if ( !_computeError->myAlgo )
         _computeError->myAlgo = theAlgo;
@@ -2078,6 +2097,23 @@ EventListenerData* SMESH_subMesh::GetEventListenerData(EventListener* listener)
   return 0;
 }
 
+//================================================================================
+/*!
+ * \brief Return an event listener data
+ * \param listenerName - the listener name
+ * \retval EventListenerData* - found data, maybe NULL
+ */
+//================================================================================
+
+EventListenerData* SMESH_subMesh::GetEventListenerData(const string& listenerName) const
+{
+  map< EventListener*, EventListenerData* >::const_iterator l_d = _eventListeners.begin();
+  for ( ; l_d != _eventListeners.end(); ++l_d )
+    if ( listenerName == l_d->first->GetName() )
+      return l_d->second;
+  return 0;
+}
+
 //================================================================================
 /*!
  * \brief Notify stored event listeners on the occured event
@@ -2118,8 +2154,15 @@ void SMESH_subMesh::DeleteEventListener(EventListener* listener)
   map< EventListener*, EventListenerData* >::iterator l_d =
     _eventListeners.find( listener );
   if ( l_d != _eventListeners.end() ) {
-    if ( l_d->first  && l_d->first->IsDeletable() )  delete l_d->first;
-    if ( l_d->second && l_d->second->IsDeletable() ) delete l_d->second;
+    if ( l_d->first && l_d->first->IsDeletable() )
+    {
+      l_d->first->BeforeDelete( this, l_d->second );
+      delete l_d->first;
+    }
+    if ( l_d->second && l_d->second->IsDeletable() )
+    {
+      delete l_d->second;
+    }
     _eventListeners.erase( l_d );
   }
 }
index ee4b96658b924c75c42cf6816548066d79db2bb2..057f532a7d3fb13db34481171e98c15bcd048f39 100644 (file)
@@ -138,6 +138,13 @@ class SMESH_EXPORT SMESH_subMesh
    */
   EventListenerData* GetEventListenerData(EventListener* listener) const;
 
+  /*!
+   * \brief Return an event listener data
+    * \param listenerName - the listener name
+    * \retval EventListenerData* - found data, maybe NULL
+   */
+  EventListenerData* GetEventListenerData(const std::string& listenerName) const;
+
   /*!
    * \brief Unregister the listener and delete it and it's data
     * \param listener - the event listener to delete
@@ -278,7 +285,9 @@ protected:
    * \brief Update compute_state by _computeError
     * \retval bool - false if there are errors
    */
-  bool checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& theShape=TopoDS_Shape());
+  bool checkComputeError(SMESH_Algo*         theAlgo,
+                         const bool          theComputeOK,
+                         const TopoDS_Shape& theShape=TopoDS_Shape());
 
   /*!
    * \brief Return a hypothesis attached to theShape.
index ae911cfefbde029507c776f3b7a214bdcf4c444d..bbba7870222a0bc392ce564ee1390095f95b3237 100644 (file)
@@ -46,18 +46,18 @@ class SMESH_EXPORT SMESH_subMeshEventListener
 {
   bool myIsDeletable; //!< if true, it will be deleted by SMESH_subMesh
   mutable std::set<SMESH_subMesh*> myBusySM; //!< to avoid infinite recursion via events
+  const char*                      myName;   //!< identifier
   friend class SMESH_subMesh;
-#ifdef _DEBUG_
-  const char* myName; //!< identifier used for debug
-#endif
 
  public:
-  SMESH_subMeshEventListener(bool isDeletable, const char* name) :myIsDeletable(isDeletable)
-#ifdef _DEBUG_
-    ,myName(name)
-#endif
+  SMESH_subMeshEventListener(bool isDeletable, const char* name)
+    :myIsDeletable(isDeletable), myName(name) {}
+  virtual      ~SMESH_subMeshEventListener() {}
+  bool         IsDeletable() const { return myIsDeletable; }
+  const char*  GetName()     const { return myName; }
+  virtual void BeforeDelete(SMESH_subMesh*                  subMesh,
+                            SMESH_subMeshEventListenerData* data)
   {}
-  bool IsDeletable() const { return myIsDeletable; }
   /*!
    * \brief Do something on a certain event
    * \param event - algo_event or compute_event itself (of SMESH_subMesh)
index d89d95fa1abc582acc3eaf0fe9a092764022a5fc..7e3902eecefd5965e95426fe31630d3eeca23184 100644 (file)
@@ -57,6 +57,7 @@ libSMESHClient_la_CPPFLAGS = \
        -I$(srcdir)/../SMDS \
        -I$(srcdir)/../SMESHDS \
        -I$(srcdir)/../SMESH \
+       -I$(srcdir)/../SMESHUtils \
        -I$(top_builddir)/idl
 
 libSMESHClient_la_LDFLAGS  = \
index 1825812560504b8c7b8cec5db6c834f302d6e304..4b7f1fcd1bab0a2a1d9fe55eb55eb6c825ec7f67 100644 (file)
@@ -38,27 +38,27 @@ class SMESHDS_EXPORT SMESHDS_Document
 {
   public:
         SMESHDS_Document(int UserID);
-        int NewMesh(bool theIsEmbeddedMode);
-        void RemoveMesh(int MeshID);
-        SMESHDS_Mesh * GetMesh(int MeshID);
-        void AddHypothesis(SMESHDS_Hypothesis * H);
-        void RemoveHypothesis(int HypID);
+         ~SMESHDS_Document();
+        int                  NewMesh(bool theIsEmbeddedMode);
+        void                 RemoveMesh(int MeshID);
+        SMESHDS_Mesh *       GetMesh(int MeshID);
+        void                 AddHypothesis(SMESHDS_Hypothesis * H);
+        void                 RemoveHypothesis(int HypID);
         SMESHDS_Hypothesis * GetHypothesis(int HypID);
-        int NbMeshes();
-        int NbHypothesis();
-        void InitMeshesIterator();
-        SMESHDS_Mesh * NextMesh();
-        bool MoreMesh();        
-        void InitHypothesisIterator();
+        int                  NbMeshes();
+        int                  NbHypothesis();
+        void                 InitMeshesIterator();
+        SMESHDS_Mesh *       NextMesh();
+        bool                 MoreMesh();        
+        void                 InitHypothesisIterator();
         SMESHDS_Hypothesis * NextHypothesis();
-        bool MoreHypothesis();  
-         ~SMESHDS_Document();
+        bool                 MoreHypothesis();  
 
   private:
-        int myUserID;
-        std::map<int,SMESHDS_Mesh*> myMeshes;
-        std::map<int,SMESHDS_Hypothesis*> myHypothesis;
-        std::map<int,SMESHDS_Mesh*>::iterator myMeshesIt;
+        int                                         myUserID;
+        std::map<int,SMESHDS_Mesh*>                 myMeshes;
+        std::map<int,SMESHDS_Hypothesis*>           myHypothesis;
+        std::map<int,SMESHDS_Mesh*>::iterator       myMeshesIt;
         std::map<int,SMESHDS_Hypothesis*>::iterator myHypothesisIt;
 };
 
index d819684af6a8e8b2d36f32a5a1cfc1b50b6de343..85e115c05d149150d026b3b0f07fb479cddd4e32 100644 (file)
@@ -24,7 +24,6 @@
 //  File   : SMESHDS_Hypothesis.hxx
 //  Author : Paul RASCLE, EDF
 //  Module : SMESH
-//  $Header$
 //
 #ifndef _SMESHDS_HYPOTHESIS_HXX_
 #define _SMESHDS_HYPOTHESIS_HXX_
@@ -36,7 +35,7 @@
 
 class SMESHDS_EXPORT SMESHDS_Hypothesis
 {
-public:
+ public:
   SMESHDS_Hypothesis(int hypId);
   virtual ~SMESHDS_Hypothesis();
 
@@ -50,12 +49,12 @@ public:
   virtual bool operator==(const SMESHDS_Hypothesis& other) const;
   bool operator!=(const SMESHDS_Hypothesis& other) const { return !(*this==other); }
 
-enum hypothesis_type {PARAM_ALGO, ALGO_0D, ALGO_1D, ALGO_2D, ALGO_3D};
+  enum hypothesis_type { PARAM_ALGO, ALGO_0D, ALGO_1D, ALGO_2D, ALGO_3D };
 
-protected:
-  std::string _name;
-  int _hypId;
-  int _type;
+ protected:
+  std::string _name;  // identifier if hypothesis type
+  int         _hypId; // ID unique within application session
+  int         _type;  // enum hypothesis_type
 };
 
 #endif
index 15925385f603cb7ab08057838533111ce11b600e..9bfd599b3debf59f9556f503c8623d11082f3066 100644 (file)
@@ -49,7 +49,6 @@ salomeinclude_HEADERS = \
        SMESHGUI_RemoveElementsDlg.h \
        SMESHGUI_MeshInfo.h \
        SMESHGUI_Measurements.h \
-       SMESHGUI_Preferences_ColorDlg.h \
        SMESHGUI_Preferences_ScalarBarDlg.h \
        SMESHGUI_AddMeshElementDlg.h \
        SMESHGUI_XmlHandler.h \
@@ -97,6 +96,7 @@ salomeinclude_HEADERS = \
        SMESHGUI_CopyMeshDlg.h \
        SMESHGUI_PreviewDlg.h  \
        SMESHGUI_ReorientFacesDlg.h \
+       SMESHGUI_PropertiesDlg.h \
        SMESH_SMESHGUI.hxx
 
 # Libraries targets
@@ -115,7 +115,6 @@ dist_libSMESH_la_SOURCES = \
        SMESHGUI_RemoveElementsDlg.cxx \
        SMESHGUI_MeshInfo.cxx \
        SMESHGUI_Measurements.cxx \
-       SMESHGUI_Preferences_ColorDlg.cxx \
        SMESHGUI_Preferences_ScalarBarDlg.cxx \
        SMESHGUI_AddMeshElementDlg.cxx \
        SMESHGUI_XmlHandler.cxx \
@@ -173,7 +172,8 @@ dist_libSMESH_la_SOURCES = \
        SMESHGUI_CopyMeshDlg.cxx \
        SMESHGUI_FileValidator.cxx \
        SMESHGUI_PreviewDlg.cxx  \
-       SMESHGUI_ReorientFacesDlg.cxx
+       SMESHGUI_ReorientFacesDlg.cxx \
+       SMESHGUI_PropertiesDlg.cxx
 
 MOC_FILES = \
        SMESHGUI_moc.cxx \
@@ -189,7 +189,6 @@ MOC_FILES = \
        SMESHGUI_RemoveElementsDlg_moc.cxx \
        SMESHGUI_MeshInfo_moc.cxx \
        SMESHGUI_Measurements_moc.cxx \
-       SMESHGUI_Preferences_ColorDlg_moc.cxx \
        SMESHGUI_Preferences_ScalarBarDlg_moc.cxx \
        SMESHGUI_AddMeshElementDlg_moc.cxx \
        SMESHGUI_FilterDlg_moc.cxx \
@@ -233,7 +232,8 @@ MOC_FILES = \
        SMESHGUI_CopyMeshDlg_moc.cxx \
        SMESHGUI_MeshOrderOp_moc.cxx \
        SMESHGUI_PreviewDlg_moc.cxx \
-       SMESHGUI_ReorientFacesDlg_moc.cxx
+       SMESHGUI_ReorientFacesDlg_moc.cxx \
+       SMESHGUI_PropertiesDlg_moc.cxx
 
 nodist_libSMESH_la_SOURCES= \
        $(MOC_FILES)
index 52f3180adab914968c21c6acefd7b3f7ff9e247f..28df5fdbfaef7aff9e6b8a3a28e154cd365ad5f6 100644 (file)
@@ -59,8 +59,8 @@
 #include "SMESHGUI_MeshPatternDlg.h"
 #include "SMESHGUI_MultiEditDlg.h"
 #include "SMESHGUI_NodesDlg.h"
-#include "SMESHGUI_Preferences_ColorDlg.h"
 #include "SMESHGUI_Preferences_ScalarBarDlg.h"
+#include "SMESHGUI_PropertiesDlg.h"
 #include "SMESHGUI_RemoveElementsDlg.h"
 #include "SMESHGUI_RemoveNodesDlg.h"
 #include "SMESHGUI_RenumberingDlg.h"
       filter.append( QObject::tr( "SAUV files (*.sauv*)" ) );
       filter.append( QObject::tr( "All files (*)" ) );
     }
+    else if ( theCommandID == 118 ) {
+      filter.append( QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)"  );
+      filter.append( QObject::tr( "GMF_BINARY_FILES_FILTER") + " (*.meshb)" );
+    }
 
     QString anInitialPath = "";
     if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
               }
               break;
             }
+          case 118:
+            {
+              // GMF format
+              SMESH::ComputeError_var res;
+              aMeshes->length( 1 );
+              aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toLatin1().constData(), 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() ) ) );
+                if ( strlen( res->comment.in() ) > 0 ) {
+                  errors.back() += ": ";
+                  errors.back() += res->comment.in();
+                }
+              }
+              break;
+            }
           }
         }
         catch ( const SALOME::SALOME_Exception& S_ex ) {
     const bool isSTL = ( theCommandID == 140 || theCommandID == 141 );
     const bool isCGNS= ( theCommandID == 142 || theCommandID == 143 );
     const bool isSAUV= ( theCommandID == 144 || theCommandID == 145 );
+    const bool isGMF = ( theCommandID == 146 || theCommandID == 147 );
 
     // actually, the following condition can't be met (added for insurance)
     if( selected.Extent() == 0 ||
 
     aMeshIter = aMeshList.begin();
     SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
-    SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh();
-    QString aMeshName = (*aMeshIter).second;
+    SMESH::SMESH_Mesh_var            aMesh = aMeshOrGroup->GetMesh();
+    QString                      aMeshName = (*aMeshIter).second;
 
-    if ( isMED || isCGNS || isSAUV )
+    if ( isMED || isCGNS || isSAUV ) // formats where group names must be unique
     {
       // check for equal group names within each mesh
       for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
       notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
       notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
     }
+    else if ( isGMF )
+    {
+      format = "GMF";
+      notSupportedElemTypes.push_back( SMESH::Entity_0D );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Quadrangle );
+      notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Pyramid );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Hexa );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Penta );
+      notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
+      notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
+      notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polyhedra );
+      notSupportedElemTypes.push_back( SMESH::Entity_Ball );
+    }
     if ( ! notSupportedElemTypes.empty() )
     {
       SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
 
     // Get parameters of export operation
 
-    QString aFilename;
+    QString            aFilename;
     SMESH::MED_VERSION aFormat;
     // Init the parameters with the default values
-    bool aIsASCII_STL = true;
+    bool aIsASCII_STL   = true;
     bool toCreateGroups = false;
     SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
     if ( resMgr )
     if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
       anInitialPath = QDir::currentPath();
 
-    if ( isUNV || isDAT )
+    // Get a file name to write in and additional otions
+    if ( isUNV || isDAT || isGMF ) // Export w/o options
     {
       if ( isUNV )
         aFilter = QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)";
-      else
+      else if ( isDAT )
         aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
+      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();
       aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
                                             anInitialPath + QString("/") + aMeshName,
                                    toOverwrite && aMeshIndex == 0 );
           }
         }
+        else if ( isGMF )
+        {
+          aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data() );
+        }
       }
       catch (const SALOME::SALOME_Exception& S_ex){
         wc.suspend();
       SALOMEDS::Color aColor = aGroupObject->GetColor();
       _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject);
       if (aGroupSObject) {
+        QColor c;
+        int delta;
         if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
           switch ( aGroupObject->GetType ()) {
           case SMESH::NODE:
             anActor->Set0DColor( aColor.R, aColor.G, aColor.B ); break;
           case SMESH::BALL:
             anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break;
+          case SMESH::VOLUME:
+            SMESH::GetColor("SMESH", "volume_color", c, delta, "255,0,170|-100");
+            anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break;
+          case SMESH::FACE:
           default:
-            QColor c;
-            int delta;
             SMESH::GetColor("SMESH", "fill_color", c, delta, "0,170,255|-100");
             anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta );
           }
         (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show();
         return;
       }
-      case 1132:{
-        QColor c, e, b, n, c0D, cBall, o, outl, selection, preselection;
-        int delta;
-        int size0D = 0, ballSize = 0;
-        int Edgewidth = 0;
-        vtkFloatingPointType Shrink = 0.0;
-        vtkFloatingPointType faces_orientation_scale = 0.0;
-        bool faces_orientation_3dvectors = false;
-
-        VTK::MarkerType aMarkerTypeCurrent = VTK::MT_NONE;
-        VTK::MarkerScale aMarkerScaleCurrent = VTK::MS_NONE;
-        int aMarkerTextureCurrent = 0;
+      case 1132: {
+        vtkFloatingPointType color[3];
+        QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor;
+        QColor orientationColor, outlineColor, volumeColor;
+        int deltaF = 0, deltaV = 0;
+        int elem0dSize   = 1;
+        int ballSize     = 1;
+        int edgeWidth    = 1;
+        int outlineWidth = 1;
+        vtkFloatingPointType shrinkCoef = 0.0;
+        vtkFloatingPointType orientationScale = 0.0;
+        bool orientation3d = false;
+        VTK::MarkerType markerType = VTK::MT_NONE;
+        VTK::MarkerScale markerScale = VTK::MS_NONE;
+        int markerId = 0;
+        bool hasNodes = false;
+        int presentEntities = 0;
+        bool firstTime  = true;
 
         SALOME_ListIteratorOfListIO It( selected );
-        for( ; It.More(); It.Next()){
+        for ( ; It.More(); It.Next() ) {
           Handle(SALOME_InteractiveObject) IObject = It.Value();
-          if(IObject->hasEntry()){
-            if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
-              vtkFloatingPointType color[3];
-              anActor->GetSufaceColor(color[0], color[1], color[2],delta);
-              int c0 = int (color[0] * 255);
-              int c1 = int (color[1] * 255);
-              int c2 = int (color[2] * 255);
-              c.setRgb(c0, c1, c2);
-
-              vtkFloatingPointType edgecolor[3];
-              anActor->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]);
-              c0 = int (edgecolor[0] * 255);
-              c1 = int (edgecolor[1] * 255);
-              c2 = int (edgecolor[2] * 255);
-              e.setRgb(c0, c1, c2);
-
-              vtkFloatingPointType nodecolor[3];
-              anActor->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]);
-              c0 = int (nodecolor[0] * 255);
-              c1 = int (nodecolor[1] * 255);
-              c2 = int (nodecolor[2] * 255);
-              n.setRgb(c0, c1, c2);
-
-              vtkFloatingPointType color0D[3];
-              anActor->Get0DColor(color0D[0], color0D[1], color0D[2]);
-              c0 = int (color0D[0] * 255);
-              c1 = int (color0D[1] * 255);
-              c2 = int (color0D[2] * 255);
-              c0D.setRgb(c0, c1, c2);
-
-              vtkFloatingPointType ballcolor[3];
-              anActor->GetBallColor(ballcolor[0], ballcolor[1], ballcolor[2]);
-              c0 = int (ballcolor[0] * 255);
-              c1 = int (ballcolor[1] * 255);
-              c2 = int (ballcolor[2] * 255);
-              cBall.setRgb(c0, c1, c2);
-
-              vtkFloatingPointType outlineColor[3];
-              anActor->GetOutlineColor(outlineColor[0], outlineColor[1], outlineColor[2]);
-              c0 = int (outlineColor[0] * 255);
-              c1 = int (outlineColor[1] * 255);
-              c2 = int (outlineColor[2] * 255);
-              outl.setRgb(c0, c1, c2);
-
-              vtkFloatingPointType hColor[3];
-              anActor->GetHighlightColor(hColor[0], hColor[1], hColor[2]);
-              c0 = int (hColor[0] * 255);
-              c1 = int (hColor[1] * 255);
-              c2 = int (hColor[2] * 255);
-              selection.setRgb(c0, c1, c2);
-
-              vtkFloatingPointType phColor[3];
-              anActor->GetPreHighlightColor(phColor[0], phColor[1], phColor[2]);
-              c0 = int (phColor[0] * 255);
-              c1 = int (phColor[1] * 255);
-              c2 = int (phColor[2] * 255);
-              preselection.setRgb(c0, c1, c2);
-
-              size0D = (int)anActor->Get0DSize();
-              if(size0D == 0)
-                size0D = 1;
-              ballSize = (int)anActor->GetBallSize();
-              if(ballSize == 0)
-                ballSize = 1;
-              Edgewidth = (int)anActor->GetLineWidth();
-              if(Edgewidth == 0)
-                Edgewidth = 1;
-              Shrink = anActor->GetShrinkFactor();
-
-              vtkFloatingPointType faces_orientation_color[3];
-              anActor->GetFacesOrientationColor(faces_orientation_color);
-              c0 = int (faces_orientation_color[0] * 255);
-              c1 = int (faces_orientation_color[1] * 255);
-              c2 = int (faces_orientation_color[2] * 255);
-              o.setRgb(c0, c1, c2);
-
-              faces_orientation_scale = anActor->GetFacesOrientationScale();
-              faces_orientation_3dvectors = anActor->GetFacesOrientation3DVectors();
-
-              aMarkerTypeCurrent = anActor->GetMarkerType();
-              aMarkerScaleCurrent = anActor->GetMarkerScale();
-              aMarkerTextureCurrent = anActor->GetMarkerTexture();
-
-              // even if there are multiple objects in the selection,
-              // we need only the first one to get values for the dialog
-              break;
-            }
+          if ( !IObject->hasEntry() ) continue;
+          SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
+          if ( !anActor || !anActor->GetObject() ) continue;
+
+          if ( firstTime ) {
+            // nodes: color, marker
+            anActor->GetNodeColor( color[0], color[1], color[2] );
+            nodeColor.setRgbF( color[0], color[1], color[2] );
+            markerType  = anActor->GetMarkerType();
+            markerScale = anActor->GetMarkerScale();
+            markerId    = anActor->GetMarkerTexture();
+            // edges: color, width
+            anActor->GetEdgeColor( color[0], color[1], color[2] );
+            edgeColor.setRgbF( color[0], color[1], color[2] );
+            edgeWidth = qMax( (int)anActor->GetLineWidth(), 1 ); // minimum allowed width is 1
+            // faces: front color, back color (delta)
+            anActor->GetSufaceColor( color[0], color[1], color[2], deltaF );
+            faceColor.setRgbF( color[0], color[1], color[2] );
+            // faces: front color, back color (delta)
+            anActor->GetVolumeColor( color[0], color[1], color[2], deltaV );
+            volumeColor.setRgbF( color[0], color[1], color[2] );
+            // 0d elements: color, size
+            anActor->Get0DColor( color[0], color[1], color[2] );
+            elem0dColor.setRgbF( color[0], color[1], color[2] );
+            elem0dSize = qMax( (int)anActor->Get0DSize(), 1 ); // minimum allowed size is 1
+            // balls: color, size
+            anActor->GetBallColor( color[0], color[1], color[2] );
+            ballColor.setRgbF( color[0], color[1], color[2] );
+            ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
+            // outlines: color
+            anActor->GetOutlineColor( color[0], color[1], color[2] );
+            outlineColor.setRgbF( color[0], color[1], color[2] );
+            outlineWidth = qMax( (int)anActor->GetOutlineWidth(), 1 ); // minimum allowed width is 1
+            // orientation vectors: color, scale, 3d flag
+            anActor->GetFacesOrientationColor( color[0], color[1], color[2] );
+            orientationColor.setRgbF( color[0], color[1], color[2] );
+            orientationScale = anActor->GetFacesOrientationScale();
+            orientation3d = anActor->GetFacesOrientation3DVectors();
+            // shrink factor
+            shrinkCoef = anActor->GetShrinkFactor();
           }
+
+          firstTime = false; // we only take properties from first object (for performance reasons)
+
+          if ( !hasNodes )
+            hasNodes = anActor->GetObject()->GetNbEntities( SMDSAbs_Node );
+          if ( !(presentEntities & SMESH_Actor::eEdges) && anActor->GetObject()->GetNbEntities( SMDSAbs_Edge ) )
+            presentEntities = presentEntities | SMESH_Actor::eEdges;
+          if ( !(presentEntities & SMESH_Actor::eFaces) && anActor->GetObject()->GetNbEntities( SMDSAbs_Face ) )
+            presentEntities = presentEntities | SMESH_Actor::eFaces;
+          if ( !(presentEntities & SMESH_Actor::eVolumes) && anActor->GetObject()->GetNbEntities( SMDSAbs_Volume ) )
+            presentEntities = presentEntities | SMESH_Actor::eVolumes;
+          if ( !(presentEntities & SMESH_Actor::e0DElements) && anActor->GetObject()->GetNbEntities( SMDSAbs_0DElement ) )
+            presentEntities = presentEntities | SMESH_Actor::e0DElements;
+          if ( !(presentEntities & SMESH_Actor::eBallElem) && anActor->GetObject()->GetNbEntities( SMDSAbs_Ball ) )
+            presentEntities = presentEntities | SMESH_Actor::eBallElem;
+          
+          // as we know that all types of elements are present, we can exit the loop
+          if ( presentEntities == SMESH_Actor::eAllEntity )
+            break;
         }
 
-        SMESHGUI_Preferences_ColorDlg *aDlg =
-          new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI() );
-        aDlg->SetBooleanValue(1, faces_orientation_3dvectors);
-        aDlg->SetColor(1, c);
-        aDlg->SetColor(2, e);
-        aDlg->SetColor(3, n);
-        aDlg->SetColor(4, outl);
-        aDlg->SetColor(5, c0D);
-        aDlg->SetColor(6, cBall);
-        aDlg->SetColor(7, o);
-        aDlg->SetColor(8, selection);
-        aDlg->SetColor(9, preselection);
-        aDlg->SetDeltaBrightness(delta);
-        aDlg->SetDoubleValue(1, faces_orientation_scale);
-        aDlg->SetIntValue(1, Edgewidth);
-        aDlg->SetIntValue(2, int(Shrink*100.));
-        aDlg->SetIntValue(3, size0D);
-        aDlg->SetIntValue(4, ballSize);
-        aDlg->setCustomMarkerMap( theMarkerMap[ aStudy->StudyId() ] );
-
-        if( aMarkerTypeCurrent != VTK::MT_USER )
-          aDlg->setStandardMarker( aMarkerTypeCurrent, aMarkerScaleCurrent );
+        SMESHGUI_PropertiesDlg dlg( theMarkerMap[ aStudy->StudyId() ], SMESHGUI::desktop() );
+        // nodes: color, marker
+        dlg.setNodeColor( nodeColor );
+        if( markerType != VTK::MT_USER )
+          dlg.setNodeMarker( markerType, markerScale );
         else
-          aDlg->setCustomMarker( aMarkerTextureCurrent );
-
-        if(aDlg->exec()){
-          QColor color                   = aDlg->GetColor(1);
-          QColor edgecolor               = aDlg->GetColor(2);
-          QColor nodecolor               = aDlg->GetColor(3);
-          QColor outlinecolor            = aDlg->GetColor(4);
-          QColor color0D                 = aDlg->GetColor(5);
-          QColor ballcolor               = aDlg->GetColor(6);
-          QColor faces_orientation_color = aDlg->GetColor(7);
-          QColor selectioncolor          = aDlg->GetColor(8);
-          QColor preSelectioncolor       = aDlg->GetColor(9);
-          int delta = aDlg->GetDeltaBrightness();
-
-          /* Point marker */
-          theMarkerMap[ aStudy->StudyId() ] = aDlg->getCustomMarkerMap();
-
+          dlg.setNodeCustomMarker( markerId );
+        // edges: color, line width
+        dlg.setEdgeColor( edgeColor );
+        dlg.setEdgeWidth( edgeWidth );
+        // faces: front color, back color
+        dlg.setFaceColor( faceColor, deltaF );
+        // volumes: normal color, reversed color
+        dlg.setVolumeColor( volumeColor, deltaV );
+        // outlines: color, line width
+        dlg.setOutlineColor( outlineColor );
+        dlg.setOutlineWidth( outlineWidth );
+        // 0d elements: color, size
+        dlg.setElem0dColor( elem0dColor );
+        dlg.setElem0dSize( elem0dSize );
+        // balls: color, size
+        dlg.setBallColor( ballColor );
+        dlg.setBallSize( ballSize );
+        // orientation: color, scale, 3d flag
+        dlg.setOrientationColor( orientationColor );
+        dlg.setOrientationSize( int( orientationScale * 100. ) );
+        dlg.setOrientation3d( orientation3d );
+        // shrink: scale factor
+        dlg.setShrinkCoef( int( shrinkCoef * 100. ) );
+        // hide unused controls
+        dlg.showControls( presentEntities, hasNodes );
+        
+        if ( dlg.exec() ) {
+          nodeColor        = dlg.nodeColor();
+          markerType       = dlg.nodeMarkerType();
+          markerScale      = dlg.nodeMarkerScale();
+          markerId         = dlg.nodeMarkerId();
+          edgeColor        = dlg.edgeColor();
+          edgeWidth        = dlg.edgeWidth();
+          faceColor        = dlg.faceColor();
+          deltaF           = dlg.faceColorDelta();
+          volumeColor      = dlg.volumeColor();
+          deltaV           = dlg.volumeColorDelta();
+          outlineColor     = dlg.outlineColor();
+          outlineWidth     = dlg.outlineWidth();
+          elem0dColor      = dlg.elem0dColor();
+          elem0dSize       = dlg.elem0dSize();
+          ballColor        = dlg.ballColor();
+          ballSize         = dlg.ballSize();
+          orientationColor = dlg.orientationColor();
+          orientationScale = dlg.orientationSize() / 100.;
+          orientation3d    = dlg.orientation3d();
+          shrinkCoef       = dlg.shrinkCoef() / 100.;
+
+          // store point markers map that might be changed by the user
+          theMarkerMap[ aStudy->StudyId() ] = dlg.customMarkers();
+
+          // set properties from dialog box to the presentations
           SALOME_ListIteratorOfListIO It( selected );
-          for( ; It.More(); It.Next()){
+          for ( ; It.More(); It.Next() ) {
             Handle(SALOME_InteractiveObject) IObject = It.Value();
-            if(IObject->hasEntry()){
-              if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
-                /* actor color and backface color */
-                anActor->SetSufaceColor(vtkFloatingPointType (color.red()) / 255.,
-                                        vtkFloatingPointType (color.green()) / 255.,
-                                        vtkFloatingPointType (color.blue()) / 255.,
-                                        delta);
-                /* edge color */
-                anActor->SetEdgeColor(vtkFloatingPointType (edgecolor.red()) / 255.,
-                                      vtkFloatingPointType (edgecolor.green()) / 255.,
-                                      vtkFloatingPointType (edgecolor.blue()) / 255.);
-                /* edge outline */
-                anActor->SetOutlineColor(vtkFloatingPointType (outlinecolor.red()) / 255.,
-                                         vtkFloatingPointType (outlinecolor.green()) / 255.,
-                                         vtkFloatingPointType (outlinecolor.blue()) / 255.);
-
-                /* selection */
-                anActor->SetHighlightColor(vtkFloatingPointType (selectioncolor.red()) / 255.,
-                                           vtkFloatingPointType (selectioncolor.green()) / 255.,
-                                           vtkFloatingPointType (selectioncolor.blue()) / 255.);
-                /* pre-selection */
-                anActor->SetPreHighlightColor(vtkFloatingPointType (preSelectioncolor.red()) / 255.,
-                                              vtkFloatingPointType (preSelectioncolor.green()) / 255.,
-                                              vtkFloatingPointType (preSelectioncolor.blue()) / 255.);
-                
-
-                /* Shrink factor and size edges */
-                anActor->SetShrinkFactor(aDlg->GetIntValue(2) / 100.);
-                anActor->SetLineWidth(aDlg->GetIntValue(1));
-
-                /* Nodes color and size */
-                anActor->SetNodeColor(vtkFloatingPointType (nodecolor.red()) / 255.,
-                                      vtkFloatingPointType (nodecolor.green()) / 255.,
-                                      vtkFloatingPointType (nodecolor.blue()) / 255.);
-
-                /* 0D elements */
-                anActor->Set0DColor(vtkFloatingPointType (color0D.red()) / 255.,
-                                    vtkFloatingPointType (color0D.green()) / 255.,
-                                    vtkFloatingPointType (color0D.blue()) / 255.);
-                anActor->Set0DSize(aDlg->GetIntValue(3));
-
-                /* Ball elements */
-                anActor->SetBallColor(vtkFloatingPointType (ballcolor.red()) / 255.,
-                                      vtkFloatingPointType (ballcolor.green()) / 255.,
-                                      vtkFloatingPointType (ballcolor.blue()) / 255.);
-                anActor->SetBallSize(aDlg->GetIntValue(4));
-
-                /* Faces orientation */
-                vtkFloatingPointType c[3] = {vtkFloatingPointType(faces_orientation_color.redF()),
-                                             vtkFloatingPointType(faces_orientation_color.greenF()),
-                                             vtkFloatingPointType(faces_orientation_color.blueF())};
-                anActor->SetFacesOrientationColor(c);
-                anActor->SetFacesOrientationScale(aDlg->GetDoubleValue(1));
-                anActor->SetFacesOrientation3DVectors(aDlg->GetBooleanValue(1));
-
-                VTK::MarkerType aMarkerTypeNew = aDlg->getMarkerType();
-                VTK::MarkerScale aMarkerScaleNew = aDlg->getStandardMarkerScale();
-                int aMarkerTextureNew = aDlg->getCustomMarkerID();
-                if( aMarkerTypeNew != VTK::MT_USER )
-                  anActor->SetMarkerStd( aMarkerTypeNew, aMarkerScaleNew );
-                else {
-                  const VTK::MarkerMap& aMarkerMap = theMarkerMap[ aStudy->StudyId() ];
-                  VTK::MarkerMap::const_iterator anIter = aMarkerMap.find( aMarkerTextureNew );
-                  if( anIter != aMarkerMap.end() )
-                    anActor->SetMarkerTexture( aMarkerTextureNew, anIter->second.second );
-                }
-
-                SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
-                if( !aGroupObject->_is_nil() )
-                {
-                  SMESH::ElementType anElementType = aGroupObject->GetType();
-                  QColor aColor;
-                  switch( anElementType )
-                  {
-                    case SMESH::NODE: aColor = nodecolor; break;
-                    case SMESH::EDGE: aColor = edgecolor; break;
-                    default: aColor = color; break;
-                  }
-
-                  SALOMEDS::Color aGroupColor;
-                  aGroupColor.R = (float)aColor.red() / 255.0;
-                  aGroupColor.G = (float)aColor.green() / 255.0;
-                  aGroupColor.B = (float)aColor.blue() / 255.0;
-                  aGroupObject->SetColor( aGroupColor );
-                }
-              }
+            if ( !IObject->hasEntry() ) continue;
+            SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
+            if ( !anActor ) continue;
+            
+            // nodes: color, marker
+            anActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
+            if ( markerType != VTK::MT_USER ) {
+              anActor->SetMarkerStd( markerType, markerScale );
             }
-          }
+            else {
+              const VTK::MarkerMap& markerMap = theMarkerMap[ aStudy->StudyId() ];
+              VTK::MarkerMap::const_iterator iter = markerMap.find( markerId );
+              if ( iter != markerMap.end() )
+                anActor->SetMarkerTexture( markerId, iter->second.second );
+            }
+            // volumes: normal color, reversed color (delta)
+            anActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV );
+            // faces: front color, back color (delta)
+            anActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
+            // edges: color, width
+            anActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() );
+            anActor->SetLineWidth( edgeWidth );
+            // outlines: color
+            anActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() );
+            anActor->SetOutlineWidth( outlineWidth );
+            // 0D elements: color, size
+            anActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() );
+            anActor->Set0DSize( elem0dSize );
+            // balls: color, size
+            anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
+            anActor->SetBallSize( ballSize );
+            // orientation: color, scale, 3d flag
+            anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
+            anActor->SetFacesOrientationScale( orientationScale );
+            anActor->SetFacesOrientation3DVectors( orientation3d );
+            // shrink factor
+            anActor->SetShrinkFactor( shrinkCoef );
+
+            // for groups, set also proper color
+            SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
+            if ( !aGroupObject->_is_nil() ) {
+              SMESH::ElementType anElementType = aGroupObject->GetType();
+              QColor aColor;
+              switch( anElementType ) {
+              case SMESH::NODE:
+                aColor = nodeColor; break;
+              case SMESH::EDGE:
+                aColor = edgeColor; break;
+              case SMESH::FACE: 
+                aColor = faceColor; break;
+              case SMESH::VOLUME:
+                aColor = volumeColor; break;
+              case SMESH::ELEM0D: 
+                aColor = elem0dColor; break;
+              case SMESH::BALL: 
+                aColor = ballColor; break;
+              default: break;
+              }
+              
+              if ( aColor.isValid() ) {
+                SALOMEDS::Color aGroupColor;
+                aGroupColor.R = aColor.redF();
+                aGroupColor.G = aColor.greenF();
+                aGroupColor.B = aColor.blueF();
+                aGroupObject->SetColor( aGroupColor );
+              }
+            } // if ( !aGroupObject->_is_nil() )
+          } // for ( ; It.More(); It.Next() )
           SMESH::RepaintCurrentView();
-        }
-        delete aDlg;
+        } // if ( dlg.exec() )
         return;
-      }
-      }
+      } // case 1132:
+      } // switch(theCommandID)
       SALOME_ListIteratorOfListIO It( selected );
       for( ; It.More(); It.Next()){
         Handle(SALOME_InteractiveObject) IObject = It.Value();
@@ -2160,6 +2182,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case 116:
   case 115:
   case 117:
+  case 118:
   case 113:
   case 112:
   case 111:                                     // IMPORT
@@ -2200,6 +2223,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
   case 143:
   case 144:
   case 145:
+  case 146:
+  case 147:
     {
       ::ExportMeshToFile(theCommandID);
       break;
@@ -3509,25 +3534,28 @@ void SMESHGUI::initialize( CAM_Application* app )
 
   // ----- create actions --------------
 
-  createSMESHAction(  111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
+  //createSMESHAction(  111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
   createSMESHAction(  112, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_U) );
   createSMESHAction(  113, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
   createSMESHAction(  114, "NUM" );
-  createSMESHAction(  115, "IMPORT_STL" );
+  createSMESHAction(  115, "IMPORT_STL"  );
   createSMESHAction(  116, "IMPORT_CGNS" );
   createSMESHAction(  117, "IMPORT_SAUV" );
+  createSMESHAction(  118, "IMPORT_GMF"  );
   createSMESHAction(  121, "DAT" );
   createSMESHAction(  122, "MED" );
   createSMESHAction(  123, "UNV" );
   createSMESHAction(  140, "STL" );
-  createSMESHAction(  142, "CGNS" );
-  createSMESHAction(  144, "SAUV" );
+  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(  143, "EXPORT_CGNS");
+  createSMESHAction(  145, "EXPORT_SAUV");
+  createSMESHAction(  147, "EXPORT_GMF" );
   createSMESHAction(  150, "FILE_INFO" );
   createSMESHAction(   33, "DELETE",          "ICON_DELETE", Qt::Key_Delete );
   createSMESHAction( 5105, "SEL_FILTER_LIB" );
@@ -3699,7 +3727,7 @@ void SMESHGUI::initialize( CAM_Application* app )
       renumId  = createMenu( tr( "MEN_RENUM" ),  modifyId, 404 ),
       transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 );
 
-  createMenu( 111, importId, -1 );
+  //createMenu( 111, importId, -1 );
   createMenu( 112, importId, -1 );
   createMenu( 113, importId, -1 );
   createMenu( 115, importId, -1 );
@@ -3707,6 +3735,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( 116, importId, -1 );
 #endif
   createMenu( 117, importId, -1 );
+  createMenu( 118, importId, -1 );
   createMenu( 121, exportId, -1 );
   createMenu( 122, exportId, -1 );
   createMenu( 123, exportId, -1 );
@@ -3715,6 +3744,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createMenu( 142, exportId, -1 ); // export to CGNS
 #endif
   createMenu( 144, exportId, -1 ); // export to SAUV
+  createMenu( 146, exportId, -1 ); // export to GMF
   createMenu( separator(), fileId, 10 );
 
   createMenu( 33, editId, -1 );
@@ -4042,6 +4072,7 @@ void SMESHGUI::initialize( CAM_Application* app )
   createPopupItem( 143, OB, mesh_group, multiple_non_empty );   // EXPORT_CGNS
 #endif
   createPopupItem( 145, OB, mesh_group, multiple_non_empty );   // EXPORT_SAUV
+  createPopupItem( 147, OB, mesh_group, multiple_non_empty );   // EXPORT_GMF
   createPopupItem(  33, OB, mesh_part + " " + hyp_alg );        // DELETE
   createPopupItem( 813, OB, group );                            // DEL_GROUP with contents
   popupMgr()->insert( separator(), -1, 0 );
@@ -4407,7 +4438,7 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
   // end of GEOM plugins loading
 
   // Reset actions accelerator keys
-  action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
+  //action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
   action(112)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_U)); // Import UNV
   action(113)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); // Import MED
 
@@ -4442,7 +4473,7 @@ bool SMESHGUI::deactivateModule( SUIT_Study* study )
   EmitSignalCloseAllDialogs();
 
   // Unset actions accelerator keys
-  action(111)->setShortcut(QKeySequence()); // Import DAT
+  //action(111)->setShortcut(QKeySequence()); // Import DAT
   action(112)->setShortcut(QKeySequence()); // Import UNV
   action(113)->setShortcut(QKeySequence()); // Import MED
 
@@ -4761,20 +4792,23 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
 
   int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab );
-  setPreferenceProperty( elemGroup, "columns", 2 );
+  //setPreferenceProperty( elemGroup, "columns", 2 );
 
-  int ColorId = addPreference( tr( "PREF_FILL"     ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
+  int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
+  setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
+  ColorId = addPreference( tr( "PREF_VOLUME" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "volume_color" );
+  setPreferenceProperty( ColorId, "text", tr("PREF_REVERSEDVOLUME") );
   addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" );
   addPreference( tr( "PREF_BALL_COLOR" ), elemGroup, LightApp_Preferences::Color, "SMESH", "ball_elem_color" );
   addPreference( tr( "PREF_OUTLINE"  ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" );
   addPreference( tr( "PREF_WIREFRAME"  ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" );
 
-  setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
 
   int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab );
   setPreferenceProperty( grpGroup, "columns", 2 );
 
   addPreference( tr( "PREF_GRP_NAMES" ), grpGroup, LightApp_Preferences::Color, "SMESH", "group_name_color" );
+  addPreference( tr( "PREF_GRP_DEF_COLOR" ), grpGroup, LightApp_Preferences::Color, "SMESH", "default_grp_color" );
 
   int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
                              LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
@@ -4782,6 +4816,8 @@ void SMESHGUI::createPreferences()
                              LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size");
   int elemW  = addPreference(tr("PREF_WIDTH"), elemGroup,
                              LightApp_Preferences::IntSpin, "SMESH", "element_width");
+  int outW  = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup,
+                             LightApp_Preferences::IntSpin, "SMESH", "outline_width");
   int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup,
                              LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff");
 
@@ -4794,6 +4830,9 @@ void SMESHGUI::createPreferences()
   setPreferenceProperty( elemW, "min", 1 );
   setPreferenceProperty( elemW, "max", 5 );
 
+  setPreferenceProperty( outW, "min", 1 );
+  setPreferenceProperty( outW, "max", 5 );
+
   setPreferenceProperty( shrink, "min", 0 );
   setPreferenceProperty( shrink, "max", 100 );
 
@@ -5169,9 +5208,9 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReser
   aColor.setHsv( aHue, 255, 255 );
 
   SALOMEDS::Color aSColor;
-  aSColor.R = (double)aColor.red() / 255.0;
-  aSColor.G = (double)aColor.green() / 255.0;
-  aSColor.B = (double)aColor.blue() / 255.0;
+  aSColor.R = aColor.redF();
+  aSColor.G = aColor.greenF();
+  aSColor.B = aColor.blueF();
 
   return aSColor;
 }
index 2febf76f82f06b54077812d8cbefdc472d8ae509..4ce7522d50e5119983024405cc66cf8be3f79c8e 100644 (file)
@@ -498,12 +498,12 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
     int idx = 0;
     if( addToGroup ) {
       aGroupName = ComboBox_GroupName->currentText();
-      for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+      for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
         QString aName = ComboBox_GroupName->itemText( i );
         if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
           idx = i;
       }
-      if ( idx > 0 && idx < myGroups.count() ) {
+      if ( idx > 0 && idx <= myGroups.count() ) {
         SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
         if ( !aGeomGroup->_is_nil() ) {
           int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
index 0472de715d82c9e7ccbc259db5c464af50837df8..c4bc516ad7b4496ec0c2015c44e23d9643cbd233 100644 (file)
@@ -711,12 +711,12 @@ void SMESHGUI_AddQuadraticElementDlg::ClickOnApply()
   int idx = 0;
   if( addToGroup ) {
     aGroupName = ComboBox_GroupName->currentText();
-    for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+    for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
       QString aName = ComboBox_GroupName->itemText( i );
       if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
         idx = i;
     }
-    if ( idx > 0 && idx < myGroups.count() ) {
+    if ( idx > 0 && idx <= myGroups.count() ) {
       SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
       if ( !aGeomGroup->_is_nil() ) {
         int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
index 3143626c66b4b586070defa1cb16bf7124bca7a1..82638364b32f185cf30d3770196a50d707bb9b7e 100644 (file)
@@ -370,7 +370,7 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow
 
   ActorList = new QListWidget(GroupPlanes);
   ActorList->setSelectionMode(QAbstractItemView::SingleSelection);
-
+  
   SelectAllCheckBox = new QCheckBox(tr("SELECT_ALL"), GroupPlanes);
 
   GroupPlanesLayout->addWidget(ComboBoxPlanes,    0, 0);
@@ -477,7 +477,7 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow
   connect(SpinBoxRot1, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam()));
   connect(SpinBoxRot2, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam()));
   connect(PreviewCheckBox, SIGNAL(toggled(bool)), this, SLOT(OnPreviewToggle(bool)));
-  connect(AutoApplyCheckBox, SIGNAL(toggled(bool)), this, SLOT(ClickOnApply()));
+  connect(AutoApplyCheckBox, SIGNAL(toggled(bool)), this, SLOT(onAutoApply(bool)));
   connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
   connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
   connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
@@ -1063,7 +1063,9 @@ void SMESHGUI_ClippingDlg::initializePlaneData()
     SMESHGUI_ClippingPlaneInfoList::const_iterator anIter2 = aClippingPlaneInfoList.begin();
     for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) {
       const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2;
-      SMESH::TPlane aTPlane( aClippingPlaneInfo.Plane );
+      SMESH::OrientedPlane* anOrientedPlane = SMESH::OrientedPlane::New(myViewWindow);
+      anOrientedPlane->ShallowCopy(aClippingPlaneInfo.Plane);
+      SMESH::TPlane aTPlane( anOrientedPlane );
       SMESH::TPlaneData aPlaneData( aTPlane, aClippingPlaneInfo.ActorList );
       myPlanes.push_back( aPlaneData );
     }
@@ -1170,3 +1172,8 @@ void SMESHGUI_ClippingDlg::dumpPlaneData() const
   }
   printf( "----------------------------------\n" );
 }
+
+void SMESHGUI_ClippingDlg::onAutoApply(bool toggled)
+{
+  if ( toggled ) ClickOnApply();
+}
index 70bd03b89e0a6ed407f0267aa93a4d08f932ac0c..e8cb095f89fa7f8293ed2a402ad851333e15f2bf 100644 (file)
@@ -201,6 +201,7 @@ public slots:
   void                    onSelectOrientation( int );
   void                    SetCurrentPlaneParam();
   void                    OnPreviewToggle( bool );
+  void                    onAutoApply(bool);
   void                    ClickOnOk();
   void                    ClickOnCancel();
   void                    ClickOnApply();
index 0bb2fa5ef2bac0a06e1fdafb4cbc706ef3229c52..7bf81c56cca5918ccbd2a78f177abd3ba273a683 100644 (file)
@@ -337,15 +337,16 @@ namespace SMESH
   {
     QString text;
     switch ( errCode ) {
-      CASE2TEXT( COMPERR_OK            );
-      CASE2TEXT( COMPERR_BAD_INPUT_MESH);
-      CASE2TEXT( COMPERR_STD_EXCEPTION );
-      CASE2TEXT( COMPERR_OCC_EXCEPTION );
+      CASE2TEXT( COMPERR_OK               );
+      CASE2TEXT( COMPERR_BAD_INPUT_MESH   );
+      CASE2TEXT( COMPERR_STD_EXCEPTION    );
+      CASE2TEXT( COMPERR_OCC_EXCEPTION    );
     case SMESH::COMPERR_SLM_EXCEPTION: break; // avoid double "Salome exception"
-      CASE2TEXT( COMPERR_EXCEPTION     );
-      CASE2TEXT( COMPERR_MEMORY_PB     );
-      CASE2TEXT( COMPERR_BAD_SHAPE     );
-      CASE2TEXT( COMPERR_CANCELED      );
+      CASE2TEXT( COMPERR_EXCEPTION        );
+      CASE2TEXT( COMPERR_MEMORY_PB        );
+      CASE2TEXT( COMPERR_BAD_SHAPE        );
+      CASE2TEXT( COMPERR_CANCELED         );
+      CASE2TEXT( COMPERR_NO_MESH_ON_SHAPE );
     case SMESH::COMPERR_ALGO_FAILED:
       if ( strlen(comment) == 0 )
         text = QObject::tr("COMPERR_ALGO_FAILED");
@@ -550,6 +551,9 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
   myTable->hideColumn( COL_SHAPEID );
   myTable->hideColumn( COL_BAD_MESH );
   myTable->horizontalHeader()->setResizeMode( COL_ERROR, QHeaderView::Interactive );
+  myTable->setWordWrap( true );
+  myTable->horizontalHeader()->setStretchLastSection( true );
+  myTable->setMinimumWidth( 500 );
 
   QStringList headers;
   headers << tr( "COL_ALGO_HEADER" );
@@ -564,12 +568,12 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
   QGridLayout* grpLayout = new QGridLayout(myCompErrorGroup);
   grpLayout->setSpacing(SPACING);
   grpLayout->setMargin(MARGIN);
-  grpLayout->addWidget( myWarningLabel, 0, 0 );
-  grpLayout->addWidget( myTable,        1, 0, 4, 1 );
-  grpLayout->addWidget( myShowBtn,      1, 1 );
+  grpLayout->addWidget( myWarningLabel, 0, 0, 1, 4 );
+  grpLayout->addWidget( myTable,        1, 0, 1, 4 );
+  grpLayout->addWidget( myShowBtn,      2, 0 );
   grpLayout->addWidget( myPublishBtn,   2, 1 );
-  grpLayout->addWidget( myBadMeshBtn,   3, 1 );
-  grpLayout->setRowStretch( 4, 1 );
+  grpLayout->addWidget( myBadMeshBtn,   2, 2 );
+  grpLayout->setColumnStretch( 3, 1 );
 
   // Hypothesis definition errors
 
@@ -948,7 +952,8 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack,
   {
     bool onlyWarnings = !theNoCompError; // == valid mesh computed but there are errors reported
     for ( int i = 0; i < theCompErrors->length() && onlyWarnings; ++i )
-      onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING );
+      onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING ||
+                       theCompErrors[ i ].code == SMESH::COMPERR_NO_MESH_ON_SHAPE );
 
     // full or brief mesh info
     SMESH::long_array_var aRes = myMesh->GetMeshInfo();
@@ -1035,6 +1040,7 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack,
       }
       tbl->resizeColumnToContents( COL_ALGO );
       tbl->resizeColumnToContents( COL_SHAPE );
+      tbl->setWordWrap( true );
 
       if ( hasBadMesh )
         aCompDlg->myBadMeshBtn->show();
@@ -1142,13 +1148,13 @@ void SMESHGUI_BaseComputeOp::onShowBadMesh()
       SMESH::MeshPreviewStruct_var aMeshData = gen->GetBadInputElements(myMesh,curSub);
       vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3);
       vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
-      // delete property !!!!!!!!!!
       vtkProperty* prop = vtkProperty::New();
       prop->SetLineWidth( aLineWidth * 3 );
       prop->SetPointSize( aPointSize * 3 );
       prop->SetColor( 250, 0, 250 );
       myBadMeshDisplayer->GetActor()->SetProperty( prop );
       myBadMeshDisplayer->SetData( aMeshData._retn() );
+      prop->Delete();
     }
   }
 }
@@ -2084,6 +2090,7 @@ void SMESHGUI_BaseComputeOp::showEvaluateResult(const SMESH::long_array& theRes,
       }
       tbl->resizeColumnToContents( COL_ALGO );
       tbl->resizeColumnToContents( COL_SHAPE );
+      tbl->setWordWrap( true );
 
       if ( hasBadMesh )
         aCompDlg->myBadMeshBtn->show();
index a62d0b94993be4b23b7dcdf7e644cf7d431b31ec..a5575b8797bae2cfc2667da3d4755df98ca9817e 100644 (file)
 
 #include "SMESHGUI.h"
 #include "SMESHGUI_ConvToQuadDlg.h"
+#include "SMESHGUI_MeshEditPreview.h"
 #include "SMESHGUI_Utils.h"
-#include "SMDSAbs_ElementType.hxx"
-
+#include "SMESH_ActorUtils.h"
 #include "SMESH_TypeFilter.hxx"
+#include "SMDSAbs_ElementType.hxx"
 
 // SALOME GUI includes
 #include <LightApp_UpdateFlags.h>
 #include <SUIT_MessageBox.h>
 #include <SUIT_OverrideCursor.h>
 #include <SalomeApp_Tools.h>
+#include <SALOME_Actor.h>
 
 // IDL includes
 #include <SALOMEconfig.h>
 #include CORBA_SERVER_HEADER(SMESH_MeshEditor)
 
+// VTK includes
+#include <vtkProperty.h>
+
 //================================================================================
 /*!
  * \brief Constructor
@@ -53,7 +58,8 @@
 //================================================================================
 SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp()
   : SMESHGUI_SelectionOp(), 
-    myDlg( 0 )
+    myDlg( 0 ),
+    myBadElemsPreview(0)
 {
 }
 
@@ -64,8 +70,8 @@ SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp()
 //================================================================================
 SMESHGUI_ConvToQuadOp::~SMESHGUI_ConvToQuadOp()
 {
-  if ( myDlg )
-    delete myDlg;
+  if ( myDlg ) delete myDlg;
+  if ( myBadElemsPreview ) delete myBadElemsPreview;
 }
 
 //================================================================================
@@ -237,14 +243,47 @@ bool SMESHGUI_ConvToQuadOp::onApply()
     SMESH::SMESH_Mesh_var sourceMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pObj );  
     if( !myDlg->CurrentRB() )
     {
-      bool aParam = true;
+      bool force3d = true;
       if( myDlg->IsEnabledCheck() )
-        aParam = myDlg->IsMediumNdsOnGeom();
+        force3d = myDlg->IsMediumNdsOnGeom();
 
       if ( sourceMesh->_is_nil() )
-        aEditor->ConvertToQuadraticObject( aParam, idSource );
+        aEditor->ConvertToQuadraticObject( force3d, idSource );
       else
-        aEditor->ConvertToQuadratic( aParam );
+        aEditor->ConvertToQuadratic( force3d );
+
+      if ( !force3d )
+      {
+        SMESH::ComputeError_var error = aEditor->GetLastError();
+        if ( error->hasBadMesh )
+        {
+          if ( myBadElemsPreview ) delete myBadElemsPreview; // viewWindow may change
+          myBadElemsPreview = new SMESHGUI_MeshEditPreview( viewWindow() );
+          
+          vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3);
+          vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
+          vtkProperty* prop = vtkProperty::New();
+          prop->SetLineWidth( aLineWidth * 3 );
+          prop->SetPointSize( aPointSize * 3 );
+          prop->SetColor( 250, 0, 250 );
+          myBadElemsPreview->GetActor()->SetProperty( prop );
+          prop->Delete();
+
+          SMESH::MeshPreviewStruct_var previewData = aEditor->GetPreviewData();
+          myBadElemsPreview->SetData( & previewData.in() );
+          myBadElemsPreview->SetVisibility(true);
+
+          SUIT_MessageBox* mb = new SUIT_MessageBox(SUIT_MessageBox::Warning,
+                                                    tr( "SMESH_WRN_WARNING" ),
+                                                    tr("EDITERR_NO_MEDIUM_ON_GEOM"),
+                                                    SUIT_MessageBox::Ok, myDlg);
+          mb->setWindowModality( Qt::NonModal );
+          mb->setAttribute( Qt::WA_DeleteOnClose );
+          mb->show();
+          connect ( mb, SIGNAL( finished(int) ), this, SLOT( onWarningWinFinished() ));
+          //connect ( mb, SIGNAL( rejected() ), this, SLOT( onWarningWinFinished() ));
+        }
+      }
     }
     else
     {
@@ -272,6 +311,18 @@ bool SMESHGUI_ConvToQuadOp::onApply()
   return aResult;
 }
 
+//================================================================================
+/*!
+ * \brief SLOT called when a warning window is closed
+ */
+//================================================================================
+
+void SMESHGUI_ConvToQuadOp::onWarningWinFinished()
+{
+  if ( myBadElemsPreview )
+    myBadElemsPreview->SetVisibility(false);
+}
+
 //================================================================================
 /*! ConsistMesh
  *  Determines, what elements this mesh contains. 
index 9e2cbb1298941da564a5c71a40e91d11d112165f..ba30b15e15b7b9b59f4dc8f433a85221a28dbf43 100644 (file)
@@ -37,6 +37,7 @@
 #include CORBA_SERVER_HEADER(SMESH_Mesh)
 
 class SMESHGUI_ConvToQuadDlg;
+class SMESHGUI_MeshEditPreview;
 
 class SMESHGUI_EXPORT SMESHGUI_ConvToQuadOp : public SMESHGUI_SelectionOp
 { 
@@ -60,9 +61,11 @@ protected:
 protected slots:
   virtual bool                   onApply();
   void                           ConnectRadioButtons( int );
+  void                           onWarningWinFinished();
 
 private:
   SMESHGUI_ConvToQuadDlg*        myDlg;
+  SMESHGUI_MeshEditPreview*      myBadElemsPreview;
 };
 
 #endif // SMESHGUI_CONVTOQUADOP_H
index ffc22ecdbfdd9631aecb99e61681edf005265ee6..73eae4dd247ec919a481138ca35ed4c8fc85b0f5 100644 (file)
@@ -458,12 +458,12 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnApply()
       int idx = 0;
       if( addToGroup ) {
         aGroupName = ComboBox_GroupName->currentText();
-        for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+        for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
           QString aName = ComboBox_GroupName->itemText( i );
           if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
             idx = i;
         }
-        if ( idx > 0 && idx < myGroups.count() ) {
+        if ( idx > 0 && idx <= myGroups.count() ) {
           SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
           if ( !aGeomGroup->_is_nil() ) {
             int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
index c75af4f45bfd259a32b7b205f1a5f5d02ef2a2ce..fa367fd510ea421b7f88718e342b4df85053d1cd 100644 (file)
@@ -280,15 +280,22 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
   mySMESHGUI->SetActiveDialogBox(this);
 
   // Costruction of the logical filter for the elements: mesh/sub-mesh/group
-  SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
-  SMESH_TypeFilter* aSmeshGroupFilter    = new SMESH_TypeFilter (GROUP);
-
   QList<SUIT_SelectionFilter*> aListOfFilters;
-  if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
-  if (aSmeshGroupFilter)    aListOfFilters.append(aSmeshGroupFilter);
-
-  myMeshOrSubMeshOrGroupFilter =
-    new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
+  aListOfFilters.append(new SMESH_TypeFilter (MESH));
+  aListOfFilters.append(new SMESH_TypeFilter (SUBMESH_VERTEX));
+  aListOfFilters.append(new SMESH_TypeFilter (GROUP_NODE));
+  myMeshOrSubMeshOrGroupFilter0D =
+    new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
+  aListOfFilters[0] = new SMESH_TypeFilter (MESH);
+  aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_EDGE);
+  aListOfFilters[2] = new SMESH_TypeFilter (GROUP_EDGE);
+  myMeshOrSubMeshOrGroupFilter1D =
+    new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
+  aListOfFilters[0] = new SMESH_TypeFilter (MESH);
+  aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_FACE);
+  aListOfFilters[2] = new SMESH_TypeFilter (GROUP_FACE);
+  myMeshOrSubMeshOrGroupFilter2D =
+    new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
 
   myHelpFileName = "extrusion_page.html";
 
@@ -351,6 +358,9 @@ SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg()
     myFilterDlg->setParent( 0 );
     delete myFilterDlg;
   }
+  if ( myMeshOrSubMeshOrGroupFilter0D ) delete myMeshOrSubMeshOrGroupFilter0D;
+  if ( myMeshOrSubMeshOrGroupFilter1D ) delete myMeshOrSubMeshOrGroupFilter1D;
+  if ( myMeshOrSubMeshOrGroupFilter2D ) delete myMeshOrSubMeshOrGroupFilter2D;
 }
 
 //=================================================================================
@@ -898,31 +908,38 @@ void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
 
   if (send == SelectElementsButton) {
     myEditCurrentArgument = (QWidget*)LineEditElements;
-    if (CheckBoxMesh->isChecked()) {
+    if (CheckBoxMesh->isChecked())
+    {
       if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
         aViewWindow->SetSelectionMode(ActorSelection);
-      mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
-    } else {
+      switch( GetConstructorId() ) {
+      case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
+      case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
+      case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
+      }
+    }
+    else
+    {
       int aConstructorId = GetConstructorId();
       switch(aConstructorId) {
-          case 0:
-          {   
-            if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-              aViewWindow->SetSelectionMode(NodeSelection);
-            break;
-          }
-          case 1:
-          {
-            if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
-              aViewWindow->SetSelectionMode(EdgeSelection);
-            break;
-          }
-          case 2:
-          {
-            if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+      case 0:
+        {
+          if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+            aViewWindow->SetSelectionMode(NodeSelection);
+          break;
+        }
+      case 1:
+        {
+          if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+            aViewWindow->SetSelectionMode(EdgeSelection);
+          break;
+        }
+      case 2:
+        {
+          if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
             aViewWindow->SetSelectionMode(FaceSelection);
-            break;
-          }
+          break;
+        }
       }
     }
   }
@@ -1028,13 +1045,20 @@ void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh)
 
   mySelectionMgr->clearFilters();
 
-  if (toSelectMesh) {
+  if (toSelectMesh)
+  {
     if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
       aViewWindow->SetSelectionMode(ActorSelection);
-    mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
+    switch( GetConstructorId() ) {
+    case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
+    case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
+    case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
+    }
     LineEditElements->setReadOnly(true);
     LineEditElements->setValidator(0);
-  } else {
+  }
+  else
+  {
     int aConstructorId = GetConstructorId();
     switch(aConstructorId) {
       case 0:
index dd0b741a0a178ba1ff44ff7cdd5c9d52909b4bfb..330951397bd9a219e8e1ffdde7de4ac13e158bd3 100644 (file)
@@ -94,7 +94,9 @@ private:
   SMESH::long_array_var            myElementsId;
   SMESH_Actor*                     myActor;
   Handle(SALOME_InteractiveObject) myIO;
-  SUIT_SelectionFilter*            myMeshOrSubMeshOrGroupFilter;
+  SUIT_SelectionFilter*            myMeshOrSubMeshOrGroupFilter0D;
+  SUIT_SelectionFilter*            myMeshOrSubMeshOrGroupFilter1D;
+  SUIT_SelectionFilter*            myMeshOrSubMeshOrGroupFilter2D;
 
   // widgets
   QGroupBox*                       ConstructorsBox;
index ac756a16c204484bcd135d8473fcb041d5b640d4..d29ae2c82a064b9d19c6b322ac2adb369bfc9851 100755 (executable)
@@ -2647,18 +2647,18 @@ SMESHGUI_FilterDlg::~SMESHGUI_FilterDlg()
 // name    : SMESHGUI_FilterDlg::Init
 // Purpose : Init dialog fields, connect signals and slots, show dialog
 //=======================================================================
-void SMESHGUI_FilterDlg::Init (const int type)
+void SMESHGUI_FilterDlg::Init (const int type, const bool setInViewer)
 {
   QList<int> aTypes;
   aTypes.append(type);
-  Init(aTypes);
+  Init(aTypes,setInViewer);
 }
 
 //=======================================================================
 // name    : SMESHGUI_FilterDlg::Init
 // Purpose : Init dialog fields, connect signals and slots, show dialog
 //=======================================================================
-void SMESHGUI_FilterDlg::Init (const QList<int>& theTypes)
+void SMESHGUI_FilterDlg::Init (const QList<int>& theTypes, const bool setInViewer)
 {
   mySourceWg  = 0;
   myTypes     = theTypes;
@@ -2713,7 +2713,7 @@ void SMESHGUI_FilterDlg::Init (const QList<int>& theTypes)
   if (myInsertState.contains(theTypes.first()))
     mySetInViewer->setChecked(myInsertState[ theTypes.first() ]);
   else
-    mySetInViewer->setChecked(true);
+    mySetInViewer->setChecked(setInViewer);
 
   mySourceGrp->button(myApplyToState.contains(theTypes.first()) ? 
                       myApplyToState[ theTypes.first() ] :
@@ -3008,7 +3008,7 @@ bool SMESHGUI_FilterDlg::isValid() const
 
 //=======================================================================
 // name    : SMESHGUI_FilterDlg::SetSourceWg
-// Purpose : Set widget of parent dialog containing idsto be filtered if
+// Purpose : Set widget of parent dialog containing ids to be filtered if
 //           user select corresponding source radio button
 //=======================================================================
 void SMESHGUI_FilterDlg::SetSourceWg (QWidget* theWg,
@@ -3501,6 +3501,8 @@ void SMESHGUI_FilterDlg::updateSelection()
   }
   else
   {
+    mySelector->SetSelectionMode( getSelMode( myTable->GetType() ));
+
     if (myIsSelectionChanged) {
       // mySelectionMgr->installFilter( new GEOM_TypeFilter( aStudy, -1 ) ); // This filter deactivates selection
       // Impossible to select any object in the OB on the second opening of FilterDlg
index ace63067b59751f912c7beeff57716d469e2ac38..4501a9d373272a881efcab610c8354b2c9381a04 100755 (executable)
@@ -222,8 +222,8 @@ public:
   SMESHGUI_FilterDlg( SMESHGUI*, const int );
   virtual ~SMESHGUI_FilterDlg();
 
-  void                      Init( const QList<int>& );
-  void                      Init( const int );
+  void                      Init( const QList<int>&, const bool setInViewer=true );
+  void                      Init( const int, const bool setInViewer=true );
 
   void                      SetSelection();
   void                      SetMesh (SMESH::SMESH_Mesh_var);
index 10995de1942a6c74074942ad7e8ebf7c27e5fddd..668681496edb16bd69f4842a2bd94fbadc20c4c1 100644 (file)
@@ -805,7 +805,7 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
       if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : EdgeSelection);
       break;
     case grpBallSelection:
-      //if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : BallSelection);
+      if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : BallSelection);
       break;
     case grpFaceSelection:
       if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : FaceSelection);
@@ -1126,17 +1126,21 @@ bool SMESHGUI_GroupDlg::onApply()
       if ( aMeshGroupSO )
         if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
           anActor->setName(myName->text().toLatin1().data());
+         QColor c;
+         int delta;
           switch ( myTypeId ) {
           case grpNodeSelection:   anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
           case grpBallSelection:   anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break;
           case grpEdgeSelection:   anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
-          case grpFaceSelection:   
           case grpVolumeSelection: 
+              SMESH::GetColor("SMESH", "volume_color", c , delta, "255,0,170|-100");
+              anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break;          
+             break;
+          case grpFaceSelection:   
           default:
-              QColor c;
-              int delta;
               SMESH::GetColor("SMESH", "fill_color", c , delta, "0,170,255|-100");
               anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta ); break;          
+             break;
           }
         }
     }
@@ -1759,7 +1763,7 @@ void SMESHGUI_GroupDlg::onAdd()
     break;
   case grpBallSelection:
     aType = SMESH::BALL;
-    //mySelector->SetSelectionMode(BallSelection);
+    mySelector->SetSelectionMode(BallSelection);
     break;
   case grpEdgeSelection:
     aType = SMESH::EDGE;
@@ -2438,7 +2442,7 @@ void SMESHGUI_GroupDlg::setDefaultGroupColor()
   if( !isAutoColor )
   {
     int r = 0, g = 0, b = 0;
-    SMESH::GetColor( "SMESH", "fill_color", r, g, b, QColor( 0, 170, 255 ) );
+    SMESH::GetColor( "SMESH", "default_grp_color", r, g, b, QColor( 255, 170, 0 ) );
     aQColor.setRgb( r, g, b );
   }
   else
index 2bfdd1bc948ed16c0d4ad93b626c8138eb087201..e62b015c2f53d0b0221642f1294a0cc3dbb6fc61 100644 (file)
@@ -353,10 +353,10 @@ bool SMESHGUI_GroupOnShapeOp::onApply()
           anEntryList.append( aSObject->GetID().c_str() );
     }
   }
-  update( UF_ObjBrowser | UF_Model );
-
   SMESHGUI::Modified();
 
+  update( UF_ObjBrowser | UF_Model );
+
   // Re-init controls to create the next group
   myElemGeoIDs.clear();
   myNodeGeoIDs.clear();
@@ -367,8 +367,6 @@ bool SMESHGUI_GroupOnShapeOp::onApply()
   myDlg->myNodeGeomBtn->setChecked(false);
   myDlg->updateButtons();
 
-  update( UF_ObjBrowser | UF_Model );
-
   if( LightApp_Application* anApp =
       dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
     anApp->browseObjects( anEntryList, isApplyAndClose() );
index 3d0baf890b2b1d0a856a8d01e474407cce0ff9e0..c42a940d42b86f20858508d74fe75298c74592c3 100644 (file)
@@ -653,10 +653,10 @@ void SMESHGUI_HypothesisDlg::onHelp()
     if(myCreator) {
       QVariant pluginName = myCreator->property( PLUGIN_NAME );
       if( pluginName.isValid() ) {
-       QString rootDir = pluginName.toString() + "PLUGIN_ROOT_DIR";
-       QString varValue = QString( getenv(rootDir.toLatin1().constData()));
-       if(!varValue.isEmpty())
-         name = pluginName.toString() + "PLUGIN";
+        QString rootDir = pluginName.toString() + "PLUGIN_ROOT_DIR";
+        QString varValue = QString( getenv(rootDir.toLatin1().constData()));
+        if(!varValue.isEmpty())
+          name = pluginName.toString() + "PLUGIN";
       }
     }    
     app->onHelpContextModule(name, myHelpFileName);
index d7e3e6ce685f63dad94af3d2e0016404a1ae7048..fde2ae60951f9965bf5af25aecd8ef3f8698d3a5 100644 (file)
@@ -452,11 +452,11 @@ namespace SMESH
               // BUG 0020378
               //myHypCreatorMap[aHypType] = aCreator;
 
-             //rnv : This dynamic property of the QObject stores the name of the plugin.
-             //      It is used to obtain plugin root dir environment variable
+              //rnv : This dynamic property of the QObject stores the name of the plugin.
+              //      It is used to obtain plugin root dir environment variable
               //      in the SMESHGUI_HypothesisDlg class. Plugin root dir environment 
-             //      variable is used to display documentation.
-             aCreator->setProperty(PLUGIN_NAME,aHypData->PluginName);
+              //      variable is used to display documentation.
+              aCreator->setProperty(PLUGIN_NAME,aHypData->PluginName);
             }
           }
         }
index 17f653938d46537dcdbbc4f6d0a356c1c95d00a4..a56fa2c5ebba76aa07350bc885e647729a72a11b 100644 (file)
@@ -319,6 +319,15 @@ SMESHGUI_MeshInfosBox::SMESHGUI_MeshInfosBox(const bool full, QWidget* theParent
     my0DElem = new QLabel( this );
     l->addWidget( my0DElem,      row, 1 );
 
+    // balls
+    row = l->rowCount();         // retrieve current row count
+    // --
+    lab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_BALLS")), this );
+    l->addWidget( lab,           row, 0 );
+    // --
+    myBall = new QLabel( this );
+    l->addWidget( myBall,        row, 1 );
+
     addSeparator(this);          // add separator
 
     // edges
index 3f369e79009ffb1b976f3f77e71ff8c940b4d113..d82ec9c1d8aaaae1d3627a0783f13faa9543ba81 100644 (file)
@@ -452,12 +452,12 @@ bool SMESHGUI_NodesDlg::ClickOnApply()
   int idx = 0;
   if( addToGroup ) {
     aGroupName = ComboBox_GroupName->currentText();
-    for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+    for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
       QString aName = ComboBox_GroupName->itemText( i );
       if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
         idx = i;
     }
-    if ( idx > 0 && idx < myGroups.count() ) {
+    if ( idx > 0 && idx <= myGroups.count() ) {
       SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
       if ( !aGeomGroup->_is_nil() ) {
         int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx
deleted file mode 100644 (file)
index c7b6d5e..0000000
+++ /dev/null
@@ -1,570 +0,0 @@
-// 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
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_Preferences_ColorDlg.cxx
-// Author : Nicolas REJNERI, Open CASCADE S.A.S.
-// SMESH includes
-//
-#include "SMESHGUI_Preferences_ColorDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_SpinBox.h"
-#include "SMESHGUI_Utils.h"
-
-// SALOME GUI includes
-#include <SUIT_Desktop.h>
-#include <SUIT_MessageBox.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_Session.h>
-#include <QtxColorButton.h>
-#include <VTKViewer_MarkerWidget.h>
-#include <LightApp_Application.h>
-#include <SalomeApp_IntSpinBox.h>
-
-// Qt includes
-#include <QGroupBox>
-#include <QLabel>
-#include <QPushButton>
-#include <QVBoxLayout>
-#include <QHBoxLayout>
-#include <QGridLayout>
-#include <QCheckBox>
-#include <QKeyEvent>
-
-#define SPACING 6
-#define MARGIN  11
-
-//=================================================================================
-// function : SMESHGUI_Preferences_ColorDlg()
-// purpose  : Constructs a SMESHGUI_Preferences_ColorDlg which is a child
-//            of 'parent', with the name 'name' and widget flags set to 'f'
-//            The dialog will by default be modeless, unless you
-//            set'modal' to true to construct a modal dialog.
-//=================================================================================
-SMESHGUI_Preferences_ColorDlg::SMESHGUI_Preferences_ColorDlg( SMESHGUI* theModule )
-  : QDialog( SMESH::GetDesktop( theModule ) ),
-    mySMESHGUI( theModule )
-{
-  setModal( true );
-  setWindowTitle( tr( "DIALOG_TITLE" ) );
-  setSizeGripEnabled( true );
-
-  // -------------------------------
-  QVBoxLayout* topLayout = new QVBoxLayout( this );
-  topLayout->setSpacing( SPACING );
-  topLayout->setMargin( MARGIN );
-
-  // -------------------------------
-  QGroupBox* ButtonGroup1 = new QGroupBox( tr( "GRP_ELEMENTS" ), this );
-  QGridLayout* ButtonGroup1Layout = new QGridLayout( ButtonGroup1 );
-  ButtonGroup1Layout->setSpacing( SPACING );
-  ButtonGroup1Layout->setMargin( MARGIN );
-
-  QLabel* TextLabel_Fill = new QLabel( tr( "SURFACE_COLOR_LBL" ), ButtonGroup1 );
-
-  toolSurfColor = new QtxBiColorTool(ButtonGroup1);
-  toolSurfColor->setText( tr( "BACKSURFACE_COLOR_LBL" ));
-
-  QLabel* TextLabel_Outline = new QLabel( tr( "OUTLINE_COLOR_LBL" ), ButtonGroup1 );
-  btnOutlineColor = new QtxColorButton( ButtonGroup1 );
-
-  QLabel* TextLabel_Wireframe = new QLabel( tr( "WIREFRAME_COLOR_LBL" ), ButtonGroup1 );
-  btnWireframeColor = new QtxColorButton( ButtonGroup1 );
-
-  QLabel* TextLabel_0DElements_Color = new QLabel( tr( "0D_ELEMENTS_COLOR_LBL" ), ButtonGroup1 );
-  btn0DElementsColor = new QtxColorButton( ButtonGroup1 );
-
-  QLabel* TextLabel_0DElements_Size = new QLabel( tr( "0D_ELEMENTS_SIZE_LBL" ), ButtonGroup1 );
-  SpinBox_0DElements_Size = new SalomeApp_IntSpinBox( ButtonGroup1 );
-  SpinBox_0DElements_Size->setAcceptNames( false ); // No Notebook variables allowed
-  SpinBox_0DElements_Size->setRange( 1, 10 );
-  SpinBox_0DElements_Size->setSingleStep( 1 );
-  SpinBox_0DElements_Size->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
-  SpinBox_0DElements_Size->setButtonSymbols( QSpinBox::PlusMinus );
-
-  QLabel* TextLabel_BallElem_Color = new QLabel( tr( "0D_ELEMENTS_COLOR_LBL" ), ButtonGroup1 );
-  btnBallElemColor = new QtxColorButton( ButtonGroup1 );
-
-  QLabel* TextLabel_BallElem_Size = new QLabel( tr( "BALLELEM_SIZE_LBL" ), ButtonGroup1 );
-  SpinBox_BallElem_Size = new SalomeApp_IntSpinBox( ButtonGroup1 );
-  SpinBox_BallElem_Size->setAcceptNames( false ); // No Notebook variables allowed
-  SpinBox_BallElem_Size->setRange( 1, 10 );
-  SpinBox_BallElem_Size->setSingleStep( 1 );
-  SpinBox_BallElem_Size->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
-  SpinBox_BallElem_Size->setButtonSymbols( QSpinBox::PlusMinus );
-
-  QLabel* TextLabel_Width = new QLabel( tr( "LINE_WIDTH_LBL" ), ButtonGroup1 );
-  SpinBox_Width = new SalomeApp_IntSpinBox( ButtonGroup1 );
-  SpinBox_Width->setAcceptNames( false ); // No Notebook variables allowed
-  SpinBox_Width->setRange( 1, 5 );
-  SpinBox_Width->setSingleStep( 1 );
-  SpinBox_Width->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
-  SpinBox_Width->setButtonSymbols( QSpinBox::PlusMinus );
-
-  QLabel* TextLabel_ShrinkCoeff = new QLabel( tr( "SHRINK_COEF_LBL" ), ButtonGroup1 );
-  SpinBox_Shrink = new SalomeApp_IntSpinBox( ButtonGroup1 );
-  SpinBox_Shrink->setAcceptNames( false ); // No Notebook variables allowed
-  SpinBox_Shrink->setRange( 20, 100 );
-  SpinBox_Shrink->setSingleStep( 1 );
-  SpinBox_Shrink->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
-  SpinBox_Shrink->setButtonSymbols( QSpinBox::PlusMinus );
-
-  ButtonGroup1Layout->addWidget( TextLabel_Fill,             0, 0 );
-  ButtonGroup1Layout->addWidget( toolSurfColor,              0, 1, 1, 3 );
-
-  ButtonGroup1Layout->addWidget( TextLabel_Outline,          1, 0 );
-  ButtonGroup1Layout->addWidget( btnOutlineColor,            1, 1 );
-  ButtonGroup1Layout->addWidget( TextLabel_Wireframe,        1, 2 );
-  ButtonGroup1Layout->addWidget( btnWireframeColor,         1, 3 );
-
-  ButtonGroup1Layout->addWidget( TextLabel_0DElements_Color, 2, 0 );
-  ButtonGroup1Layout->addWidget( btn0DElementsColor,         2, 1 );
-
-  ButtonGroup1Layout->addWidget( TextLabel_0DElements_Size,  2, 2 );
-  ButtonGroup1Layout->addWidget( SpinBox_0DElements_Size,    2, 3 );
-
-  ButtonGroup1Layout->addWidget( TextLabel_BallElem_Color, 2, 0 );
-  ButtonGroup1Layout->addWidget( btnBallElemColor,         2, 1 );
-
-  ButtonGroup1Layout->addWidget( TextLabel_BallElem_Size,  2, 2 );
-  ButtonGroup1Layout->addWidget( SpinBox_BallElem_Size,    2, 3 );
-
-  ButtonGroup1Layout->addWidget( TextLabel_Width,            3, 0 );
-  ButtonGroup1Layout->addWidget( SpinBox_Width,              3, 1 );
-  ButtonGroup1Layout->addWidget( TextLabel_ShrinkCoeff,      3, 2 );
-  ButtonGroup1Layout->addWidget( SpinBox_Shrink,             3, 3 );
-
-  // -------------------------------
-  QGroupBox* ButtonGroup2 = new QGroupBox( tr( "GRP_NODES" ), this );
-  QGridLayout* ButtonGroup2Layout = new QGridLayout( ButtonGroup2 );
-  ButtonGroup2Layout->setSpacing( SPACING );
-  ButtonGroup2Layout->setMargin( MARGIN );
-
-  QLabel* TextLabel_Nodes_Color = new QLabel( tr( "NODES_COLOR_LBL" ), ButtonGroup2 );
-  btnNodeColor = new QtxColorButton( ButtonGroup2 );
-
-  QGroupBox* MarkerGroup = new QGroupBox( tr( "NODES_MARKER_LBL" ), ButtonGroup2 );
-  QVBoxLayout* MarkerGroupLayout = new QVBoxLayout( MarkerGroup );
-  MarkerGroupLayout->setSpacing( 0 );
-  MarkerGroupLayout->setMargin( 0 );
-
-  MarkerWidget = new VTKViewer_MarkerWidget( MarkerGroup );
-
-  MarkerGroupLayout->addWidget( MarkerWidget );
-
-  ButtonGroup2Layout->addWidget( TextLabel_Nodes_Color, 0, 0 );
-  ButtonGroup2Layout->addWidget( btnNodeColor,          0, 1 );
-  ButtonGroup2Layout->addWidget( MarkerGroup,           1, 0, 1, 3 );
-  ButtonGroup2Layout->setColumnStretch( 2, 1 );
-
-  // -------------------------------
-  QGroupBox* ButtonGroup3 = new QGroupBox( tr( "GRP_ORIENTATION" ), this );
-  QGridLayout* ButtonGroup3Layout = new QGridLayout( ButtonGroup3 );
-  ButtonGroup3Layout->setSpacing( SPACING );
-  ButtonGroup3Layout->setMargin( MARGIN );
-
-  QLabel* TextLabel_Orientation_Color = new QLabel( tr( "ORIENTATION_COLOR_LBL" ), ButtonGroup3 );
-  btnOrientationColor = new QtxColorButton( ButtonGroup3 );
-
-  QLabel* TextLabel_Orientation_Scale = new QLabel( tr( "ORIENTATION_SCALE_LBL" ), ButtonGroup3 );
-  SpinBox_Orientation_Scale = new SMESHGUI_SpinBox( ButtonGroup3 );
-  SpinBox_Orientation_Scale->setAcceptNames( false ); // No Notebook variables allowed
-  SpinBox_Orientation_Scale->RangeStepAndValidator( .05, .5, .05, "parametric_precision" );
-  SpinBox_Orientation_Scale->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
-  SpinBox_Orientation_Scale->setButtonSymbols( QSpinBox::PlusMinus );
-
-  CheckBox_Orientation_3DVectors = new QCheckBox( tr( "3D_VECTORS_LBL" ), ButtonGroup3 );
-
-  ButtonGroup3Layout->addWidget( TextLabel_Orientation_Color,    0, 0 );
-  ButtonGroup3Layout->addWidget( btnOrientationColor,            0, 1 );
-  ButtonGroup3Layout->addWidget( TextLabel_Orientation_Scale,    0, 2 );
-  ButtonGroup3Layout->addWidget( SpinBox_Orientation_Scale,      0, 3 );
-  ButtonGroup3Layout->addWidget( CheckBox_Orientation_3DVectors, 1, 0, 1, 4 );
-
-  // -------------------------------
-  QGroupBox* ButtonGroup4 = new QGroupBox( tr( "GRP_SELECTION" ), this );
-  QGridLayout* ButtonGroup4Layout = new QGridLayout( ButtonGroup4 );
-  ButtonGroup3Layout->setSpacing( SPACING );
-  ButtonGroup3Layout->setMargin( MARGIN );
-  
-  QLabel* TextLabel_Selection_Color = new QLabel( tr( "SELECTION_COLOR_LBL" ), ButtonGroup4 );
-  btnSelectionColor = new QtxColorButton( ButtonGroup4 );
-  
-  QLabel* TextLabel_Preselection_Color = new QLabel( tr( "PRESELECTION_COLOR_LBL" ), ButtonGroup4 );
-  btnPreselectionColor = new QtxColorButton( ButtonGroup4 );
-  
-  ButtonGroup4Layout->addWidget( TextLabel_Selection_Color,      0, 0 );
-  ButtonGroup4Layout->addWidget( btnSelectionColor,              0, 1 );
-  ButtonGroup4Layout->addWidget( TextLabel_Preselection_Color,   0, 2 );
-  ButtonGroup4Layout->addWidget( btnPreselectionColor,           0, 3 );
-
-  // -------------------------------
-  QGroupBox* GroupButtons = new QGroupBox( this );
-  QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons );
-  GroupButtonsLayout->setSpacing( SPACING );
-  GroupButtonsLayout->setMargin( MARGIN );
-
-  QPushButton* buttonOk = new QPushButton( tr( "SMESH_BUT_OK" ), GroupButtons );
-  buttonOk->setAutoDefault( true );
-  buttonOk->setDefault( true );
-
-  QPushButton* buttonCancel = new QPushButton( tr( "SMESH_BUT_CANCEL" ), GroupButtons );
-  buttonCancel->setAutoDefault( true );
-
-  QPushButton* buttonHelp = new QPushButton( tr( "SMESH_BUT_HELP" ), GroupButtons );
-  buttonHelp->setAutoDefault( true );
-
-  GroupButtonsLayout->addWidget( buttonOk );
-  GroupButtonsLayout->addSpacing( 10 );
-  GroupButtonsLayout->addStretch();
-  GroupButtonsLayout->addWidget( buttonCancel );
-  GroupButtonsLayout->addWidget( buttonHelp );
-
-  // -------------------------------
-  topLayout->addWidget( ButtonGroup1 );
-  topLayout->addWidget( ButtonGroup2 );
-  topLayout->addWidget( ButtonGroup3 );
-  //  rnv: Selection and preselection colors are defined only in the Preferences 
-  //  topLayout->addWidget( ButtonGroup4 );
-  ButtonGroup4->hide();
-  topLayout->addWidget( GroupButtons );
-
-  // -------------------------------
-  mySMESHGUI->SetActiveDialogBox( this );
-
-  myHelpFileName = "colors_size_page.html";
-
-  /* signals and slots connections */
-  connect( buttonOk,     SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
-  connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) );
-  connect( buttonHelp,   SIGNAL( clicked() ), this, SLOT( ClickOnHelp() ) );
-
-  connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ),
-           this,       SLOT( DeactivateActiveDialog() ) );
-  /* to close dialog if study change */
-  connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ),
-           this,       SLOT( ClickOnCancel() ) );
-}
-
-//=================================================================================
-// function : ~SMESHGUI_Preferences_ColorDlg()
-// purpose  : Destructor
-//=================================================================================
-SMESHGUI_Preferences_ColorDlg::~SMESHGUI_Preferences_ColorDlg()
-{
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnOk()
-{
-  mySMESHGUI->ResetState();
-  accept();
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnCancel()
-{
-  mySMESHGUI->ResetState();
-  reject();
-}
-
-//=================================================================================
-// function : ClickOnHelp()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnHelp()
-{
-  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
-  if (app) 
-    app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
-  else {
-    QString platform;
-#ifdef WIN32
-    platform = "winapplication";
-#else
-    platform = "application";
-#endif
-    SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
-                             tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
-                             arg(app->resourceMgr()->stringValue("ExternalBrowser", 
-                                                                 platform)).
-                             arg(myHelpFileName));
-  }
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::DeactivateActiveDialog()
-{
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::closeEvent( QCloseEvent* )
-{
-  ClickOnCancel(); /* same than click on cancel button */
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ActivateThisDialog()
-{
-  /* Emit a signal to deactivate any active dialog */
-  mySMESHGUI->EmitSignalDeactivateDialog();
-}
-
-//=================================================================================
-// function : SetColor()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetColor( int type, const QColor& color )
-{
-  switch ( type ) {
-  case 1 : toolSurfColor->setMainColor( color );     break; // fill
-  case 2 : btnWireframeColor->setColor( color );     break; // wireframe
-  case 3 : btnNodeColor->setColor( color );          break; // node
-  case 4 : btnOutlineColor->setColor( color );       break; // outline
-  case 5 : btn0DElementsColor->setColor( color );    break; // 0d elements
-  case 6 : btnBallElemColor->setColor( color );      break; // ball elements
-  case 7 : btnOrientationColor->setColor( color );   break; // orientation of faces
-  case 8 : btnSelectionColor->setColor( color );     break; // selection color
-  case 9 : btnPreselectionColor->setColor( color );  break; // pre-selection color
-  default: break;
-  }
-}
-
-//=================================================================================
-// function : GetColor()
-// purpose  :
-//=================================================================================
-QColor SMESHGUI_Preferences_ColorDlg::GetColor( int type )
-{
-  QColor color;
-  switch ( type ) {
-  case 1 : color = toolSurfColor->mainColor();    break; // fill
-  case 2 : color = btnWireframeColor->color();    break; // outline
-  case 3 : color = btnNodeColor->color();         break; // node
-  case 4 : color = btnOutlineColor->color();      break; // node
-  case 5 : color = btn0DElementsColor->color();   break; // 0d elements
-  case 6 : color = btnBallElemColor->color();   break; // 0d elements
-  case 7 : color = btnOrientationColor->color();  break; // orientation of faces
-  case 8 : color = btnSelectionColor->color();    break; // selection color
-  case 9 : color = btnPreselectionColor->color(); break; // pre-selection color
-
-  default: break;
-  }
-  return color;
-}
-
-//=================================================================================
-// function : SetIntValue()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetIntValue( int type, int value )
-{
-  switch ( type ) {
-  case 1 : SpinBox_Width->setValue( value );           break; // width
-  case 2 : SpinBox_Shrink->setValue( value );          break; // shrink coeff
-  case 3 : SpinBox_0DElements_Size->setValue( value ); break; // 0d elements
-  case 4 : SpinBox_BallElem_Size->setValue( value ); break; // 0d elements
-  default: break;
-  }
-}
-
-//=================================================================================
-// function : GetIntValue()
-// purpose  :
-//=================================================================================
-int SMESHGUI_Preferences_ColorDlg::GetIntValue( int type )
-{
-  int res = 0;
-  switch ( type ) {
-  case 1 : res = SpinBox_Width->value();           break; // width
-  case 2 : res = SpinBox_Shrink->value();          break; // shrink coeff
-  case 3 : res = SpinBox_0DElements_Size->value(); break; // 0d elements
-  case 4 : res = SpinBox_BallElem_Size->value(); break; // 0d elements
-  default: break;
-  }
-  return res;
-}
-
-//=================================================================================
-// function : SetDoubleValue()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetDoubleValue( int type, double value )
-{
-  switch ( type ) {
-  case 1 : SpinBox_Orientation_Scale->setValue( value ); break; // orientation scale
-  default: break;
-  }
-}
-
-//=================================================================================
-// function : GetDoubleValue()
-// purpose  :
-//=================================================================================
-double SMESHGUI_Preferences_ColorDlg::GetDoubleValue( int type )
-{
-  double res = 0;
-  switch ( type ) {
-  case 1 : res = SpinBox_Orientation_Scale->value(); break; // orientation scale
-  default: break;
-  }
-  return res;
-}
-
-//=================================================================================
-// function : SetBooleanValue()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetBooleanValue( int type, bool value )
-{
-  switch ( type ) {
-  case 1 : CheckBox_Orientation_3DVectors->setChecked( value ); break; // 3D vectors
-  default: break;
-  }
-}
-
-//=================================================================================
-// function : GetBooleanValue()
-// purpose  :
-//=================================================================================
-bool SMESHGUI_Preferences_ColorDlg::GetBooleanValue( int type )
-{
-  bool res = false;
-  switch ( type ) {
-  case 1 : res = CheckBox_Orientation_3DVectors->isChecked(); break; // 3D vectors
-  default: break;
-  }
-  return res;
-}
-
-//=================================================================================
-// function : setCustomMarkerMap()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::setCustomMarkerMap( VTK::MarkerMap theMarkerMap )
-{
-  MarkerWidget->setCustomMarkerMap( theMarkerMap );
-}
-
-//=================================================================================
-// function : getCustomMarkerMap()
-// purpose  :
-//=================================================================================
-VTK::MarkerMap SMESHGUI_Preferences_ColorDlg::getCustomMarkerMap()
-{
-  return MarkerWidget->getCustomMarkerMap();
-}
-
-//=================================================================================
-// function : setStandardMarker()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::setStandardMarker( VTK::MarkerType theMarkerType,
-                                                       VTK::MarkerScale theMarkerScale )
-{
-  MarkerWidget->setStandardMarker( theMarkerType, theMarkerScale );
-}
-
-//=================================================================================
-// function : setCustomMarker()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::setCustomMarker( int theId )
-{
-  MarkerWidget->setCustomMarker( theId );
-}
-
-//=================================================================================
-// function : getMarkerType()
-// purpose  :
-//=================================================================================
-VTK::MarkerType SMESHGUI_Preferences_ColorDlg::getMarkerType() const
-{
-  return MarkerWidget->getMarkerType();
-}
-
-//=================================================================================
-// function : getStandardMarkerScale()
-// purpose  :
-//=================================================================================
-VTK::MarkerScale SMESHGUI_Preferences_ColorDlg::getStandardMarkerScale() const
-{
-  return MarkerWidget->getStandardMarkerScale();
-}
-
-//=================================================================================
-// function : getCustomMarkerID()
-// purpose  :
-//=================================================================================
-int SMESHGUI_Preferences_ColorDlg::getCustomMarkerID() const
-{
-  return MarkerWidget->getCustomMarkerID();
-}
-
-//=================================================================================
-// function : SetDeltaBrightness(int)
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetDeltaBrightness(int delta) 
-{
-  toolSurfColor->setDelta(delta);
-}
-//=================================================================================
-// function : GetDeltaBrightness()
-// purpose  :
-//=================================================================================
-int SMESHGUI_Preferences_ColorDlg::GetDeltaBrightness() 
-{
-  return toolSurfColor->delta();
-}
-
-//=================================================================================
-// function : keyPressEvent()
-// purpose  :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::keyPressEvent( QKeyEvent* e )
-{
-  QDialog::keyPressEvent( e );
-  if ( e->isAccepted() )
-    return;
-
-  if ( e->key() == Qt::Key_F1 ) {
-    e->accept();
-    ClickOnHelp();
-  }
-}
diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h
deleted file mode 100644 (file)
index 9533ca7..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-// 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
-//
-
-// SMESH SMESHGUI : GUI for SMESH component
-// File   : SMESHGUI_Preferences_ColorDlg.h
-// Author : Nicolas REJNERI, Open CASCADE S.A.S.
-//
-#ifndef SMESHGUI_PREFERENCES_COLORDLG_H
-#define SMESHGUI_PREFERENCES_COLORDLG_H
-
-// SMESH includes
-#include "SMESH_SMESHGUI.hxx"
-
-// SALOME GUI includes
-#include <VTKViewer_MarkerDef.h>
-#include <QtxBiColorTool.h>
-
-// Qt includes
-#include <QDialog>
-
-class QCheckBox;
-class SMESHGUI;
-class SMESHGUI_SpinBox;
-class SalomeApp_IntSpinBox;
-class QtxColorButton;
-class VTKViewer_MarkerWidget;
-
-class SMESHGUI_EXPORT SMESHGUI_Preferences_ColorDlg : public QDialog
-{ 
-  Q_OBJECT
-    
-public:
-  SMESHGUI_Preferences_ColorDlg( SMESHGUI* );
-  ~SMESHGUI_Preferences_ColorDlg();
-
-  void                  SetColor( int, const QColor& );
-  QColor                GetColor( int );
-  void                  SetIntValue( int, int );
-  int                   GetIntValue( int );
-  void                  SetDoubleValue( int, double );
-  double                GetDoubleValue( int );
-  void                  SetBooleanValue( int, bool );
-  bool                  GetBooleanValue( int );
-
-  void                  setCustomMarkerMap( VTK::MarkerMap );
-  VTK::MarkerMap        getCustomMarkerMap();
-
-  void                  SetDeltaBrightness(int);
-  int                   GetDeltaBrightness();
-
-  void                  setStandardMarker( VTK::MarkerType, VTK::MarkerScale );
-  void                  setCustomMarker( int );
-  VTK::MarkerType       getMarkerType() const;
-  VTK::MarkerScale      getStandardMarkerScale() const;
-  int                   getCustomMarkerID() const;
-
-protected:
-  void                  closeEvent( QCloseEvent* );
-  void                  keyPressEvent( QKeyEvent* );
-
-private slots:
-  void                  ClickOnOk();
-  void                  ClickOnCancel();
-  void                  ClickOnHelp();
-  void                  DeactivateActiveDialog();
-  void                  ActivateThisDialog();
-  
-private:
-  SMESHGUI*             mySMESHGUI;            
-
-  QtxBiColorTool*       toolSurfColor; 
-  QtxColorButton*       btnWireframeColor;
-  QtxColorButton*       btnOutlineColor;
-  QtxColorButton*       btn0DElementsColor;
-  QtxColorButton*       btnBallElemColor;
-  SalomeApp_IntSpinBox* SpinBox_0DElements_Size;
-  SalomeApp_IntSpinBox* SpinBox_BallElem_Size;
-  SalomeApp_IntSpinBox* SpinBox_Width;
-  SalomeApp_IntSpinBox* SpinBox_Shrink;
-  QtxColorButton*       btnNodeColor;
-  VTKViewer_MarkerWidget* MarkerWidget;
-  QtxColorButton*       btnOrientationColor;
-  SMESHGUI_SpinBox*     SpinBox_Orientation_Scale;
-  QCheckBox*            CheckBox_Orientation_3DVectors;
-  QtxColorButton*       btnPreselectionColor;
-  QtxColorButton*       btnSelectionColor;
-
-  QString               myHelpFileName;
-};
-
-#endif // SMESHGUI_PREFERENCES_COLORDLG_H
diff --git a/src/SMESHGUI/SMESHGUI_PropertiesDlg.cxx b/src/SMESHGUI/SMESHGUI_PropertiesDlg.cxx
new file mode 100644 (file)
index 0000000..1e9874b
--- /dev/null
@@ -0,0 +1,649 @@
+// 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   : SMESHGUI_PropertiesDlg.cxx
+//  Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
+
+#include "SMESHGUI_PropertiesDlg.h"
+#include "SMESH_Actor.h"
+
+#include <QCheckBox>
+#include <QFrame>
+#include <QGroupBox>
+#include <QHBoxLayout>
+#include <QLabel>
+
+#include <QtxBiColorTool.h>
+#include <QtxColorButton.h>
+#include <QtxIntSpinBox.h>
+#include <VTKViewer_MarkerWidget.h>
+#include <SUIT_Session.h>
+#include <LightApp_Application.h>
+
+const int MARGIN  = 9;
+const int SPACING = 6;
+
+/*!
+  \class SMESHGUI_PropertiesDlg
+  \brief Dialog box to set-up mesh presentation properties: colors,
+  sizes of elements, width of lines etc
+*/
+
+/*
+  \brief Constructor
+  \param customMarkers custom node markers
+  \param parent parent widget
+*/
+SMESHGUI_PropertiesDlg::SMESHGUI_PropertiesDlg( const VTK::MarkerMap& customMarkers, QWidget* parent )
+  : SMESHGUI_Dialog( parent, true, true, Standard )
+{
+  // set title
+  setWindowTitle( tr( "TITLE" ) );
+  
+  // create widgets
+
+  QHBoxLayout* hl;
+  int widthLab1 = 0, widthLab2 = 0;
+
+  // -- node controls
+  myNodeGrp = new QGroupBox( tr( "NODES" ), mainFrame() );
+  QLabel* nodeColorLab = new QLabel( tr( "COLOR" ), myNodeGrp );
+  myNodeColor = new QtxColorButton( myNodeGrp );
+  myNodeMarker = new VTKViewer_MarkerWidget( myNodeGrp );
+  hl = new QHBoxLayout( myNodeGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( nodeColorLab );
+  hl->addWidget( myNodeColor );
+  hl->addWidget( myNodeMarker );
+  widthLab1 = qMax( widthLab1, nodeColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, myNodeMarker->typeLabel()->minimumSizeHint().width() );
+
+  // -- edge controls
+  myEdgeGrp = new QGroupBox( tr( "EDGES" ), mainFrame() );
+  QLabel* edgeColorLab = new QLabel( tr( "COLOR" ), myEdgeGrp );
+  myEdgeColor = new QtxColorButton( myEdgeGrp );
+  QLabel* edgeWidthLab = new QLabel( tr( "WIDTH" ), myEdgeGrp );
+  myEdgeWidth = new QtxIntSpinBox( myEdgeGrp );
+  hl = new QHBoxLayout( myEdgeGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( edgeColorLab );
+  hl->addWidget( myEdgeColor );
+  hl->addWidget( edgeWidthLab );
+  hl->addWidget( myEdgeWidth );
+  widthLab1 = qMax( widthLab1, edgeColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, edgeWidthLab->minimumSizeHint().width() );
+  
+  // -- face controls
+  myFaceGrp = new QGroupBox( tr( "FACES" ), mainFrame() );
+  QLabel* faceColorLab = new QLabel( tr( "FACE_FRONT" ), myFaceGrp );
+  myFaceColor = new QtxBiColorTool( myFaceGrp );
+  myFaceColor->label()->setText( tr( "FACE_BACK" ) );
+  hl = new QHBoxLayout( myFaceGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( faceColorLab );
+  hl->addWidget( myFaceColor );
+  widthLab1 = qMax( widthLab1, faceColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, myFaceColor->label()->minimumSizeHint().width() );
+  
+  // -- volumes
+  myVolumeGrp = new QGroupBox( tr( "VOLUMES" ), mainFrame() );
+  QLabel* volumeColorLab = new QLabel( tr( "VOLUME_NORMAL" ), myVolumeGrp );
+  myVolumeColor = new QtxBiColorTool( myVolumeGrp );
+  myVolumeColor->label()->setText( tr( "VOLUME_REVERSED" ) );
+  hl = new QHBoxLayout( myVolumeGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( volumeColorLab );
+  hl->addWidget( myVolumeColor );
+  widthLab1 = qMax( widthLab1, volumeColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, myVolumeColor->label()->minimumSizeHint().width() );
+
+  // -- outline controls
+  myOutlineGrp = new QGroupBox( tr( "OUTLINES" ), mainFrame() );
+  QLabel* outlineColorLab = new QLabel( tr( "COLOR" ), myOutlineGrp );
+  myOutlineColor = new QtxColorButton( myOutlineGrp );
+  QLabel* outlineWidthLab = new QLabel( tr( "WIDTH" ), myOutlineGrp );
+  myOutlineWidth = new QtxIntSpinBox( myOutlineGrp );
+  hl = new QHBoxLayout( myOutlineGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( outlineColorLab );
+  hl->addWidget( myOutlineColor );
+  hl->addWidget( outlineWidthLab );
+  hl->addWidget( myOutlineWidth );
+  widthLab1 = qMax( widthLab1, outlineColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, outlineWidthLab->minimumSizeHint().width() );
+
+  // -- 0d element controls
+  myElem0dGrp = new QGroupBox( tr( "0D_ELEMENTS" ), mainFrame() );
+  QLabel* elem0dColorLab = new QLabel( tr( "COLOR" ), myElem0dGrp );
+  myElem0dColor = new QtxColorButton( myElem0dGrp );
+  QLabel* elem0dSizeLab = new QLabel( tr( "SIZE" ), myElem0dGrp );
+  myElem0dSize = new QtxIntSpinBox( myElem0dGrp );
+  hl = new QHBoxLayout( myElem0dGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( elem0dColorLab );
+  hl->addWidget( myElem0dColor );
+  hl->addWidget( elem0dSizeLab );
+  hl->addWidget( myElem0dSize );
+  widthLab1 = qMax( widthLab1, elem0dColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, elem0dSizeLab->minimumSizeHint().width() );
+  
+  // -- ball controls
+  myBallGrp = new QGroupBox( tr( "BALLS" ), mainFrame() );
+  QLabel* ballColorLab = new QLabel( tr( "COLOR" ), myBallGrp );
+  myBallColor = new QtxColorButton( myBallGrp );
+  QLabel* ballSizeLab = new QLabel( tr( "SIZE" ), myBallGrp );
+  myBallSize = new QtxIntSpinBox( myBallGrp );
+  hl = new QHBoxLayout( myBallGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( ballColorLab );
+  hl->addWidget( myBallColor );
+  hl->addWidget( ballSizeLab );
+  hl->addWidget( myBallSize );
+  widthLab1 = qMax( widthLab1, ballColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, ballSizeLab->minimumSizeHint().width() );
+  
+  // -- orientation vector controls
+  myOrientationGrp = new QGroupBox( tr( "ORIENTATIONS" ), mainFrame() );
+  QLabel* orientationColorLab = new QLabel( tr( "COLOR" ), myOrientationGrp );
+  myOrientationColor = new QtxColorButton( myOrientationGrp );
+  QLabel* orientationScaleLab = new QLabel( tr( "ORIENTATION_SCALE" ), myOrientationGrp );
+  myOrientationSize = new QtxIntSpinBox( myOrientationGrp );
+  myOrientationSize->setSuffix( "% ");
+  myOrientation3d = new QCheckBox( tr("ORIENTATION_3D"), myOrientationGrp );
+  hl = new QHBoxLayout( myOrientationGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( orientationColorLab );
+  hl->addWidget( myOrientationColor );
+  hl->addWidget( orientationScaleLab );
+  hl->addWidget( myOrientationSize );
+  hl->addWidget( myOrientation3d );
+  widthLab1 = qMax( widthLab1, orientationColorLab->minimumSizeHint().width() );
+  widthLab2 = qMax( widthLab2, orientationScaleLab->minimumSizeHint().width() );
+
+  // -- other controls
+  myExtraGrp = new QFrame( mainFrame() );
+  QLabel* shrinkSizeLab = new QLabel( tr( "SHRINK" ), myExtraGrp );
+  myShrinkSize = new QtxIntSpinBox( myExtraGrp );
+  myShrinkSize->setSuffix( "% ");
+  hl = new QHBoxLayout( myExtraGrp );
+  hl->setMargin( MARGIN );
+  hl->setSpacing( SPACING );
+  hl->addWidget( shrinkSizeLab );
+  hl->addWidget( myShrinkSize );
+  hl->addStretch();
+  widthLab1 = qMax( widthLab1, shrinkSizeLab->minimumSizeHint().width() );
+
+  // layout widgets
+  QVBoxLayout* vl = new QVBoxLayout( mainFrame() );
+  vl->setMargin( 0 );
+  vl->setSpacing( SPACING );
+  vl->addWidget( myNodeGrp );
+  vl->addWidget( myEdgeGrp );
+  vl->addWidget( myFaceGrp );
+  vl->addWidget( myVolumeGrp );
+  vl->addWidget( myOutlineGrp );
+  vl->addWidget( myElem0dGrp );
+  vl->addWidget( myBallGrp );
+  vl->addWidget( myOrientationGrp );
+  vl->addWidget( myExtraGrp );
+  
+  nodeColorLab->setMinimumWidth( widthLab1 );
+  edgeColorLab->setMinimumWidth( widthLab1 );
+  faceColorLab->setMinimumWidth( widthLab1 );
+  volumeColorLab->setMinimumWidth( widthLab1 );
+  outlineColorLab->setMinimumWidth( widthLab1 );
+  elem0dColorLab->setMinimumWidth( widthLab1 );
+  ballColorLab->setMinimumWidth( widthLab1 );
+  orientationColorLab->setMinimumWidth( widthLab1 );
+  shrinkSizeLab->setMinimumWidth( widthLab1 );
+
+  myNodeMarker->typeLabel()->setMinimumWidth( widthLab2 );
+  edgeWidthLab->setMinimumWidth( widthLab2 );
+  myFaceColor->label()->setMinimumWidth( widthLab2 );
+  myVolumeColor->label()->setMinimumWidth( widthLab2 );
+  outlineWidthLab->setMinimumWidth( widthLab2 );
+  elem0dSizeLab->setMinimumWidth( widthLab2 );
+  ballSizeLab->setMinimumWidth( widthLab2 );
+  orientationScaleLab->setMinimumWidth( widthLab2 );
+
+  myEdgeWidth->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+  myOutlineWidth->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+  myElem0dSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+  myBallSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+  myOrientationSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+  myShrinkSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+
+  // initialize widgets
+  myNodeMarker->setCustomMarkers( customMarkers );
+  myElem0dSize->setRange( 1, 10 );
+  myBallSize->setRange( 1, 10 );
+  myEdgeWidth->setRange( 1, 5 );
+  myOutlineWidth->setRange( 1, 5 );
+  myShrinkSize->setRange( 20, 100 );
+  myOrientationSize->setRange( 5, 100 );
+
+  button( OK )->setText( tr( "SMESH_BUT_OK" ) );
+
+  connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
+}
+
+/*
+  \brief Destructor: clean-up resources if necessary
+*/
+SMESHGUI_PropertiesDlg::~SMESHGUI_PropertiesDlg()
+{
+}
+
+/*!
+  \brief Set nodes color
+  \param color nodes color
+*/
+void SMESHGUI_PropertiesDlg::setNodeColor( const QColor& color )
+{
+  myNodeColor->setColor( color );
+}
+
+/*!
+  \brief Get nodes color
+  \return current nodes color
+*/
+QColor SMESHGUI_PropertiesDlg::nodeColor() const
+{
+  return myNodeColor->color();
+}
+
+/*!
+  \brief Set standard nodes marker
+  \param type standard nodes marker type
+  \param scale standard nodes marker scale
+*/
+void SMESHGUI_PropertiesDlg::setNodeMarker( VTK::MarkerType type, VTK::MarkerScale scale )
+{
+  myNodeMarker->setMarker( type, scale );
+}
+
+/*!
+  \brief Set custom nodes marker
+  \param id custom nodes marker id
+*/
+void SMESHGUI_PropertiesDlg::setNodeCustomMarker( int id )
+{
+  myNodeMarker->setCustomMarker( id );
+}
+
+/*!
+  \brief Get nodes marker type.
+  For custom marker, VTK::MT_USER is returned and markerId() function
+  then returns its identifier.
+  \return currently selected nodes marker type
+*/
+VTK::MarkerType SMESHGUI_PropertiesDlg::nodeMarkerType() const
+{
+  return myNodeMarker->markerType();
+}
+
+/*!
+  \brief Get nodes marker scale.
+  For custom marker return value is undefined.
+  \return currently selected nodes marker scale
+*/
+VTK::MarkerScale SMESHGUI_PropertiesDlg::nodeMarkerScale() const
+{
+  return myNodeMarker->markerScale();
+}
+
+/*!
+  \brief Get custom nodes marker.
+  For standard markers return value is VTK::MT_NONE.
+  \return custom nodes marker id
+*/
+int SMESHGUI_PropertiesDlg::nodeMarkerId() const
+{
+  return myNodeMarker->markerId();
+}
+
+/*!
+  \brief Set edges (wireframe) color
+  \param color edges color
+*/
+void SMESHGUI_PropertiesDlg::setEdgeColor( const QColor& color )
+{
+  myEdgeColor->setColor( color );
+}
+
+/*!
+  \brief Get edges (wireframe) color
+  \return current edges color
+*/
+QColor SMESHGUI_PropertiesDlg::edgeColor() const
+{
+  return myEdgeColor->color();
+}
+
+/*!
+  \brief Set edges width
+  \param width edges width
+*/
+void SMESHGUI_PropertiesDlg::setEdgeWidth( int width )
+{
+  myEdgeWidth->setValue( width );
+}
+
+/*!
+  \brief Get edges width
+  \return current edges width
+*/
+int SMESHGUI_PropertiesDlg::edgeWidth() const
+{
+  return myEdgeWidth->value();
+}
+
+/*!
+  \brief Set faces colors
+  \param color front faces color
+  \param delta back faces coloring delta
+*/
+void SMESHGUI_PropertiesDlg::setFaceColor( const QColor& color, int delta )
+{
+  myFaceColor->setMainColor( color );
+  myFaceColor->setDelta( delta );
+}
+
+/*!
+  \brief Get front faces color
+  \return current front faces color
+*/
+QColor SMESHGUI_PropertiesDlg::faceColor() const
+{
+  return myFaceColor->mainColor();
+}
+
+/*!
+  \brief Get back faces coloring delta
+  \return current back faces coloring delta
+*/
+int SMESHGUI_PropertiesDlg::faceColorDelta() const
+{
+  return myFaceColor->delta();
+}
+
+/*!
+  \brief Set volumes colors
+  \param color normal volumes color
+  \param delta reversed volumes coloring delta
+*/
+void SMESHGUI_PropertiesDlg::setVolumeColor( const QColor& color, int delta )
+{
+  myVolumeColor->setMainColor( color );
+  myVolumeColor->setDelta( delta );
+}
+
+/*!
+  \brief Get normal volumes color
+  \return current normal volumes color
+*/
+QColor SMESHGUI_PropertiesDlg::volumeColor() const
+{
+  return myVolumeColor->mainColor();
+}
+
+/*!
+  \brief Get reversed volumes coloring delta
+  \return current reversed volumes coloring delta
+*/
+int SMESHGUI_PropertiesDlg::volumeColorDelta() const
+{
+  return myVolumeColor->delta();
+}
+
+/*!
+  \brief Set outlines color
+  \param color outlines color
+*/
+void SMESHGUI_PropertiesDlg::setOutlineColor( const QColor& color )
+{
+  myOutlineColor->setColor( color );
+}
+
+/*!
+  \brief Get outlines color
+  \return current outlines color
+*/
+QColor SMESHGUI_PropertiesDlg::outlineColor() const
+{
+  return myOutlineColor->color();
+}
+
+/*!
+  \brief Set outlines width
+  \param width outlines width
+*/
+void SMESHGUI_PropertiesDlg::setOutlineWidth( int width )
+{
+  myOutlineWidth->setValue( width );
+}
+
+/*!
+  \brief Get outlines width
+  \return current outlines width
+*/
+int SMESHGUI_PropertiesDlg::outlineWidth() const
+{
+  return myOutlineWidth->value();
+}
+
+/*!
+  \brief Set 0D elements color
+  \param color 0D elements color
+*/
+void SMESHGUI_PropertiesDlg::setElem0dColor( const QColor& color )
+{
+  myElem0dColor->setColor( color );
+}
+
+/*!
+  \brief Get 0D elements color
+  \return current 0D elements color
+*/
+QColor SMESHGUI_PropertiesDlg::elem0dColor() const
+{
+  return myElem0dColor->color();
+}
+
+/*!
+  \brief Set 0D elements size
+  \param size 0D elements size
+*/
+void SMESHGUI_PropertiesDlg::setElem0dSize( int size )
+{
+  myElem0dSize->setValue( size );
+}
+
+/*!
+  \brief Get 0D elements size
+  \return current 0D elements size
+*/
+int SMESHGUI_PropertiesDlg::elem0dSize() const
+{
+  return myElem0dSize->value();
+}
+
+/*!
+  \brief Set discrete elements (balls) color
+  \param color discrete elements (balls) color
+*/
+void SMESHGUI_PropertiesDlg::setBallColor( const QColor& color )
+{
+  myBallColor->setColor( color );
+}
+
+/*!
+  \brief Get discrete elements (balls) color
+  \return current discrete elements (balls) color
+*/
+QColor SMESHGUI_PropertiesDlg::ballColor() const
+{
+  return myBallColor->color();
+}
+
+/*!
+  \brief Set discrete elements (balls) size
+  \param size discrete elements (balls) size
+*/
+void SMESHGUI_PropertiesDlg::setBallSize( int size )
+{
+  myBallSize->setValue( size );
+}
+
+/*!
+  \brief Get discrete elements (balls) size
+  \return current discrete elements (balls) size
+*/
+int SMESHGUI_PropertiesDlg::ballSize() const
+{
+  return myBallSize->value();
+}
+
+/*!
+  \brief Set orientation vectors color
+  \param color orientation vectors color
+*/
+void SMESHGUI_PropertiesDlg::setOrientationColor( const QColor& color )
+{
+  myOrientationColor->setColor( color );
+}
+
+/*!
+  \brief Get orientation vectors color
+  \return current orientation vectors color
+*/
+QColor SMESHGUI_PropertiesDlg::orientationColor() const
+{
+  return myOrientationColor->color();
+}
+
+/*!
+  \brief Set orientation vectors scale (percent)
+  \param scale orientation vectors scale
+*/
+void SMESHGUI_PropertiesDlg::setOrientationSize( int scale )
+{
+  myOrientationSize->setValue( scale );
+}
+
+/*!
+  \brief Get orientation vectors scale (percent)
+  \return current orientation vectors scale
+*/
+int SMESHGUI_PropertiesDlg::orientationSize() const
+{
+  return myOrientationSize->value();
+}
+
+/*!
+  \brief Set orientation vectors 3d flag
+  \param on orientation vectors 3d flag value
+*/
+void SMESHGUI_PropertiesDlg::setOrientation3d( bool on )
+{
+  myOrientation3d->setChecked( on );
+}
+
+/*!
+  \brief Get orientation vectors 3d flag
+  \return orientation vectors 3d flag value
+*/
+bool SMESHGUI_PropertiesDlg::orientation3d() const
+{
+  return myOrientation3d->isChecked();
+}
+
+/*!
+  \brief Set shrink coefficient (percent)
+  \param coef shrink coefficient
+*/
+void SMESHGUI_PropertiesDlg::setShrinkCoef( int coef )
+{
+  myShrinkSize->setValue( coef );
+}
+
+/*!
+  \brief Get shrink coefficient (percent)
+  \return current shrink coefficient
+*/
+int SMESHGUI_PropertiesDlg::shrinkCoef() const
+{
+  return myShrinkSize->value();
+}
+
+/*
+  \brief Get custom markers
+  \return custom markers map
+*/
+VTK::MarkerMap SMESHGUI_PropertiesDlg::customMarkers() const
+{
+  return myNodeMarker->customMarkers();
+}
+
+/*!
+  \brief Show / hide controls for specified entity type
+  \param elements mesh element types (an or-ed combination of flags)
+  \param nodes mesh nodes presence flag
+*/
+void SMESHGUI_PropertiesDlg::showControls( int elements, bool nodes )
+{
+  // node controls are supposed to be shown if at least any element type is present
+  // or if there are only nodes
+  myNodeGrp->setVisible( nodes || elements & SMESH_Actor::eAllEntity );
+  // edge controls are shown only if there are edges
+  myEdgeGrp->setVisible( elements & SMESH_Actor::eEdges );
+  // face controls are shown only if there are faces
+  myFaceGrp->setVisible( elements & SMESH_Actor::eFaces );
+  // volume controls are shown only if there are volumes
+  myVolumeGrp->setVisible( elements & SMESH_Actor::eVolumes );
+  // 0d elements controls are shown only if there are 0d elements
+  myElem0dGrp->setVisible( elements & SMESH_Actor::e0DElements );
+  // ball controls are shown only if there are balls
+  myBallGrp->setVisible( elements & SMESH_Actor::eBallElem );
+  // outline controls are needed for faces and volumes
+  myOutlineGrp->setVisible( elements & ( SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) );
+  // orientation controls are needed for faces and volumes
+  myOrientationGrp->setVisible( elements & ( SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) );
+  // shrink factor is shown if there are edges and/or faces and/or volumes
+  myExtraGrp->setVisible( elements & ( SMESH_Actor::eEdges | SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) );
+}
+
+/*!
+  \brief Show online help on dialog box
+*/
+void SMESHGUI_PropertiesDlg::onHelp()
+{
+  LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+  app->onHelpContextModule( "SMESH", "colors_size_page.html" );
+}
diff --git a/src/SMESHGUI/SMESHGUI_PropertiesDlg.h b/src/SMESHGUI/SMESHGUI_PropertiesDlg.h
new file mode 100644 (file)
index 0000000..bcdcc72
--- /dev/null
@@ -0,0 +1,143 @@
+// 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   : SMESHGUI_PropertiesDlg.h
+//  Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
+
+#ifndef SMESHGUI_PROPERTIESDLG_H
+#define SMESHGUI_PROPERTIESDLG_H
+
+#include "SMESH_SMESHGUI.hxx"
+#include "SMESHGUI_Dialog.h"
+
+#include <VTKViewer_MarkerDef.h>
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(SMESH_Mesh)
+
+class QCheckBox;
+class QFrame;
+class QGroupBox;
+class QtxColorButton;
+class QtxBiColorTool;
+class QtxIntSpinBox;
+class VTKViewer_MarkerWidget;
+
+class SMESHGUI_EXPORT SMESHGUI_PropertiesDlg : public SMESHGUI_Dialog
+{ 
+  Q_OBJECT
+    
+public:
+  SMESHGUI_PropertiesDlg( const VTK::MarkerMap&, QWidget* parent );
+  ~SMESHGUI_PropertiesDlg();
+
+  void              setNodeColor( const QColor& );
+  QColor            nodeColor() const;
+  void              setNodeMarker( VTK::MarkerType, VTK::MarkerScale );
+  void              setNodeCustomMarker( int );
+  VTK::MarkerType   nodeMarkerType() const;
+  VTK::MarkerScale  nodeMarkerScale() const;
+  int               nodeMarkerId() const;
+
+  void              setEdgeColor( const QColor& );
+  QColor            edgeColor() const;
+  void              setEdgeWidth( int );
+  int               edgeWidth() const;
+
+  void              setFaceColor( const QColor&, int );
+  QColor            faceColor() const;
+  int               faceColorDelta() const;
+
+  void              setVolumeColor( const QColor&, int );
+  QColor            volumeColor() const;
+  int               volumeColorDelta() const;
+
+  void              setOutlineColor( const QColor& );
+  QColor            outlineColor() const;
+  void              setOutlineWidth( int );
+  int               outlineWidth() const;
+
+  void              setElem0dColor( const QColor& );
+  QColor            elem0dColor() const;
+  void              setElem0dSize( int );
+  int               elem0dSize() const;
+
+  void              setBallColor( const QColor& );
+  QColor            ballColor() const;
+  void              setBallSize( int );
+  int               ballSize() const;
+
+  void              setOrientationColor( const QColor& );
+  QColor            orientationColor() const;
+  void              setOrientationSize( int );
+  int               orientationSize() const;
+  void              setOrientation3d( bool );
+  bool              orientation3d() const;
+
+  void              setShrinkCoef( int );
+  int               shrinkCoef() const;
+
+  VTK::MarkerMap    customMarkers() const;
+
+  void              showControls( int, bool );
+
+private slots:
+  void              onHelp();
+
+private:
+  // group boxes
+  QGroupBox*              myNodeGrp;
+  QGroupBox*              myEdgeGrp;
+  QGroupBox*              myFaceGrp;
+  QGroupBox*              myVolumeGrp;
+  QGroupBox*              myOutlineGrp;
+  QGroupBox*              myElem0dGrp;
+  QGroupBox*              myBallGrp;
+  QGroupBox*              myOrientationGrp;
+  QFrame*                 myExtraGrp;
+  // widgets
+  // - nodes
+  QtxColorButton*         myNodeColor;
+  VTKViewer_MarkerWidget* myNodeMarker;
+  // - edges
+  QtxColorButton*         myEdgeColor;
+  QtxIntSpinBox*          myEdgeWidth;
+  // - faces
+  QtxBiColorTool*         myFaceColor; 
+  // - volumes
+  QtxBiColorTool*         myVolumeColor; 
+  // - outlines
+  QtxColorButton*         myOutlineColor;
+  QtxIntSpinBox*          myOutlineWidth;
+  // - 0d elements
+  QtxColorButton*         myElem0dColor;
+  QtxIntSpinBox*          myElem0dSize;
+  // - balls
+  QtxColorButton*         myBallColor;
+  QtxIntSpinBox*          myBallSize;
+  // - orientation vectors
+  QtxColorButton*         myOrientationColor;
+  QtxIntSpinBox*          myOrientationSize;
+  QCheckBox*              myOrientation3d;
+  // - shrink coefficient
+  QtxIntSpinBox*          myShrinkSize;
+};
+
+#endif // SMESHGUI_PROPERTIESDLG_H
index baafa985c8de0f04391d5f0606fd94b9437eacae..0da8d3a3abeec00ecd36394ee9c7da32f0a9ec03 100644 (file)
@@ -610,14 +610,17 @@ namespace SMESH
         SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj ));
         if(!CORBA::is_nil(aGroup) && anActor)
         {
-         QColor c;int delta;
-         SMESH::GetColor( "SMESH", "fill_color", c, delta, "0,170,255|-100"  );
+         QColor c;
+         int deltaF, deltaV;
+         SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100"  );
+         SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100"  );
+         SMESH::GetColor( "SMESH", "default_grp_color", c );
           SALOMEDS::Color aColor = aGroup->GetColor();
           if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ))
           {
-           aColor.R = (float)c.red() / 255.0;
-           aColor.G = (float)c.green() / 255.0;
-            aColor.B = (float)c.blue() / 255.0;
+           aColor.R = c.redF();
+           aColor.G = c.greenF();
+            aColor.B = c.blueF();
             aGroup->SetColor( aColor );
           }
           if( aGroup->GetType() == SMESH::NODE )
@@ -628,8 +631,10 @@ namespace SMESH
             anActor->Set0DColor( aColor.R, aColor.G, aColor.B );
           else if( aGroup->GetType() == SMESH::BALL )
             anActor->SetBallColor( aColor.R, aColor.G, aColor.B );
+          else if( aGroup->GetType() == SMESH::VOLUME )
+            anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, deltaV );
           else
-            anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta );
+            anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, deltaF );
         }
       }
     }
@@ -1337,7 +1342,7 @@ namespace SMESH
 
     if( !anIsOk )
       return false;
-
+    
     DistanceToPosition( theBounds, theNormal, theDist, theOrigin );
     return true;
   }
index d02d9cd0215796ce92692fda5589a19a1d91023a..b62244e6f8d8412b4bfb420f67232b8a17427ba5 100644 (file)
@@ -193,7 +193,8 @@ bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&,
   }
   else if ( qName == "python-wrap" ||
             qName == "algo"        ||
-            qName == "hypo"         )
+            qName == "hypo"        ||
+            qName == "accumulative-methods")
   {
     // elements used in SMESH_2smeshpy
     return true;
index 2ac37e0f5ba72ab79e47c84e5157ee320618fb3b..84f6c2ee10ae80eef8e8de225672eed141ba3ea8 100644 (file)
         <source>CGNS_FILES_FILTER</source>
         <translation>CGNS files</translation>
     </message>
+    <message>
+        <source>GMF_ASCII_FILES_FILTER</source>
+        <translation>GMF ASCII files</translation>
+    </message>
+    <message>
+        <source>GMF_BINARY_FILES_FILTER</source>
+        <translation>GMF binary files</translation>
+    </message>
     <message>
         <source>STL_BIN_FILES_FILTER</source>
         <translation>STL binary files</translation>
         <source>COMPERR_CANCELED</source>
         <translation>Computation canceled</translation>
     </message>
+    <message>
+        <source>COMPERR_NO_MESH_ON_SHAPE</source>
+        <translation>No mesh elements assigned to a Sub-shape</translation>
+    </message>
+    <message>
+        <source>EDITERR_NO_MEDIUM_ON_GEOM</source>
+        <translation>Some medium nodes not placed on geometry to avoid
+        distorting elements shown in magenta</translation>
+    </message>
     <message>
         <source>SMESH_GEOM</source>
         <translation>Geometry</translation>
         <source>MEN_EXPORT_CGNS</source>
         <translation>Export to CGNS File</translation>
     </message>
+    <message>
+        <source>MEN_EXPORT_GMF</source>
+        <translation>Export to GMF File</translation>
+    </message>
     <message>
         <source>MEN_EXPORT_SAUV</source>
         <translation>Export to SAUV file</translation>
         <source>MEN_CGNS</source>
         <translation>CGNS file</translation>
     </message>
+    <message>
+        <source>MEN_IMPORT_GMF</source>
+        <translation>GMF file</translation>
+    </message>
+    <message>
+        <source>MEN_GMF</source>
+        <translation>GMF file</translation>
+    </message>
     <message>
         <source>MEN_IMPORT_SAUV</source>
         <translation>SAUV file</translation>
@@ -2844,6 +2873,10 @@ Please check preferences of Mesh module.
         <source>STB_EXPORT_CGNS</source>
         <translation>Export to CGNS file</translation>
     </message>
+    <message>
+        <source>STB_EXPORT_GMF</source>
+        <translation>Export to GMF file</translation>
+    </message>
     <message>
         <source>STB_EXPORT_SAUV</source>
         <translation>Export to SAUV file</translation>
@@ -2964,6 +2997,14 @@ Please check preferences of Mesh module.
         <source>STB_CGNS</source>
         <translation>Export CGNS file</translation>
     </message>
+    <message>
+        <source>STB_IMPORT_GMF</source>
+        <translation>Import GMF file</translation>
+    </message>
+    <message>
+        <source>STB_GMF</source>
+        <translation>Export GMF file</translation>
+    </message>
     <message>
         <source>STB_IMPORT_SAUV</source>
         <translation>Import SAUV file</translation>
@@ -3560,6 +3601,14 @@ Please check preferences of Mesh module.
         <source>TOP_CGNS</source>
         <translation>Export CGNS file</translation>
     </message>
+    <message>
+        <source>TOP_IMPORT_GMF</source>
+        <translation>Import GMF file</translation>
+    </message>
+    <message>
+        <source>TOP_GMF</source>
+        <translation>Export GMF file</translation>
+    </message>
     <message>
         <source>TOP_IMPORT_SAUV</source>
         <translation>Import SAUV file</translation>
@@ -4014,6 +4063,14 @@ Please, create VTK viewer and try again</translation>
         <source>PREF_BACKFACE</source>
         <translation>Back surface color</translation>
     </message>
+    <message>
+        <source>PREF_VOLUME</source>
+        <translation>Volume color</translation>
+    </message>
+    <message>
+        <source>PREF_REVERSEDVOLUME</source>
+        <translation>Reversed volume color</translation>
+    </message>
     <message>
         <source>PREF_WIREFRAME</source>
         <translation>Wireframe color</translation>
@@ -4138,6 +4195,10 @@ Please, create VTK viewer and try again</translation>
         <source>PREF_GRP_NAMES</source>
         <translation>Names color</translation>
     </message>
+    <message>
+        <source>PREF_GRP_DEF_COLOR</source>
+        <translation>Default color</translation>
+    </message>
     <message>
         <source>PREF_GROUP_PRECISION</source>
         <translation>Precision</translation>
@@ -4252,7 +4313,11 @@ Please, create VTK viewer and try again</translation>
     </message>
     <message>
         <source>PREF_WIDTH</source>
-        <translation>Width</translation>
+        <translation>Line width</translation>
+    </message>
+    <message>
+        <source>PREF_OUTLINE_WIDTH</source>
+        <translation>Outline width</translation>
     </message>
     <message>
         <source>PREF_PREVIEW_CHUNK_SIZE</source>
@@ -6807,152 +6872,140 @@ as they are of improper type:
     </message>
 </context>
 <context>
-    <name>SMESHGUI_Preferences_ColorDlg</name>
-    <message>
-        <source>DIALOG_TITLE</source>
-        <translation>Properties (color, line width, shrink size, ...)</translation>
-    </message>
-    <message>
-        <source>GRP_ELEMENTS</source>
-        <translation>Elements</translation>
-    </message>
-    <message>
-        <source>SURFACE_COLOR_LBL</source>
-        <translation>Surface color</translation>
-    </message>
+    <name>SMESHGUI_ReorientFacesDlg</name>
     <message>
-        <source>BACKSURFACE_COLOR_LBL</source>
-        <translation>Back surface color</translation>
+        <source>CAPTION</source>
+        <translation>Reorient faces by vector</translation>
     </message>
     <message>
-        <source>OUTLINE_COLOR_LBL</source>
-        <translation>Outline color</translation>
+        <source>REORIENT_FACES</source>
+        <translation>Reorient</translation>
     </message>
     <message>
-        <source>WIREFRAME_COLOR_LBL</source>
-        <translation>Wireframe color</translation>
+        <source>DIRECTION</source>
+        <translation>Direction</translation>
     </message>
     <message>
-        <source>0D_ELEMENTS_COLOR_LBL</source>
-        <translation>0D elements</translation>
+        <source>OBJECT</source>
+        <translation>Object</translation>
     </message>
     <message>
-        <source>0D_ELEMENTS_SIZE_LBL</source>
-        <translation>Size of 0D elements</translation>
+        <source>POINT</source>
+        <translation>Point</translation>
     </message>
     <message>
-        <source>BALL_ELEMENTS_COLOR_LBL</source>
-        <translation>Ball elements</translation>
+        <source>FACE</source>
+        <translation>Face</translation>
     </message>
     <message>
-        <source>BALL_ELEMENTS_SIZE_LBL</source>
-        <translation>Size of balls</translation>
+        <source>FACES</source>
+        <translation>Faces source</translation>
     </message>
     <message>
-        <source>LINE_WIDTH_LBL</source>
-        <translation>Line width</translation>
+        <source>ORIENTATION</source>
+        <translation>Orientation</translation>
     </message>
+</context>
+<context>
+    <name>SMESHGUI_ReorientFacesOp</name>
     <message>
-        <source>SHRINK_COEF_LBL</source>
-        <translation>Shrink coef.</translation>
+        <source>NO_OBJECT_SELECTED</source>
+        <translation>No object selected</translation>
     </message>
     <message>
-        <source>GRP_NODES</source>
-        <translation>Nodes</translation>
+        <source>NO_FACES</source>
+        <translation>Object includes no faces</translation>
     </message>
     <message>
-        <source>NODES_COLOR_LBL</source>
-        <translation>Color</translation>
+        <source>ZERO_SIZE_VECTOR</source>
+        <translation>Zero size vector</translation>
     </message>
     <message>
-        <source>NODES_MARKER_LBL</source>
-        <translation>Marker</translation>
+        <source>INVALID_FACE</source>
+        <translation>Not valid face</translation>
     </message>
     <message>
-        <source>GRP_ORIENTATION</source>
-        <translation>Orientation of faces</translation>
+        <source>NB_REORIENTED</source>
+        <translation>%1 faces reversed</translation>
     </message>
+</context>
+<context>
+    <name>SMESHGUI_PropertiesDlg</name>
     <message>
-        <source>ORIENTATION_COLOR_LBL</source>
-        <translation>Color</translation>
+        <source>TITLE</source>
+        <translation>Properties</translation>
     </message>
     <message>
-        <source>ORIENTATION_SCALE_LBL</source>
-        <translation>Scale</translation>
+        <source>NODES</source>
+        <translation>Nodes</translation>
     </message>
     <message>
-        <source>3D_VECTORS_LBL</source>
-        <translation>3D vectors</translation>
+        <source>EDGES</source>
+        <translation>Edges / wireframe</translation>
     </message>
     <message>
-        <source>GRP_SELECTION</source>
-        <translation>Selection</translation>
+        <source>FACES</source>
+        <translation>Faces</translation>
     </message>
     <message>
-        <source>SELECTION_COLOR_LBL</source>
-        <translation>Selection color</translation>
+        <source>VOLUMES</source>
+        <translation>Volumes</translation>
     </message>
     <message>
-        <source>PRESELECTION_COLOR_LBL</source>
-        <translation>Pre-selection color</translation>
+        <source>OUTLINES</source>
+        <translation>Outlines</translation>
     </message>
-</context>
-<context>
-    <name>SMESHGUI_ReorientFacesDlg</name>
     <message>
-        <source>CAPTION</source>
-        <translation>Reorient faces by vector</translation>
+        <source>0D_ELEMENTS</source>
+        <translation>0D elements</translation>
     </message>
     <message>
-        <source>REORIENT_FACES</source>
-        <translation>Reorient</translation>
+        <source>BALLS</source>
+        <translation>Balls</translation>
     </message>
     <message>
-        <source>DIRECTION</source>
-        <translation>Direction</translation>
+        <source>ORIENTATIONS</source>
+        <translation>Orientation vectors</translation>
     </message>
     <message>
-        <source>OBJECT</source>
-        <translation>Object</translation>
+        <source>COLOR</source>
+        <translation>Color:</translation>
     </message>
     <message>
-        <source>POINT</source>
-        <translation>Point</translation>
+        <source>WIDTH</source>
+        <translation>Width:</translation>
     </message>
     <message>
-        <source>FACE</source>
-        <translation>Face</translation>
+        <source>FACE_FRONT</source>
+        <translation>Front:</translation>
     </message>
     <message>
-        <source>FACES</source>
-        <translation>Faces source</translation>
+        <source>FACE_BACK</source>
+        <translation>Back:</translation>
     </message>
     <message>
-        <source>ORIENTATION</source>
-        <translation>Orientation</translation>
+        <source>VOLUME_NORMAL</source>
+        <translation>Normal:</translation>
     </message>
-</context>
-<context>
-    <name>SMESHGUI_ReorientFacesOp</name>
     <message>
-        <source>NO_OBJECT_SELECTED</source>
-        <translation>No object selected</translation>
+        <source>VOLUME_REVERSED</source>
+        <translation>Reversed:</translation>
     </message>
     <message>
-        <source>NO_FACES</source>
-        <translation>Object includes no faces</translation>
+        <source>SIZE</source>
+        <translation>Size:</translation>
     </message>
     <message>
-        <source>ZERO_SIZE_VECTOR</source>
-        <translation>Zero size vector</translation>
+        <source>ORIENTATION_SCALE</source>
+        <translation>Scale:</translation>
     </message>
     <message>
-        <source>INVALID_FACE</source>
-        <translation>Not valid face</translation>
+        <source>ORIENTATION_3D</source>
+        <translation>3D vectors</translation>
     </message>
     <message>
-        <source>NB_REORIENTED</source>
-        <translation>%1 faces reversed</translation>
+        <source>SHRINK</source>
+        <translation>Shrink coef:</translation>
     </message>
 </context>
 </TS>
index 1672f6fbc1ac57ac42fade9df38e46c727af198a..f4eb29eddc6b2eb1e375c2e5a732a42434840f58 100755 (executable)
@@ -4031,6 +4031,14 @@ Ouvrez une fenêtre VTK et essayez de nouveau</translation>
         <source>PREF_BACKFACE</source>
         <translation>Face arrière</translation>
     </message>
+    <message>
+        <source>PREF_VOLUME</source>
+        <translation type="unfinished">Volume color</translation>
+    </message>
+    <message>
+        <source>PREF_REVERSEDVOLUME</source>
+        <translation type="unfinished">Reversed volume color</translation>
+    </message>
     <message>
         <source>PREF_WIREFRAME</source>
         <translation>Couleur de contour</translation>
@@ -4155,6 +4163,10 @@ Ouvrez une fenêtre VTK et essayez de nouveau</translation>
         <source>PREF_GRP_NAMES</source>
         <translation>Couleur des noms</translation>
     </message>
+    <message>
+        <source>PREF_GRP_DEF_COLOR</source>
+        <translation>Couleur par défaut</translation>
+    </message>
     <message>
         <source>PREF_GROUP_PRECISION</source>
         <translation>Précision</translation>
@@ -4269,7 +4281,11 @@ Ouvrez une fenêtre VTK et essayez de nouveau</translation>
     </message>
     <message>
         <source>PREF_WIDTH</source>
-        <translation>Epaisseur</translation>
+        <translation type="unfinished">Line width</translation>
+    </message>
+    <message>
+        <source>PREF_OUTLINE_WIDTH</source>
+        <translation type="unfinished">Outline width</translation>
     </message>
     <message>
         <source>PREF_PREVIEW_CHUNK_SIZE</source>
@@ -6817,152 +6833,140 @@ en raison de leurs types incompatibles:
     </message>
 </context>
 <context>
-    <name>SMESHGUI_Preferences_ColorDlg</name>
-    <message>
-        <source>DIALOG_TITLE</source>
-        <translation>Propriétés (couleur, épaisseur des traits, taille des éléments réduits, ...)</translation>
-    </message>
-    <message>
-        <source>GRP_ELEMENTS</source>
-        <translation>Eléments</translation>
-    </message>
-    <message>
-        <source>SURFACE_COLOR_LBL</source>
-        <translation>Couleur de surface</translation>
-    </message>
+    <name>SMESHGUI_ReorientFacesDlg</name>
     <message>
-        <source>BACKSURFACE_COLOR_LBL</source>
-        <translation>Couleur arrière</translation>
+        <source>CAPTION</source>
+        <translation>Réorienter des faces selon un vector</translation>
     </message>
     <message>
-        <source>OUTLINE_COLOR_LBL</source>
-        <translation>Couleur de contour</translation>
+        <source>REORIENT_FACES</source>
+        <translation>Réorienter</translation>
     </message>
     <message>
-        <source>WIREFRAME_COLOR_LBL</source>
-        <translation>Couleur en mode fil de fer</translation>
+        <source>DIRECTION</source>
+        <translation>Direction</translation>
     </message>
     <message>
-        <source>0D_ELEMENTS_COLOR_LBL</source>
-        <translation>Eléments 0D</translation>
+        <source>OBJECT</source>
+        <translation>Objet</translation>
     </message>
     <message>
-        <source>0D_ELEMENTS_SIZE_LBL</source>
-        <translation>Taille des éléments 0D</translation>
+        <source>POINT</source>
+        <translation>Point</translation>
     </message>
     <message>
-        <source>BALL_ELEMENTS_COLOR_LBL</source>
-        <translation>Eléments particulaires</translation>
+        <source>FACE</source>
+        <translation>Face</translation>
     </message>
     <message>
-        <source>BALL_ELEMENTS_SIZE_LBL</source>
-        <translation>Taille des éléments particulaires</translation>
+        <source>FACES</source>
+        <translation>Source des faces</translation>
     </message>
     <message>
-        <source>LINE_WIDTH_LBL</source>
-        <translation>Epaisseur des traits</translation>
+        <source>ORIENTATION</source>
+        <translation>Orientation</translation>
     </message>
+</context>
+<context>
+    <name>SMESHGUI_ReorientFacesOp</name>
     <message>
-        <source>SHRINK_COEF_LBL</source>
-        <translation>Coef. de contraction</translation>
+        <source>NO_OBJECT_SELECTED</source>
+        <translation>Aucun objet sélectionné</translation>
     </message>
     <message>
-        <source>GRP_NODES</source>
-        <translation>Nœuds</translation>
+        <source>NO_FACES</source>
+        <translation>L&apos;objet ne contient pas de faces</translation>
     </message>
     <message>
-        <source>NODES_COLOR_LBL</source>
-        <translation>Couleur</translation>
+        <source>ZERO_SIZE_VECTOR</source>
+        <translation>Vecteur de taille nulle</translation>
     </message>
     <message>
-        <source>NODES_MARKER_LBL</source>
-        <translation>Marqueur</translation>
+        <source>INVALID_FACE</source>
+        <translation>Face non valide</translation>
     </message>
     <message>
-        <source>GRP_ORIENTATION</source>
-        <translation>Orientation des faces</translation>
+        <source>NB_REORIENTED</source>
+        <translation>%1 face(s) inversée(s)</translation>
     </message>
+</context>
+<context>
+    <name>SMESHGUI_PropertiesDlg</name>
     <message>
-        <source>ORIENTATION_COLOR_LBL</source>
-        <translation>Couleur</translation>
+        <source>TITLE</source>
+        <translation type="unfinished">Properties</translation>
     </message>
     <message>
-        <source>ORIENTATION_SCALE_LBL</source>
-        <translation>Facteur d&apos;échelle</translation>
+        <source>NODES</source>
+        <translation type="unfinished">Nodes</translation>
     </message>
     <message>
-        <source>3D_VECTORS_LBL</source>
-        <translation>Vecteurs 3D</translation>
+        <source>EDGES</source>
+        <translation type="unfinished">Edges / wireframe</translation>
     </message>
     <message>
-        <source>GRP_SELECTION</source>
-        <translation>Sélection</translation>
+        <source>FACES</source>
+        <translation type="unfinished">Faces</translation>
     </message>
     <message>
-        <source>SELECTION_COLOR_LBL</source>
-        <translation>Couleur de sélection</translation>
+        <source>VOLUMES</source>
+        <translation type="unfinished">Volumes</translation>
     </message>
     <message>
-        <source>PRESELECTION_COLOR_LBL</source>
-        <translation>Couleur de pré-sélection</translation>
+        <source>OUTLINES</source>
+        <translation type="unfinished">Outlines</translation>
     </message>
-</context>
-<context>
-    <name>SMESHGUI_ReorientFacesDlg</name>
     <message>
-        <source>CAPTION</source>
-        <translation>Réorienter des faces selon un vector</translation>
+        <source>0D_ELEMENTS</source>
+        <translation type="unfinished">0D elements</translation>
     </message>
     <message>
-        <source>REORIENT_FACES</source>
-        <translation>Réorienter</translation>
+        <source>BALLS</source>
+        <translation type="unfinished">Balls</translation>
     </message>
     <message>
-        <source>DIRECTION</source>
-        <translation>Direction</translation>
+        <source>ORIENTATIONS</source>
+        <translation type="unfinished">Orientation vectors</translation>
     </message>
     <message>
-        <source>OBJECT</source>
-        <translation>Objet</translation>
+        <source>COLOR</source>
+        <translation type="unfinished">Color:</translation>
     </message>
     <message>
-        <source>POINT</source>
-        <translation>Point</translation>
+        <source>WIDTH</source>
+        <translation type="unfinished">Width:</translation>
     </message>
     <message>
-        <source>FACE</source>
-        <translation>Face</translation>
+        <source>FACE_FRONT</source>
+        <translation type="unfinished">Front:</translation>
     </message>
     <message>
-        <source>FACES</source>
-        <translation>Source des faces</translation>
+        <source>FACE_BACK</source>
+        <translation type="unfinished">Back:</translation>
     </message>
     <message>
-        <source>ORIENTATION</source>
-        <translation>Orientation</translation>
+        <source>VOLUME_NORMAL</source>
+        <translation type="unfinished">Normal:</translation>
     </message>
-</context>
-<context>
-    <name>SMESHGUI_ReorientFacesOp</name>
     <message>
-        <source>NO_OBJECT_SELECTED</source>
-        <translation>Aucun objet sélectionné</translation>
+        <source>VOLUME_REVERSED</source>
+        <translation type="unfinished">Reversed:</translation>
     </message>
     <message>
-        <source>NO_FACES</source>
-        <translation>L&apos;objet ne contient pas de faces</translation>
+        <source>SIZE</source>
+        <translation type="unfinished">Size:</translation>
     </message>
     <message>
-        <source>ZERO_SIZE_VECTOR</source>
-        <translation>Vecteur de taille nulle</translation>
+        <source>ORIENTATION_SCALE</source>
+        <translation type="unfinished">Scale:</translation>
     </message>
     <message>
-        <source>INVALID_FACE</source>
-        <translation>Face non valide</translation>
+        <source>ORIENTATION_3D</source>
+        <translation type="unfinished">3D vectors</translation>
     </message>
     <message>
-        <source>NB_REORIENTED</source>
-        <translation>%1 face(s) inversée(s)</translation>
+        <source>SHRINK</source>
+        <translation type="unfinished">Shrink coef:</translation>
     </message>
 </context>
 </TS>
index 204427f088dc5275ac9f13d267caf7bc7a6348fb..6800f0d90f0b83052b1e7c70aa459230713e9339 100644 (file)
@@ -40,17 +40,24 @@ enum SMESH_ComputeErrorName
 {
   // If you modify it, pls update SMESH_ComputeError::CommonName() below.
   // Positive values are for algo specific errors
-  COMPERR_OK             = -1,
-  COMPERR_BAD_INPUT_MESH = -2,  //!< wrong mesh on lower submesh
-  COMPERR_STD_EXCEPTION  = -3,  //!< some std exception raised
-  COMPERR_OCC_EXCEPTION  = -4,  //!< OCC exception raised
-  COMPERR_SLM_EXCEPTION  = -5,  //!< SALOME exception raised
-  COMPERR_EXCEPTION      = -6,  //!< other exception raised
-  COMPERR_MEMORY_PB      = -7,  //!< std::bad_alloc exception
-  COMPERR_ALGO_FAILED    = -8,  //!< algo failed for some reason
-  COMPERR_BAD_SHAPE      = -9,  //!< bad geometry
-  COMPERR_WARNING        = -10, //!< algo reports error but sub-mesh is computed anyway
-  COMPERR_CANCELED       = -11  //!< compute canceled
+  COMPERR_OK               = -1,
+  COMPERR_BAD_INPUT_MESH   = -2,  //!< wrong mesh on lower submesh
+  COMPERR_STD_EXCEPTION    = -3,  //!< some std exception raised
+  COMPERR_OCC_EXCEPTION    = -4,  //!< OCC exception raised
+  COMPERR_SLM_EXCEPTION    = -5,  //!< SALOME exception raised
+  COMPERR_EXCEPTION        = -6,  //!< other exception raised
+  COMPERR_MEMORY_PB        = -7,  //!< std::bad_alloc exception
+  COMPERR_ALGO_FAILED      = -8,  //!< algo failed for some reason
+  COMPERR_BAD_SHAPE        = -9,  //!< bad geometry
+  COMPERR_WARNING          = -10, //!< algo reports error but sub-mesh is computed anyway
+  COMPERR_CANCELED         = -11, //!< compute canceled
+  COMPERR_NO_MESH_ON_SHAPE = -12, //!< no mesh elements assigned to sub-shape
+  COMPERR_LAST_ALGO_ERROR  = -100,//!< terminator of mesh computation errors
+  // Errors of SMESH_MeshEditor follow
+  EDITERR_NO_MEDIUM_ON_GEOM= -101 /* during conversion to quadratic,
+                                     some medium nodes not placed on geometry
+                                     to avoid distorting elements, which are
+                                     stored in SMESH_ComputeError::myBadElements */
 };
 
 // =============================================================
@@ -77,29 +84,32 @@ struct SMESH_ComputeError
                      const SMESH_Algo* algo    = 0)
     :myName(error),myComment(comment),myAlgo(algo) {}
 
-  bool IsOK()     { return myName == COMPERR_OK; }
-  bool IsKO()     { return myName != COMPERR_OK && myName != COMPERR_WARNING; }
-  bool IsCommon() { return myName < 0; }
+  bool IsOK()        const { return myName == COMPERR_OK; }
+  bool IsKO()        const { return myName != COMPERR_OK && myName != COMPERR_WARNING; }
+  bool IsCommon()    const { return myName < 0 && myName > COMPERR_LAST_ALGO_ERROR; }
+  bool HasBadElems() const { return !myBadElements.empty(); }
   inline std::string CommonName() const;
 
 };
 
 #define _case2char(err) case err: return #err;
 
+// Return myName as text, to be used to dump errors in terminal
 std::string SMESH_ComputeError::CommonName() const
 {
   switch( myName ) {
-  _case2char(COMPERR_OK            );
-  _case2char(COMPERR_BAD_INPUT_MESH);
-  _case2char(COMPERR_STD_EXCEPTION );
-  _case2char(COMPERR_OCC_EXCEPTION );
-  _case2char(COMPERR_SLM_EXCEPTION );
-  _case2char(COMPERR_EXCEPTION     );
-  _case2char(COMPERR_MEMORY_PB     );
-  _case2char(COMPERR_ALGO_FAILED   );
-  _case2char(COMPERR_BAD_SHAPE     );
-  _case2char(COMPERR_WARNING       );
-  _case2char(COMPERR_CANCELED      );
+  _case2char(COMPERR_OK              );
+  _case2char(COMPERR_BAD_INPUT_MESH  );
+  _case2char(COMPERR_STD_EXCEPTION   );
+  _case2char(COMPERR_OCC_EXCEPTION   );
+  _case2char(COMPERR_SLM_EXCEPTION   );
+  _case2char(COMPERR_EXCEPTION       );
+  _case2char(COMPERR_MEMORY_PB       );
+  _case2char(COMPERR_ALGO_FAILED     );
+  _case2char(COMPERR_BAD_SHAPE       );
+  _case2char(COMPERR_WARNING         );
+  _case2char(COMPERR_CANCELED        );
+  _case2char(COMPERR_NO_MESH_ON_SHAPE);
   default:;
   }
   return "";
index 2f748f7da54ee59b964aba2b309a37ce182a0ad2..4f05fa7a4ee6baf0d81f08dfa129f4607a6aea4d 100644 (file)
@@ -48,6 +48,7 @@ salomeinclude_HEADERS = \
        SMESH_NoteBook.hxx \
        SMESH_Measurements_i.hxx \
        SMESH_PreMeshInfo.hxx \
+       SMESH_MeshPartDS.hxx \
        SMESH.hxx
 
 # Scripts to be installed.
index 88e7ba18279e2439925598ce20d8c95def973ef5..91f6e7effd1d6482db1de829fd9aaa67fac89d1d 100644 (file)
@@ -1539,7 +1539,8 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand )
   // ----------------------------------------------------------------------
   else if ( method == "RemoveHypothesis" ) // (geom, hyp)
   {
-    _pyID hypID = theCommand->GetArg( 2 );
+    _pyID hypID  = theCommand->GetArg( 2 );
+    _pyID geomID = theCommand->GetArg( 1 );
 
     // check if this mesh still has corresponding addition command
     bool hasAddCmd = false;
@@ -1547,7 +1548,8 @@ void _pyMesh::Process( const Handle(_pyCommand)& theCommand )
     while ( cmd != myAddHypCmds.end() )
     {
       // AddHypothesis(geom, hyp)
-      if ( hypID == (*cmd)->GetArg( 2 )) { // erase both (add and remove) commands
+      if ( hypID  == (*cmd)->GetArg( 2 ) &&
+           geomID == (*cmd)->GetArg( 1 )) { // erase both (add and remove) commands
         theCommand->Clear();
         (*cmd)->Clear();
         cmd = myAddHypCmds.erase( cmd );
@@ -2356,7 +2358,7 @@ void _pyHypothesis::Assign( const Handle(_pyHypothesis)& theOther,
   myGeom                    = theOther->myGeom;
   myMesh                    = theMesh;
   myAlgoType2CreationMethod = theOther->myAlgoType2CreationMethod;
-  //myArgCommands             = theOther->myArgCommands;
+  myAccumulativeMethods     = theOther->myAccumulativeMethods;
   //myUnusedCommands          = theOther->myUnusedCommands;
   // init myCurCrMethod
   GetCreationMethod( theOther->GetAlgoType() );
@@ -2485,7 +2487,9 @@ bool _pyHypothesis::GetReferredMeshesAndGeom( list< Handle(_pyMesh) >& meshes )
 void _pyHypothesis::rememberCmdOfParameter( const Handle(_pyCommand) & theCommand )
 {
   // parameters are discriminated by method name
-  TCollection_AsciiString method = theCommand->GetMethod();
+  _AString method = theCommand->GetMethod();
+  if ( myAccumulativeMethods.count( method ))
+    return; // this method adds values and not override the previus value
 
   // discriminate commands setting different parameters via one method
   // by passing parameter names like e.g. SetOption("size", "0.2")
@@ -2503,7 +2507,7 @@ void _pyHypothesis::rememberCmdOfParameter( const Handle(_pyCommand) & theComman
     }
   }
   // parameters are discriminated by method name
-  list< Handle(_pyCommand)>& cmds = myMeth2Commands[ theCommand->GetMethod() ];
+  list< Handle(_pyCommand)>& cmds = myMeth2Commands[ method /*theCommand->GetMethod()*/ ];
   if ( !cmds.empty() && !isCmdUsedForCompute( cmds.back() ))
   {
     cmds.back()->Clear(); // previous parameter value has not been used
@@ -3304,10 +3308,10 @@ static inline bool isWord(const char c, const bool dotIsWord)
  */
 //================================================================================
 
-TCollection_AsciiString _pyCommand::GetWord( const TCollection_AsciiString & theString,
-                                            int &      theStartPos,
-                                            const bool theForward,
-                                            const bool dotIsWord )
+TCollection_AsciiString _pyCommand::GetWord( const _AString & theString,
+                                             int &            theStartPos,
+                                             const bool       theForward,
+                                             const bool       dotIsWord )
 {
   int beg = theStartPos, end = theStartPos;
   theStartPos = EMPTY;
@@ -4023,73 +4027,8 @@ bool _pyFilter::CanClear()
 
 _pyHypothesisReader::_pyHypothesisReader()
 {
-  // Get paths to xml files of plugins
-  vector< string > xmlPaths;
-  string sep;
-  if ( const char* meshersList = getenv("SMESH_MeshersList") )
-  {
-    string meshers = meshersList, plugin;
-    string::size_type from = 0, pos;
-    while ( from < meshers.size() )
-    {
-      // cut off plugin name
-      pos = meshers.find( ':', from );
-      if ( pos != string::npos )
-        plugin = meshers.substr( from, pos-from );
-      else
-        plugin = meshers.substr( from ), pos = meshers.size();
-      from = pos + 1;
-
-      // get PLUGIN_ROOT_DIR path
-      string rootDirVar, pluginSubDir = plugin;
-      if ( plugin == "StdMeshers" )
-        rootDirVar = "SMESH", pluginSubDir = "smesh";
-      else
-        for ( pos = 0; pos < plugin.size(); ++pos )
-          rootDirVar += toupper( plugin[pos] );
-      rootDirVar += "_ROOT_DIR";
-
-      const char* rootDir = getenv( rootDirVar.c_str() );
-      if ( !rootDir || strlen(rootDir) == 0 )
-      {
-        rootDirVar = plugin + "_ROOT_DIR"; // HexoticPLUGIN_ROOT_DIR
-        rootDir = getenv( rootDirVar.c_str() );
-        if ( !rootDir || strlen(rootDir) == 0 ) continue;
-      }
-
-      // get a separator from rootDir
-      for ( pos = strlen( rootDir )-1; pos >= 0 && sep.empty(); --pos )
-        if ( rootDir[pos] == '/' || rootDir[pos] == '\\' )
-        {
-          sep = rootDir[pos];
-          break;
-        }
-#ifdef WNT
-      if (sep.empty() ) sep = "\\";
-#else
-      if (sep.empty() ) sep = "/";
-#endif
-
-      // get a path to resource file
-      string xmlPath = rootDir;
-      if ( xmlPath[ xmlPath.size()-1 ] != sep[0] )
-        xmlPath += sep;
-      xmlPath += "share" + sep + "salome" + sep + "resources" + sep;
-      for ( pos = 0; pos < pluginSubDir.size(); ++pos )
-        xmlPath += tolower( pluginSubDir[pos] );
-      xmlPath += sep + plugin + ".xml";
-      bool fileOK;
-#ifdef WNT
-      fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES);
-#else
-      fileOK = (access(xmlPath.c_str(), F_OK) == 0);
-#endif
-      if ( fileOK )
-        xmlPaths.push_back( xmlPath );
-    }
-  }
-
   // Read xml files
+  vector< string > xmlPaths = SMESH_Gen::GetPluginXMLPaths();
   LDOMParser xmlParser;
   for ( size_t i = 0; i < xmlPaths.size(); ++i )
   {
@@ -4111,7 +4050,7 @@ _pyHypothesisReader::_pyHypothesisReader()
     LDOM_NodeList algoNodeList = xmlDoc.getElementsByTagName( "algorithm" );
     for ( int i = 0; i < algoNodeList.getLength(); ++i )
     {
-      LDOM_Node algoNode = algoNodeList.item( i );
+      LDOM_Node     algoNode = algoNodeList.item( i );
       LDOM_Element& algoElem = (LDOM_Element&) algoNode;
       LDOM_NodeList pyAlgoNodeList = algoElem.getElementsByTagName( "algo" );
       if ( pyAlgoNodeList.getLength() < 1 ) continue;
@@ -4173,7 +4112,43 @@ _pyHypothesisReader::_pyHypothesisReader()
         }
       }
     }
-  }
+    // <hypothesis type="BLSURF_Parameters"
+    //          ...
+    //          dim="2">
+    //   <python-wrap>
+    //     <accumulative-methods> 
+    //       SetEnforcedVertex,
+    //       SetEnforcedVertexNamed
+    //     </accumulative-methods>
+    //   </python-wrap>
+    // </hypothesis>
+    //
+    LDOM_NodeList hypNodeList = xmlDoc.getElementsByTagName( "hypothesis" );
+    for ( int i = 0; i < hypNodeList.getLength(); ++i )
+    {
+      LDOM_Node     hypNode      = hypNodeList.item( i );
+      LDOM_Element& hypElem      = (LDOM_Element&) hypNode;
+      _AString      hypType      = hypElem.getAttribute("type");
+      LDOM_NodeList methNodeList = hypElem.getElementsByTagName( "accumulative-methods" );
+      if ( methNodeList.getLength() != 1 || hypType.IsEmpty() ) continue;
+
+      map<_AString, Handle(_pyHypothesis)>::const_iterator type2hyp = myType2Hyp.find( hypType );
+      if ( type2hyp == myType2Hyp.end() ) continue;
+
+      LDOM_Node methNode = methNodeList.item( 0 );
+      LDOM_Node textNode = methNode.getFirstChild();
+      _AString      text = textNode.getNodeValue();
+      _AString method;
+      int pos = 1;
+      do {
+        method = _pyCommand::GetWord( text, pos, /*forward= */true );
+        pos += method.Length();
+        type2hyp->second->AddAccumulativeMethod( method );
+      }
+      while ( !method.IsEmpty() );
+    }
+
+  } // loop on xmlPaths
 }
 
 //================================================================================
index f92c285b4c4176cf3463c4afe671db5b35fc7e4a..36212e0686a3bffbe5ff3bb02f3dae63d229db1b 100644 (file)
@@ -37,6 +37,7 @@
 #include <list>
 #include <map>
 #include <vector>
+#include <set>
 
 #include <SALOMEconfig.h>
 #include CORBA_CLIENT_HEADER(SALOMEDS)
@@ -360,7 +361,7 @@ protected:
   _pyID   myGeom,   myMesh;
   struct CreationMethod {
     _AString              myMethod; // method of algo or mesh creating a hyp
-    // myArgNb(i)-th arg of myArgMethods(i) of hyp becomes an i-th arg of myAlgoMethod
+    // myArgNb(i)-th arg of myArgMethods(i) of hyp becomes an i-th arg of myMethod
     std::vector<_AString> myArgMethods;
     std::vector<int>      myArgNb; // arg nb countered from 1
     std::vector<_AString> myArgs; // creation arguments
@@ -369,6 +370,7 @@ protected:
   // a hypothesis can be created by different algos by different methods
   typedef std::map<_AString, CreationMethod > TType2CrMethod;
   TType2CrMethod                myAlgoType2CreationMethod;
+  std::set< _AString >          myAccumulativeMethods;
   CreationMethod*               myCurCrMethod; // used for adding to myAlgoType2CreationMethod
   std::list<Handle(_pyCommand)> myArgCommands;
   std::list<Handle(_pyCommand)> myUnusedCommands;
@@ -389,6 +391,8 @@ public:
   void AddArgMethod(const _AString& method, const int argNb = 1)
   { myCurCrMethod->myArgMethods.push_back( method );
     myCurCrMethod->myArgNb.push_back( argNb ); }
+  void AddAccumulativeMethod( const _AString& method)
+  { myAccumulativeMethods.insert( method ); }
   //const TColStd_SequenceOfAsciiString& GetArgs() const { return myArgs; }
   const std::list<Handle(_pyCommand)>& GetArgCommands() const { return myArgCommands; }
   void ClearAllCommands();
index 0544cb091f48852dcc670d7e6c29895f10e7f24b..e76a8a7360fe547ea3e487b2b54a340cd304def2 100644 (file)
@@ -85,10 +85,8 @@ namespace SMESH
   TPythonDump::
   operator<<(const TVar& theVarValue)
   {
-    if ( theVarValue.myVals.empty() ) return *this;
-
     const std::vector< std::string >& varNames = SMESH_Gen_i::GetSMESHGen()->GetLastParameters();
-    if ( theVarValue.myVals.size() > 1 )
+    if ( theVarValue.myVals.size() != 1 )
     {
       myStream << "[ ";
       for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i )
index 24b30bb62e2c5013e60b976dd36db43ebd79da1c..dc47f8a848a90ef34afd293464453bb63e1add95 100644 (file)
 #include <map>
 #include <fstream>
 #include <cstdio>
+#include <stdlib.h>
 
 using namespace std;
 using SMESH::TPythonDump;
@@ -960,7 +961,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMeshesFromUNV( const char* theFileName
     aStudyBuilder->CommitCommand();
     if ( !aSO->_is_nil() ) {
       // Update Python script
-      TPythonDump() << aSO << " = smeshgen.CreateMeshesFromUNV(r'" << theFileName << "')";
+      TPythonDump() << aSO << " = " << this << ".CreateMeshesFromUNV(r'" << theFileName << "')";
     }
   }
 
@@ -1222,6 +1223,47 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromCGNS( const char* theFileName,
   return aResult._retn();
 }
 
+//================================================================================
+/*!
+ * \brief Create a mesh and import data from a GMF file
+ */
+//================================================================================
+
+SMESH::SMESH_Mesh_ptr
+SMESH_Gen_i::CreateMeshesFromGMF( const char*             theFileName,
+                                  SMESH::ComputeError_out theError)
+    throw ( SALOME::SALOME_Exception )
+{
+  Unexpect aCatch(SALOME_SalomeException);
+
+  SMESH::SMESH_Mesh_var aMesh = createMesh();
+#ifdef WIN32
+  char bname[ _MAX_FNAME ];
+  _splitpath( theFileName, NULL, NULL, bname, NULL );
+  string aFileName = bname;
+#else
+  string aFileName = basename( theFileName );
+#endif
+  // publish mesh in the study
+  if ( CanPublishInStudy( aMesh ) ) {
+    SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+    aStudyBuilder->NewCommand();  // There is a transaction
+    SALOMEDS::SObject_var aSO = PublishInStudy
+      ( myCurrentStudy, SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() );
+    aStudyBuilder->CommitCommand();
+    if ( !aSO->_is_nil() ) {
+      // Update Python script
+      TPythonDump() << "("<< aSO << ", error) = " << this << ".CreateMeshesFromGMF(r'" << theFileName << "')";
+    }
+  }
+  SMESH_Mesh_i* aServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( aMesh ).in() );
+  ASSERT( aServant );
+  theError = aServant->ImportGMFFile( theFileName );
+  aServant->GetImpl().GetMeshDS()->Modified();
+  return aMesh._retn();
+}
+
+
 //=============================================================================
 /*!
  *  SMESH_Gen_i::IsReadyToCompute
@@ -4158,18 +4200,6 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent,
             }
           }
 
-          // issue 0020693. Restore _isModified flag
-          if( aTopGroup->ExistInternalObject( "_isModified" ) )
-          {
-            aDataset = new HDFdataset( "_isModified", aTopGroup );
-            aDataset->OpenOnDisk();
-            size = aDataset->GetSize();
-            int* isModified = new int[ size ];
-            aDataset->ReadFromDisk( isModified );
-            aDataset->CloseOnDisk();
-            myNewMeshImpl->GetImpl().SetIsModified( bool(*isModified));
-          }
-
           // issue 20918. Restore Persistent Id of SMESHDS_Mesh
           if( aTopGroup->ExistInternalObject( "meshPersistentId" ) )
           {
index a72c466f31c9f97daff0038896330d1ced30e95f..1165ac142fa8c8267f707d0c112d9e6d48aa7e87 100644 (file)
@@ -238,7 +238,7 @@ public:
   SMESH::SMESH_Mesh_ptr CreateEmptyMesh()
     throw ( SALOME::SALOME_Exception );
 
-  //  Create mesh(es) and import data from UNV fileter
+  //  Create a mesh and import data from an UNV file
   SMESH::SMESH_Mesh_ptr CreateMeshesFromUNV( const char* theFileName )
     throw ( SALOME::SALOME_Exception );
 
@@ -252,7 +252,7 @@ public:
                                            SMESH::DriverMED_ReadStatus& theStatus )
     throw ( SALOME::SALOME_Exception );
 
-  //  Create mesh(es) and import data from STL file
+  //  Create a mesh and import data from a STL file
   SMESH::SMESH_Mesh_ptr CreateMeshesFromSTL( const char* theFileName )
     throw ( SALOME::SALOME_Exception );
 
@@ -261,6 +261,11 @@ public:
                                            SMESH::DriverMED_ReadStatus& theStatus )
     throw ( SALOME::SALOME_Exception );
 
+  //  Create a mesh and import data from a GMF file
+  SMESH::SMESH_Mesh_ptr CreateMeshesFromGMF( const char*             theFileName,
+                                             SMESH::ComputeError_out theError)
+    throw ( SALOME::SALOME_Exception );
+
   // Copy a part of mesh
   SMESH::SMESH_Mesh_ptr CopyMesh(SMESH::SMESH_IDSource_ptr meshPart,
                                  const char*               meshName,
index 96131044beb93cb8c40a7c0687703a91cca6e87a..f0fed296401201f4d8d9bc894612017bc409616c 100644 (file)
@@ -216,98 +216,98 @@ void SMESH_Hypothesis_i::setOldParameters (const char* theParameters)
  *
  */
 //=============================================================================
-void SMESH_Hypothesis_i::SetParameters(const char* theParameters)
-{
-  SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
-  //char * aParameters = CORBA::string_dup(theParameters);
-  if(gen){
-    gen->UpdateParameters(theParameters);
-    // if(IsPublished()) {
-    //   SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Hypothesis::_narrow(_this()),aParameters);
-    // }
-    // else {
-    //   myBaseImpl->SetParameters(gen->ParseParameters(aParameters));
-    // }
-  }
-}
-
-//=============================================================================
-/*!
- *  SMESH_Hypothesis_i::GetParameters()
- *
- */
-//=============================================================================
-char* SMESH_Hypothesis_i::GetParameters()
-{
-  SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
-  char* aResult;
-  if(IsPublished()) {
-    MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get Parameters from SObject");
-    aResult = gen->GetParameters(SMESH::SMESH_Hypothesis::_narrow(_this()));
-  }
-  else {
-    MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get local parameters");
-    aResult = myBaseImpl->GetParameters(); 
-  }
-  return CORBA::string_dup(aResult);
-}
-
-//=============================================================================
-/*!
- *  SMESH_Hypothesis_i::GetLastParameters()
- *
- */
-//=============================================================================
-SMESH::ListOfParameters* SMESH_Hypothesis_i::GetLastParameters()
-{
-  SMESH::ListOfParameters_var aResult = new SMESH::ListOfParameters();
-  SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
-  if(gen) {
-    char *aParameters;
-    if(IsPublished())
-     aParameters = GetParameters();
-    else
-      aParameters = myBaseImpl->GetLastParameters();
-
-    SALOMEDS::Study_ptr aStudy = gen->GetCurrentStudy();
-    if(!aStudy->_is_nil()) {
-      SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters); 
-      if(aSections->length() > 0) {
-        SALOMEDS::ListOfStrings aVars = aSections[aSections->length()-1];
-        aResult->length(aVars.length());
-        for(int i = 0;i < aVars.length();i++)
-          aResult[i] = CORBA::string_dup( aVars[i]);
-      }
-    }
-  }
-  return aResult._retn();
-}
-
-//=============================================================================
-/*!
- *  SMESH_Hypothesis_i::SetLastParameters()
- *
- */
-//=============================================================================
-void SMESH_Hypothesis_i::SetLastParameters(const char* theParameters)
-{
-  if(!IsPublished()) {
-    myBaseImpl->SetLastParameters(theParameters);
-  }
-}
-//=============================================================================
-/*!
- *  SMESH_Hypothesis_i::ClearParameters()
- *
- */
-//=============================================================================
-void SMESH_Hypothesis_i::ClearParameters()
-{
-  myMethod2VarParams.clear();
-  // if(!IsPublished()) {
-  //   myBaseImpl->ClearParameters();
-  // }
-}
+// void SMESH_Hypothesis_i::SetParameters(const char* theParameters)
+// {
+//   SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+//   //char * aParameters = CORBA::string_dup(theParameters);
+//   if(gen){
+//     gen->UpdateParameters(theParameters);
+//     // if(IsPublished()) {
+//     //   SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Hypothesis::_narrow(_this()),aParameters);
+//     // }
+//     // else {
+//     //   myBaseImpl->SetParameters(gen->ParseParameters(aParameters));
+//     // }
+//   }
+// }
+
+// //=============================================================================
+// /*!
+//  *  SMESH_Hypothesis_i::GetParameters()
+//  *
+//  */
+// //=============================================================================
+// char* SMESH_Hypothesis_i::GetParameters()
+// {
+//   SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+//   char* aResult;
+//   if(IsPublished()) {
+//     MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get Parameters from SObject");
+//     aResult = gen->GetParameters(SMESH::SMESH_Hypothesis::_narrow(_this()));
+//   }
+//   else {
+//     MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get local parameters");
+//     aResult = myBaseImpl->GetParameters(); 
+//   }
+//   return CORBA::string_dup(aResult);
+// }
+
+// //=============================================================================
+// /*!
+//  *  SMESH_Hypothesis_i::GetLastParameters()
+//  *
+//  */
+// //=============================================================================
+// SMESH::ListOfParameters* SMESH_Hypothesis_i::GetLastParameters()
+// {
+//   SMESH::ListOfParameters_var aResult = new SMESH::ListOfParameters();
+//   SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+//   if(gen) {
+//     char *aParameters;
+//     if(IsPublished())
+//      aParameters = GetParameters();
+//     else
+//       aParameters = myBaseImpl->GetLastParameters();
+
+//     SALOMEDS::Study_ptr aStudy = gen->GetCurrentStudy();
+//     if(!aStudy->_is_nil()) {
+//       SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters); 
+//       if(aSections->length() > 0) {
+//         SALOMEDS::ListOfStrings aVars = aSections[aSections->length()-1];
+//         aResult->length(aVars.length());
+//         for(int i = 0;i < aVars.length();i++)
+//           aResult[i] = CORBA::string_dup( aVars[i]);
+//       }
+//     }
+//   }
+//   return aResult._retn();
+// }
+
+// //=============================================================================
+// /*!
+//  *  SMESH_Hypothesis_i::SetLastParameters()
+//  *
+//  */
+// //=============================================================================
+// void SMESH_Hypothesis_i::SetLastParameters(const char* theParameters)
+// {
+//   if(!IsPublished()) {
+//     myBaseImpl->SetLastParameters(theParameters);
+//   }
+// }
+// //=============================================================================
+// /*!
+//  *  SMESH_Hypothesis_i::ClearParameters()
+//  *
+//  */
+// //=============================================================================
+// void SMESH_Hypothesis_i::ClearParameters()
+// {
+//   myMethod2VarParams.clear();
+//   // if(!IsPublished()) {
+//   //   myBaseImpl->ClearParameters();
+//   // }
+// }
 
 //=============================================================================
 /*!
index 593ed85cab9928ab3020c9c36ceb6705347fc179..c8ff51ab3886d9afc09ed4ce0b9f0e3dd8360bae 100644 (file)
@@ -79,20 +79,20 @@ public:
   char* GetVarParameter (const char* methodName);
 
   // Set list of parameters  separated by ":" symbol, used for Hypothesis creation
-  void SetParameters (const char* theParameters);
+  // void SetParameters (const char* theParameters);
   
-  // Return list of notebook variables used for Hypothesis creation separated by ":" symbol
-  char* GetParameters();
+  // // Return list of notebook variables used for Hypothesis creation separated by ":" symbol
+  // char* GetParameters();
 
-  //Return list of last notebook variables used for Hypothesis creation.
-  SMESH::ListOfParameters* GetLastParameters();
+  // //Return list of last notebook variables used for Hypothesis creation.
+  // SMESH::ListOfParameters* GetLastParameters();
 
-  //Set last parameters for not published hypothesis
+  // //Set last parameters for not published hypothesis
   
-  void SetLastParameters(const char* theParameters);
+  // void SetLastParameters(const char* theParameters);
   
-  // Clear parameters list
-  void ClearParameters();
+  // // Clear parameters list
+  // void ClearParameters();
 
   //Return true if hypothesis was published in study
   bool IsPublished();
index 026eed079f2ac031ff0f0e4236db2b5e8091bc20..a5b5f88c16998a07f94d73e784c616a7673aa502 100644 (file)
 
 #include "SMESH_MeshEditor_i.hxx"
 
+#include "DriverMED_R_SMESHDS_Mesh.h"
+#include "DriverMED_W_SMESHDS_Mesh.h"
+#include "SMDS_EdgePosition.hxx"
+#include "SMDS_ElemIterator.hxx"
+#include "SMDS_FacePosition.hxx"
+#include "SMDS_IteratorOnIterators.hxx"
 #include "SMDS_LinearEdge.hxx"
 #include "SMDS_Mesh0DElement.hxx"
 #include "SMDS_MeshFace.hxx"
 #include "SMDS_MeshVolume.hxx"
 #include "SMDS_PolyhedralVolumeOfNodes.hxx"
 #include "SMDS_SetIterator.hxx"
+#include "SMDS_SetIterator.hxx"
+#include "SMDS_VolumeTool.hxx"
+#include "SMESHDS_Command.hxx"
+#include "SMESHDS_CommandType.hxx"
 #include "SMESHDS_Group.hxx"
+#include "SMESHDS_GroupOnGeom.hxx"
 #include "SMESH_ControlsDef.hxx"
 #include "SMESH_Filter_i.hxx"
+#include "SMESH_Filter_i.hxx"
+#include "SMESH_Gen_i.hxx"
 #include "SMESH_Gen_i.hxx"
+#include "SMESH_Group.hxx"
 #include "SMESH_Group_i.hxx"
+#include "SMESH_Group_i.hxx"
+#include "SMESH_MEDMesh_i.hxx"
+#include "SMESH_MeshEditor.hxx"
+#include "SMESH_MeshPartDS.hxx"
+#include "SMESH_MesherHelper.hxx"
+#include "SMESH_PreMeshInfo.hxx"
+#include "SMESH_PythonDump.hxx"
 #include "SMESH_PythonDump.hxx"
 #include "SMESH_subMeshEventListener.hxx"
 #include "SMESH_subMesh_i.hxx"
+#include "SMESH_subMesh_i.hxx"
 
 #include "utilities.h"
 #include "Utils_ExceptHandlers.hxx"
@@ -438,6 +460,7 @@ void SMESH_MeshEditor_i::initData(bool deleteSearchers)
     if ( deleteSearchers )
       TSearchersDeleter::Delete();
   }
+  myEditor.GetError().reset();
 }
 
 //================================================================================
@@ -458,27 +481,42 @@ void SMESH_MeshEditor_i::storeResult(::SMESH_MeshEditor& )
 
 SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
 {
-  if ( myPreviewMode ) { // --- MeshPreviewStruct filling ---
+  const bool hasBadElems = ( myEditor.GetError() && myEditor.GetError()->HasBadElems() );
+
+  if ( myPreviewMode || hasBadElems ) { // --- MeshPreviewStruct filling ---
 
     list<int> aNodesConnectivity;
     typedef map<int, int> TNodesMap;
     TNodesMap nodesMap;
 
-    TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( myEditor.GetMesh() );
-    SMDSAbs_ElementType previewType = aPreviewMesh->myPreviewType;
-
-    SMESHDS_Mesh* aMeshDS = myEditor.GetMeshDS();
+    SMESHDS_Mesh* aMeshDS;
+    std::auto_ptr< SMESH_MeshPartDS > aMeshPartDS;
+    if ( hasBadElems ) {
+      aMeshPartDS.reset( new SMESH_MeshPartDS( myEditor.GetError()->myBadElements ));
+      aMeshDS = aMeshPartDS.get();
+    }
+    else {
+      aMeshDS = myEditor.GetMeshDS();
+    }
     int nbEdges = aMeshDS->NbEdges();
     int nbFaces = aMeshDS->NbFaces();
     int nbVolum = aMeshDS->NbVolumes();
-    switch ( previewType ) {
-    case SMDSAbs_Edge  : nbFaces = nbVolum = 0; break;
-    case SMDSAbs_Face  : nbEdges = nbVolum = 0; break;
-    case SMDSAbs_Volume: nbEdges = nbFaces = 0; break;
-    default:;
-    }
     myPreviewData = new SMESH::MeshPreviewStruct();
     myPreviewData->nodesXYZ.length(aMeshDS->NbNodes());
+
+    
+    SMDSAbs_ElementType previewType = SMDSAbs_All;
+    if ( !hasBadElems )
+      if (TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( myEditor.GetMesh() )) {
+        previewType = aPreviewMesh->myPreviewType;
+        switch ( previewType ) {
+        case SMDSAbs_Edge  : nbFaces = nbVolum = 0; break;
+        case SMDSAbs_Face  : nbEdges = nbVolum = 0; break;
+        case SMDSAbs_Volume: nbEdges = nbFaces = 0; break;
+        default:;
+        }
+      }
+
     myPreviewData->elementTypes.length(nbEdges + nbFaces + nbVolum);
     int i = 0, j = 0;
     SMDS_ElemIteratorPtr itMeshElems = aMeshDS->elementsIterator();
@@ -561,6 +599,26 @@ SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedElems()
   return myLastCreatedElems._retn();
 }
 
+//=======================================================================
+/*
+ * Returns description of an error/warning occured during the last operation
+ */
+//=======================================================================
+
+SMESH::ComputeError* SMESH_MeshEditor_i::GetLastError()
+{
+  SMESH::ComputeError*   errOut = new SMESH::ComputeError;
+  SMESH_ComputeErrorPtr& errIn  = myEditor.GetError();
+  if ( errIn && !errIn->IsOK() )
+  {
+    errOut->code       = -( errIn->myName < 0 ? errIn->myName + 1: errIn->myName ); // -1 -> 0
+    errOut->comment    = errIn->myComment.c_str();
+    errOut->subShapeID = -1;
+    errOut->hasBadMesh = !errIn->myBadElements.empty();
+  }
+  return errOut;
+}
+
 //=======================================================================
 //function : MakeIDSource
 //purpose  : Wrap a sequence of ids in a SMESH_IDSource
@@ -5937,6 +5995,124 @@ SMESH_MeshEditor_i::DoubleNodeElemGroupsInRegion(const SMESH::ListOfGroups& theE
   return aResult;
 }
 
+//================================================================================
+/*!
+  \brief Identify the elements that will be affected by node duplication (actual duplication is not performed.
+  This method is the first step of DoubleNodeElemGroupsInRegion.
+  \param theElems - list of groups of elements (edges or faces) to be replicated
+  \param theNodesNot - list of groups of nodes not to replicated
+  \param theShape - shape to detect affected elements (element which geometric center
+         located on or inside shape).
+         The replicated nodes should be associated to affected elements.
+  \return groups of affected elements
+  \sa DoubleNodeElemGroupsInRegion()
+ */
+//================================================================================
+SMESH::ListOfGroups*
+SMESH_MeshEditor_i::AffectedElemGroupsInRegion( const SMESH::ListOfGroups& theElems,
+                                                const SMESH::ListOfGroups& theNodesNot,
+                                                GEOM::GEOM_Object_ptr      theShape )
+{
+  MESSAGE("AffectedElemGroupsInRegion");
+  SMESH::ListOfGroups_var aListOfGroups = new SMESH::ListOfGroups();
+  bool isEdgeGroup = false;
+  bool isFaceGroup = false;
+  bool isVolumeGroup = false;
+  SMESH::SMESH_Group_var aNewEdgeGroup = myMesh_i->CreateGroup(SMESH::EDGE, "affectedEdges");
+  SMESH::SMESH_Group_var aNewFaceGroup = myMesh_i->CreateGroup(SMESH::FACE, "affectedFaces");
+  SMESH::SMESH_Group_var aNewVolumeGroup = myMesh_i->CreateGroup(SMESH::VOLUME, "affectedVolumes");
+
+  initData();
+
+  ::SMESH_MeshEditor aMeshEditor(myMesh);
+
+  SMESHDS_Mesh* aMeshDS = GetMeshDS();
+  TIDSortedElemSet anElems, aNodes;
+  listOfGroupToSet(theElems, aMeshDS, anElems, false);
+  listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true);
+
+  TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape(theShape);
+  TIDSortedElemSet anAffected;
+  bool aResult = aMeshEditor.AffectedElemGroupsInRegion(anElems, aNodes, aShape, anAffected);
+
+  storeResult(aMeshEditor);
+
+  myMesh->GetMeshDS()->Modified();
+  TPythonDump pyDump;
+  if (aResult)
+    {
+      myMesh->SetIsModified(true);
+
+      int lg = anAffected.size();
+      MESSAGE("lg="<< lg);
+      SMESH::long_array_var volumeIds = new SMESH::long_array;
+      volumeIds->length(lg);
+      SMESH::long_array_var faceIds = new SMESH::long_array;
+      faceIds->length(lg);
+      SMESH::long_array_var edgeIds = new SMESH::long_array;
+      edgeIds->length(lg);
+      int ivol = 0;
+      int iface = 0;
+      int iedge = 0;
+
+      TIDSortedElemSet::const_iterator eIt = anAffected.begin();
+      for (; eIt != anAffected.end(); ++eIt)
+        {
+          const SMDS_MeshElement* anElem = *eIt;
+          if (!anElem)
+            continue;
+          int elemId = anElem->GetID();
+          if (myMesh->GetElementType(elemId, true) == SMDSAbs_Volume)
+            volumeIds[ivol++] = elemId;
+          else if (myMesh->GetElementType(elemId, true) == SMDSAbs_Face)
+            faceIds[iface++] = elemId;
+          else if (myMesh->GetElementType(elemId, true) == SMDSAbs_Edge)
+            edgeIds[iedge++] = elemId;
+        }
+      volumeIds->length(ivol);
+      faceIds->length(iface);
+      edgeIds->length(iedge);
+
+      aNewVolumeGroup->Add(volumeIds);
+      aNewFaceGroup->Add(faceIds);
+      aNewEdgeGroup->Add(edgeIds);
+      isVolumeGroup = (aNewVolumeGroup->Size() > 0);
+      isFaceGroup = (aNewFaceGroup->Size() > 0);
+      isEdgeGroup = (aNewEdgeGroup->Size() > 0);
+    }
+
+  int nbGroups = 0;
+  if (isEdgeGroup)
+    nbGroups++;
+  if (isFaceGroup)
+    nbGroups++;
+  if (isVolumeGroup)
+    nbGroups++;
+  aListOfGroups->length(nbGroups);
+
+  int i = 0;
+  if (isEdgeGroup)
+    aListOfGroups[i++] = aNewEdgeGroup._retn();
+  if (isFaceGroup)
+    aListOfGroups[i++] = aNewFaceGroup._retn();
+  if (isVolumeGroup)
+    aListOfGroups[i++] = aNewVolumeGroup._retn();
+
+  // Update Python script
+
+  pyDump << "[ ";
+  if (isEdgeGroup)
+    pyDump << aNewEdgeGroup << ", ";
+  if (isFaceGroup)
+    pyDump << aNewFaceGroup << ", ";
+  if (isVolumeGroup)
+    pyDump << aNewVolumeGroup << ", ";
+  pyDump << "] = ";
+  pyDump << this << ".AffectedElemGroupsInRegion( " << &theElems << ", " << &theNodesNot << ", " << theShape << " )";
+
+  return aListOfGroups._retn();
+}
+
 //================================================================================
 /*!
   \brief Generated skin mesh (containing 2D cells) from 3D mesh
@@ -6055,6 +6231,53 @@ CORBA::Boolean SMESH_MeshEditor_i::CreateFlatElementsOnFacesGroups( const SMESH:
   return aResult;
 }
 
+/*!
+ *  \brief identify all the elements around a geom shape, get the faces delimiting the hole
+ *  Build groups of volume to remove, groups of faces to replace on the skin of the object,
+ *  groups of faces to remove inside the object, (idem edges).
+ *  Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+ */
+void SMESH_MeshEditor_i::CreateHoleSkin(CORBA::Double radius,
+                                        GEOM::GEOM_Object_ptr theShape,
+                                        const char* groupName,
+                                        const SMESH::double_array& theNodesCoords,
+                                        SMESH::array_of_long_array_out GroupsOfNodes)
+throw (SALOME::SALOME_Exception)
+{
+  initData();
+  std::vector<std::vector<int> > aListOfListOfNodes;
+  ::SMESH_MeshEditor aMeshEditor( myMesh );
+
+  theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other
+  if ( !theNodeSearcher )
+    theNodeSearcher = aMeshEditor.GetNodeSearcher();
+
+  vector<double> nodesCoords;
+  for (int i = 0; i < theNodesCoords.length(); i++)
+    {
+      nodesCoords.push_back( theNodesCoords[i] );
+  }
+
+  TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape );
+  aMeshEditor.CreateHoleSkin(radius, aShape, theNodeSearcher, groupName, nodesCoords, aListOfListOfNodes);
+
+  GroupsOfNodes = new SMESH::array_of_long_array;
+  GroupsOfNodes->length( aListOfListOfNodes.size() );
+  std::vector<std::vector<int> >::iterator llIt = aListOfListOfNodes.begin();
+  for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ )
+    {
+      vector<int>& aListOfNodes = *llIt;
+      vector<int>::iterator lIt = aListOfNodes.begin();;
+      SMESH::long_array& aGroup = (*GroupsOfNodes)[ i ];
+      aGroup.length( aListOfNodes.size() );
+      for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ )
+        aGroup[ j ] = (*lIt);
+    }
+  TPythonDump() << "lists_nodes = " << this << ".CreateHoleSkin( "
+      << radius << ", " << theShape << ", " << ", " << groupName << ", " << theNodesCoords << " )";
+}
+
+
 // issue 20749 ===================================================================
 /*!
  * \brief Creates missing boundary elements
index 15233798bb907aad3d7f598c4d1a0de3ae4b997b..fa76be969ce7a8e391ca1114f27d6fe64d2a8e0e 100644 (file)
@@ -38,7 +38,6 @@
 #include "SMESH_MeshEditor.hxx"
 #include <list>
 
-class SMESH_MeshEditor;
 class SMESH_Mesh_i;
 
 class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor
@@ -47,9 +46,35 @@ public:
   SMESH_MeshEditor_i(SMESH_Mesh_i * theMesh, bool isPreview);
 
   virtual ~ SMESH_MeshEditor_i();
+  /*!
+   * \brief Return edited mesh ID
+   * \retval int - mesh ID
+   */
+  int GetMeshId() const { return myMesh->GetId(); }
 
   // --- CORBA
 
+  /*!
+   * Return data of mesh edition preview
+   */
+  SMESH::MeshPreviewStruct* GetPreviewData();
+  /*!
+   * If during last operation of MeshEditor some nodes were
+   * created this method returns list of their IDs, if new nodes
+   * not created - returns an empty list
+   */
+  SMESH::long_array* GetLastCreatedNodes();
+  /*!
+   * If during last operation of MeshEditor some elements were
+   * created this method returns list of their IDs, if new elements
+   * not created - returns an empty list
+   */
+  SMESH::long_array* GetLastCreatedElems();
+  /*!
+   * \brief Returns description of an error/warning occured during the last operation
+   */
+  SMESH::ComputeError* GetLastError();
+
   /*!
    * \brief Wrap a sequence of ids in a SMESH_IDSource
    */
@@ -568,31 +593,6 @@ public:
    */
   CORBA::Boolean ChangeElemNodes(CORBA::Long ide, const SMESH::long_array& newIDs);
 
-  /*!
-   * Return data of mesh edition preview
-   */
-  SMESH::MeshPreviewStruct* GetPreviewData();
-
-  /*!
-   * If during last operation of MeshEditor some nodes were
-   * created this method returns list of it's IDs, if new nodes
-   * not creared - returns empty list
-   */
-  SMESH::long_array* GetLastCreatedNodes();
-
-  /*!
-   * If during last operation of MeshEditor some elements were
-   * created this method returns list of it's IDs, if new elements
-   * not creared - returns empty list
-   */
-  SMESH::long_array* GetLastCreatedElems();
-
-  /*!
-   * \brief Return edited mesh ID
-   * \retval int - mesh ID
-   */
-  int GetMeshId() const { return myMesh->GetId(); }
-
   CORBA::Boolean DoubleNodes( const SMESH::long_array& theNodes,
                               const SMESH::long_array& theModifiedElems );
 
@@ -743,6 +743,22 @@ public:
   CORBA::Boolean DoubleNodeElemGroupsInRegion( const SMESH::ListOfGroups& theElems,
                                                const SMESH::ListOfGroups& theNodesNot,
                                                GEOM::GEOM_Object_ptr      theShape );
+
+  /*!
+   * \brief Identify the elements that will be affected by node duplication (actual duplication is not performed.
+   * This method is the first step of DoubleNodeElemGroupsInRegion.
+   * \param theElems - list of groups of elements (edges or faces) to be replicated
+   * \param theNodesNot - list of groups of nodes not to replicated
+   * \param theShape - shape to detect affected elements (element which geometric center
+   *        located on or inside shape).
+   *        The replicated nodes should be associated to affected elements.
+   * \return groups of affected elements
+   * \sa DoubleNodeElemGroupsInRegion()
+   */
+  SMESH::ListOfGroups* AffectedElemGroupsInRegion( const SMESH::ListOfGroups& theElems,
+                                                   const SMESH::ListOfGroups& theNodesNot,
+                                                   GEOM::GEOM_Object_ptr      theShape );
+
   /*!
    * \brief Double nodes on shared faces between groups of volumes and create flat elements on demand.
    * The list of groups must describe a partition of the mesh volumes.
@@ -767,6 +783,19 @@ public:
    */
   CORBA::Boolean CreateFlatElementsOnFacesGroups( const SMESH::ListOfGroups& theGroupsOfFaces );
 
+  /*!
+   *  \brief identify all the elements around a geom shape, get the faces delimiting the hole
+   *  Build groups of volume to remove, groups of faces to replace on the skin of the object,
+   *  groups of faces to remove insidethe object, (idem edges).
+   *  Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+   */
+  void CreateHoleSkin(CORBA::Double radius,
+                      GEOM::GEOM_Object_ptr theShape,
+                      const char* groupName,
+                      const SMESH::double_array& theNodesCoords,
+                      SMESH::array_of_long_array_out GroupsOfNodes)
+  throw (SALOME::SALOME_Exception);
+
   /*!
    * \brief Generated skin mesh (containing 2D cells) from 3D mesh
    * The created 2D mesh elements based on nodes of free faces of boundary volumes
diff --git a/src/SMESH_I/SMESH_MeshPartDS.hxx b/src/SMESH_I/SMESH_MeshPartDS.hxx
new file mode 100644 (file)
index 0000000..7257b71
--- /dev/null
@@ -0,0 +1,70 @@
+// 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      : SMESH_MeshPartDS.hxx
+// Created   : Thu Sep 13 20:26:47 2012
+// Author    : Edward AGAPOV (eap)
+
+#ifndef __SMESH_MeshPartDS_HXX__
+#define __SMESH_MeshPartDS_HXX__
+
+#include "SMESHDS_Mesh.hxx"
+
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Mesh)
+
+#include <list>
+
+//=============================================================================
+/*!
+ * \brief Class providing SMESHDS_Mesh API to SMESH_IDSource. 
+ *        It is used to export a part of mesh as a whole mesh.
+ */
+// Implementation is in SMESH_Mesh_i.cxx where this class was extracted from
+
+class SMESH_MeshPartDS : public SMESHDS_Mesh
+{
+public:
+  SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr                    meshPart);
+  SMESH_MeshPartDS(const std::list< const SMDS_MeshElement* > & badElems );
+
+  virtual SMDS_NodeIteratorPtr   nodesIterator     (bool idInceasingOrder=false) const;
+  virtual SMDS_EdgeIteratorPtr   edgesIterator     (bool idInceasingOrder=false) const;
+  virtual SMDS_FaceIteratorPtr   facesIterator     (bool idInceasingOrder=false) const;
+  virtual SMDS_VolumeIteratorPtr volumesIterator   (bool idInceasingOrder=false) const;
+
+  virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
+  virtual SMDS_ElemIteratorPtr elementGeomIterator(SMDSAbs_GeometryType type) const;
+  virtual SMDS_ElemIteratorPtr elementEntityIterator(SMDSAbs_EntityType type) const;
+
+private:
+  TIDSortedElemSet _elements[ SMDSAbs_NbElementTypes ];
+  SMESHDS_Mesh*    _meshDS;
+  /*!
+   * \brief Class used to access to protected data of SMDS_MeshInfo
+   */
+  struct TMeshInfo : public SMDS_MeshInfo
+  {
+    void Add(const SMDS_MeshElement* e) { SMDS_MeshInfo::addWithPoly( e ); }
+  };
+};
+
+#endif
index 2e4d1772c2a1bd5c01ea74c750e27528eda85aeb..3bcdb181ca7898578e1983fe74f1630f9bbd912d 100644 (file)
@@ -43,6 +43,7 @@
 #include "SMESH_MEDMesh_i.hxx"
 #include "SMESH_MeshEditor.hxx"
 #include "SMESH_MeshEditor_i.hxx"
+#include "SMESH_MeshPartDS.hxx"
 #include "SMESH_MesherHelper.hxx"
 #include "SMESH_PreMeshInfo.hxx"
 #include "SMESH_PythonDump.hxx"
 #include <OSD_File.hxx>
 #include <OSD_Path.hxx>
 #include <OSD_Protection.hxx>
+#include <Standard_OutOfMemory.hxx>
 #include <TColStd_MapIteratorOfMapOfInteger.hxx>
 #include <TColStd_MapOfInteger.hxx>
 #include <TColStd_SequenceOfInteger.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TopExp.hxx>
 #include <TopExp_Explorer.hxx>
-#include <TopoDS_Compound.hxx>
-#include <TopTools_MapOfShape.hxx>
 #include <TopTools_MapIteratorOfMapOfShape.hxx>
+#include <TopTools_MapOfShape.hxx>
+#include <TopoDS_Compound.hxx>
 
 // STL Includes
 #include <algorithm>
@@ -304,7 +306,7 @@ void SMESH_Mesh_i::ClearSubMesh(CORBA::Long ShapeID)
 
 //=============================================================================
 /*!
- *
+ * Convert enum Driver_Mesh::Status to SMESH::DriverMED_ReadStatus
  */
 //=============================================================================
 
@@ -328,6 +330,30 @@ static SMESH::DriverMED_ReadStatus ConvertDriverMEDReadStatus (int theStatus)
   return res;
 }
 
+//=============================================================================
+/*!
+ * Convert ::SMESH_ComputeError to SMESH::ComputeError
+ */
+//=============================================================================
+
+static SMESH::ComputeError* ConvertComputeError( SMESH_ComputeErrorPtr errorPtr )
+{
+  SMESH::ComputeError_var errVar = new SMESH::ComputeError();
+  errVar->subShapeID = -1;
+  errVar->hasBadMesh = false;
+
+  if ( !errorPtr || errorPtr->IsOK() )
+  {
+    errVar->code = SMESH::COMPERR_OK;
+  }
+  else
+  {
+    errVar->code = ConvertDriverMEDReadStatus( errorPtr->myName );
+    errVar->comment = errorPtr->myComment.c_str();
+  }
+  return errVar._retn();
+}
+
 //=============================================================================
 /*!
  *  ImportMEDFile
@@ -451,6 +477,45 @@ int SMESH_Mesh_i::ImportSTLFile( const char* theFileName )
   return 1;
 }
 
+//================================================================================
+/*!
+ * \brief Imports data from a GMF file and returns an error description
+ */
+//================================================================================
+
+SMESH::ComputeError* SMESH_Mesh_i::ImportGMFFile( const char* theFileName )
+  throw (SALOME::SALOME_Exception)
+{
+  SMESH_ComputeErrorPtr error;
+  try {
+    error = _impl->GMFToMesh( theFileName );
+  }
+  catch ( std::bad_alloc& exc ) {
+    error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, "std::bad_alloc raised" );
+  }
+  catch ( Standard_OutOfMemory& exc ) {
+    error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, "Standard_OutOfMemory raised" );
+  }
+  catch (Standard_Failure& ex) {
+    error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, ex.DynamicType()->Name() );
+    if ( ex.GetMessageString() && strlen( ex.GetMessageString() ))
+      error->myComment += string(": ") + ex.GetMessageString();
+  }
+  catch ( SALOME_Exception& S_ex ) {
+    error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, S_ex.what() );
+  }
+  catch ( std::exception& exc ) {
+    error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, exc.what() );
+  }
+  catch (...) {
+    error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, "Unknown exception" );
+  }
+
+  CreateGroupServants();
+
+  return ConvertComputeError( error );
+}
+
 //=============================================================================
 /*!
  *
@@ -2838,37 +2903,6 @@ void SMESH_Mesh_i::ExportSTL (const char *file, const bool isascii)
   _impl->ExportSTL(file, isascii);
 }
 
-//=============================================================================
-/*!
- * \brief Class providing SMESHDS_Mesh API to SMESH_IDSource. 
- *        It is used to export a part of mesh as a whole mesh.
- */
-class SMESH_MeshPartDS : public SMESHDS_Mesh
-{
-public:
-  SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart);
-
-  virtual SMDS_NodeIteratorPtr   nodesIterator     (bool idInceasingOrder=false) const;
-  virtual SMDS_EdgeIteratorPtr   edgesIterator     (bool idInceasingOrder=false) const;
-  virtual SMDS_FaceIteratorPtr   facesIterator     (bool idInceasingOrder=false) const;
-  virtual SMDS_VolumeIteratorPtr volumesIterator   (bool idInceasingOrder=false) const;
-
-  virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
-  virtual SMDS_ElemIteratorPtr elementGeomIterator(SMDSAbs_GeometryType type) const;
-  virtual SMDS_ElemIteratorPtr elementEntityIterator(SMDSAbs_EntityType type) const;
-
-private:
-  TIDSortedElemSet _elements[ SMDSAbs_NbElementTypes ];
-  SMESHDS_Mesh*    _meshDS;
-  /*!
-   * \brief Class used to access to protected data of SMDS_MeshInfo
-   */
-  struct TMeshInfo : public SMDS_MeshInfo
-  {
-    void Add(const SMDS_MeshElement* e) { SMDS_MeshInfo::addWithPoly( e ); }
-  };
-};
-
 //================================================================================
 /*!
  * \brief Export a part of mesh to a med file
@@ -2991,13 +3025,36 @@ void SMESH_Mesh_i::ExportCGNS(::SMESH::SMESH_IDSource_ptr meshPart,
   SMESH_MeshPartDS partDS( meshPart );
   _impl->ExportCGNS(file, &partDS);
 
-  TPythonDump() << _this() << ".ExportCGNS( "
-                << meshPart<< ", r'" << file << "', " << overwrite << ")";
+  TPythonDump() << _this() << ".ExportCGNS( r'"
+                << file << "', " << overwrite << ", "<< meshPart<< ")";
 #else
   THROW_SALOME_CORBA_EXCEPTION("CGNS library is unavailable", SALOME::INTERNAL_ERROR);
 #endif
 }
 
+//================================================================================
+/*!
+ * \brief Export a part of mesh to a GMF file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportGMF(::SMESH::SMESH_IDSource_ptr meshPart,
+                             const char*                 file)
+  throw (SALOME::SALOME_Exception)
+{
+  Unexpect aCatch(SALOME_SalomeException);
+  if ( _preMeshInfo )
+    _preMeshInfo->FullLoadFromFile();
+
+  PrepareForWriting(file,/*overwrite=*/true);
+
+  SMESH_MeshPartDS partDS( meshPart );
+  _impl->ExportGMF(file, &partDS);
+
+  TPythonDump() << _this() << ".ExportGMF( r'"
+                << file << "', "<< meshPart<< ")";
+}
+
 //=============================================================================
 /*!
  * Return implementation of SALOME_MED::MESH interfaces
@@ -4083,7 +4140,7 @@ SMESH::double_array* SMESH_Mesh_i::BaryCenter(const CORBA::Long id)
  */
 //=============================================================================
 
-void SMESH_Mesh_i::CreateGroupServants() 
+void SMESH_Mesh_i::CreateGroupServants()
 {
   SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
 
@@ -4352,12 +4409,14 @@ void SMESH_Mesh_i::CollectMeshInfo(const SMDS_ElemIteratorPtr theItr,
 }
 
 //=============================================================================
+namespace // Finding concurrent hypotheses
+//=============================================================================
+{
+
 /*!
  * \brief mapping of mesh dimension into shape type
  */
-//=============================================================================
-
-static TopAbs_ShapeEnum shapeTypeByDim(const int theDim)
+TopAbs_ShapeEnum shapeTypeByDim(const int theDim)
 {
   TopAbs_ShapeEnum aType = TopAbs_SOLID;
   switch ( theDim ) {
@@ -4370,7 +4429,7 @@ static TopAbs_ShapeEnum shapeTypeByDim(const int theDim)
   return aType;
 }
 
-//=============================================================================
+//-----------------------------------------------------------------------------
 /*!
  * \brief Internal structure used to find concurent submeshes
  *
@@ -4379,8 +4438,6 @@ static TopAbs_ShapeEnum shapeTypeByDim(const int theDim)
  *  with another submesh. In other words, it is dimension of a hypothesis assigned
  *  to submesh.
  */
-//=============================================================================
-
 class SMESH_DimHyp
 {
  public:
@@ -4389,8 +4446,14 @@ class SMESH_DimHyp
   int _ownDim; //!< dimension of shape of _subMesh (>=_dim)
   TopTools_MapOfShape _shapeMap;
   SMESH_subMesh*      _subMesh;
-  list<const SMESHDS_Hypothesis*> _hypothesises; //!< algo is first, then its parameters
+  list<const SMESHDS_Hypothesis*> _hypotheses; //!< algo is first, then its parameters
+
+  //-----------------------------------------------------------------------------
+  // Return the algorithm
+  const SMESH_Algo* GetAlgo() const
+  { return _hypotheses.empty() ? 0 : dynamic_cast<const SMESH_Algo*>( _hypotheses.front() ); }
 
+  //-----------------------------------------------------------------------------
   //! Constructors
   SMESH_DimHyp(const SMESH_subMesh*  theSubMesh,
                const int             theDim,
@@ -4400,6 +4463,7 @@ class SMESH_DimHyp
     SetShape( theDim, theShape );
   }
 
+  //-----------------------------------------------------------------------------
   //! set shape
   void SetShape(const int           theDim,
                 const TopoDS_Shape& theShape)
@@ -4415,6 +4479,7 @@ class SMESH_DimHyp
     }
   }
 
+  //-----------------------------------------------------------------------------
   //! Check sharing of sub-shapes
   static bool isShareSubShapes(const TopTools_MapOfShape& theToCheck,
                                const TopTools_MapOfShape& theToFind,
@@ -4435,11 +4500,13 @@ class SMESH_DimHyp
     return isShared;
   }
   
+  //-----------------------------------------------------------------------------
   //! check algorithms
   static bool checkAlgo(const SMESHDS_Hypothesis* theA1,
                         const SMESHDS_Hypothesis* theA2)
   {
-    if ( theA1->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ||
+    if ( !theA1 || !theA2 ||
+         theA1->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ||
          theA2->GetType() == SMESHDS_Hypothesis::PARAM_ALGO )
       return false; // one of the hypothesis is not algorithm
     // check algorithm names (should be equal)
@@ -4447,6 +4514,7 @@ class SMESH_DimHyp
   }
 
   
+  //-----------------------------------------------------------------------------
   //! Check if sub-shape hypotheses are concurrent
   bool IsConcurrent(const SMESH_DimHyp* theOther) const
   {
@@ -4456,8 +4524,10 @@ class SMESH_DimHyp
     // if ( <own dim of either of submeshes> == <concurrent dim> &&
     //      any of the two submeshes is not on COMPOUND shape )
     //  -> no concurrency
-    bool meIsCompound = (_subMesh->GetSubMeshDS() && _subMesh->GetSubMeshDS()->IsComplexSubmesh());
-    bool otherIsCompound = (theOther->_subMesh->GetSubMeshDS() && theOther->_subMesh->GetSubMeshDS()->IsComplexSubmesh());
+    bool meIsCompound    = (_subMesh->GetSubMeshDS() &&
+                            _subMesh->GetSubMeshDS()->IsComplexSubmesh());
+    bool otherIsCompound = (theOther->_subMesh->GetSubMeshDS() &&
+                            theOther->_subMesh->GetSubMeshDS()->IsComplexSubmesh());
     if ( (_ownDim == _dim  || theOther->_ownDim == _dim ) && (!meIsCompound || !otherIsCompound))
       return false;
 
@@ -4469,65 +4539,102 @@ class SMESH_DimHyp
         return false;
 
     // check algorithms to be same
-    if (!checkAlgo( _hypothesises.front(), theOther->_hypothesises.front() ))
-      return true; // different algorithms
-    
+    if ( !checkAlgo( this->GetAlgo(), theOther->GetAlgo() ))
+      return true; // different algorithms -> concurrency !
+
     // check hypothesises for concurrence (skip first as algorithm)
     int nbSame = 0;
-    // pointers should be same, becase it is referenes from mesh hypothesis partition
-    list <const SMESHDS_Hypothesis*>::const_iterator hypIt = _hypothesises.begin();
-    list <const SMESHDS_Hypothesis*>::const_iterator otheEndIt = theOther->_hypothesises.end();
-    for ( hypIt++ /*skip first as algo*/; hypIt != _hypothesises.end(); hypIt++ )
-      if ( find( theOther->_hypothesises.begin(), otheEndIt, *hypIt ) != otheEndIt )
+    // pointers should be same, because it is referened from mesh hypothesis partition
+    list <const SMESHDS_Hypothesis*>::const_iterator hypIt = _hypotheses.begin();
+    list <const SMESHDS_Hypothesis*>::const_iterator otheEndIt = theOther->_hypotheses.end();
+    for ( hypIt++ /*skip first as algo*/; hypIt != _hypotheses.end(); hypIt++ )
+      if ( find( theOther->_hypotheses.begin(), otheEndIt, *hypIt ) != otheEndIt )
         nbSame++;
     // the submeshes are concurrent if their algorithms has different parameters
-    return nbSame != theOther->_hypothesises.size() - 1;
+    return nbSame != theOther->_hypotheses.size() - 1;
+  }
+
+  // Return true if algorithm of this SMESH_DimHyp is used if no
+  // sub-mesh order is imposed by the user
+  bool IsHigherPriorityThan( const SMESH_DimHyp* theOther ) const
+  {
+    // NeedDiscreteBoundary() algo has a higher priority
+    if ( this    ->GetAlgo()->NeedDiscreteBoundary() !=
+         theOther->GetAlgo()->NeedDiscreteBoundary() )
+      return !this->GetAlgo()->NeedDiscreteBoundary();
+
+    return ( this->_subMesh->GetId() < theOther->_subMesh->GetId() );
   }
   
 }; // end of SMESH_DimHyp
+//-----------------------------------------------------------------------------
+
+typedef list<const SMESH_DimHyp*> TDimHypList;
 
-typedef list<SMESH_DimHyp*> TDimHypList;
+//-----------------------------------------------------------------------------
 
-static void addDimHypInstance(const int               theDim, 
-                              const TopoDS_Shape&     theShape,
-                              const SMESH_Algo*       theAlgo,
-                              const SMESH_subMesh*    theSubMesh,
-                              const list <const SMESHDS_Hypothesis*>& theHypList,
-                              TDimHypList*            theDimHypListArr )
+void addDimHypInstance(const int                               theDim, 
+                       const TopoDS_Shape&                     theShape,
+                       const SMESH_Algo*                       theAlgo,
+                       const SMESH_subMesh*                    theSubMesh,
+                       const list <const SMESHDS_Hypothesis*>& theHypList,
+                       TDimHypList*                            theDimHypListArr )
 {
   TDimHypList& listOfdimHyp = theDimHypListArr[theDim];
   if ( listOfdimHyp.empty() || listOfdimHyp.back()->_subMesh != theSubMesh ) {
     SMESH_DimHyp* dimHyp = new SMESH_DimHyp( theSubMesh, theDim, theShape );
+    dimHyp->_hypotheses.push_front(theAlgo);
     listOfdimHyp.push_back( dimHyp );
   }
   
-  SMESH_DimHyp* dimHyp = listOfdimHyp.back();
-  dimHyp->_hypothesises.push_front(theAlgo);
-  list <const SMESHDS_Hypothesis*>::const_iterator hypIt = theHypList.begin();
-  for( ; hypIt != theHypList.end(); hypIt++ )
-    dimHyp->_hypothesises.push_back( *hypIt );
+  SMESH_DimHyp* dimHyp = const_cast<SMESH_DimHyp*>( listOfdimHyp.back() );
+  dimHyp->_hypotheses.insert( dimHyp->_hypotheses.end(),
+                              theHypList.begin(), theHypList.end() );
 }
 
-static void findConcurrents(const SMESH_DimHyp* theDimHyp,
-                            const TDimHypList&  theListOfDimHyp,
-                            TListOfInt&         theListOfConcurr )
+//-----------------------------------------------------------------------------
+void addInOrderOfPriority( const SMESH_DimHyp* theDimHyp,
+                           TDimHypList&        theListOfConcurr)
+{
+  if ( theListOfConcurr.empty() )
+  {
+    theListOfConcurr.push_back( theDimHyp );
+  }
+  else
+  {
+    TDimHypList::iterator hypIt = theListOfConcurr.begin();
+    while ( hypIt != theListOfConcurr.end() &&
+            !theDimHyp->IsHigherPriorityThan( *hypIt ))
+      ++hypIt;
+    theListOfConcurr.insert( hypIt, theDimHyp );
+  }
+}
+
+//-----------------------------------------------------------------------------
+void findConcurrents(const SMESH_DimHyp* theDimHyp,
+                     const TDimHypList&  theListOfDimHyp,
+                     TDimHypList&        theListOfConcurrHyp,
+                     set<int>&           theSetOfConcurrId )
 {
   TDimHypList::const_reverse_iterator rIt = theListOfDimHyp.rbegin();
-  for ( ; rIt != theListOfDimHyp.rend(); rIt++ ) {
+  for ( ; rIt != theListOfDimHyp.rend(); rIt++ )
+  {
     const SMESH_DimHyp* curDimHyp = *rIt;
     if ( curDimHyp == theDimHyp )
       break; // meet own dimHyp pointer in same dimension
-    else if ( theDimHyp->IsConcurrent( curDimHyp ) )
-      if ( find( theListOfConcurr.begin(),
-                 theListOfConcurr.end(),
-                 curDimHyp->_subMesh->GetId() ) == theListOfConcurr.end() )
-        theListOfConcurr.push_back( curDimHyp->_subMesh->GetId() );
+
+    if ( theDimHyp->IsConcurrent( curDimHyp ) &&
+         theSetOfConcurrId.insert( curDimHyp->_subMesh->GetId() ).second )
+    {
+      addInOrderOfPriority( curDimHyp, theListOfConcurrHyp );
+    }
   }
 }
 
-static void unionLists(TListOfInt&       theListOfId,
-                       TListOfListOfInt& theListOfListOfId,
-                       const int         theIndx )
+//-----------------------------------------------------------------------------
+void unionLists(TListOfInt&       theListOfId,
+                TListOfListOfInt& theListOfListOfId,
+                const int         theIndx )
 {
   TListOfListOfInt::iterator it = theListOfListOfId.begin();
   for ( int i = 0; it != theListOfListOfId.end(); it++, i++ ) {
@@ -4549,9 +4656,10 @@ static void unionLists(TListOfInt&       theListOfId,
     otherListOfId.clear();
   }
 }
+//-----------------------------------------------------------------------------
 
 //! free memory allocated for dimension-hypothesis objects
-static void removeDimHyps( TDimHypList* theArrOfList )
+void removeDimHyps( TDimHypList* theArrOfList )
 {
   for (int i = 0; i < 4; i++ ) {
     TDimHypList& listOfdimHyp = theArrOfList[i];
@@ -4561,6 +4669,28 @@ static void removeDimHyps( TDimHypList* theArrOfList )
   }
 }
 
+//-----------------------------------------------------------------------------
+/*!
+ * \brief find common submeshes with given submesh
+ * \param theSubMeshList list of already collected submesh to check
+ * \param theSubMesh given submesh to intersect with other
+ * \param theCommonSubMeshes collected common submeshes
+ */
+void findCommonSubMesh (list<const SMESH_subMesh*>& theSubMeshList,
+                        const SMESH_subMesh*        theSubMesh,
+                        set<const SMESH_subMesh*>&  theCommon )
+{
+  if ( !theSubMesh )
+    return;
+  list<const SMESH_subMesh*>::const_iterator it = theSubMeshList.begin();
+  for ( ; it != theSubMeshList.end(); it++ )
+    theSubMesh->FindIntersection( *it, theCommon );
+  theSubMeshList.push_back( theSubMesh );
+  //theCommon.insert( theSubMesh );
+}
+
+} // namespace
+
 //=============================================================================
 /*!
  * \brief Return submesh objects list in meshing order
@@ -4579,7 +4709,7 @@ SMESH::submesh_array_array* SMESH_Mesh_i::GetMeshOrder()
   TListOfListOfInt anOrder = mesh.GetMeshOrder(); // is there already defined order?
   if ( !anOrder.size() ) {
 
-    // collect submeshes detecting concurrent algorithms and hypothesises
+    // collect submeshes and detect concurrent algorithms and hypothesises
     TDimHypList dimHypListArr[4]; // dimHyp list for each shape dimension
     
     map<int, ::SMESH_subMesh*>::iterator i_sm = _mapSubMesh.begin();
@@ -4587,7 +4717,7 @@ SMESH::submesh_array_array* SMESH_Mesh_i::GetMeshOrder()
       ::SMESH_subMesh* sm = (*i_sm).second;
       // shape of submesh
       const TopoDS_Shape& aSubMeshShape = sm->GetSubShape();
-      
+
       // list of assigned hypothesises
       const list <const SMESHDS_Hypothesis*>& hypList = mesh.GetHypothesisList(aSubMeshShape);
       // Find out dimensions where the submesh can be concurrent.
@@ -4606,7 +4736,7 @@ SMESH::submesh_array_array* SMESH_Mesh_i::GetMeshOrder()
             anAlgo = mesh.GetGen()->GetAlgo( mesh, anExp.Current() );
         }
         if (!anAlgo)
-          continue; // no assigned algorithm to current submesh
+          continue; // no algorithm assigned to a current submesh
 
         int dim = anAlgo->GetDim(); // top concurrent dimension (see comment to SMESH_DimHyp)
         // the submesh can concurrent at <dim> (or lower dims if !anAlgo->NeedDiscreteBoundary())
@@ -4619,20 +4749,25 @@ SMESH::submesh_array_array* SMESH_Mesh_i::GetMeshOrder()
     
     // iterate on created dimension-hypotheses and check for concurrents
     for ( int i = 0; i < 4; i++ ) {
-      const list<SMESH_DimHyp*>& listOfDimHyp = dimHypListArr[i];
+      const TDimHypList& listOfDimHyp = dimHypListArr[i];
       // check for concurrents in own and other dimensions (step-by-step)
       TDimHypList::const_iterator dhIt = listOfDimHyp.begin();
       for ( ; dhIt != listOfDimHyp.end(); dhIt++ ) {
         const SMESH_DimHyp* dimHyp = *dhIt;
-        TListOfInt listOfConcurr;
+        TDimHypList listOfConcurr;
+        set<int>    setOfConcurrIds;
         // looking for concurrents and collect into own list
         for ( int j = i; j < 4; j++ )
-          findConcurrents( dimHyp, dimHypListArr[j], listOfConcurr );
+          findConcurrents( dimHyp, dimHypListArr[j], listOfConcurr, setOfConcurrIds );
         // check if any concurrents found
         if ( listOfConcurr.size() > 0 ) {
           // add own submesh to list of concurrent
-          listOfConcurr.push_front( dimHyp->_subMesh->GetId() );
-          anOrder.push_back( listOfConcurr );
+          addInOrderOfPriority( dimHyp, listOfConcurr );
+          list<int> listOfConcurrIds;
+          TDimHypList::iterator hypIt = listOfConcurr.begin();
+          for ( ; hypIt != listOfConcurr.end(); ++hypIt )
+            listOfConcurrIds.push_back( (*hypIt)->_subMesh->GetId() );
+          anOrder.push_back( listOfConcurrIds );
         }
       }
     }
@@ -4655,28 +4790,6 @@ SMESH::submesh_array_array* SMESH_Mesh_i::GetMeshOrder()
   return aResult._retn();
 }
 
-//=============================================================================
-/*!
- * \brief find common submeshes with given submesh
- * \param theSubMeshList list of already collected submesh to check
- * \param theSubMesh given submesh to intersect with other
- * \param theCommonSubMeshes collected common submeshes
- */
-//=============================================================================
-
-static void findCommonSubMesh (list<const SMESH_subMesh*>& theSubMeshList,
-                               const SMESH_subMesh*        theSubMesh,
-                               set<const SMESH_subMesh*>&  theCommon )
-{
-  if ( !theSubMesh )
-    return;
-  list<const SMESH_subMesh*>::const_iterator it = theSubMeshList.begin();
-  for ( ; it != theSubMeshList.end(); it++ )
-    theSubMesh->FindIntersection( *it, theCommon );
-  theSubMeshList.push_back( theSubMesh );
-  //theCommon.insert( theSubMesh );
-}
-
 //=============================================================================
 /*!
  * \brief Set submesh object order
@@ -4845,6 +4958,27 @@ SMESH_MeshPartDS::SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart):
   }
 }
 // -------------------------------------------------------------------------------------
+SMESH_MeshPartDS::SMESH_MeshPartDS(const std::list< const SMDS_MeshElement* > & meshPart):
+  SMESHDS_Mesh( /*meshID=*/-1, /*isEmbeddedMode=*/true), _meshDS(0)
+{
+  TMeshInfo tmpInfo;
+  list< const SMDS_MeshElement* >::const_iterator partIt = meshPart.begin();
+  for ( ; partIt != meshPart.end(); ++partIt )
+    if ( const SMDS_MeshElement * e = *partIt )
+      if ( _elements[ e->GetType() ].insert( e ).second )
+      {
+        tmpInfo.Add( e );
+        SMDS_ElemIteratorPtr nIt = e->nodesIterator();
+        while ( nIt->more() )
+        {
+          const SMDS_MeshNode * n = (const SMDS_MeshNode*) nIt->next();
+          if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+            tmpInfo.Add( n );
+        }
+      }
+  myInfo = tmpInfo;
+}
+// -------------------------------------------------------------------------------------
 SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementGeomIterator(SMDSAbs_GeometryType geomType) const
 {
   if ( _meshDS ) return _meshDS->elementGeomIterator( geomType );
index 3c13916a4592e4b26ccf628b28be849c1b2f7961..0c2a3ca97c62b58a103bb9d304e007bf92f33905 100644 (file)
@@ -29,6 +29,7 @@
 #include "SMESH.hxx"
 
 #include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Gen)
 #include CORBA_SERVER_HEADER(SMESH_Mesh)
 #include CORBA_SERVER_HEADER(SMESH_Group)
 #include CORBA_SERVER_HEADER(SMESH_Hypothesis)
@@ -37,7 +38,6 @@
 
 #include "SMESH_Hypothesis.hxx"
 #include "SMESH_Mesh.hxx"
-//#include "SMESH_subMesh_i.hxx"
 #include "SMESH_subMesh.hxx"
 
 #include "SALOME_GenericObj_i.hh"
@@ -198,6 +198,9 @@ public:
   int ImportSTLFile( const char* theFileName )
     throw (SALOME::SALOME_Exception);
 
+  SMESH::ComputeError* ImportGMFFile( const char* theFileName )
+    throw (SALOME::SALOME_Exception);
+
   /*!
    * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value
    */
@@ -245,6 +248,8 @@ public:
   void ExportCGNS(SMESH::SMESH_IDSource_ptr meshPart,
                   const char*               file,
                   CORBA::Boolean            overwrite) throw (SALOME::SALOME_Exception);
+  void ExportGMF(SMESH::SMESH_IDSource_ptr meshPart,
+                 const char*               file) throw (SALOME::SALOME_Exception);
 
   void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart,
                        const char*               file,
index e56adfadf43b4e3f9971d8dadf19f8720a7946de..0a3d58614a4a37e466e9c35517af8492cc6d9f0b 100644 (file)
@@ -858,7 +858,7 @@ void SMESH_PreMeshInfo::FullLoadFromFile() const
   SMESH_PreMeshInfo* meshInfo = _mesh->changePreMeshInfo();
   _mesh->changePreMeshInfo() = NULL; // to allow GUI accessing to real info
 
-  ::SMESH_Mesh& mesh = _mesh->GetImpl();
+  ::SMESH_Mesh&   mesh = _mesh->GetImpl();
   SMESHDS_Mesh* meshDS = mesh.GetMeshDS();
 
   PreMeshInfo_TRY;
@@ -919,6 +919,18 @@ void SMESH_PreMeshInfo::readSubMeshes(DriverMED_R_SMESHDS_Mesh* reader) const
 
     SMESHDS_Mesh* meshDS = _mesh->GetImpl().GetMeshDS();
 
+    // issue 0020693. Restore _isModified flag
+    if ( aTopGroup->ExistInternalObject( "_isModified" ))
+    {
+      HDFdataset* aDataset = new HDFdataset( "_isModified", aTopGroup );
+      aDataset->OpenOnDisk();
+      hdf_size size = aDataset->GetSize();
+      int* isModified = new int[ size ];
+      aDataset->ReadFromDisk( isModified );
+      aDataset->CloseOnDisk();
+      _mesh->GetImpl().SetIsModified( bool(*isModified));
+    }
+
     bool submeshesInFamilies = ( ! aTopGroup->ExistInternalObject( "Submeshes" ));
     if ( submeshesInFamilies ) // from MED
     {
index ab94f663c9f46ef3cbabaf6c711c7a442cc9c94f..fd1f9e29c69c4e73deef14d0b7be7cbba8fdfc97 100644 (file)
@@ -26,9 +26,10 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 
 # Scripts to be installed.
-dist_salomescript_DATA= \
+dist_salomescript_PYTHON = \
        smesh.py \
        smeshDC.py \
+       smesh_algorithm.py \
        StdMeshersDC.py \
        batchmode_smesh.py \
        batchmode_mefisto.py \
index af20cb4e2645be3b20fe20e44f302977812a748a..03d598d1b2f7f1150ab281195f8a0bb0761da77f 100644 (file)
 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
 #
 
-from smesh import Mesh_Algorithm, AssureGeomPublished, IsEqual, ParseParameters
+##
+# @package StdMeshersDC
+# Python API for the standard meshing plug-in module.
+
+from smesh_algorithm import Mesh_Algorithm
+from smesh import AssureGeomPublished, IsEqual, ParseParameters
 from smesh import GetName, TreatHypoStatus
 from smeshDC import Mesh
 
 import StdMeshers
 
-# Types of algorithms
+#----------------------------
+# Mesh algo type identifiers
+#----------------------------
+
+## Algorithm type: Regular 1D algorithm, see StdMeshersDC_Segment
 REGULAR     = "Regular_1D"
+## Algorithm type: Python 1D algorithm, see StdMeshersDC_Segment_Python
 PYTHON      = "Python_1D"
+## Algorithm type: Composite segment 1D algorithm, see StdMeshersDC_CompositeSegment
 COMPOSITE   = "CompositeSegment_1D"
+## Algorithm type: Triangle MEFISTO 2D algorithm, see StdMeshersDC_Triangle_MEFISTO
 MEFISTO     = "MEFISTO_2D"
+## Algorithm type: Hexahedron 3D (i-j-k) algorithm, see StdMeshersDC_Hexahedron
 Hexa        = "Hexa_3D"
+## Algorithm type: Quadrangle 2D algorithm, see StdMeshersDC_Quadrangle
 QUADRANGLE  = "Quadrangle_2D"
+## Algorithm type: Radial Quadrangle 1D-2D algorithm, see StdMeshersDC_RadialQuadrangle1D2D
 RADIAL_QUAD = "RadialQuadrangle_1D2D"
 
-
 # import items of enum QuadType
 for e in StdMeshers.QuadType._items: exec('%s = StdMeshers.%s'%(e,e))
 
+#----------------------
+# Algorithms
+#----------------------
 
-# Public class: Mesh_Segment
-# --------------------------
-
-## Class to define a REGULAR 1D algorithm for discretization. It is created by
-#  calling Mesh.Segment(geom=0)
+## Defines segment 1D algorithm for edges discretization.
+#
+#  It can be created by calling smesh.Mesh.Segment(geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_Segment(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Segment"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = REGULAR
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates segment 1D algorithm for edges"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
+        pass
 
     ## Defines "LocalLength" hypothesis to cut an edge in several segments with the same length
     #  @param l for the length of segments that cut an edge
@@ -135,7 +162,8 @@ class StdMeshersDC_Segment(Mesh_Algorithm):
         return hyp
 
     ## Private method
-    ## Checks if the given "NumberOfSegments" hypothesis has the same parameters as the given arguments
+    #  
+    #  Checks if the given "NumberOfSegments" hypothesis has the same parameters as the given arguments
     def _compareNumberOfSegments(self, hyp, args):
         if hyp.GetNumberOfSegments() == args[0]:
             if len(args) == 3:
@@ -282,7 +310,7 @@ class StdMeshersDC_Segment(Mesh_Algorithm):
         else:
             self.geom = vertex
             pass
-        ### 0D algorithm
+        # 0D algorithm
         if self.geom is None:
             raise RuntimeError, "Attemp to create SegmentAroundVertex_0D algoritm on None shape"
         AssureGeomPublished( self.mesh, self.geom )
@@ -294,7 +322,7 @@ class StdMeshersDC_Segment(Mesh_Algorithm):
             pass
         status = self.mesh.mesh.AddHypothesis(self.geom, algo)
         TreatHypoStatus(status, "SegmentAroundVertex_0D", name, True)
-        ###
+        #
         comFun = lambda hyp, args: IsEqual(hyp.GetLength(), args[0])
         hyp = self.Hypothesis("SegmentLengthAroundVertex", [length], UseExisting=UseExisting,
                               CompareMethod=comFun)
@@ -314,44 +342,67 @@ class StdMeshersDC_Segment(Mesh_Algorithm):
         hyp = self.Hypothesis("QuadraticMesh", UseExisting=1, CompareMethod=self.CompareEqualHyp)
         return hyp
 
-# Public class: Mesh_CompositeSegment
-# --------------------------
+    pass # end of StdMeshersDC_Segment class
 
-## A regular 1D algorithm for discretization of a set of adjacent edges as one.
-#  It is created by calling Mesh.Segment(COMPOSITE,geom=0)
+## Segment 1D algorithm for discretization of a set of adjacent edges as one edge.
+#
+#  It is created by calling smesh.Mesh.Segment(smesh.COMPOSITE,geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_CompositeSegment(StdMeshersDC_Segment):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Segment"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = COMPOSITE
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = False
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates segment 1D algorithm for edges"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         self.Create(mesh, geom, self.algoType)
+        pass
 
+    pass # end of StdMeshersDC_CompositeSegment class
 
-# Public class: Mesh_Segment_Python
-# ---------------------------------
-
-## Defines a segment 1D algorithm for discretization with python function
-#  It is created by calling Mesh.Segment(PYTHON,geom=0)
+## Defines a segment 1D algorithm for discretization of edges with Python function
+#
+#  It is created by calling smesh.Mesh.Segment(smesh.PYTHON,geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_Segment_Python(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Segment"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = PYTHON
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates tetrahedron 3D algorithm for solids"
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates segment 1D algorithm for edges"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         import Python1dPlugin
         self.Create(mesh, geom, self.algoType, "libPython1dEngine.so")
+        pass
 
     ## Defines "PythonSplit1D" hypothesis
     #  @param n for the number of segments that cut an edge
@@ -367,25 +418,37 @@ class StdMeshersDC_Segment_Python(Mesh_Algorithm):
         hyp.SetPythonLog10RatioFunction(func)
         return hyp
 
-# Public class: Mesh_Triangle_MEFISTO
-# -----------------------------------
+    pass # end of StdMeshersDC_Segment_Python class
 
 ## Triangle MEFISTO 2D algorithm
-#  It is created by calling Mesh.Triangle(MEFISTO,geom=0)
+#
+#  It is created by calling smesh.Mesh.Triangle(smesh.MEFISTO,geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_Triangle_MEFISTO(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Triangle"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = MEFISTO
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates triangle 2D algorithm for faces"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
+        pass
 
     ## Defines "MaxElementArea" hypothesis basing on the definition of the maximum area of each triangle
     #  @param area for the maximum area of each triangle
@@ -408,28 +471,40 @@ class StdMeshersDC_Triangle_MEFISTO(Mesh_Algorithm):
         hyp = self.Hypothesis("LengthFromEdges", UseExisting=1, CompareMethod=self.CompareEqualHyp)
         return hyp
 
-# Public class: Mesh_Quadrangle
-# -----------------------------
+    pass # end of StdMeshersDC_Triangle_MEFISTO class
 
 ## Defines a quadrangle 2D algorithm
-#  It is created by calling Mesh.Quadrangle(geom=0)
+# 
+#  It is created by calling smesh.Mesh.Quadrangle(geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_Quadrangle(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Quadrangle"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = QUADRANGLE
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
-
-    params=0
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates quadrangle 2D algorithm for faces"
+    ## hypothesis associated with algorithm
+    #  @internal
+    params     = 0
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
-        return
+        pass
 
     ## Defines "QuadrangleParameters" hypothesis
     #  @param quadType defines the algorithm of transition between differently descretized
@@ -515,47 +590,69 @@ class StdMeshersDC_Quadrangle(Mesh_Algorithm):
     def TriangleVertex(self, vertex, UseExisting=0):
         return self.QuadrangleParameters(QUAD_STANDARD,vertex,UseExisting)
 
-
-# Public class: Mesh_Hexahedron
-# ------------------------------
+    pass # end of StdMeshersDC_Quadrangle class
 
 ## Defines a hexahedron 3D algorithm
-#  It is created by calling Mesh.Hexahedron(geom=0)
+# 
+#  It is created by calling smesh.Mesh.Hexahedron(geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_Hexahedron(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Hexahedron"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = Hexa
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates hexahedron 3D algorithm for volumes"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, Hexa)
         pass
 
-# Public class: Mesh_Projection1D
-# -------------------------------
+    pass # end of StdMeshersDC_Hexahedron class
 
 ## Defines a projection 1D algorithm
-#  It is created by calling Mesh.Projection1D(geom=0)
-#  @ingroup l3_algos_proj
+#  
+#  It is created by calling smesh.Mesh.Projection1D(geom=0)
 #
+#  @ingroup l3_algos_proj
 class StdMeshersDC_Projection1D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Projection1D"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Projection_1D"
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates projection 1D algorithm for edges"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
+        pass
 
     ## Defines "Source Edge" hypothesis, specifying a meshed edge, from where
     #  a mesh pattern is taken, and, optionally, the association of vertices
@@ -582,26 +679,37 @@ class StdMeshersDC_Projection1D(Mesh_Algorithm):
         hyp.SetVertexAssociation( srcV, tgtV )
         return hyp
 
-
-# Public class: Mesh_Projection2D
-# ------------------------------
+    pass # end of StdMeshersDC_Projection1D class
 
 ## Defines a projection 2D algorithm
-#  It is created by calling Mesh.Projection2D(geom=0)
-#  @ingroup l3_algos_proj
+#  
+#  It is created by calling smesh.Mesh.Projection2D(geom=0)
 #
+#  @ingroup l3_algos_proj
 class StdMeshersDC_Projection2D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Projection2D"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Projection_2D"
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates projection 2D algorithm for faces"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
+        pass
 
     ## Defines "Source Face" hypothesis, specifying a meshed face, from where
     #  a mesh pattern is taken, and, optionally, the association of vertices
@@ -634,44 +742,60 @@ class StdMeshersDC_Projection2D(Mesh_Algorithm):
         hyp.SetVertexAssociation( srcV1, srcV2, tgtV1, tgtV2 )
         return hyp
 
-# Public class: Mesh_Projection1D2D
-# ---------------------------------
+    pass # end of StdMeshersDC_Projection2D class
 
 ## Defines a projection 1D-2D algorithm
-#  It is created by calling Mesh.Projection1D2D(geom=0)
+#  
+#  It is created by calling smesh.Mesh.Projection1D2D(geom=0)
 #
 #  @ingroup l3_algos_proj
-
 class StdMeshersDC_Projection1D2D(StdMeshersDC_Projection2D):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Projection1D2D"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Projection_1D2D"
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates projection 1D-2D algorithm for edges and faces"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         StdMeshersDC_Projection2D.__init__(self, mesh, geom)
+        pass
 
-# Public class: Mesh_Projection3D
-# ------------------------------
+    pass # end of StdMeshersDC_Projection1D2D class
 
 ## Defines a projection 3D algorithm
-#  It is created by calling Mesh.Projection3D(COMPOSITE)
+# 
+#  It is created by calling smesh.Mesh.Projection3D(geom=0)
 #
 #  @ingroup l3_algos_proj
-#
 class StdMeshersDC_Projection3D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Projection3D"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Projection_3D"
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates projection 3D algorithm for volumes"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
+        pass
 
     ## Defines the "Source Shape 3D" hypothesis, specifying a meshed solid, from where
     #  the mesh pattern is taken, and, optionally, the  association of vertices
@@ -707,23 +831,30 @@ class StdMeshersDC_Projection3D(Mesh_Algorithm):
         #elif srcV1 or srcV2 or tgtV1 or tgtV2:
         return hyp
 
-# Public class: Mesh_Prism
-# ------------------------
+    pass # end of StdMeshersDC_Projection3D class
 
 ## Defines a Prism 3D algorithm, which is either "Extrusion 3D" or "Radial Prism"
 #  depending on geometry
-#  It is created by calling Mesh.Prism(geom=0)
+# 
+#  It is created by calling smesh.Mesh.Prism(geom=0)
 #
 #  @ingroup l3_algos_3dextr
-#
 class StdMeshersDC_Prism3D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Prism"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Prism_3D"
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates prism 3D algorithm for volumes"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         
@@ -735,11 +866,14 @@ class StdMeshersDC_Prism3D(Mesh_Algorithm):
         nbShells = len( SubShapeAll( shape, ShapeType["SHELL"] ))
         if nbSolids == 0 or nbSolids == nbShells:
             self.Create(mesh, geom, "Prism_3D")
+            pass
         else:
             self.algoType = "RadialPrism_3D"
             self.Create(mesh, geom, "RadialPrism_3D")
             self.distribHyp = self.Hypothesis("LayerDistribution", UseExisting=0)
             self.nbLayers = None
+            pass
+        pass
 
     ## Return 3D hypothesis holding the 1D one
     def Get3DHypothesis(self):
@@ -847,28 +981,36 @@ class StdMeshersDC_Prism3D(Mesh_Algorithm):
         hyp.SetFineness( fineness )
         return hyp
 
+    pass # end of StdMeshersDC_Prism3D class
 
-# Public class: Mesh_RadialQuadrangle1D2D
-# -------------------------------
-
-## Defines a Radial Quadrangle 1D2D algorithm
-#  It is created by calling Mesh.Quadrangle(RADIAL_QUAD,geom=0)
+## Defines a Radial Quadrangle 1D-2D algorithm
+# 
+#  It is created by calling smesh.Mesh.Quadrangle(smesh.RADIAL_QUAD,geom=0)
 #
 #  @ingroup l2_algos_radialq
 class StdMeshersDC_RadialQuadrangle1D2D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "Quadrangle"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = RADIAL_QUAD
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates quadrangle 1D-2D algorithm for triangular faces"
 
     ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
 
         self.distribHyp = None #self.Hypothesis("LayerDistribution2D", UseExisting=0)
         self.nbLayers = None
+        pass
 
     ## Return 2D hypothesis holding the 1D one
     def Get2DHypothesis(self):
@@ -954,25 +1096,37 @@ class StdMeshersDC_RadialQuadrangle1D2D(Mesh_Algorithm):
         hyp.SetFineness( fineness )
         return hyp
 
+    pass # end of StdMeshersDC_RadialQuadrangle1D2D class
 
-# Public class: Mesh_UseExistingElements
-# --------------------------------------
-## Defines a Radial Quadrangle 1D2D algorithm
-#  It is created by calling Mesh.UseExisting1DElements(geom=0)
+## Defines a Use Existing Elements 1D algorithm
+#
+#  It is created by calling smesh.Mesh.UseExisting1DElements(geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_UseExistingElements_1D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "UseExisting1DElements"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Import_1D"
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates 1D algorithm for edges with reusing of existing mesh elements"
 
+    ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
-        return
+        pass
 
     ## Defines "Source edges" hypothesis, specifying groups of edges to import
     #  @param groups list of groups of edges
@@ -991,24 +1145,37 @@ class StdMeshersDC_UseExistingElements_1D(Mesh_Algorithm):
         hyp.SetCopySourceMesh(toCopyMesh, toCopyGroups)
         return hyp
 
-# Public class: Mesh_UseExistingElements
-# --------------------------------------
-## Defines a Radial Quadrangle 1D2D algorithm
-#  It is created by calling Mesh.UseExisting2DElements(geom=0)
+    pass # end of StdMeshersDC_UseExistingElements_1D class
+
+## Defines a Use Existing Elements 1D-2D algorithm
+#
+#  It is created by calling smesh.Mesh.UseExisting2DElements(geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_UseExistingElements_1D2D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "UseExisting2DElements"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Import_1D2D"
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates 1D-2D algorithm for edges/faces with reusing of existing mesh elements"
 
+    ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         Mesh_Algorithm.__init__(self)
         self.Create(mesh, geom, self.algoType)
-        return
+        pass
 
     ## Defines "Source faces" hypothesis, specifying groups of faces to import
     #  @param groups list of groups of faces
@@ -1027,25 +1194,37 @@ class StdMeshersDC_UseExistingElements_1D2D(Mesh_Algorithm):
         hyp.SetCopySourceMesh(toCopyMesh, toCopyGroups)
         return hyp
 
+    pass # end of StdMeshersDC_UseExistingElements_1D2D class
 
-# Public class: Mesh_Cartesian_3D
-# --------------------------------------
 ## Defines a Body Fitting 3D algorithm
-#  It is created by calling Mesh.BodyFitted(geom=0)
+#
+#  It is created by calling smesh.Mesh.BodyFitted(geom=0)
 #
 #  @ingroup l3_algos_basic
 class StdMeshersDC_Cartesian_3D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "BodyFitted"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "Cartesian_3D"
+    ## flag pointing either this algorithm should be used by default in dynamic method
+    #  of smesh.Mesh class
+    #  @internal
     isDefault  = True
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates body fitting 3D algorithm for volumes"
 
+    ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         self.Create(mesh, geom, self.algoType)
         self.hyp = None
-        return
+        pass
 
     ## Defines "Body Fitting parameters" hypothesis
     #  @param xGridDef is definition of the grid along the X asix.
@@ -1088,39 +1267,60 @@ class StdMeshersDC_Cartesian_3D(Mesh_Algorithm):
         self.hyp.SetSizeThreshold( sizeThreshold )
         return self.hyp
 
-# Public class: Mesh_UseExisting_1D
-# ---------------------------------
+    pass # end of StdMeshersDC_Cartesian_3D class
+
 ## Defines a stub 1D algorithm, which enables "manual" creation of nodes and
 #  segments usable by 2D algoritms
-#  It is created by calling Mesh.UseExistingSegments(geom=0)
+#
+#  It is created by calling smesh.Mesh.UseExistingSegments(geom=0)
 #
 #  @ingroup l3_algos_basic
-
 class StdMeshersDC_UseExisting_1D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "UseExistingSegments"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "UseExisting_1D"
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates 1D algorithm for edges with reusing of existing mesh elements"
 
+    ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         self.Create(mesh, geom, self.algoType)
+        pass
 
+    pass # end of StdMeshersDC_UseExisting_1D class
 
-# Public class: Mesh_UseExisting
-# -------------------------------
 ## Defines a stub 2D algorithm, which enables "manual" creation of nodes and
 #  faces usable by 3D algoritms
-#  It is created by calling Mesh.UseExistingFaces(geom=0)
+#
+#  It is created by calling smesh.Mesh.UseExistingFaces(geom=0)
 #
 #  @ingroup l3_algos_basic
-
 class StdMeshersDC_UseExisting_2D(Mesh_Algorithm):
 
-    ## Name of method of class Mesh creating an instance of this class
+    ## name of the dynamic method in smesh.Mesh class
+    #  @internal
     meshMethod = "UseExistingFaces"
-    ## Name of algorithm type
+    ## type of algorithm used with helper function in smesh.Mesh class
+    #  @internal
     algoType   = "UseExisting_2D"
+    ## doc string of the method
+    #  @internal
+    docHelper  = "Creates 2D algorithm for faces with reusing of existing mesh elements"
 
+    ## Private constructor.
+    #  @param mesh parent mesh object algorithm is assigned to
+    #  @param geom geometry (shape/sub-shape) algorithm is assigned to;
+    #              if it is @c 0 (default), the algorithm is assigned to the main shape
     def __init__(self, mesh, geom=0):
         self.Create(mesh, geom, self.algoType)
+        pass
+
+    pass # end of StdMeshersDC_UseExisting_2D class
index c13a57e8e4c414f784445f560a6898df85bbc23f..64279aa683fab5f5e818d352eef52b274cb80abf 100644 (file)
@@ -36,34 +36,48 @@ import geompy
 import smeshDC
 from smeshDC import *
 
-# get instance of class smeshDC
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.init_smesh(salome.myStudy,geompy.geom)
+# retrieve SMESH engine in try/except block
+# to avoid problems in some cases, e.g. when generating documentation
+try:
+    # get instance of class smeshDC
+    smesh = salome.lcc.FindOrLoadComponent( "FactoryServer", "SMESH" )
+    smesh.init_smesh( salome.myStudy, geompy.geom )
+except:
+    smesh = None
+    pass
 
-# load plugins
+# load plugins and add dynamically generated methods to Mesh class,
+# the same for for global variables declared by plug-ins
 from smeshDC import Mesh, algoCreator
-for pluginName in os.environ["SMESH_MeshersList"].split(":"):
+for pluginName in os.environ[ "SMESH_MeshersList" ].split( ":" ):
+    #
+    pluginName += "DC"
+    try:
+        exec( "from %s import *" % pluginName )
+    except Exception, e:
+        print "Exception while loading %s: %s" % ( pluginName, e )
+        continue
+    exec( "import %s" % pluginName )
+    plugin = eval( pluginName )
 
-  pluginName += "DC"
-  try:
-    exec("from %s import *" % pluginName )
-  except Exception, e:
-    print "Exception while loading %s: %s" % ( pluginName, e )
-    continue
-  exec("import %s" % pluginName )
-  plugin = eval(pluginName)
+    # add methods creating algorithms to Mesh
+    for k in dir( plugin ):
+        if k[0] == '_': continue
+        algo = getattr( plugin, k )
+        if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod" ):
+            if not hasattr( Mesh, algo.meshMethod ):
+                setattr( Mesh, algo.meshMethod, algoCreator() )
+                pass
+            getattr( Mesh, algo.meshMethod ).add( algo )
+            pass
+        pass
+    pass
+del pluginName
 
-  # add methods creating algorithms to Mesh
-  for k in dir(plugin):
-    if k[0] == '_':continue
-    algo = getattr(plugin,k)
-    if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod"):
-      if not hasattr( Mesh, algo.meshMethod ):
-        setattr( Mesh, algo.meshMethod, algoCreator())
-      getattr( Mesh, algo.meshMethod ).add( algo )
-
-# Export the methods of smeshDC
-for k in dir(smesh):
-  if k[0] == '_':continue
-  globals()[k]=getattr(smesh,k)
-del k
+# export the methods of smeshDC
+if smesh:
+    for k in dir( smesh ):
+       if k[0] == '_': continue
+       globals()[k] = getattr( smesh, k )
+    del k
+    pass
index 9780503a12d00e5de5007cae0a40a29b8638fcd1..e224ade4c5c8eee268352dadbe428bac06a24d30 100644 (file)
 #  Author : Francis KLOSS, OCC
 #  Module : SMESH
 
-"""
- \namespace smesh
- \brief Module smesh
-"""
+## @package smesh
+#  Python API for SALOME %Mesh module
 
 ## @defgroup l1_auxiliary Auxiliary methods and structures
 ## @defgroup l1_creating  Creating meshes
@@ -89,6 +87,7 @@ import geompyDC
 
 import SMESH # This is necessary for back compatibility
 from   SMESH import *
+from   smesh_algorithm import Mesh_Algorithm
 
 import SALOME
 import SALOMEDS
@@ -506,6 +505,14 @@ class smeshDC(SMESH._objref_SMESH_Gen):
             aMeshes.append(aMesh)
         return aMeshes, aStatus
 
+    ## Creates a Mesh object importing data from the given GMF file
+    #  @return [ an instance of Mesh class, SMESH::ComputeError ]
+    #  @ingroup l2_impexp
+    def CreateMeshesFromGMF( self, theFileName ):
+        aSmeshMesh, error = SMESH._objref_SMESH_Gen.CreateMeshesFromGMF(self,theFileName)
+        if error.comment: print "*** CreateMeshesFromGMF() errors:\n", error.comment
+        return Mesh(self, self.geompyD, aSmeshMesh), error
+
     ## Concatenate the given meshes into one mesh.
     #  @return an instance of Mesh class
     #  @param meshes the meshes to combine into one mesh
@@ -976,7 +983,10 @@ class Mesh:
                     if studyID != geompyD.myStudyId:
                         geompyD.init_geom( smeshpyD.GetCurrentStudy())
                         pass
-                    geo_name = "%s_%s_for_meshing"%(self.geom.GetShapeType(), id(self.geom)%100)
+                    if name:
+                        geo_name = name
+                    else:
+                        geo_name = "%s_%s_for_meshing"%(self.geom.GetShapeType(), id(self.geom)%100)
                     geompyD.addToStudy( self.geom, geo_name )
                 self.mesh = self.smeshpyD.CreateMesh(self.geom)
 
@@ -1169,15 +1179,18 @@ class Mesh:
                     except:
                         shapeText = " on subshape #%s" % (err.subShapeID)
                 errText = ""
-                stdErrors = ["OK",                 #COMPERR_OK
-                             "Invalid input mesh", #COMPERR_BAD_INPUT_MESH
-                             "std::exception",     #COMPERR_STD_EXCEPTION
-                             "OCC exception",      #COMPERR_OCC_EXCEPTION
-                             "SALOME exception",   #COMPERR_SLM_EXCEPTION
-                             "Unknown exception",  #COMPERR_EXCEPTION
+                stdErrors = ["OK",                   #COMPERR_OK
+                             "Invalid input mesh",   #COMPERR_BAD_INPUT_MESH
+                             "std::exception",       #COMPERR_STD_EXCEPTION
+                             "OCC exception",        #COMPERR_OCC_EXCEPTION
+                             "SALOME exception",     #COMPERR_SLM_EXCEPTION
+                             "Unknown exception",    #COMPERR_EXCEPTION
                              "Memory allocation problem", #COMPERR_MEMORY_PB
-                             "Algorithm failed",   #COMPERR_ALGO_FAILED
-                             "Unexpected geometry"]#COMPERR_BAD_SHAPE
+                             "Algorithm failed",     #COMPERR_ALGO_FAILED
+                             "Unexpected geometry",  #COMPERR_BAD_SHAPE
+                             "Warning",              #COMPERR_WARNING
+                             "Computation cancelled",#COMPERR_CANCELED
+                             "No mesh on sub-shape"] #COMPERR_NO_MESH_ON_SHAPE
                 if err.code > 0:
                     if err.code < len(stdErrors): errText = stdErrors[err.code]
                 else:
@@ -1452,6 +1465,19 @@ class Mesh:
             meshPart = self.mesh
         self.mesh.ExportCGNS(meshPart, f, overwrite)
 
+    ## Exports the mesh in a file in GMF format
+    #  @param f is the file name
+    #  @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh
+    #  @ingroup l2_impexp
+    def ExportGMF(self, f, meshPart=None):
+        if isinstance( meshPart, list ):
+            meshPart = self.GetIDSource( meshPart, SMESH.ALL )
+        if isinstance( meshPart, Mesh ):
+            meshPart = meshPart.mesh
+        elif not meshPart:
+            meshPart = self.mesh
+        self.mesh.ExportGMF(meshPart, f)
+
     ## Deprecated, used only for compatibility! Please, use ExportToMEDX() method instead.
     #  Exports the mesh in a file in MED format and chooses the \a version of MED format
     ## allowing to overwrite the file if it exists or add the exported data to its contents
@@ -1759,14 +1785,14 @@ class Mesh:
     #  @return an instance of SMESH_MeshEditor
     #  @ingroup l1_modifying
     def GetMeshEditor(self):
-        return self.mesh.GetMeshEditor()
+        return self.editor
 
     ## Wrap a list of IDs of elements or nodes into SMESH_IDSource which
     #  can be passed as argument to a method accepting mesh, group or sub-mesh
     #  @return an instance of SMESH_IDSource
     #  @ingroup l1_auxiliary
     def GetIDSource(self, ids, elemType):
-        return self.GetMeshEditor().MakeIDSource(ids, elemType)
+        return self.editor.MakeIDSource(ids, elemType)
 
     ## Gets MED Mesh
     #  @return an instance of SALOME_MED::MESH
@@ -3974,6 +4000,18 @@ class Mesh:
     def DoubleNodeElemGroupsInRegion(self, theElems, theNodesNot, theShape):
         return self.editor.DoubleNodeElemGroupsInRegion(theElems, theNodesNot, theShape)
 
+    ## Identify the elements that will be affected by node duplication (actual duplication is not performed.
+    #  This method is the first step of DoubleNodeElemGroupsInRegion.
+    #  @param theElems - list of groups of elements (edges or faces) to be replicated
+    #  @param theNodesNot - list of groups of nodes not to replicated
+    #  @param theShape - shape to detect affected elements (element which geometric center
+    #         located on or inside shape).
+    #         The replicated nodes should be associated to affected elements.
+    #  @return groups of affected elements
+    #  @ingroup l2_modif_edit
+    def AffectedElemGroupsInRegion(self, theElems, theNodesNot, theShape):
+        return self.editor.AffectedElemGroupsInRegion(theElems, theNodesNot, theShape)
+
     ## Double nodes on shared faces between groups of volumes and create flat elements on demand.
     # The list of groups must describe a partition of the mesh volumes.
     # The nodes of the internal faces at the boundaries of the groups are doubled.
@@ -3994,6 +4032,11 @@ class Mesh:
     # @return TRUE if operation has been completed successfully, FALSE otherwise
     def CreateFlatElementsOnFacesGroups(self, theGroupsOfFaces ):
         return self.editor.CreateFlatElementsOnFacesGroups( theGroupsOfFaces )
+    
+    ## identify all the elements around a geom shape, get the faces delimiting the hole
+    #
+    def CreateHoleSkin(self, radius, theShape, groupName, theNodesCoords):
+        return self.editor.CreateHoleSkin( radius, theShape, groupName, theNodesCoords )
 
     def _valueFromFunctor(self, funcType, elemId):
         fn = self.smeshpyD.GetFunctor(funcType)
@@ -4075,283 +4118,10 @@ class Mesh:
     def GetSkew(self, elemId):
         return self._valueFromFunctor(SMESH.FT_Skew, elemId)
 
-## The mother class to define algorithm, it is not recommended to use it directly.
+    pass # end of Mesh class
+    
+## Helper class for wrapping of SMESH.SMESH_Pattern CORBA class
 #
-#  For each meshing algorithm, a python class inheriting from class Mesh_Algorithm
-#  should be defined. This descendant class sould have two attributes defining the way
-# it is created by class Mesh (see e.g. class StdMeshersDC_Segment in StdMeshersDC.py).
-# - meshMethod attribute defines name of method of class Mesh by calling which the
-#   python class of algorithm is created. E.g. if in class MyPlugin_Algorithm
-#   meshMethod = "MyAlgorithm", then an instance of MyPlugin_Algorithm is created
-#   by the following code: my_algo = mesh.MyAlgorithm()
-# - algoType defines name of algorithm type and is used mostly to discriminate
-#   algorithms that are created by the same method of class Mesh. E.g. if
-#   MyPlugin_Algorithm.algoType = "MyPLUGIN" then it's creation code can be:
-#   my_algo = mesh.MyAlgorithm(algo="MyPLUGIN")
-#  @ingroup l2_algorithms
-class Mesh_Algorithm:
-    #  @class Mesh_Algorithm
-    #  @brief Class Mesh_Algorithm
-
-    #def __init__(self,smesh):
-    #    self.smesh=smesh
-    def __init__(self):
-        self.mesh = None
-        self.geom = None
-        self.subm = None
-        self.algo = None
-
-    ## Finds a hypothesis in the study by its type name and parameters.
-    #  Finds only the hypotheses created in smeshpyD engine.
-    #  @return SMESH.SMESH_Hypothesis
-    def FindHypothesis (self, hypname, args, CompareMethod, smeshpyD):
-        study = smeshpyD.GetCurrentStudy()
-        #to do: find component by smeshpyD object, not by its data type
-        scomp = study.FindComponent(smeshpyD.ComponentDataType())
-        if scomp is not None:
-            res,hypRoot = scomp.FindSubObject(SMESH.Tag_HypothesisRoot)
-            # Check if the root label of the hypotheses exists
-            if res and hypRoot is not None:
-                iter = study.NewChildIterator(hypRoot)
-                # Check all published hypotheses
-                while iter.More():
-                    hypo_so_i = iter.Value()
-                    attr = hypo_so_i.FindAttribute("AttributeIOR")[1]
-                    if attr is not None:
-                        anIOR = attr.Value()
-                        hypo_o_i = salome.orb.string_to_object(anIOR)
-                        if hypo_o_i is not None:
-                            # Check if this is a hypothesis
-                            hypo_i = hypo_o_i._narrow(SMESH.SMESH_Hypothesis)
-                            if hypo_i is not None:
-                                # Check if the hypothesis belongs to current engine
-                                if smeshpyD.GetObjectId(hypo_i) > 0:
-                                    # Check if this is the required hypothesis
-                                    if hypo_i.GetName() == hypname:
-                                        # Check arguments
-                                        if CompareMethod(hypo_i, args):
-                                            # found!!!
-                                            return hypo_i
-                                        pass
-                                    pass
-                                pass
-                            pass
-                        pass
-                    iter.Next()
-                    pass
-                pass
-            pass
-        return None
-
-    ## Finds the algorithm in the study by its type name.
-    #  Finds only the algorithms, which have been created in smeshpyD engine.
-    #  @return SMESH.SMESH_Algo
-    def FindAlgorithm (self, algoname, smeshpyD):
-        study = smeshpyD.GetCurrentStudy()
-        if not study: return None
-        #to do: find component by smeshpyD object, not by its data type
-        scomp = study.FindComponent(smeshpyD.ComponentDataType())
-        if scomp is not None:
-            res,hypRoot = scomp.FindSubObject(SMESH.Tag_AlgorithmsRoot)
-            # Check if the root label of the algorithms exists
-            if res and hypRoot is not None:
-                iter = study.NewChildIterator(hypRoot)
-                # Check all published algorithms
-                while iter.More():
-                    algo_so_i = iter.Value()
-                    attr = algo_so_i.FindAttribute("AttributeIOR")[1]
-                    if attr is not None:
-                        anIOR = attr.Value()
-                        algo_o_i = salome.orb.string_to_object(anIOR)
-                        if algo_o_i is not None:
-                            # Check if this is an algorithm
-                            algo_i = algo_o_i._narrow(SMESH.SMESH_Algo)
-                            if algo_i is not None:
-                                # Checks if the algorithm belongs to the current engine
-                                if smeshpyD.GetObjectId(algo_i) > 0:
-                                    # Check if this is the required algorithm
-                                    if algo_i.GetName() == algoname:
-                                        # found!!!
-                                        return algo_i
-                                    pass
-                                pass
-                            pass
-                        pass
-                    iter.Next()
-                    pass
-                pass
-            pass
-        return None
-
-    ## If the algorithm is global, returns 0; \n
-    #  else returns the submesh associated to this algorithm.
-    def GetSubMesh(self):
-        return self.subm
-
-    ## Returns the wrapped mesher.
-    def GetAlgorithm(self):
-        return self.algo
-
-    ## Gets the list of hypothesis that can be used with this algorithm
-    def GetCompatibleHypothesis(self):
-        mylist = []
-        if self.algo:
-            mylist = self.algo.GetCompatibleHypothesis()
-        return mylist
-
-    ## Gets the name of the algorithm
-    def GetName(self):
-        GetName(self.algo)
-
-    ## Sets the name to the algorithm
-    def SetName(self, name):
-        self.mesh.smeshpyD.SetName(self.algo, name)
-
-    ## Gets the id of the algorithm
-    def GetId(self):
-        return self.algo.GetId()
-
-    ## Private method.
-    def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"):
-        if geom is None:
-            raise RuntimeError, "Attemp to create " + hypo + " algoritm on None shape"
-        algo = self.FindAlgorithm(hypo, mesh.smeshpyD)
-        if algo is None:
-            algo = mesh.smeshpyD.CreateHypothesis(hypo, so)
-            pass
-        self.Assign(algo, mesh, geom)
-        return self.algo
-
-    ## Private method
-    def Assign(self, algo, mesh, geom):
-        if geom is None:
-            raise RuntimeError, "Attemp to create " + algo + " algoritm on None shape"
-        self.mesh = mesh
-        name = ""
-        if not geom:
-            self.geom = mesh.geom
-        else:
-            self.geom = geom
-            AssureGeomPublished( mesh, geom )
-            try:
-                name = GetName(geom)
-                pass
-            except:
-                pass
-            self.subm = mesh.mesh.GetSubMesh(geom, algo.GetName())
-        self.algo = algo
-        status = mesh.mesh.AddHypothesis(self.geom, self.algo)
-        TreatHypoStatus( status, algo.GetName(), name, True )
-        return
-
-    def CompareHyp (self, hyp, args):
-        print "CompareHyp is not implemented for ", self.__class__.__name__, ":", hyp.GetName()
-        return False
-
-    def CompareEqualHyp (self, hyp, args):
-        return True
-
-    ## Private method
-    def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so",
-                    UseExisting=0, CompareMethod=""):
-        hypo = None
-        if UseExisting:
-            if CompareMethod == "": CompareMethod = self.CompareHyp
-            hypo = self.FindHypothesis(hyp, args, CompareMethod, self.mesh.smeshpyD)
-            pass
-        if hypo is None:
-            hypo = self.mesh.smeshpyD.CreateHypothesis(hyp, so)
-            a = ""
-            s = "="
-            for arg in args:
-                argStr = str(arg)
-                if isinstance( arg, geompyDC.GEOM._objref_GEOM_Object ):
-                    argStr = arg.GetStudyEntry()
-                    if not argStr: argStr = "GEOM_Obj_%s", arg.GetEntry()
-                if len( argStr ) > 10:
-                    argStr = argStr[:7]+"..."
-                    if argStr[0] == '[': argStr += ']'
-                a = a + s + argStr
-                s = ","
-                pass
-            if len(a) > 50:
-                a = a[:47]+"..."
-            self.mesh.smeshpyD.SetName(hypo, hyp + a)
-            pass
-        geomName=""
-        if self.geom:
-            geomName = GetName(self.geom)
-        status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
-        TreatHypoStatus( status, GetName(hypo), geomName, 0 )
-        return hypo
-
-    ## Returns entry of the shape to mesh in the study
-    def MainShapeEntry(self):
-        if not self.mesh or not self.mesh.GetMesh(): return ""
-        if not self.mesh.GetMesh().HasShapeToMesh(): return ""
-        shape = self.mesh.GetShape()
-        return shape.GetStudyEntry()
-
-    ## Defines "ViscousLayers" hypothesis to give parameters of layers of prisms to build
-    #  near mesh boundary. This hypothesis can be used by several 3D algorithms:
-    #  NETGEN 3D, GHS3D, Hexahedron(i,j,k)
-    #  @param thickness total thickness of layers of prisms
-    #  @param numberOfLayers number of layers of prisms
-    #  @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
-    #  @param ignoreFaces list of geometrical faces (or their ids) not to generate layers on
-    #  @ingroup l3_hypos_additi
-    def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, ignoreFaces=[]):
-        if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo):
-            raise TypeError, "ViscousLayers are supported by 3D algorithms only"
-        if not "ViscousLayers" in self.GetCompatibleHypothesis():
-            raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
-        if ignoreFaces and isinstance( ignoreFaces[0], geompyDC.GEOM._objref_GEOM_Object ):
-            ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ]
-        hyp = self.Hypothesis("ViscousLayers",
-                              [thickness, numberOfLayers, stretchFactor, ignoreFaces])
-        hyp.SetTotalThickness(thickness)
-        hyp.SetNumberLayers(numberOfLayers)
-        hyp.SetStretchFactor(stretchFactor)
-        hyp.SetIgnoreFaces(ignoreFaces)
-        return hyp
-
-    ## Transform a list of ether edges or tuples (edge, 1st_vertex_of_edge)
-    #  into a list acceptable to SetReversedEdges() of some 1D hypotheses
-    #  @ingroup l3_hypos_1dhyps
-    def ReversedEdgeIndices(self, reverseList):
-        resList = []
-        geompy = self.mesh.geompyD
-        for i in reverseList:
-            if isinstance( i, int ):
-                s = geompy.SubShapes(self.mesh.geom, [i])[0]
-                if s.GetShapeType() != geompyDC.GEOM.EDGE:
-                    raise TypeError, "Not EDGE index given"
-                resList.append( i )
-            elif isinstance( i, geompyDC.GEOM._objref_GEOM_Object ):
-                if i.GetShapeType() != geompyDC.GEOM.EDGE:
-                    raise TypeError, "Not an EDGE given"
-                resList.append( geompy.GetSubShapeID(self.mesh.geom, i ))
-            elif len( i ) > 1:
-                e = i[0]
-                v = i[1]
-                if not isinstance( e, geompyDC.GEOM._objref_GEOM_Object ) or \
-                   not isinstance( v, geompyDC.GEOM._objref_GEOM_Object ):
-                    raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
-                if v.GetShapeType() == geompyDC.GEOM.EDGE and \
-                   e.GetShapeType() == geompyDC.GEOM.VERTEX:
-                    v,e = e,v
-                if e.GetShapeType() != geompyDC.GEOM.EDGE or \
-                   v.GetShapeType() != geompyDC.GEOM.VERTEX:
-                    raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
-                vFirst = FirstVertexOnCurve( e )
-                tol    = geompy.Tolerance( vFirst )[-1]
-                if geompy.MinDistance( v, vFirst ) > 1.5*tol:
-                    resList.append( geompy.GetSubShapeID(self.mesh.geom, e ))
-            else:
-                raise TypeError, "Item must be either an edge or tuple (edge, 1st_vertex_of_edge)"
-        return resList
-
-
 class Pattern(SMESH._objref_SMESH_Pattern):
 
     def ApplyToMeshFaces(self, theMesh, theFacesIDs, theNodeIndexOnKeyPoint1, theReverse):
@@ -4366,13 +4136,9 @@ class Pattern(SMESH._objref_SMESH_Pattern):
         theMesh.SetParameters(Parameters)
         return SMESH._objref_SMESH_Pattern.ApplyToHexahedrons( self, theMesh, theVolumesIDs, theNode000Index, theNode001Index )
 
-#Registering the new proxy for Pattern
+# Registering the new proxy for Pattern
 omniORB.registerObjref(SMESH._objref_SMESH_Pattern._NP_RepositoryId, Pattern)
 
-
-
-
-
 ## Private class used to bind methods creating algorithms to the class Mesh
 #
 class algoCreator:
@@ -4416,6 +4182,7 @@ class algoCreator:
         return None
 
 # Private class used to substitute and store variable parameters of hypotheses.
+#
 class hypMethodWrapper:
     def __init__(self, hyp, method):
         self.hyp    = hyp
diff --git a/src/SMESH_SWIG/smesh_algorithm.py b/src/SMESH_SWIG/smesh_algorithm.py
new file mode 100644 (file)
index 0000000..dfeaba4
--- /dev/null
@@ -0,0 +1,322 @@
+# Copyright (C) 2007-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
+#
+
+## @package smesh_algorithm
+#  Python API for base Mesh_Algorithm class.
+#  This package is a part of SALOME %Mesh module Python API
+
+import salome
+import geompyDC
+import SMESH
+
+## The base class to define meshing algorithms
+#
+#  @note This class should not be used directly, it is supposed to be sub-classed
+#  for implementing Python API for specific meshing algorithms
+#
+#  For each meshing algorithm, a python class inheriting from class %Mesh_Algorithm
+#  should be defined. This descendant class should have two attributes defining the way
+#  it is created by class Mesh (see e.g. class @ref StdMeshersDC.StdMeshersDC_Segment "StdMeshersDC_Segment"
+#  in StdMeshersDC package):
+#  - @c meshMethod attribute defines name of method of class smesh.Mesh by calling which the
+#    python class of algorithm is created; this method is dynamically added to the smesh.Mesh class
+#    in runtime. For example, if in @c class MyPlugin_Algorithm this attribute is defined as
+#    @code
+#    meshMethod = "MyAlgorithm"
+#    @endcode
+#    then an instance of @c MyPlugin_Algorithm can be created by the direct invokation of the function
+#    of smesh.Mesh class:
+#    @code
+#    my_algo = mesh.MyAlgorithm()
+#    @endcode
+#  - @c algoType defines type of algorithm and is used mostly to discriminate
+#    algorithms that are created by the same method of class smesh.Mesh. For example, if this attribute
+#    is specified in @c MyPlugin_Algorithm class as
+#    @code
+#    algoType = "MyPLUGIN"
+#    @endcode
+#    then it's creation code can be:
+#    @code
+#    my_algo = mesh.MyAlgorithm(algo="MyPLUGIN")
+#    @endcode
+#  @ingroup l2_algorithms
+class Mesh_Algorithm:
+    
+    ## Private constuctor
+    def __init__(self):
+        self.mesh = None
+        self.geom = None
+        self.subm = None
+        self.algo = None
+        pass
+
+    ## Finds a hypothesis in the study by its type name and parameters.
+    #  Finds only the hypotheses created in smeshpyD engine.
+    #  @return SMESH.SMESH_Hypothesis
+    def FindHypothesis (self, hypname, args, CompareMethod, smeshpyD):
+        study = smeshpyD.GetCurrentStudy()
+        #to do: find component by smeshpyD object, not by its data type
+        scomp = study.FindComponent(smeshpyD.ComponentDataType())
+        if scomp is not None:
+            res,hypRoot = scomp.FindSubObject(SMESH.Tag_HypothesisRoot)
+            # Check if the root label of the hypotheses exists
+            if res and hypRoot is not None:
+                iter = study.NewChildIterator(hypRoot)
+                # Check all published hypotheses
+                while iter.More():
+                    hypo_so_i = iter.Value()
+                    attr = hypo_so_i.FindAttribute("AttributeIOR")[1]
+                    if attr is not None:
+                        anIOR = attr.Value()
+                        hypo_o_i = salome.orb.string_to_object(anIOR)
+                        if hypo_o_i is not None:
+                            # Check if this is a hypothesis
+                            hypo_i = hypo_o_i._narrow(SMESH.SMESH_Hypothesis)
+                            if hypo_i is not None:
+                                # Check if the hypothesis belongs to current engine
+                                if smeshpyD.GetObjectId(hypo_i) > 0:
+                                    # Check if this is the required hypothesis
+                                    if hypo_i.GetName() == hypname:
+                                        # Check arguments
+                                        if CompareMethod(hypo_i, args):
+                                            # found!!!
+                                            return hypo_i
+                                        pass
+                                    pass
+                                pass
+                            pass
+                        pass
+                    iter.Next()
+                    pass
+                pass
+            pass
+        return None
+
+    ## Finds the algorithm in the study by its type name.
+    #  Finds only the algorithms, which have been created in smeshpyD engine.
+    #  @return SMESH.SMESH_Algo
+    def FindAlgorithm (self, algoname, smeshpyD):
+        study = smeshpyD.GetCurrentStudy()
+        if not study: return None
+        #to do: find component by smeshpyD object, not by its data type
+        scomp = study.FindComponent(smeshpyD.ComponentDataType())
+        if scomp is not None:
+            res,hypRoot = scomp.FindSubObject(SMESH.Tag_AlgorithmsRoot)
+            # Check if the root label of the algorithms exists
+            if res and hypRoot is not None:
+                iter = study.NewChildIterator(hypRoot)
+                # Check all published algorithms
+                while iter.More():
+                    algo_so_i = iter.Value()
+                    attr = algo_so_i.FindAttribute("AttributeIOR")[1]
+                    if attr is not None:
+                        anIOR = attr.Value()
+                        algo_o_i = salome.orb.string_to_object(anIOR)
+                        if algo_o_i is not None:
+                            # Check if this is an algorithm
+                            algo_i = algo_o_i._narrow(SMESH.SMESH_Algo)
+                            if algo_i is not None:
+                                # Checks if the algorithm belongs to the current engine
+                                if smeshpyD.GetObjectId(algo_i) > 0:
+                                    # Check if this is the required algorithm
+                                    if algo_i.GetName() == algoname:
+                                        # found!!!
+                                        return algo_i
+                                    pass
+                                pass
+                            pass
+                        pass
+                    iter.Next()
+                    pass
+                pass
+            pass
+        return None
+
+    ## If the algorithm is global, returns 0; \n
+    #  else returns the submesh associated to this algorithm.
+    def GetSubMesh(self):
+        return self.subm
+
+    ## Returns the wrapped mesher.
+    def GetAlgorithm(self):
+        return self.algo
+
+    ## Gets the list of hypothesis that can be used with this algorithm
+    def GetCompatibleHypothesis(self):
+        mylist = []
+        if self.algo:
+            mylist = self.algo.GetCompatibleHypothesis()
+        return mylist
+
+    ## Gets the name of the algorithm
+    def GetName(self):
+        from smesh import GetName
+        return GetName(self.algo)
+
+    ## Sets the name to the algorithm
+    def SetName(self, name):
+        self.mesh.smeshpyD.SetName(self.algo, name)
+
+    ## Gets the id of the algorithm
+    def GetId(self):
+        return self.algo.GetId()
+
+    ## Private method.
+    def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"):
+        if geom is None:
+            raise RuntimeError, "Attemp to create " + hypo + " algoritm on None shape"
+        algo = self.FindAlgorithm(hypo, mesh.smeshpyD)
+        if algo is None:
+            algo = mesh.smeshpyD.CreateHypothesis(hypo, so)
+            pass
+        self.Assign(algo, mesh, geom)
+        return self.algo
+
+    ## Private method
+    def Assign(self, algo, mesh, geom):
+        from smesh import AssureGeomPublished, TreatHypoStatus, GetName
+        if geom is None:
+            raise RuntimeError, "Attemp to create " + algo + " algoritm on None shape"
+        self.mesh = mesh
+        name = ""
+        if not geom:
+            self.geom = mesh.geom
+        else:
+            self.geom = geom
+            AssureGeomPublished( mesh, geom )
+            try:
+                name = GetName(geom)
+                pass
+            except:
+                pass
+            self.subm = mesh.mesh.GetSubMesh(geom, algo.GetName())
+        self.algo = algo
+        status = mesh.mesh.AddHypothesis(self.geom, self.algo)
+        TreatHypoStatus( status, algo.GetName(), name, True )
+        return
+
+    def CompareHyp (self, hyp, args):
+        print "CompareHyp is not implemented for ", self.__class__.__name__, ":", hyp.GetName()
+        return False
+
+    def CompareEqualHyp (self, hyp, args):
+        return True
+
+    ## Private method
+    def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so",
+                    UseExisting=0, CompareMethod=""):
+        from smesh import TreatHypoStatus, GetName
+        hypo = None
+        if UseExisting:
+            if CompareMethod == "": CompareMethod = self.CompareHyp
+            hypo = self.FindHypothesis(hyp, args, CompareMethod, self.mesh.smeshpyD)
+            pass
+        if hypo is None:
+            hypo = self.mesh.smeshpyD.CreateHypothesis(hyp, so)
+            a = ""
+            s = "="
+            for arg in args:
+                argStr = str(arg)
+                if isinstance( arg, geompyDC.GEOM._objref_GEOM_Object ):
+                    argStr = arg.GetStudyEntry()
+                    if not argStr: argStr = "GEOM_Obj_%s", arg.GetEntry()
+                if len( argStr ) > 10:
+                    argStr = argStr[:7]+"..."
+                    if argStr[0] == '[': argStr += ']'
+                a = a + s + argStr
+                s = ","
+                pass
+            if len(a) > 50:
+                a = a[:47]+"..."
+            self.mesh.smeshpyD.SetName(hypo, hyp + a)
+            pass
+        geomName=""
+        if self.geom:
+            geomName = GetName(self.geom)
+        status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
+        TreatHypoStatus( status, GetName(hypo), geomName, 0 )
+        return hypo
+
+    ## Returns entry of the shape to mesh in the study
+    def MainShapeEntry(self):
+        if not self.mesh or not self.mesh.GetMesh(): return ""
+        if not self.mesh.GetMesh().HasShapeToMesh(): return ""
+        shape = self.mesh.GetShape()
+        return shape.GetStudyEntry()
+
+    ## Defines "ViscousLayers" hypothesis to give parameters of layers of prisms to build
+    #  near mesh boundary. This hypothesis can be used by several 3D algorithms:
+    #  NETGEN 3D, GHS3D, Hexahedron(i,j,k)
+    #  @param thickness total thickness of layers of prisms
+    #  @param numberOfLayers number of layers of prisms
+    #  @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
+    #  @param ignoreFaces list of geometrical faces (or their ids) not to generate layers on
+    #  @ingroup l3_hypos_additi
+    def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, ignoreFaces=[]):
+        if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo):
+            raise TypeError, "ViscousLayers are supported by 3D algorithms only"
+        if not "ViscousLayers" in self.GetCompatibleHypothesis():
+            raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
+        if ignoreFaces and isinstance( ignoreFaces[0], geompyDC.GEOM._objref_GEOM_Object ):
+            ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ]
+        hyp = self.Hypothesis("ViscousLayers",
+                              [thickness, numberOfLayers, stretchFactor, ignoreFaces])
+        hyp.SetTotalThickness(thickness)
+        hyp.SetNumberLayers(numberOfLayers)
+        hyp.SetStretchFactor(stretchFactor)
+        hyp.SetIgnoreFaces(ignoreFaces)
+        return hyp
+
+    ## Transform a list of ether edges or tuples (edge, 1st_vertex_of_edge)
+    #  into a list acceptable to SetReversedEdges() of some 1D hypotheses
+    #  @ingroup l3_hypos_1dhyps
+    def ReversedEdgeIndices(self, reverseList):
+        from smesh import FirstVertexOnCurve
+        resList = []
+        geompy = self.mesh.geompyD
+        for i in reverseList:
+            if isinstance( i, int ):
+                s = geompy.SubShapes(self.mesh.geom, [i])[0]
+                if s.GetShapeType() != geompyDC.GEOM.EDGE:
+                    raise TypeError, "Not EDGE index given"
+                resList.append( i )
+            elif isinstance( i, geompyDC.GEOM._objref_GEOM_Object ):
+                if i.GetShapeType() != geompyDC.GEOM.EDGE:
+                    raise TypeError, "Not an EDGE given"
+                resList.append( geompy.GetSubShapeID(self.mesh.geom, i ))
+            elif len( i ) > 1:
+                e = i[0]
+                v = i[1]
+                if not isinstance( e, geompyDC.GEOM._objref_GEOM_Object ) or \
+                   not isinstance( v, geompyDC.GEOM._objref_GEOM_Object ):
+                    raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
+                if v.GetShapeType() == geompyDC.GEOM.EDGE and \
+                   e.GetShapeType() == geompyDC.GEOM.VERTEX:
+                    v,e = e,v
+                if e.GetShapeType() != geompyDC.GEOM.EDGE or \
+                   v.GetShapeType() != geompyDC.GEOM.VERTEX:
+                    raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
+                vFirst = FirstVertexOnCurve( e )
+                tol    = geompy.Tolerance( vFirst )[-1]
+                if geompy.MinDistance( v, vFirst ) > 1.5*tol:
+                    resList.append( geompy.GetSubShapeID(self.mesh.geom, e ))
+            else:
+                raise TypeError, "Item must be either an edge or tuple (edge, 1st_vertex_of_edge)"
+        return resList
+
index eca22e91e77323f0d982a7df4b755de0010658b3..679a8d8532f5d04f6c26bc661b19270cff099aba 100644 (file)
@@ -37,6 +37,9 @@
 
 // SALOME GUI includes
 #include <SUIT_Session.h>
+#include <SUIT_ViewManager.h>
+#include <SALOME_Prs.h>
+#include <SUIT_ViewWindow.h>
 #include <VTKViewer_ViewModel.h>
 #include <SALOME_Event.h>
 #include <SalomeApp_Application.h>
@@ -575,6 +578,44 @@ void SMESH_Swig::CreateAndDisplayActor( const char* Mesh_Entry )
   ProcessVoidEvent(new TEvent(Mesh_Entry));
 }
 
+void SMESH_Swig::EraseActor( const char* Mesh_Entry, const bool allViewers )
+{
+  class TEvent: public SALOME_Event
+  {
+  private:
+    const char* _entry;
+    bool _allViewers;
+  public:
+    TEvent(const char* Mesh_Entry, const bool allViewers ) {
+      _entry = Mesh_Entry;
+      _allViewers = allViewers;
+    }
+    virtual void Execute() {
+      SUIT_Session* aSession = SUIT_Session::session();
+      SUIT_Application* anApplication = aSession->activeApplication();
+      SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>(anApplication);
+      SMESHGUI_Displayer* aDisp = new SMESHGUI_Displayer(anApp);
+      ViewManagerList aManagers;
+      if ( !_allViewers ) {
+       aManagers << anApp->activeViewManager();
+      }
+      else {
+       aManagers = anApp->viewManagers();
+      }
+      foreach( SUIT_ViewManager* aMgr, aManagers ) {
+       if ( aMgr && aMgr->getType() == VTKViewer_Viewer::Type() ) {
+         SALOME_View* aSalomeView = dynamic_cast<SALOME_View*>(aMgr->getViewModel());
+         if (aSalomeView) {
+           aDisp->Erase(_entry,true, true, aSalomeView);
+         }
+       }
+      }
+    }
+  };
+
+  ProcessVoidEvent(new TEvent(Mesh_Entry, allViewers));
+}
+
 void SMESH_Swig::SetName(const char* theEntry,
                          const char* theName)
 {
index 4a7b8e719a8e2e949c5a4bcfff223fdd9ec3febd..504eba84579172148c557fcc67279648c4e9c57b 100644 (file)
@@ -65,6 +65,8 @@ public:
 
   void                       SetName( const char*, const char* );
 
+  void                       EraseActor( const char*, const bool allViewers = false );
+
   /*!
    * \brief Set mesh icon according to compute status
     * \param Mesh_Entry - entry of a mesh
index 52d2bb87fa4aab38309d362f30de565b0ed4f809..db8ef31aa9919aaac36aa946d023d37167a6def7 100644 (file)
@@ -75,4 +75,5 @@ class SMESH_Swig
   void SetMeshIcon(const char* Mesh_Entry, const bool isComputed, const bool isEmpty);
 
   void CreateAndDisplayActor( const char* Mesh_Entry );
+  void EraseActor( const char* Mesh_Entry, const bool allViewers = false );
 };
index c1e57198fe17fc844001e1a5533358c17b9e3981..6b0c68b93facfbd1f13490635d7730d58eefbac3 100644 (file)
@@ -35,6 +35,7 @@
 
 #include "utilities.h"
 #include "Utils_ExceptHandlers.hxx"
+#include <Basics_OCCTVersion.hxx>
 
 #include <BRepAdaptor_Surface.hxx>
 #include <BRepBndLib.hxx>
@@ -85,7 +86,10 @@ using namespace std;
 
 //#define _MY_DEBUG_
 
-#define ELLIPSOLID_WORKAROUND // remove it as soon as http://tracker.dev.opencascade.org/view.php?id=22809 is solved
+#if OCC_VERSION_LARGE <= 0x06050300
+// workaround it required only for OCCT6.5.3 and older (see OCC22809)
+#define ELLIPSOLID_WORKAROUND
+#endif
 
 #ifdef ELLIPSOLID_WORKAROUND
 #include <BRepIntCurveSurface_Inter.hxx>
index 4aefa321f83b07fdad073af4c7f8ef3ee9563147..df2228e3d7df7cd72aab25ab81f8669f535b8dc1 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 /*!
  * \brief A 3D algorithm generating 3D structured Cartesian mesh in the
index d5b9f8b4e30eb5aeb1f92ea77d7e76361c8ce5ee..a39791e96d95ae2c8e2aaec00ac5d237c1a28340 100644 (file)
@@ -25,7 +25,7 @@
 #define _SMESH_CompositeSegment_1D_HXX_
 
 #include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 class SMESH_Mesh;
 class StdMeshers_FaceSide;
index 0912a4d030f5e12c3bc8711007239717ab97929a..16e70fc207ae9244a27ca6aa0acb875fe887b97d 100644 (file)
@@ -25,7 +25,7 @@
 #define __StdMeshers_HexaFromSkin_3D_HXX__
 
 #include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 /*!
  * \brief Alorithm generating hexahedral mesh from 2D skin of block
index 48f1eebbe8b08949ab2ef66ebf3e15a3373442c0..50b476c7dfc154df58cc3ed596ba7de434beb22d 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 
 class StdMeshers_ViscousLayers;
index b8a5076b8c10c2eb8fcd9a62a17aba6438245088..a856471205ed4d88875a67a60247e1ea1284c104 100644 (file)
@@ -134,7 +134,7 @@ namespace // INTERNAL STUFF
     _ListenerData(const StdMeshers_ImportSource1D* h, _ListenerDataType type=SRC_HYP):
       SMESH_subMeshEventListenerData(/*isDeletable=*/true), _srcHyp(h)
     {
-      myType = type; 
+      myType = type;
     }
   };
   //================================================================================
@@ -613,7 +613,7 @@ namespace // INTERNAL STUFF
 
 //=============================================================================
 /*!
- * Import elements from the other mesh 
+ * Import elements from the other mesh
  */
 //=============================================================================
 
@@ -637,8 +637,8 @@ bool StdMeshers_Import_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & th
   subShapeIDs.insert( shapeID );
 
   // get nodes on vertices
-  list < SMESH_TNodeXYZ > vertexNodes; 
- list < SMESH_TNodeXYZ >::iterator vNIt;
+  list < SMESH_TNodeXYZ > vertexNodes;
 list < SMESH_TNodeXYZ >::iterator vNIt;
   TopExp_Explorer vExp( theShape, TopAbs_VERTEX );
   for ( ; vExp.More(); vExp.Next() )
   {
@@ -670,7 +670,7 @@ bool StdMeshers_Import_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & th
     SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
     vector<const SMDS_MeshNode*> newNodes;
     SMDS_MeshNode *tmpNode = helper.AddNode(0,0,0);
-    double u;
+    double u = 0;
     while ( srcElems->more() ) // loop on group contents
     {
       const SMDS_MeshElement* edge = srcElems->next();
@@ -678,6 +678,10 @@ bool StdMeshers_Import_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & th
       newNodes.resize( edge->NbNodes() );
       newNodes.back() = 0;
       SMDS_MeshElement::iterator node = edge->begin_nodes();
+      SMESH_TNodeXYZ a(edge->GetNode(0));
+      // --- define a tolerance relative to the length of an edge
+      double mytol = a.Distance(edge->GetNode(edge->NbNodes()-1))/25;
+      //MESSAGE("mytol = " << mytol);
       for ( unsigned i = 0; i < newNodes.size(); ++i, ++node )
       {
         TNodeNodeMap::iterator n2nIt = n2n->insert( make_pair( *node, (SMDS_MeshNode*)0 )).first;
@@ -701,7 +705,7 @@ bool StdMeshers_Import_1D::Compute(SMESH_Mesh & theMesh, const TopoDS_Shape & th
         {
           // find out if node lies on theShape
           tmpNode->setXYZ( (*node)->X(), (*node)->Y(), (*node)->Z());
-          if ( helper.CheckNodeU( geomEdge, tmpNode, u, 10 * edgeTol, /*force=*/true ))
+          if ( helper.CheckNodeU( geomEdge, tmpNode, u, mytol, /*force=*/true ))
           {
             SMDS_MeshNode* newNode = tgtMesh->AddNode( (*node)->X(), (*node)->Y(), (*node)->Z());
             n2nIt->second = newNode;
@@ -906,7 +910,7 @@ void StdMeshers_Import_1D::importMesh(const SMESH_Mesh*          srcMesh,
  */
 //=============================================================================
 
-void StdMeshers_Import_1D::setEventListener(SMESH_subMesh*             subMesh, 
+void StdMeshers_Import_1D::setEventListener(SMESH_subMesh*             subMesh,
                                             StdMeshers_ImportSource1D* sourceHyp)
 {
   if ( sourceHyp )
index b71b90564777f213a7aca26e3d0e46d13808f35e..03b8cbcf00fc75c06c0476b09a36b06e6d73f629 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_1D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 #include "SMDS_MeshElement.hxx"
 
 class StdMeshers_ImportSource1D;
index fc3a89d8513569f034a92c973b136b7d161e5fe3..22dbed743e4555abb3f6ed55b5941d697f32441d 100644 (file)
@@ -28,7 +28,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 #include "SMDS_MeshElement.hxx"
 
 class StdMeshers_ImportSource1D;
index fe637c65a1e82c2e345d8edde45da2a4f8b8e8b9..f7a91a6b1493044c04cfdced27d5a695522594ac 100644 (file)
@@ -51,8 +51,8 @@
 
 #include <BRepTools.hxx>
 #include <BRep_Tool.hxx>
-#include <Geom_Curve.hxx>
 #include <Geom2d_Curve.hxx>
+#include <Geom_Curve.hxx>
 #include <Geom_Surface.hxx>
 #include <Precision.hxx>
 #include <TopExp.hxx>
@@ -64,6 +64,7 @@
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Iterator.hxx>
+#include <TopoDS_Wire.hxx>
 #include <gp_Pnt2d.hxx>
 
 #include <BRep_Tool.hxx>
index 0dce86135ef9018c64a336dab7ec6f2ca6a87430..219df40890088fc1f82f799f186a1e0b3f0e6f06 100644 (file)
 //           Moved here from SMESH_MEFISTO_2D.hxx
 //  Author : Paul RASCLE, EDF
 //  Module : SMESH
-//  $Header$
 //
 #ifndef _StdMeshers_MEFISTO_2D_HXX_
 #define _StdMeshers_MEFISTO_2D_HXX_
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 class TopoDS_Face;
 class StdMeshers_MaxElementArea;
index 5d23368cc5f6a2659d59d6775e9c53817f5f927d..680389051b435f65e87986c2d1a7515d7ccf41a1 100644 (file)
 //  class StdMeshers_SMESHBlock
 //
 ////////////////////////////////////////////////////////////////////////
+#include <TColStd_MapOfInteger.hxx>
+#include <TopTools_IndexedMapOfOrientedShape.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Vertex.hxx>
 #include <gp_Pnt.hxx>
 #include <gp_XYZ.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopTools_IndexedMapOfOrientedShape.hxx>
-#include <TColStd_MapOfInteger.hxx>
 
+#include "SMESH_Algo.hxx"
 #include "SMESH_Block.hxx"
 #include "SMESH_ComputeError.hxx"
 #include "SMESH_MesherHelper.hxx"
-#include "SMESH_3D_Algo.hxx"
 
 typedef std::map< double, std::vector<const SMDS_MeshNode*> > StdMeshers_IJNodeMap;
 
index 8c1e6fa78fe629b3b29764f688def0a1ea0f2fd4..42d56fe16ccfc70961435677c61aac61ff17454c 100644 (file)
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_3D_Algo.hxx"
-#include "SMDS_TypeOfPosition.hxx"
 #include "SMDS_MeshNode.hxx"
+#include "SMDS_TypeOfPosition.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_Algo.hxx"
 #include "SMESH_Block.hxx"
+#include "SMESH_Comment.hxx"
 #include "SMESH_Mesh.hxx"
-#include "SMESHDS_Mesh.hxx"
-#include "SMESH_subMesh.hxx"
 #include "SMESH_MesherHelper.hxx"
-#include "SMESH_Comment.hxx"
+#include "SMESH_subMesh.hxx"
 
 #include <vector>
 
+#include <Adaptor2d_Curve2d.hxx>
 #include <Adaptor3d_Curve.hxx>
 #include <Adaptor3d_Surface.hxx>
-#include <Adaptor2d_Curve2d.hxx>
 #include <BRepAdaptor_Surface.hxx>
 #include <TopTools_IndexedMapOfOrientedShape.hxx>
-#include <gp_XYZ.hxx>
 #include <gp_Trsf.hxx>
+#include <gp_XYZ.hxx>
 
 
 class SMESHDS_SubMesh;
@@ -55,7 +55,6 @@ class TopoDS_Edge;
 class TopoDS_Faces;
 struct TNode;
 
-//typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
 typedef std::vector<const SMDS_MeshNode* > TNodeColumn;
 
 // map of bottom nodes to the column of nodes above them
index 3053be90d22bce6d95db37e677127ed460366d0f..d0f29a54bb66dbc9ddebdcd549e4a62baa39bbd4 100644 (file)
@@ -2004,8 +2004,9 @@ bool StdMeshers_ProjectionUtils::MakeComputed(SMESH_subMesh * sm, const int iter
   if ( !srcMesh )
     srcMesh = mesh;
 
-  if ( MakeComputed( srcMesh->GetSubMesh( srcShape ), iterationNb + 1 ))
-    return gen->Compute( *mesh, sm->GetSubShape() );
+  if ( MakeComputed( srcMesh->GetSubMesh( srcShape ), iterationNb + 1 ) &&
+       gen->Compute( *mesh, sm->GetSubShape() ))
+    return sm->IsMeshComputed();
 
   return false;
 }
index 5ef640170fdda85077800be5b474ed9c3641bb56..acef6c83bf56f1c1f3caa7702dae199825c79f0b 100644 (file)
@@ -30,7 +30,7 @@
 #include "SMESH_StdMeshers.hxx"
 
 
-#include "SMESH_1D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 
 class StdMeshers_ProjectionSource1D;
index efe6bf034819dd7a5c7a696f65812988343d9b55..7e5cfe82181ca4f87276f0a52dc5fe1165b5a2b7 100644 (file)
@@ -27,6 +27,7 @@
 
 #include "SMESH_Gen.hxx"
 #include "SMESH_MesherHelper.hxx"
+#include "SMESH_subMesh.hxx"
 #include "SMESH_subMeshEventListener.hxx"
 #include "StdMeshers_FaceSide.hxx"
 #include "StdMeshers_ProjectionSource2D.hxx"
index b4734fa0c6c531b40b0c82d3f3a94c75c1338cfd..60917a9fcd4be63af82cf9d32e1dcbd1de7a2031 100644 (file)
@@ -72,8 +72,6 @@ StdMeshers_Projection_2D::StdMeshers_Projection_2D(int hypId, int studyId, SMESH
   :SMESH_2D_Algo(hypId, studyId, gen)
 {
   _name = "Projection_2D";
-  _shapeType = (1 << TopAbs_FACE);      // 1 bit per shape type
-
   _compatibleHypothesis.push_back("ProjectionSource2D");
   _sourceHypo = 0;
 }
@@ -808,7 +806,7 @@ bool StdMeshers_Projection_2D::Compute(SMESH_Mesh& theMesh, const TopoDS_Shape&
   SMESH_subMesh* tgtSubMesh = tgtMesh->GetSubMesh( tgtFace );
 
   if ( tgtMesh == srcMesh ) {
-    if ( !TAssocTool::MakeComputed( srcSubMesh ))
+    if ( !TAssocTool::MakeComputed( srcSubMesh ) || !srcSubMesh->IsMeshComputed() )
       return error(COMPERR_BAD_INPUT_MESH,"Source mesh not computed");
   }
   else {
index 3d1bd1808e7b76336a3c2bc85760cf29e9839af2..38bcb113a9525a00b115041c0acf29239927c951 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 class StdMeshers_ProjectionSource2D;
 
index 76c29c82215f3cc96ac1a6784801c970ff30fbcc..ed22742f75124308d1ad897b30ce204fee884a11 100644 (file)
@@ -296,12 +296,12 @@ bool StdMeshers_Projection_3D::Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& aS
       SMESH_Block::GetFaceEdgesIDs( fId, edgeIdVec );
       for ( int i = 0; i < edgeIdVec.size(); ++i ) {
         int eID = edgeIdVec[ i ];
-        shape2ShapeMap.Bind( tgtShapes( eID ), scrShapes( eID ));
+        shape2ShapeMap.Bind( scrShapes( eID ), tgtShapes( eID ));
         if ( i < 2 ) {
           vector< int > vertexIdVec;
           SMESH_Block::GetEdgeVertexIDs( eID, vertexIdVec );
-          shape2ShapeMap.Bind( tgtShapes( vertexIdVec[0] ), scrShapes( vertexIdVec[0] ));
-          shape2ShapeMap.Bind( tgtShapes( vertexIdVec[1] ), scrShapes( vertexIdVec[1] ));
+          shape2ShapeMap.Bind( scrShapes( vertexIdVec[0]), tgtShapes( vertexIdVec[0]) );
+          shape2ShapeMap.Bind( scrShapes( vertexIdVec[1]), tgtShapes( vertexIdVec[1]) );
         }
       }
     }
index 03e8c4838a8382c48d4ea757e55fcb330be85b85..fdfe5b81799f12459a24d1d4164a05386b5bc480 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 class StdMeshers_ProjectionSource3D;
 
index 5764cc6eac0520dda5a7f2a24ae226c59a627b0d..4c96220ea5297581e5a1ef7dedbd289ec2c88a00 100644 (file)
@@ -28,6 +28,8 @@
 
 #include "SMESH_Algo.hxx"
 #include "SMESH_MesherHelper.hxx"
+#include "SMESH_Group.hxx"
+#include "SMESHDS_GroupBase.hxx"
 
 #include <IntAna_IntConicQuad.hxx>
 #include <IntAna_Quadric.hxx>
@@ -38,7 +40,9 @@
 #include <TopoDS.hxx>
 #include <gp_Lin.hxx>
 #include <gp_Pln.hxx>
+#include "utilities.h"
 
+#include <string>
 #include <numeric>
 #include <limits>
 
@@ -224,7 +228,7 @@ namespace
           }
         }
 
-      // Within pyramids, replace nodes to remove by nodes to keep  
+      // Within pyramids, replace nodes to remove by nodes to keep
 
       for ( unsigned i = 0; i < pyrams.size(); ++i )
       {
@@ -281,7 +285,7 @@ void StdMeshers_QuadToTriaAdaptor::MergePiramids( const SMDS_MeshElement*     Pr
 
   // find and remove coincided faces of merged pyramids
   vector< const SMDS_MeshElement* > inverseElems
-    // copy inverse elements to avoid iteration on changing container 
+    // copy inverse elements to avoid iteration on changing container
     ( TStdElemIterator( CommonNode->GetInverseElementIterator(SMDSAbs_Face)), itEnd);
   for ( unsigned i = 0; i < inverseElems.size(); ++i )
   {
@@ -550,13 +554,13 @@ bool StdMeshers_QuadToTriaAdaptor::CheckIntersection (const gp_Pnt&       P,
   gp_Ax1 line( P, gp_Vec(P,PC));
   vector< const SMDS_MeshElement* > suspectElems;
   searcher->GetElementsNearLine( line, SMDSAbs_Face, suspectElems);
-  
+
   for ( int i = 0; i < suspectElems.size(); ++i )
   {
     const SMDS_MeshElement* face = suspectElems[i];
     if ( face == NotCheckedFace ) continue;
     Handle(TColgp_HSequenceOfPnt) aContour = new TColgp_HSequenceOfPnt;
-    for ( int i = 0; i < face->NbCornerNodes(); ++i ) 
+    for ( int i = 0; i < face->NbCornerNodes(); ++i )
       aContour->Append( SMESH_TNodeXYZ( face->GetNode(i) ));
     if( HasIntersection(P, PC, Pres, aContour) ) {
       res = true;
@@ -702,7 +706,7 @@ int StdMeshers_QuadToTriaAdaptor::Preparation(const SMDS_MeshElement*       face
 
 //=======================================================================
 //function : Compute
-//purpose  : 
+//purpose  :
 //=======================================================================
 
 bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh&         aMesh,
@@ -898,6 +902,36 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh)
   if ( aMesh.NbQuadrangles() < 1 )
     return false;
 
+  // find if there is a group of faces identified as skin faces, with normal going outside the volume
+  std::string groupName = "skinFaces";
+  SMESHDS_GroupBase* groupDS = 0;
+  SMESH_Mesh::GroupIteratorPtr groupIt = aMesh.GetGroups();
+  while ( groupIt->more() )
+    {
+      groupDS = 0;
+      SMESH_Group * group = groupIt->next();
+      if ( !group ) continue;
+      groupDS = group->GetGroupDS();
+      if ( !groupDS || groupDS->IsEmpty() )
+      {
+        groupDS = 0;
+        continue;
+      }
+      if (groupDS->GetType() != SMDSAbs_Face)
+      {
+        groupDS = 0;
+        continue;
+      }
+      std::string grpName = group->GetName();
+      if (grpName == groupName)
+      {
+        MESSAGE("group skinFaces provided");
+        break;
+      }
+      else
+        groupDS = 0;
+    }
+
   vector<const SMDS_MeshElement*> myPyramids;
   SMESH_MesherHelper helper(aMesh);
   helper.IsQuadraticSubMesh(aMesh.GetShapeToMesh());
@@ -911,7 +945,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh)
   SMESH_ProxyMesh::SubMesh* prxSubMesh = getProxySubMesh();
 
   SMDS_FaceIteratorPtr fIt = meshDS->facesIterator(/*idInceasingOrder=*/true);
-  while( fIt->more()) 
+  while( fIt->more())
   {
     const SMDS_MeshElement* face = fIt->next();
     if ( !face ) continue;
@@ -1003,7 +1037,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh)
       continue;
     }
 
-    // Case of non-degenerated quadrangle 
+    // Case of non-degenerated quadrangle
 
     // Find pyramid peak
 
@@ -1062,6 +1096,10 @@ bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh)
       }
     }
 
+    // if the face belong to the group of skinFaces, do not build a pyramid outside
+    if (groupDS && groupDS->Contains(face))
+      intersected[0] = false;
+
     // Create one or two pyramids
 
     for ( int isRev = 0; isRev < 2; ++isRev )
@@ -1176,7 +1214,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute2ndPart(SMESH_Mesh&
         for(k=0; k<4 && !hasInt; k++) {
           gp_Vec Vtmp(PsI[k],PsI[4]);
           gp_Pnt Pshift = PsI[k].XYZ() + Vtmp.XYZ() * 0.01; // base node moved a bit to apex
-          hasInt = 
+          hasInt =
           ( HasIntersection3( Pshift, PsI[4], Pint, PsJ[0], PsJ[1], PsJ[4]) ||
             HasIntersection3( Pshift, PsI[4], Pint, PsJ[1], PsJ[2], PsJ[4]) ||
             HasIntersection3( Pshift, PsI[4], Pint, PsJ[2], PsJ[3], PsJ[4]) ||
@@ -1185,7 +1223,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute2ndPart(SMESH_Mesh&
         for(k=0; k<4 && !hasInt; k++) {
           gp_Vec Vtmp(PsJ[k],PsJ[4]);
           gp_Pnt Pshift = PsJ[k].XYZ() + Vtmp.XYZ() * 0.01;
-          hasInt = 
+          hasInt =
             ( HasIntersection3( Pshift, PsJ[4], Pint, PsI[0], PsI[1], PsI[4]) ||
               HasIntersection3( Pshift, PsJ[4], Pint, PsI[1], PsI[2], PsI[4]) ||
               HasIntersection3( Pshift, PsJ[4], Pint, PsI[2], PsI[3], PsI[4]) ||
@@ -1215,7 +1253,7 @@ bool StdMeshers_QuadToTriaAdaptor::Compute2ndPart(SMESH_Mesh&
               PCi += PsI[k].XYZ();
               PCj += PsJ[k].XYZ();
             }
-            PCi /= 4; PCj /= 4; 
+            PCi /= 4; PCj /= 4;
             gp_Vec VN1(PCi,PsI[4]);
             gp_Vec VN2(PCj,PsJ[4]);
             gp_Vec VI1(PCi,Pint);
index 3f9202e86dbe883584ec0db8a95bfdd6b2d7c1db..e200bc5af1b26554b27cb421fef6bfa220731499 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "StdMeshers_QuadrangleParams.hxx"
 
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 #include "Utils_SALOME_Exception.hxx"
 
 #include <TopoDS_Face.hxx>
index 11959d46f8ec37819a60fa1124409469c0c3209f..7a6eaf9bdfc8d08fa241d410ebf2c38301942b7c 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 #include "SMDS_MeshNode.hxx"
 
 #include <vector>
index d93c64eb6638af49c6231f6d124e0ffe0e9e89eb..3aeee6062afbbcd9380a9e6d52b016dc91d0f519 100644 (file)
@@ -20,8 +20,6 @@
 //  SMESH SMESH : implementaion of SMESH idl descriptions
 // File      : StdMeshers_RadialQuadrangle_1D2D.cxx
 // Module    : SMESH
-// Created   : Fri Oct 20 11:37:07 2006
-// Author    : Edward AGAPOV (eap)
 
 #include "StdMeshers_RadialQuadrangle_1D2D.hxx"
 
@@ -878,6 +876,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh&         aMesh,
 
   // orientation
   bool IsForward = ( CircEdge.Orientation()==TopAbs_FORWARD );
+  const double angleSign = ( F.Orientation() == TopAbs_REVERSED ? -1.0 : 1.0 );
 
   // create nodes and mesh elements on face
   // find axis of rotation
@@ -896,7 +895,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh&         aMesh,
     gp_Ax1 theAxis(P0,gp_Dir(Axis));
     aTrsf.SetRotation( theAxis, Angles.Value(i) );
     gp_Trsf2d aTrsf2d;
-    aTrsf2d.SetRotation( PC, Angles.Value(i) );
+    aTrsf2d.SetRotation( PC, Angles.Value(i) * angleSign );
     // create nodes
     int j = 1;
     for(; j<=Points.Length(); j++) {
index b68ebe9302a88a5854dd786e187f40e0de63d66b..6a4def9e5b8a7cdd0c779642328b95946e8d3db1 100644 (file)
@@ -26,7 +26,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 #include <TopoDS_Edge.hxx>
 
index 8d900955d284778f5dadb9fddb78416b11f5311e..6ea520001c195e66985a5b9e329d9c9ff0e0c099 100644 (file)
@@ -354,7 +354,7 @@ static void compensateError(double a1, double an,
                             bool              adjustNeighbors2an = false)
 {
   int i, nPar = theParams.size();
-  if ( a1 + an < length && nPar > 1 )
+  if ( a1 + an <= length && nPar > 1 )
   {
     bool reverse = ( U1 > Un );
     GCPnts_AbscissaPoint Discret(C3d, reverse ? an : -an, Un);
@@ -375,10 +375,9 @@ static void compensateError(double a1, double an,
       dUn = Utgt - theParams.back();
     }
 
-    double q  = dUn / ( nPar - 1 );
     if ( !adjustNeighbors2an )
     {
-      q = dUn / ( Utgt - Un ); // (signed) factor of segment length change
+      double q = dUn / ( Utgt - Un ); // (signed) factor of segment length change
       for ( itU = theParams.rbegin(), i = 1; i < nPar; i++ ) {
         double prevU = *itU;
         (*itU) += dUn;
@@ -386,7 +385,13 @@ static void compensateError(double a1, double an,
         dUn = q * (*itU - prevU) * (prevU-U1)/(Un-U1);
       }
     }
-    else {
+    else if ( nPar == 1 )
+    {
+      theParams.back() += dUn;
+    }
+    else
+    {
+      double q  = dUn / ( nPar - 1 );
       theParams.back() += dUn;
       double sign = reverse ? -1 : 1;
       double prevU = theParams.back();
@@ -608,12 +613,14 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
   case NB_SEGMENTS: {
 
     double eltSize = 1;
+    int nbSegments;
     if ( _hypType == MAX_LENGTH )
     {
       double nbseg = ceil(theLength / _value[ BEG_LENGTH_IND ]); // integer sup
       if (nbseg <= 0)
         nbseg = 1;                        // degenerated edge
       eltSize = theLength / nbseg;
+      nbSegments = (int) nbseg;
     }
     else if ( _hypType == LOCAL_LENGTH )
     {
@@ -654,13 +661,14 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
       if (nbseg <= 0)
         nbseg = 1;                        // degenerated edge
       eltSize = theLength / nbseg;
+      nbSegments = (int) nbseg;
     }
     else
     {
       // Number Of Segments hypothesis
-      int NbSegm = _ivalue[ NB_SEGMENTS_IND ];
-      if ( NbSegm < 1 )  return false;
-      if ( NbSegm == 1 ) return true;
+      nbSegments = _ivalue[ NB_SEGMENTS_IND ];
+      if ( nbSegments < 1 )  return false;
+      if ( nbSegments == 1 ) return true;
 
       switch (_ivalue[ DISTR_TYPE_IND ])
       {
@@ -670,8 +678,8 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
 
           if (fabs(scale - 1.0) < Precision::Confusion()) {
             // special case to avoid division by zero
-            for (int i = 1; i < NbSegm; i++) {
-              double param = f + (l - f) * i / NbSegm;
+            for (int i = 1; i < nbSegments; i++) {
+              double param = f + (l - f) * i / nbSegments;
               theParams.push_back( param );
             }
           } else {
@@ -679,10 +687,10 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
             if ( theReverse )
               scale = 1.0 / scale;
 
-            double alpha = pow(scale, 1.0 / (NbSegm - 1));
-            double factor = (l - f) / (1.0 - pow(alpha, NbSegm));
+            double alpha = pow(scale, 1.0 / (nbSegments - 1));
+            double factor = (l - f) / (1.0 - pow(alpha, nbSegments));
 
-            for (int i = 1; i < NbSegm; i++) {
+            for (int i = 1; i < nbSegments; i++) {
               double param = f + factor * (1.0 - pow(alpha, i));
               theParams.push_back( param );
             }
@@ -715,7 +723,7 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
         }
         break;
       case StdMeshers_NumberOfSegments::DT_Regular:
-        eltSize = theLength / _ivalue[ NB_SEGMENTS_IND ];
+        eltSize = theLength / nbSegments;
         break;
       default:
         return false;
@@ -725,13 +733,13 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh &     theMesh,
     if ( !Discret.IsDone() )
       return error( "GCPnts_UniformAbscissa failed");
 
-    int NbPoints = Discret.NbPoints();
-    for ( int i = 2; i < NbPoints; i++ )
+    int NbPoints = Min( Discret.NbPoints(), nbSegments + 1 );
+    for ( int i = 2; i < NbPoints; i++ ) // skip 1st and last points
     {
       double param = Discret.Parameter(i);
       theParams.push_back( param );
     }
-    compensateError( eltSize, eltSize, f, l, theLength, theC3d, theParams ); // for PAL9899
+    compensateError( eltSize, eltSize, f, l, theLength, theC3d, theParams, true ); // for PAL9899
     return true;
   }
 
index aed1064abee96b9c69bc7a08751e79813b668de9..8dceddb55106c36910b1226aeff0b85f69be8883 100644 (file)
@@ -31,7 +31,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_1D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 #include "StdMeshers_FixedPoints1D.hxx"
 
index abb8ce2c665336f31b92bbdfba8eca2ef07c0e11..97d83042ee3f944c56f48c420fd69245e78c79ec 100644 (file)
@@ -29,7 +29,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_0D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 /*!
  * \brief Algorithm existing in order just to enable assignation of
index 23c64b5b9191c12f7bbd3c7c426c5648168455a3..561036a4405aa7379796d75d0d17bfdb6e86180c 100644 (file)
@@ -26,8 +26,7 @@
 
 #include "SMESH_StdMeshers.hxx"
 
-#include "SMESH_1D_Algo.hxx"
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
 
 /*!
  * \brief 1D and 2D algorithms doing nothing to allow mesh generation
index ddae235f73e5c198f2f17a4b47810424535766a6..c875ca104a4f622be907664d77f9c5f2329f6597 100644 (file)
@@ -976,6 +976,9 @@ SMESH_ComputeErrorPtr _ViscousBuilder::Compute(SMESH_Mesh&         theMesh,
   {
     if ( ! makeLayer(_sdVec[i]) )
       return _error;
+
+    if ( _sdVec[i]._edges.size() == 0 )
+      continue;
     
     if ( ! inflate(_sdVec[i]) )
       return _error;
@@ -2504,22 +2507,21 @@ bool _ViscousBuilder::smoothAnalyticEdge( _SolidData&           data,
     else // 2D
     {
       const gp_XY center( center3D.X(), center3D.Y() );
-      
+
       gp_XY uv0 = helper.GetNodeUV( F, data._edges[iFrom]->_2neibors->_nodes[0]);
       gp_XY uvM = helper.GetNodeUV( F, data._edges[iFrom]->_nodes.back());
       gp_XY uv1 = helper.GetNodeUV( F, data._edges[iTo-1]->_2neibors->_nodes[1]);
       gp_Vec2d vec0( center, uv0 );
-      gp_Vec2d vecM( center, uvM);
+      gp_Vec2d vecM( center, uvM );
       gp_Vec2d vec1( center, uv1 );
       double uLast = vec0.Angle( vec1 ); // -PI - +PI
       double uMidl = vec0.Angle( vecM );
-      if ( uLast < 0 ) uLast += 2.*M_PI; // 0.0 - 2*PI
-      if ( uMidl < 0 ) uMidl += 2.*M_PI;
-      const bool sense = ( uMidl < uLast );
+      if ( uLast * uMidl < 0. )
+        uLast += ( uMidl > 0 ? +2. : -2. ) * M_PI;
       const double radius = 0.5 * ( vec0.Magnitude() + vec1.Magnitude() );
 
-      gp_Ax2d axis( center, vec0 );
-      gp_Circ2d circ ( axis, radius, sense );
+      gp_Ax2d   axis( center, vec0 );
+      gp_Circ2d circ( axis, radius );
       for ( int i = iFrom; i < iTo; ++i )
       {
         double    newU = uLast * len[i-iFrom] / len.back();
@@ -3375,6 +3377,15 @@ bool _ViscousBuilder::refine(_SolidData& data)
     }
   }
 
+  if ( !getMeshDS()->IsEmbeddedMode() )
+    // Log node movement
+    for ( unsigned i = 0; i < data._edges.size(); ++i )
+    {
+      _LayerEdge& edge = *data._edges[i];
+      SMESH_TNodeXYZ p ( edge._nodes.back() );
+      getMeshDS()->MoveNode( p._node, p.X(), p.Y(), p.Z() );
+    }
+
   // TODO: make quadratic prisms and polyhedrons(?)
 
   helper.SetElementsOnShape(true);
@@ -3463,7 +3474,7 @@ bool _ViscousBuilder::shrink()
   helper.ToFixNodeParameters( true );
 
   // EDGE's to shrink
-  map< int, _Shrinker1D > e2shrMap;
+  map< TGeomID, _Shrinker1D > e2shrMap;
 
   // loop on FACES to srink mesh on
   map< TGeomID, _SolidData* >::iterator f2sd = f2sdMap.begin();
@@ -3633,7 +3644,8 @@ bool _ViscousBuilder::shrink()
         for ( unsigned i = 0; i < nodesToSmooth.size(); ++i )
         {
           moved |= nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,
-                                            /*isCentroidal=*/isConcaveFace,/*set3D=*/false );
+                                            /*isCentroidal=*/isConcaveFace,
+                                            /*set3D=*/isConcaveFace);
         }
         if ( badNb < oldBadNb )
           nbNoImpSteps = 0;
@@ -3650,12 +3662,10 @@ bool _ViscousBuilder::shrink()
     bool highQuality;
     {
       const bool hasTria = _mesh->NbTriangles(), hasQuad = _mesh->NbQuadrangles();
-      if ( hasTria != hasQuad )
-      {
+      if ( hasTria != hasQuad ) {
         highQuality = hasQuad;
       }
-      else
-      {
+      else {
         set<int> nbNodesSet;
         SMDS_ElemIteratorPtr fIt = smDS->GetElements();
         while ( fIt->more() && nbNodesSet.size() < 2 )
@@ -3676,6 +3686,14 @@ bool _ViscousBuilder::shrink()
     // Set an event listener to clear FACE sub-mesh together with SOLID sub-mesh
     _SrinkShapeListener::ToClearSubMeshWithSolid( sm, data._solid );
 
+    if ( !getMeshDS()->IsEmbeddedMode() )
+      // Log node movement
+      for ( unsigned i = 0; i < nodesToSmooth.size(); ++i )
+      {
+        SMESH_TNodeXYZ p ( nodesToSmooth[i]._node );
+        getMeshDS()->MoveNode( nodesToSmooth[i]._node, p.X(), p.Y(), p.Z() );
+      }
+
   } // loop on FACES to srink mesh on
 
 
@@ -4227,7 +4245,7 @@ void _Shrinker1D::AddEdge( const _LayerEdge* e, SMESH_MesherHelper& helper )
     GeomAdaptor_Curve aCurve(C, f,l);
     const double totLen = GCPnts_AbscissaPoint::Length(aCurve, f, l);
 
-    int nbExpectNodes = eSubMesh->NbNodes() - e->_nodes.size();
+    int nbExpectNodes = eSubMesh->NbNodes();
     _initU  .reserve( nbExpectNodes );
     _normPar.reserve( nbExpectNodes );
     _nodes  .reserve( nbExpectNodes );
@@ -4439,6 +4457,8 @@ bool _ViscousBuilder::addBoundaryElements()
         F = e2f->second.Oriented( TopAbs_FORWARD );
         reverse = ( helper.GetSubShapeOri( F, E ) == TopAbs_REVERSED );
         if ( helper.GetSubShapeOri( data._solid, F ) == TopAbs_REVERSED )
+          reverse = !reverse, F.Reverse();
+        if ( SMESH_Algo::IsReversedSubMesh( TopoDS::Face(F), getMeshDS() ))
           reverse = !reverse;
       }
       else
@@ -4470,12 +4490,28 @@ bool _ViscousBuilder::addBoundaryElements()
         vector< const SMDS_MeshNode*>&  nn1 = ledges[j-dj1]->_nodes;
         vector< const SMDS_MeshNode*>&  nn2 = ledges[j-dj2]->_nodes;
         if ( isOnFace )
-          for ( unsigned z = 1; z < nn1.size(); ++z )
+          for ( size_t z = 1; z < nn1.size(); ++z )
             sm->AddElement( getMeshDS()->AddFace( nn1[z-1], nn2[z-1], nn2[z], nn1[z] ));
         else
-          for ( unsigned z = 1; z < nn1.size(); ++z )
+          for ( size_t z = 1; z < nn1.size(); ++z )
             sm->AddElement( new SMDS_FaceOfNodes( nn1[z-1], nn2[z-1], nn2[z], nn1[z]));
       }
+
+      // Make edges
+      for ( int isFirst = 0; isFirst < 2; ++isFirst )
+      {
+        _LayerEdge* edge = isFirst ? ledges.front() : ledges.back();
+        if ( !edge->_sWOL.IsNull() && edge->_sWOL.ShapeType() == TopAbs_EDGE )
+        {
+          vector< const SMDS_MeshNode*>&  nn = edge->_nodes;
+          if ( nn[1]->GetInverseElementIterator( SMDSAbs_Edge )->more() )
+            continue;
+          helper.SetSubShape( edge->_sWOL );
+          helper.SetElementsOnShape( true );
+          for ( size_t z = 1; z < nn.size(); ++z )
+            helper.AddEdge( nn[z-1], nn[z] );
+        }
+      }
     }
   }
 
index 48eec0eb433b207139426bcde0288921cb28efaf..52960e78c14c4a36d1351a82aa546126085baeb1 100644 (file)
@@ -606,7 +606,7 @@ QFrame* StdMeshersGUI_CartesianParamCreator::buildFrame()
   argGroupLayout->addWidget( new QLabel( tr( "THRESHOLD" ), GroupC1 ), row, 0 );
   myThreshold = new SMESHGUI_SpinBox( GroupC1 );
   myThreshold->setAcceptNames( false ); // No Notebook variables allowed
-  myThreshold->RangeStepAndValidator( 1.1, 1e+10, 1., "length_precision" );
+  myThreshold->RangeStepAndValidator( 1.00001, 1e+10, 1., "length_precision" );
   argGroupLayout->addWidget( myThreshold, row, 1 );
   row++;
   
index 6e902a7f191bd60f3c68720b8551ac783712e822..87727c20d76a21c0559487858cc777f044f4766b 100644 (file)
@@ -747,7 +747,7 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const
   }
 
   SMESH::SMESH_Hypothesis_var hyp = initParamsHypothesis();
-  SMESH::ListOfParameters_var aParameters = hyp->GetLastParameters();
+  //SMESH::ListOfParameters_var aParameters = hyp->GetLastParameters();
 
   if( hypType()=="LocalLength" )
   {
index 8c2240803cd2f493ca37e0d90c9524a86efa4bd6..637163f66e0b37f0e00db5c66144bc68d06f10bf 100644 (file)
@@ -249,7 +249,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument()
     for ( ; anIt.More(); anIt.Next()) { // Loop on selected objects
       Handle(SALOME_InteractiveObject) IO = anIt.Value();
       
-      GEOM::GEOM_Object_var aGeomObj = GetGeomObjectByEntry( IO->getEntry() );  
+      GEOM::GEOM_Object_var aGeomObj = GetGeomObjectByEntry( IO->getEntry() );
       if ( !CORBA::is_nil( aGeomObj ) ) { // Selected Object From Study
         GEOM::GEOM_Object_ptr aGeomFatherObj = aGeomObj->GetMainShape();
         QString aFatherEntry = "";
@@ -303,7 +303,9 @@ void StdMeshersGUI_SubShapeSelectorWdg::SelectionIntoArgument()
     }
   }
   // update add button
-  myAddButton->setEnabled( ( myListWidget->count() < myMaxSize || myMaxSize == -1 ) && mySelectedIDs.size() > 0 && ( mySelectedIDs.size() <= myMaxSize || myMaxSize == -1 ) );
+  myAddButton->setEnabled( ( myListWidget->count() < myMaxSize || myMaxSize == -1 ) &&
+                           mySelectedIDs.size() > 0 &&
+                           ( mySelectedIDs.size() <= myMaxSize || myMaxSize == -1 ) );
 
   //Connect Selected Ids in viewer and dialog's Ids list
   bool signalsBlocked = myListWidget->blockSignals( true );