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 2027867..51899e3 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 cc3ddb2..5b3adb2 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 19e21b9..da25d09 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 15060ed..213652e 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 13b8e6d..3d788cd 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 dbb81b4..d44f388 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 7474e0f..411fc30 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 f953b37..c0953ff 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 adf63c6..23349d0 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 f300d6f..9f6254c 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
@@ -51,6 +54,33 @@ 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 cbc4128..2865835 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 52ff261..7c8eeb7 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 40c2b93..0a7b88e 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 e725ef9..29ff056 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 f121843..3eb7f0f 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 e98eca6..d9e2b31 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 a163d13..3b76906 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 bc99172..2991eb5 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 bcf1531..74e2ab2 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 f6e9f89..b8d3176 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
   {
@@ -238,6 +239,13 @@ module SMESH
       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
      *  \param meshName - a name of the new mesh
index 8d18789..f2e4378 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 409bb4e..b8d2b5e 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 561c5b8..08f2b70 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
@@ -1039,6 +1046,21 @@ module SMESH
                                           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
      * \return TRUE if operation has been completed successfully, FALSE otherwise
@@ -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 0dbcc2e..20be229 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 0d519fc..b82d6a4 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 f9540e0..66601f3 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 7389517..c04008f 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 45861a8..fcaea2b 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 0062ee7..a088c77 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 517a56f..edc4741 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 338bc1d..232551e 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 a60b77c..35caa02 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 39b03f2..9d1bf4a 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 0e6d835..7fbced5 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 0e05ad7..c66dea1 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 0fff1bd..a48520c 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 b969674..5276980 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 31cb50d..59cf140 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 4daba11..1463f03 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 4e04546..fc95425 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 b346e68..11d7fe4 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 7a88f70..d53765d 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 8c3abb7..554af35 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 e137a1c..30bef05 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 56854fd..c4557b2 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 78966bc..1f6712a 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 0d9b1e6..1eb5c44 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 4c1cc7b..774c54e 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 841d235..2c7c401 100644 (file)
@@ -1454,6 +1454,45 @@ double SMDS_VolumeTool::MinLinearSize2() const
 
 //================================================================================
 /*!
+ * \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
  *
  * If a face is shared by one of <ignoreVolumes>, it is considered free
index 5c22c3e..ff067eb 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 3008e02..72cc31c 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 9768eb0..f7bd7f9 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>
@@ -98,6 +101,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 580445b..1a3be08 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 dae945e..c18ace1 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 353cba6..b785478 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 7ef5685..dae4e31 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 f378be2..edb14b9 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 fee310f..48f293a 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 0c81caa..4c29ff3 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 1057d3d..0b171a6 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();