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

index 20278673661a9843707dbd08348ed5bd5fbc58d5..51899e35e1e63be7c097f3ba3b628800d9c9f16f 100644 (file)
@@ -553,6 +553,7 @@ AC_OUTPUT([ \
   src/DriverMED/Makefile \
   src/DriverSTL/Makefile \
   src/DriverUNV/Makefile \
+  src/DriverGMF/Makefile \
   src/DriverCGNS/Makefile \
   src/MEFISTO2/Makefile \
   src/OBJECT/Makefile \
index cc3ddb25155e64ff5e38d01cbc7aa4b6c3a13495..5b3adb2fbcf76e9c9430128cb6e0f7d3f6881fbb 100755 (executable)
@@ -26,25 +26,26 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
 EXTRA_DIST += images input static/footer.html static/doxygen.css
 
+dist_salomescript_PYTHON = collect_mesh_methods.py
+
 guidocdir = $(docdir)/gui/SMESH
 guidoc_DATA = images/head.png
 
+DOC_PYTHONPATH=$(prefix)/bin/salome:$(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(MED_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(GEOM_ROOT_DIR)/bin/salome:$(GEOM_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(KERNEL_ROOT_DIR)/bin/salome:$(KERNEL_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(OMNIORB_ROOT)/lib/python$(PYTHON_VERSION)/site-packages:$(OMNIORB_ROOT)/lib64/python$(PYTHON_VERSION)/site-packages
+DOC_SMESH_MeshersList=StdMeshers
+
+# to have smesh.py in the documentation instead of smeshDC.py
+# we create dummy smesh.py from the smeshDC.py
+smesh.py: ../../../../src/SMESH_SWIG/smeshDC.py
+       @awk '/^class Mesh:/ { mesh_found=1 } // { if (mesh_found) {print $$0; next} } /^ +(def|#)/ { match( $$0, /^ +/); print substr( $$0, 1+RLENGTH ); next } /^class smeshDC/ { next } //' \
+         $< > $@
+
+tmp/smesh.py: $(top_srcdir)/src/SMESH_SWIG/StdMeshersDC.py $(srcdir)/collect_mesh_methods.py
+       @mkdir -p tmp && PYTHONPATH=$(DOC_PYTHONPATH):${PYTHONPATH} SMESH_MeshersList=$(DOC_SMESH_MeshersList) $(PYTHON) $(srcdir)/collect_mesh_methods.py -o $@ StdMeshers
 
-usr_docs: doxyfile_py doxyfile 
-       echo "===========================================" ;                    \
-       echo "Replacing smeshDC by smesh" ;                                     \
-       echo "===========================================" ;                    \
-       awk '/^class Mesh:/ { mesh_found=1 } // { if (mesh_found) {print $$0; next} } /^ +(def|#)/ { match( $$0, /^ +/); print substr( $$0, 1+RLENGTH ); next } /^class smeshDC/ { next } //' \
-         $(top_srcdir)/src/SMESH_SWIG/smeshDC.py > ./smesh.py ;                \
-       echo "===========================================" ;                    \
-       echo "Generating Python interface documentation";                       \
-       echo "===========================================" ;                    \
-       $(DOXYGEN) doxyfile_py ;                                                \
-       echo "===========================================" ;                    \
-       echo "Generating GUI documentation" ;                                   \
-       echo "===========================================" ;                    \
-       $(DOXYGEN) doxyfile ;                                                   \
-       rm -f ./smesh.py
+usr_docs: doxyfile_py doxyfile smesh.py tmp/smesh.py
+       @$(DOXYGEN) doxyfile_py ;                                               \
+       $(DOXYGEN) doxyfile
 
 docs: usr_docs
 
diff --git a/doc/salome/gui/SMESH/collect_mesh_methods.py b/doc/salome/gui/SMESH/collect_mesh_methods.py
new file mode 100755 (executable)
index 0000000..24fd318
--- /dev/null
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+#################################################################################
+#
+# File:   collect_mesh_methods.py
+# Author: Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com)
+#
+#################################################################################
+#
+# Extraction of the meshing algorithm classes
+# dynamically added by the plug-in to the Mesh
+# class.
+# 
+# This script is intended for internal usage - only
+# for generatation of the extra developer documentation for
+# the meshing plug-in(s).
+# 
+# Usage:
+#       collect_mesh_methods.py <plugin_name>
+# where
+#   <plugin_name> is a name of the plug-in module
+#
+# Notes:
+# - the script is supposed to be run in correct environment
+# i.e. PYTHONPATH, SMESH_MeshersList and other important
+# variables are set properly; otherwise the script will fail.
+#
+################################################################################
+
+import sys
+
+def main(plugin, dummymeshhelp = True, output_file = "smesh.py"):
+    plugin_module = plugin + "DC"
+    try:
+        mod = __import__(plugin_module)
+        methods = {}
+        for attr in dir( mod ):
+            if attr.startswith( '_' ): continue
+            algo = getattr( mod, attr )
+            if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod" ):
+                method = getattr( algo, "meshMethod" )
+                if method not in methods: methods[ method ] = []
+                methods[ method ].append( algo )
+                pass
+            pass
+        if methods:
+            output = []
+            if dummymeshhelp:
+                output.append( "## @package smesh" )
+                output.append( "#  Documentation of the methods dynamically added by the " + plugin + " meshing plug-in to the Mesh class." )
+                output.append( "" )
+                pass
+            output.append( "## This class allows defining and managing a mesh." )
+            output.append( "#" )
+            if dummymeshhelp:
+                # Add dummy Mesh help
+                # This is supposed to be done when generating documentation for meshing plug-ins
+                output.append( "#  @note The documentation below does not provide complete description of class @b %Mesh" )
+                output.append( "#  from @b %smesh.py package. This documentation provides only information about" )
+                output.append( "#  the methods dynamically added to the %Mesh class by the " + plugin + " plugin" )
+                output.append( "#  For more details on the %Mesh class, please refer to the SALOME %Mesh module" )
+                output.append( "#  documentation." )
+                pass
+            else:
+                # Extend documentation for Mesh class with information about dynamically added methods.
+                # This is supposed to be done only when building documentation for SMESH module
+                output.append( "#  @note Some methods are dynamically added to the @b %Mesh class in runtime by meshing " )
+                output.append( "#  plug-in modules. If you fail to find help on some methods in the documentation of SMESH module, " )
+                output.append( "#  try to look into the documentation for the meshing plug-ins." )
+                pass
+            output.append( "class Mesh:" )
+            for method in methods:
+                docHelper = ""
+                for algo in methods[ method ]:
+                    if hasattr( algo, "docHelper" ): docHelper = getattr( algo, "docHelper" )
+                    if docHelper: break
+                    pass
+                if not docHelper: docHelper = "Creates new algorithm."
+                output.append( " ## %s" % docHelper )
+                output.append( " #" )
+                output.append( " #  This method is dynamically added to %Mesh class by the meshing plug-in(s). " )
+                output.append( " #" )
+                output.append( " #  If the optional @a geom_shape parameter is not set, this algorithm is global (applied to whole mesh)." )
+                output.append( " #  Otherwise, this algorithm defines a submesh based on @a geom_shape subshape." )
+                output.append( " #  @param algo_type type of algorithm to be created; allowed values are specified by classes implemented by plug-in (see below)" )
+                output.append( " #  @param geom_shape if defined, the subshape to be meshed (GEOM_Object)" )
+                output.append( " #  @return An instance of Mesh_Algorithm sub-class according to the specified @a algo_type, see " )
+                output.append( " #  %s" % ", ".join( [ "%s.%s" % ( plugin_module, algo.__name__ ) for algo in methods[ method ] ] ) )
+                output.append( " def %s(algo_type, geom_shape=0):" % method )
+                output.append( "   pass" )
+                pass
+            f = open(output_file, "w")
+            for line in output: f.write( line + "\n" )
+            f.close()
+            pass
+        pass
+    except Exception, e:
+        print e
+        pass
+    pass
+    
+if __name__ == "__main__":
+    import optparse
+    parser = optparse.OptionParser(usage="%prog [options] plugin")
+    h  = "Output file (smesh.py by default)"
+    parser.add_option("-o", "--output", dest="output",
+                      action="store", default=None, metavar="file",
+                      help=h)
+    h  = "If this option is True, dummy help for Mesh class is added. "
+    h += "This option should be False (default) when building documentation for SMESH module "
+    h += "and True when building documentation for meshing plug-ins."
+    parser.add_option("-d", "--dummy-mesh-help", dest="dummymeshhelp",
+                      action="store_true", default=False,
+                      help=h)
+    (options, args) = parser.parse_args()
+
+    if len( args ) < 1: sys.exit("Plugin name is not specified")
+    main( args[0], options.dummymeshhelp, options.output )
+    pass
index 19e21b96ec198ad2784ad4a63dad853128e23138..da25d092b2ea65ee3521a584baeee0df72d6b7ab 100755 (executable)
@@ -99,7 +99,10 @@ EXAMPLE_RECURSIVE      = NO
 #---------------------------------------------------------------------------
 #Input related options
 #---------------------------------------------------------------------------
-INPUT             = smesh.py @top_srcdir@/src/SMESH_SWIG/StdMeshersDC.py
+INPUT             = smesh.py \
+                    @top_srcdir@/src/SMESH_SWIG/smesh_algorithm.py \
+                    @top_srcdir@/src/SMESH_SWIG/StdMeshersDC.py \
+                    tmp/smesh.py
 FILE_PATTERNS     = 
 IMAGE_PATH        = @srcdir@/images
 RECURSIVE         = NO
@@ -132,24 +135,24 @@ GENERATE_RTF      = NO
 #---------------------------------------------------------------------------
 CLASS_DIAGRAMS         = NO
 HIDE_UNDOC_RELATIONS   = NO
-HAVE_DOT               = NO
-CLASS_GRAPH            = NO
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
 COLLABORATION_GRAPH    = NO
 GROUP_GRAPHS           = NO
 UML_LOOK               = NO
-TEMPLATE_RELATIONS     = NO
-INCLUDE_GRAPH          = NO
-INCLUDED_BY_GRAPH      = NO
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
 CALL_GRAPH             = NO
-GRAPHICAL_HIERARCHY    = NO
-DIRECTORY_GRAPH        = NO
-DOT_IMAGE_FORMAT       = jpg
+GRAPHICAL_HIERARCHY    = YES
+DIRECTORY_GRAPH        = YES
+DOT_IMAGE_FORMAT       = png
 DOT_FONTNAME           = Arial
 DOT_PATH               = 
 DOTFILE_DIRS           = 
 MAX_DOT_GRAPH_WIDTH    = 1024
-MAX_DOT_GRAPH_HEIGHT   = 1200
-MAX_DOT_GRAPH_DEPTH    = 0
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 1000
 DOT_TRANSPARENT        = NO
 DOT_MULTI_TARGETS      = NO
 GENERATE_LEGEND        = NO
diff --git a/doc/salome/gui/SMESH/images/choose_geom_selection_way.png b/doc/salome/gui/SMESH/images/choose_geom_selection_way.png
new file mode 100644 (file)
index 0000000..ffee00d
Binary files /dev/null and b/doc/salome/gui/SMESH/images/choose_geom_selection_way.png differ
index 15060edfef697143200dba9de8c262936adb2ebb..213652e79922998e425c972ce5a860a7d4f36edd 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/colors_size.png and b/doc/salome/gui/SMESH/images/colors_size.png differ
diff --git a/doc/salome/gui/SMESH/images/find_geom_by_mesh_elem.png b/doc/salome/gui/SMESH/images/find_geom_by_mesh_elem.png
new file mode 100644 (file)
index 0000000..d71495e
Binary files /dev/null and b/doc/salome/gui/SMESH/images/find_geom_by_mesh_elem.png differ
index 13b8e6dab33764fef3c125991f07fe5234819bc7..3d788cd96016dfad57a445ad28016ee9955b6ea9 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/point_marker_widget1.png and b/doc/salome/gui/SMESH/images/point_marker_widget1.png differ
index dbb81b40e5c958d24445a250c540fc82b959a277..d44f3888fb2b59a0d422598a2ef2a0abb3d481f7 100755 (executable)
Binary files a/doc/salome/gui/SMESH/images/point_marker_widget2.png and b/doc/salome/gui/SMESH/images/point_marker_widget2.png differ
diff --git a/doc/salome/gui/SMESH/images/show_bad_mesh.png b/doc/salome/gui/SMESH/images/show_bad_mesh.png
new file mode 100644 (file)
index 0000000..17dfb38
Binary files /dev/null and b/doc/salome/gui/SMESH/images/show_bad_mesh.png differ
index 7474e0f62424458d96beff79accac29676926db9..411fc30b55728aa7a436d4fa71540caa326826b7 100644 (file)
@@ -5,14 +5,16 @@
 \n \b MESH represents a discretization of a geometrical CAD model into
 a set of entities with a simple topology. 
 
-Meshes are stored in DAT, MED, UNV, STL, CGNS and SAUVE formats and can be
+Meshes are stored in DAT, MED, UNV, STL, CGNS, GMF and SAUVE formats and can be
 \subpage importing_exporting_meshes_page "imported from and exported to"
  the file in these formats.
 
 It is possible to \subpage constructing_meshes_page "construct meshes" 
 on the basis of geometrical shapes produced in the GEOM module.
-It is also possible to \subpage constructing_submeshes_page "mesh on a part of the geometrical object", 
-for example, a face, with different meshing parameters than the whole mesh.
+It is also possible to \subpage constructing_submeshes_page "construct
+mesh on a part of the geometrical object", for example, a face, with
+different meshing parameters than the whole mesh.
+
 
 Several created meshes can be \subpage building_compounds_page "combined into another mesh".
 
index f953b37c671d9cd639204ff61756325ac126115b..c0953ff09d6aed9961a6bb52ca5acda29b338541 100644 (file)
@@ -4,34 +4,48 @@
 
 \image html colors_size.png
 
-Using this dialog you can define the following set of mesh visualization
-parameters:
-<ul>
-<li><b>Elements</b></li>
-<ul>
-<li><b>Surface color</b> - surface color of elements (seen in Shading mode).</li>
-<li><b>Back surface color</b> - interior surface color of elements. Use slider to select this color 
-generated on base of the <b>Surface color</b> by changing its brightness and saturation.</li>
-<li><b>Outline color</b> - color of element borders.</li>
-<li><b>Wireframe color</b> - color of element borders in wireframe mode.</li>
-<li><b>0D slements</b> - color of 0D elements.</li>
-<li><b>Size of 0D slements</b> - size of 0D elements.</li>
-<li><b>Line width</b> - width of lines (edges and borders of elements).</li>
-<li><b>Shrink coef.</b> - relative space of elements compared to gaps between
-       them in shrink mode.</li>
-</ul>
-<li><b>Nodes</b></li>
-<ul>
-<li><b>Color</b> - color of nodes.</li>
-<li><b>Marker</b> - group of options allowing to change the representation of
-       points (see \subpage point_marker_page "Point Marker" page).</li>
-</ul>
-<li><b>Orientation of faces</b></li>
-<ul>
-<li><b>Color</b> - color of orientation vertors.</li>
-<li><b>Scale</b> - size of orientation vectors.</li>
-<li><b>3D vectors</b> - allows to choose between 2D planar and 3D vectors.</li>
-</ul>
-</ul>
+Using this dialog you can customize different properties of the mesh visualization
+parameters.
+
+The GUI elements in the "Properties" dialog box are grouped according
+to the entity types of mesh data. If some data entities are not
+present in the mesh object, the corresponding GUI elements are not
+shown.
+
+- \b Nodes:
+  - \b Color - color of nodes.
+  - \b Type and \b Scale - these options allow changing of the nodes
+    representation (see \subpage point_marker_page "Point Marker" page
+    for more details).
+- <b>Edges / wireframe</b>:
+  - \b Color - color of element borders in wireframe mode.
+  - \b Width - width of lines (edges and borders of elements
+    in wireframe mode).
+- \b Faces:
+  - \b Front - surface color of face elements (seen in shading mode).
+  - \b Back - backside surface color of face elements. Use slider to
+    select this color generated on base of the \b Face color by
+    changing its brightness and saturation. 
+- \b Volumes:
+  - \b Normal - surface color of normal volume elements (seen in shading mode).
+  - \b Reversed - surface color of volume elements. Use slider to
+    select this color generated on base of the \b Normal color by
+    changing its brightness and saturation. 
+- \b Outlines:
+  - \b Color - color of element borders in shading mode.
+  - \b Width - width of outlines (borders of elements
+    in shading mode).
+- <b>0D elements</b>:
+  - \b Color - color of 0D elements.
+  - \b Size - size of 0D elements.
+- \b Balls:
+  - \b Color - color of discrete ball elements.
+  - \b Size - size of discrete ball elements.
+- <b>Orientation vectors</b>:
+  - \b Color - color of orientation vectors.
+  - \b Scale - size of orientation vectors.
+  - <b>3D vectors</b> - allows to choose between 2D planar and 3D vectors.
+- <b>Shrink coef.</b> - relative space of elements compared to gaps between
+  them in shrink mode.
 
 */
index adf63c6a1505385e6c706af72a77c28d58389ddd..23349d0c154d6580aba2f28cd25b7e7f55e564e6 100644 (file)
@@ -34,6 +34,27 @@ written in Python.
     \subpage about_hypo_page "hypotheses" which will be used at computation of
     this mesh.
 
+    "Create mesh" dialog box contains several tab pages titled \b 3D,
+    \b 2D, \b 1D and \b 0D. The title of each page reflects the
+    dimension of the CAD model (geometry) the algorithms listed on
+    this page affect to. For example, \b 3D page lists algorithms
+    that affect 3D geometrical objects (solids).
+
+    \note
+    - Some page(s) can be disabled - if the source geometrical
+    object does not include shapes (sub-shapes) of the corresponding
+    dimension(s). For example, if input object is a geometrical face,
+    \b 3D page is disabled.
+    - Some algorithms affect on geometry of several dimensions,
+    i.e. "1D-2D" or "1D-2D-3D". If such algorithm is selected by the
+    user, dialog box pages related to the corresponding lower level
+    dimensions are disabled.
+    - \b 0D page does not refer to the 0D elements, but to 0D
+    geometry (vertices). Mesh module does not provide algorithms that
+    produce 0D elements. Currently \b 0D page provides only one
+    algorithm "Segments around vertex" that allows specyfing required
+    size of mesh edges about some selected vertex(vertices).
+
     For example, you need to mesh a 3D object.
 
     First, type the name for your mesh in the \b Name box, by default,
@@ -284,6 +305,11 @@ or/and hidden by other mesh elements, to see them it can be helpful to
 switch the mesh to Wireframe visualization mode or to switch off
 visualization of faces and volumes (if any).
 
+\image html show_bad_mesh.png
+<em>Too close nodes causing meshing failure are shown in magenta using <b>Show
+    bad Mesh</b> button</em>
+<br><br>
+
 \anchor use_existing_anchor
 <h2>"Use existing edges" and "Use existing faces" algorithms</h2>
 
index f300d6f50e125a426e201beabb7fb09452c6b277..9f6254cb2f21de45f05494dc1c16618e077c5337 100644 (file)
@@ -36,12 +36,15 @@ at computation of this sub-mesh</li>
 From the \b Mesh menu select <b>Create Sub-mesh</b> or click <em>"Create
 Sum-mesh"</em> button in the toolbar.
 
-\image html image33.gif
-<center><em>"Create Sub-mesh" button</em></center>
+<center>
+  \image html image33.gif
+  <em>"Create Sub-mesh" button</em>
+</center>
 
 \par
 The following dialog box will appear:
 
+\par
 \image html createmesh-inv2.png
 
 \par
@@ -50,6 +53,33 @@ Geometry (e.g. a face if the parent mesh has been built on box) of the
 sub-mesh. You can define algorithms and hypotheses in the same way as
 in \ref constructing_meshes_page "Create mesh" menu.
 
+\par
+If the parent mesh is already computed, then you can define 
+\b Geometry by picking mesh elements computed on a sub-shape of interest
+in the 3D Viewer, i.e. you don't have to extract this sub-shape
+previously in Geometry module. To start element selection, press \a
+Selection button to the right of \b Geometry label. If this button is
+already down, then click it to release and then click it again. The
+following pop-up menu to choose a way of geometry definition will
+appear.
+
+\par
+\image html choose_geom_selection_way.png
+
+\par
+There the first item enables selecting the sub-shape in the Object
+Browser, the second one makes appear the following dialog.
+
+\par
+\image html find_geom_by_mesh_elem.png
+
+\par
+In this dialog, <b> Element Type </b> defines kind of element to pick in the
+Viewer. Instead of picking an element in the Viewer, you can type its
+ID in <b> Element ID</b> field. <b> Geometry name </b> allow you
+define a name of the sub-shape with which it will be published in the Study.
+
+
 \par
 In the Object Browser the structure of the new sub-mesh will be
 displayed as follows:
index cbc4128557c5ab8ab06ac8edd3c04cc8b447711a..2865835a582bcf73c119607f044811dca0c1c6b8 100644 (file)
@@ -8,7 +8,7 @@ corners.
 
 <em>To cut quadrangles:</em>
 <ol>
-<li>Display a mesh or a submesh in the 3D viewer.</li>
+<li>Display a mesh or a sub-mesh in the 3D viewer.</li>
 <li>In the \b Modification menu select the <b>Cutting of quadrangles</b> item or
 click <em>"Cutting of quadrangles"</em> button in the toolbar.
 
@@ -29,7 +29,7 @@ selected element or elements from the list click \b Remove button. <b>Sort
 list</b> button allows to sort the list of IDs. \b Filter button allows to
 apply a definite filter to the selection of quadrangles.</li>
 <li><b>Apply to all</b> radio button allows to modify the orientation of all
-quadrangles of the currently displayed mesh or submesh.</li>
+quadrangles of the currently displayed mesh or sub-mesh.</li>
 <li>\b Preview - provides a preview of cutting in the viewer.</li>
 </ul>
 
@@ -39,12 +39,11 @@ quadrangles of the currently displayed mesh or submesh.</li>
 <li><b>Use diagonal 1-3</b> and <b>Use diagonal 2-4</b> allows to
 specify the opposite corners which will be connected by the cutting
 edge.</li>
-<li><b>Use numeric factor</b> - allows to apply the operation only to
-those objects which meet the chosen criterion (from the list of
-Quality Controls, i.e. Skew, Warping, Minimum Angle, etc.)</li>
+<li><b>Use numeric factor</b> - allows to chose a quality criterion
+  optimization of which will be used to select the cutting edge.</li>
 </ul>
 </li>
-<li><b>Select from</b> - allows to choose a submesh or an existing
+<li><b>Select from</b> - allows to choose a sub-mesh or an existing
 group whose quadrangle elements will be automatically added to the
 list.</li>
 </ul>
@@ -60,4 +59,4 @@ list.</li>
 <br><b>See Also</b> a sample TUI Script of a 
 \ref tui_cutting_quadrangles "Cutting Quadrangles" operation.  
 
-*/
\ No newline at end of file
+*/
index 52ff261e3369b7ab05245de380fa92049d434aa9..7c8eeb79024bb14acb97267fc0d1194b23431d00 100644 (file)
@@ -3,15 +3,15 @@
 \page importing_exporting_meshes_page Importing and exporting meshes
 
 \n In MESH there is a functionality allowing importation/exportation
-of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (Nastran), \b STL
-and \b CGNS format files. You can also export a group as a whole mesh.
+of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (simple ascii format), \b STL,
+\b GMF and \b CGNS format files. You can also export a group as a whole mesh.
 
 
 <em>To import a mesh:</em>
 
 <ol>
 <li>From the \b File menu choose the \b Import item, from its sub-menu
-select the corresponding format (MED, UNV, DAT, STL and CGNS) of the file containing
+select the corresponding format (MED, UNV, STL, GMF and CGNS) of the file containing
 your mesh.</li>
 <li>In the standard <b>Search File</b> dialog box find the file for
 importation. It is possible to select multiple files to be imported all at once. </li>
@@ -26,7 +26,7 @@ importation. It is possible to select multiple files to be imported all at once.
 <ol>
 <li>Select the object you wish to export.</li>
 <li>From the \b File menu choose the \b Export item, from its sub-menu
-select the format (MED, UNV, DAT, STL and CGNS) of the file which will
+select the format (MED, UNV, DAT, STL, GMF and CGNS) of the file which will
 contain your exported mesh.</li>
 <li>In the standard <b>Search File</b> select a location for the
 exported file and enter its name.</li>
index 40c2b932bb79df041cb3bce4acb0da74ad0aaa5d..0a7b88e3bc05320f163dfb5e37e17c9c3b05fa5b 100644 (file)
@@ -33,14 +33,14 @@ lines in the file. Note that missing symbols are replaced by "0".
 Here is a texture file sample:
 
 <pre>
-00111100
-00111100
 11111111
+10000001
+10011001
+10111101
+10111101
+10011001
+10000001
 11111111
-11111111
-11111111
-00111100
-00111100
 </pre>
 
 \image html point_marker_widget2.png
index e725ef99cf237c4d8d012ac6cd3f0752efb768f4..29ff056b79125addfb5905f84be623cdbc22be15 100644 (file)
@@ -2,44 +2,37 @@
 
 \page smeshpy_interface_page Python interface
 
-Python package smesh defines several classes, destined for easy and
-clear mesh creation and edition.
+Python API for SALOME %Mesh module defines several classes that can
+be used for easy mesh creation and edition.
 
-Documentation for smesh package is available in two forms:
-
-The <a href="smeshpy_doc/modules.html"> structured
-documentation for smesh package</a>, where all methods and
+Documentation for SALOME %Mesh module Python API is available in two forms:
+- <a href="smeshpy_doc/modules.html">Structured documentation</a>, where all methods and
 classes are grouped by their functionality, like it is done in the GUI documentation
-and the \ref smeshDC "linear documentation for smesh package"
-grouped only by classes, declared in the smesh.py file.
-
-The main page of the \ref smeshDC "linear documentation for smesh package"
-contains a list of data structures and a list of
-functions, provided by the package smesh.py. The first item in
-the list of data structures (\ref smeshDC::smeshDC "class smesh")
-also represents documentation for the methods of the package smesh.py itself.
+- <a href="smeshpy_doc/namespaces.html">Linear documentation</a> grouped only by classes, declared
+in the \ref smesh and StdMeshersDC Python packages.
 
-The package smesh.py provides an interface to create and handle
-meshes. Use it to create an empty mesh or to import it from the data file.
+Python package \ref smesh provides an interface to create and handle
+meshes. It can be used to create an empty mesh or to import mesh from the data file.
 
-Once a mesh has been created, it is possible to  manage it via its own
-methods, described at \ref smeshDC::Mesh "class Mesh" documentation
-(it is also accessible by the second item "class Mesh" in the list of data structures).
+As soon as mesh is created, it is possible to manage it via its own
+methods, described in \ref smesh.Mesh "class Mesh" documentation.
 
-Class \b Mesh allows assigning algorithms to a mesh.
-Please note, that some algorithms, included in the standard SALOME
-distribution are always available:
+Class \ref smesh.Mesh "Mesh" allows assigning algorithms to a mesh.
+Please note that some algorithms, included in the standard SALOME
+distribution are always available. Python package \ref StdMeshersDC
+provides an interface for standard meshing algorithms included into
+the SALOME %Mesh module distribution, like:
 - REGULAR (1D)
 - COMPOSITE (1D)
 - MEFISTO (2D)
 - Quadrangle (2D)
 - Hexa(3D)
-- etc...
+- etc ...
 
-To add hypotheses, use the interfaces, provided by the assigned
-algorithms.
+To add meshing hypotheses, it is possible to use the functions provided by the
+algorithms interfaces.
 
-Below you can see an example of usage of the package smesh for 3d mesh generation. 
+An example below demonstrates usage of the Python API for 3d mesh generation. 
 
 \anchor example_3d_mesh
 <h2>Example of 3d mesh generation:</h2>
@@ -118,7 +111,7 @@ tetra.Group(group)
 
 \endcode
 
-Examples of Python scripts for all Mesh operations are available by
+Examples of Python scripts for Mesh operations are available by
 the following links:
 
 - \subpage tui_creating_meshes_page
index f1218439b689e7882f37c047c81c3a4364867cb0..3eb7f0fe2f16756effd5dcdb397534fe95c4c3b4 100644 (file)
@@ -25,7 +25,7 @@ print "nb tetrahedra",mesh.NbTetras()
 print "nb polyhedra",mesh.NbPolyhedrons()
 print
 
-# define the grid by sitting constant spacing
+# define the grid by setting constant spacing
 cartHyp = cartAlgo.SetGrid( "10","10","10", 1000000)
 
 mesh.Compute()
@@ -34,9 +34,9 @@ print "nb tetrahedra",mesh.NbTetras()
 print "nb polyhedra",mesh.NbPolyhedrons()
 
 
-# define the grid by sitting different spacing in 2 sub-ranges of geometry
+# define the grid by setting different spacing in 2 sub-ranges of geometry
 spaceFuns = ["5","10+10*t"]
-cartAlgo.SetGrid( [spaceFuns, [0.5]], [spaceFuns, [0.5]], [spaceFuns, [0.25]], 2 )
+cartAlgo.SetGrid( [spaceFuns, [0.5]], [spaceFuns, [0.5]], [spaceFuns, [0.25]], 10 )
 
 mesh.Compute()
 print "nb hexahedra",mesh.NbHexas()
index e98eca6b4ec10dc5f73f9c9a1b48328b6a19db08..d9e2b31f9cc56400922037e515cb0fbe7d7743de 100644 (file)
@@ -2,11 +2,48 @@
 
 \page tui_defining_hypotheses_page Defining Hypotheses and Algorithms
 
+This page provides example codes of \ref tui_defining_meshing_algos
+"defining algorithms" and hypotheses. 
+<ul>
+<li>Wire discretisation 1D algorithm
+  <ul>
+    <li>\ref tui_1d_arithmetic "Arithmetic 1D" hypothesis</li>
+    <li>\ref tui_deflection_1d "Deflection 1D and Number of Segments" hypotheses</li>
+    <li>\ref tui_start_and_end_length "Start and End Length" hypotheses</li>
+    <li>\ref tui_average_length "Local Length"</li>
+    <li>\ref tui_propagation "Propagation" additional hypothesis </li>
+    <li>\ref tui_fixed_points "Fixed Points 1D" hypothesis</li>
+  </ul>
+</li>
+<li>Triangle (Mefisto) 2D algorithm
+  <ul>
+    <li>\ref tui_max_element_area "Max Element Area" hypothesis </li>
+    <li>\ref tui_length_from_edges "Length from Edges"
+    hypothesis </li>
+  </ul>
+</li>
+<li>Tetrahedron (Netgen) 3D algorithm
+  <ul>
+    <li> \ref tui_max_element_volume "Max. Element Volume"hypothesis </li>
+    <li> \ref tui_viscous_layers "Viscous layers"</li>
+  </ul>
+</li>
+<li>\ref tui_projection "Projection Algorithms"</li>
+<li>\ref tui_radial_quadrangle "Radial Quadrangle 1D2D" algorithm</li>
+<li>Quadrangle (Mapping) 2D algorithm
+  <ul>
+    <li> \ref tui_quadrangle_parameters "Quadrangle Parameters" hypothesis </li>
+  </ul>
+</li>
+<li>\ref tui_import "Use Existing Elements" algorithm</li>
+</ul>
+<br>
+
 <h2>Defining 1D Hypotheses</h2>
 
 <br>
 \anchor tui_1d_arithmetic
-<h3>1D Arithmetic</h3>
+<h3>Arithmetic 1D</h3>
 
 \code
 import geompy
@@ -457,6 +494,40 @@ src_mesh.TranslateObject( src_mesh, MakeDirStruct( 210, 0, 0 ), Copy=False)
 
 \endcode
 
+<h3>Projection 1D2D</h3>
+
+\code
+# Project triangles from one meshed face to another mesh on the same box
+
+from smesh import *
+
+# Prepare geometry
+
+# Create a box
+box = geompy.MakeBoxDXDYDZ(100, 100, 100)
+
+# Get geom faces to mesh with triangles in the 1ts and 2nd meshes
+faces = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
+# 2 adjacent faces of the box
+Face_1 = faces[2]
+Face_2 = faces[0]
+
+geompy.addToStudy( box, 'box' )
+geompy.addToStudyInFather( box, Face_1, 'Face_1' )
+geompy.addToStudyInFather( box, Face_2, 'Face_2' )
+
+# Make the source mesh with Netgem2D
+src_mesh = Mesh(Face_1, "Source mesh")
+src_mesh.Segment().NumberOfSegments(15)
+src_mesh.Triangle()
+src_mesh.Compute()
+
+# Mesh the target mesh using the algoritm Projection1D2D
+tgt_mesh = smesh.Mesh(Face_2, "Target mesh")
+tgt_mesh.Projection1D2D().SourceFace(Face_1,src_mesh)
+tgt_mesh.Compute()
+\endcode
+
 <br>
 
 \anchor tui_fixed_points
index a163d13f5891cd4f35f334b09c3c447d35c7e665..3b769060a0599551902f575523467b7573c2b5a2 100644 (file)
@@ -98,23 +98,23 @@ critaria = [ \
     ]
 filt = GetFilterFromCriteria( critaria )
 filtGroup = mesh.GroupOnFilter( FACE, "group on filter", filt )
-print "Group on filter conatains %s elemens" % filtGroup.Size()
+print "Group on filter contains %s elemens" % filtGroup.Size()
 
 # group on filter is updated if the mesh is modified
 hyp1D.SetStartLength( 2.5 )
 hyp1D.SetEndLength( 2.5 )
 mesh.Compute()
-print "After mesh change, group on filter conatains %s elemens" % filtGroup.Size()
+print "After mesh change, group on filter contains %s elemens" % filtGroup.Size()
 
 # set a new filter defining the group
 filt2 = GetFilter( FACE, FT_RangeOfIds, "1-50" )
 filtGroup.SetFilter( filt2 )
-print "With a new filter, group on filter conatains %s elemens" % filtGroup.Size()
+print "With a new filter, group on filter contains %s elemens" % filtGroup.Size()
 
 # group is updated at modification of the filter
 filt2.SetCriteria( [ GetCriterion( FACE, FT_RangeOfIds, "1-70" )])
 filtIDs3 = filtGroup.GetIDs()
-print "After filter modification, group on filter conatains %s elemens" % filtGroup.Size()
+print "After filter modification, group on filter contains %s elemens" % filtGroup.Size()
 
 salome.sg.updateObjBrowser(1)
 \endcode
index bc99172aaec77fceb5ec25b114f2eb7d1caf1939..2991eb521fe8b6116ec834492b5799460137234b 100644 (file)
@@ -164,8 +164,8 @@ mesh.RemoveElements(anIds)
 aBorders = mesh.GetFreeBorders() 
 
 # create groups
-aGroupF = mesh.CreateGroup(SMESH.FACE, "Faces with free edges")
-aGroupN = mesh.CreateGroup(SMESH.NODE, "Nodes on free edges")
+aGroupF = mesh.CreateEmptyGroup(smesh.FACE, "Faces with free edges")
+aGroupN = mesh.CreateEmptyGroup(smesh.NODE, "Nodes on free edges")
 
 # fill groups with elements, corresponding to the criterion
 print ""
index bcf1531192c313aea60032a1f29b5b66b348116c..74e2ab2cd0626b5a569719c7c1e8a6a33218459b 100644 (file)
@@ -7,7 +7,7 @@ once many triangles if they have adjacent edges.
 
 <em>To union several triangles:</em>
 <ol>
-<li>Display a mesh or a submesh in the 3D viewer.</li>
+<li>Display a mesh or a sub-mesh in the 3D viewer.</li>
 <li>In the \b Modification menu select the <b>Union of triangles</b>
 item or click <em>"Union of triangles"</em> button in the toolbar.
 
@@ -27,11 +27,10 @@ elements from the list click the \b Remove button. The \b Sort button allows
 to sort the list of IDs. The <b>Set filter</b> button allows to apply a
 definite filter to selection of triangles.</li>
 <li><b>Apply to all</b> radio button allows to modify connectivity and
-type of all triangles of the currently displayed mesh or submesh.</li>
-<li>\b Criterion menu allows to apply the operation only to those
-object which meet the chosen criterion (from the list of Quality
-Controls, i.e. Skew, Warping, Minimum Angle, etc.)</li>
-<li><b>Select from</b> set of fields allows to choose a submesh or an
+type of all triangles of the currently displayed mesh or sub-mesh.</li>
+<li>\b Criterion menu allows to chose a quality criterion
+  optimization of which will be used to select triangles to unite.</li>
+<li><b>Select from</b> set of fields allows to choose a sub-mesh or an
 existing group whose triangle elements will be automatically added to
 the list.</li>
 </ul>
index f6e9f89adb4a842a1e94907e9249353c52121fd9..b8d3176f2c7d32e12eb66350aff58329f8d552ae 100644 (file)
@@ -101,7 +101,8 @@ module SMESH
     COMPERR_ALGO_FAILED   ,  // computation failed
     COMPERR_BAD_SHAPE     ,  // bad geometry
     COMPERR_WARNING       ,  // algo reports error but sub-mesh is computed anyway
-    COMPERR_CANCELED         // compute canceled
+    COMPERR_CANCELED      ,  // compute canceled
+    COMPERR_NO_MESH_ON_SHAPE // no mesh elements assigned to sub-mesh
   };
   struct ComputeError
   {
@@ -237,6 +238,13 @@ module SMESH
                                      out SMESH::DriverMED_ReadStatus theStatus )
       raises ( SALOME::SALOME_Exception );
 
+    /*!
+     * Create Mesh object importing data from given GMF file
+     */
+    SMESH_Mesh CreateMeshesFromGMF( in string               theFileName,
+                                    out SMESH::ComputeError theError)
+      raises ( SALOME::SALOME_Exception );
+
     /*!
      * Create a mesh by copying a part of another mesh
      *  \param meshPart - a part of mesh to copy
index 8d18789baea37cc21e49dca776d1bae6fbc2b69d..f2e43788e0ff0ab97dd789704f3cc6c6f7be50cd 100644 (file)
@@ -80,29 +80,29 @@ module SMESH
      *  \param theParameters is a string containing the notebook variables separated by ":" symbol,
      *         used for Hypothesis creation
      */
-    void SetParameters (in string theParameters);
-
-    /*!
-     *  Return list of notebook variables used for Hypothesis creation separated by ":" symbol
-     */
-    string GetParameters();
-
-    /*!
-     *  Return list of last notebook variables used for Hypothesis creation.
-     */
-    ListOfParameters GetLastParameters();
-
-    /*!
-     *  Set list of parameters
-     *  \param theParameters is a string containing the last notebook variables separated by ":" symbol,
-     *         used for Hypothesis creation
-     */
-    void SetLastParameters(in string theParameters);
+    // void SetParameters (in string theParameters);
+
+    // /*!
+    //  *  Return list of notebook variables used for Hypothesis creation separated by ":" symbol
+    //  */
+    // string GetParameters();
+
+    // /*!
+    //  *  Return list of last notebook variables used for Hypothesis creation.
+    //  */
+    // ListOfParameters GetLastParameters();
+
+    // /*!
+    //  *  Set list of parameters
+    //  *  \param theParameters is a string containing the last notebook variables separated by ":" symbol,
+    //  *         used for Hypothesis creation
+    //  */
+    // void SetLastParameters(in string theParameters);
     
-    /*!
-     * Clear parameters list
-     */
-    void ClearParameters();
+    // /*!
+    //  * Clear parameters list
+    //  */
+    // void ClearParameters();
 
     /*!
      * Verify whether hypothesis supports given entity type 
index 409bb4e6ec4ac3ded80a66a86a00e08a1152545f..b8d2b5e63e3a822a72ad65543e9c67d750fb999d 100644 (file)
@@ -652,7 +652,7 @@ module SMESH
     string GetVersionString(in MED_VERSION version, in short nbDigits);
 
     /*!
-     * Export Mesh to DAT, UNV and STL Formats
+     * Export Mesh to different Formats
      * (UNV supported version is I-DEAS 10)
      */
     void ExportDAT( in string file ) raises (SALOME::SALOME_Exception);
@@ -662,6 +662,8 @@ module SMESH
     void ExportCGNS( in SMESH_IDSource meshPart, 
                      in string         file,
                      in boolean        overwrite ) raises (SALOME::SALOME_Exception);
+    void ExportGMF( in SMESH_IDSource  meshPart, 
+                    in string          file ) raises (SALOME::SALOME_Exception);
     void ExportPartToDAT( in SMESH_IDSource meshPart, 
                           in string         file ) raises (SALOME::SALOME_Exception);
     void ExportPartToUNV( in SMESH_IDSource meshPart, 
index 561c5b8841b4945d60160daafac2eceaa1eba64a..08f2b70f2c4f3f9f3ace7257c839346f83eb5ae1 100644 (file)
@@ -25,6 +25,7 @@
 #define _SMESH_MESHEDITOR_IDL_
 
 #include "SMESH_Mesh.idl"
+#include "SMESH_Gen.idl"
 
 module SMESH
 {
@@ -34,8 +35,34 @@ module SMESH
    * This interface makes modifications on the Mesh - removing elements and nodes etc.
    */
   interface NumericalFunctor;
+
   interface SMESH_MeshEditor
   {
+   /*!
+    * Return data of mesh edition preview which is computed provided
+    * that the editor was obtained trough SMESH_Mesh::GetMeshEditPreviewer()
+    */
+    MeshPreviewStruct GetPreviewData();
+
+   /*!
+    * If during last operation of MeshEditor some nodes were
+    * created this method returns list of their IDs, if new nodes
+    * not created - returns empty list
+    */
+    long_array GetLastCreatedNodes();
+
+   /*!
+    * If during last operation of MeshEditor some elements were
+    * created this method returns list of their IDs, if new elements
+    * not created - returns empty list
+    */
+    long_array GetLastCreatedElems();
+
+    /*!
+     * \brief Returns description of an error/warning occured during the last operation
+     */
+    ComputeError GetLastError();
+
     /*!
      * \brief Wrap a sequence of ids in a SMESH_IDSource
      * \param IDsOfElements list of mesh elements identifiers
@@ -802,26 +829,6 @@ module SMESH
     */
     boolean ChangeElemNodes(in long ide, in long_array newIDs);
 
-   /*!
-    * Return data of mesh edition preview which is computed provided
-    * that the editor was obtained trough SMESH_Mesh::GetMeshEditPreviewer()
-    */
-    MeshPreviewStruct GetPreviewData();
-
-   /*!
-    * If during last operation of MeshEditor some nodes were
-    * created this method returns list of it's IDs, if new nodes
-    * not creared - returns empty list
-    */
-    long_array GetLastCreatedNodes();
-
-   /*!
-    * If during last operation of MeshEditor some elements were
-    * created this method returns list of it's IDs, if new elements
-    * not creared - returns empty list
-    */
-    long_array GetLastCreatedElems();
-
     /*!
      * \brief Creates a hole in a mesh by doubling the nodes of some particular elements
      * \param theNodes - identifiers of nodes to be doubled
@@ -1038,6 +1045,21 @@ module SMESH
                                           in ListOfGroups theNodesNot,
                                           in GEOM::GEOM_Object theShape );
 
+    /*!
+     * \brief Identify the elements that will be affected by node duplication (actual duplication is not performed).
+     * This method is the first step of DoubleNodeElemGroupsInRegion.
+     * \param theElems - list of groups of elements (edges or faces) to be replicated
+     * \param theNodesNot - list of groups of nodes not to replicated
+     * \param theShape - shape to detect affected elements (element which geometric center
+     *        located on or inside shape).
+     *        The replicated nodes should be associated to affected elements.
+     * \return groups of affected elements
+     * \sa DoubleNodeElemGroupsInRegion()
+     */
+    ListOfGroups AffectedElemGroupsInRegion( in ListOfGroups theElems,
+                                             in ListOfGroups theNodesNot,
+                                             in GEOM::GEOM_Object theShape );
+
     /*!
      * \brief Generates skin mesh (containing 2D cells) from 3D mesh
      * The created 2D mesh elements based on nodes of free faces of boundary volumes
@@ -1117,6 +1139,18 @@ module SMESH
      * \return TRUE if operation has been completed successfully, FALSE otherwise
      */
     boolean CreateFlatElementsOnFacesGroups( in ListOfGroups theGroupsOfFaces ); 
+
+    /*!
+     *  \brief identify all the elements around a geom shape, get the faces delimiting the hole
+     *  Build groups of volume to remove, groups of faces to replace on the skin of the object,
+     *  groups of faces to remove insidethe object, (idem edges).
+     *  Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+     */
+    void CreateHoleSkin(in double radius,
+                        in GEOM::GEOM_Object theShape,
+                        in string groupName,
+                        in double_array theNodesCoords,
+                        out array_of_long_array GroupsOfNodes) raises (SALOME::SALOME_Exception);
   };
 };
 
index 0dbcc2e8839737648fb994390381f4cee3ab2368..20be2291777f1f731c46d505c9288e9a44a232f0 100644 (file)
     <parameter name="icon" value="ModuleMesh.png"/>
     <parameter name="version" value="@VERSION@"/>
     <!-- Other module preferences -->
+    <parameter name="default_grp_color"            value="255, 170, 0"/>
     <parameter name="node_color"                   value="255, 0,   0"/>
     <parameter name="fill_color"                   value="0, 170, 255|-100"/>
+    <parameter name="volume_color"                 value="255, 0, 170|-100"/>
     <parameter name="wireframe_color"              value="0, 170, 255"/>
     <parameter name="outline_color"                value="0,  70,   0"/>
     <parameter name="elem0d_color"                 value="0, 255,   0"/>
-    <parameter name="ball_elem_color"              value="100, 255,   0"/>
+    <parameter name="ball_elem_color"              value="0, 85,   255"/>
     <parameter name="highlight_color"              value="0, 255, 255"/>
     <parameter name="group_name_color"             value="255, 255, 255"/>
     <parameter name="type_of_marker"               value="1"  />
@@ -41,6 +43,7 @@
     <parameter name="elem0d_size"                  value="5" />
     <parameter name="ball_elem_size"               value="10" />
     <parameter name="element_width"                value="1" />
+    <parameter name="outline_width"                value="1" />
     <parameter name="shrink_coeff"                 value="75"/>
     <parameter name="orientation_color"            value="255, 255, 255"/>
     <parameter name="orientation_scale"            value="0.1"/>
index 0d519fc574f21a5ca809d7ec8e1490c937bdd598..b82d6a441b1a8bd4090379e523cffc169da03044 100644 (file)
@@ -55,7 +55,7 @@
                 dim="1"/>
 
     <hypothesis type="FixedPoints1D"
-                label-id="Fixed points 1D"
+                label-id="Fixed Points 1D"
                 icon-id="mesh_hypo_length.png"
                 dim="1"/>
 
                 dim="1"/>
 
     <hypothesis type="Propagation"
-                label-id="Propagation of 1D Hyp. on opposite edges"
+                label-id="Propagation of 1D Hyp. on Opposite Edges"
                 icon-id="mesh_hypo_length.png"
                 dim="1"
                 auxiliary="true"/>
 
     <hypothesis type="AutomaticLength"
-                label-id="Automatic length"
+                label-id="Automatic Length"
                 icon-id="mesh_hypo_length.png"
                 dim="1"/>
 
     <hypothesis type="LengthFromEdges"
-                label-id="Length From Edges (2D Hyp. for Triangulator)"
+                label-id="Length From Edges"
                 icon-id="mesh_hypo_length.png"
                 dim="2"/>
 
   <algorithms>
 
     <algorithm type="SegmentAroundVertex_0D"
-              label-id="Segments around vertex"
+              label-id="Segments around Vertex"
               icon-id="mesh_algo_regular.png"
                hypos="SegmentLengthAroundVertex"
                output="VERTEX"
                dim="0"/>
 
     <algorithm type="Regular_1D"
-              label-id="Wire discretisation"
+              label-id="Wire Discretisation"
               icon-id="mesh_algo_regular.png"
                hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
                opt-hypos="Propagation,QuadraticMesh"
     </algorithm>
 
     <algorithm type="CompositeSegment_1D"
-              label-id="Composite side discretisation"
+              label-id="Composite Side Discretisation"
               icon-id="mesh_algo_regular.png"
                hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
                opt-hypos="Propagation,QuadraticMesh"
                dim="2">
       <python-wrap>
         <algo>Projection_2D=Projection2D()</algo>
-        <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2),SetVertexAssociation(3),SetVertexAssociation(4))</hypo>
+        <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
       </python-wrap>
     </algorithm>
 
                dim="3">
       <python-wrap>
         <algo>Projection_3D=Projection3D()</algo>
-        <hypo>ProjectionSource3D=SourceShape3D(SetSource3DShape(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2),SetVertexAssociation(3),SetVertexAssociation(4))</hypo>
+        <hypo>ProjectionSource3D=SourceShape3D(SetSource3DShape(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
       </python-wrap>
     </algorithm>
 
     <algorithm type="Import_1D"
-               label-id="Use existing 1D elements"
+               label-id="Use Existing 1D Elements"
                icon-id="mesh_algo_regular.png"
                hypos="ImportSource1D"
                output="EDGE"
     </algorithm>
 
     <algorithm type="Import_1D2D"
-               label-id="Use existing 2D elements"
+               label-id="Use Existing 2D Elements"
                icon-id="mesh_algo_quad.png"
                hypos="ImportSource2D"
                output="QUAD,TRIA"
     </algorithm>
 
     <algorithm type="Prism_3D"
-               label-id="3D extrusion"
+               label-id="3D Extrusion"
                icon-id="mesh_algo_hexa.png"
                input="QUAD,TRIA"
                dim="3">
     </algorithm>
 
     <algorithm type="UseExisting_1D"
-               label-id="Use existing edges"
+               label-id="Use Existing Edges"
                icon-id="mesh_algo_regular.png"
                input="VERTEX"
                output="EDGE"
     </algorithm>
 
     <algorithm type="UseExisting_2D"
-               label-id="Use existing faces"
+               label-id="Use Existing Faces"
                icon-id="mesh_algo_quad.png"
                input="EDGE"
                output="QUAD,TRIA"
     </algorithm>
 
     <algorithm type="RadialQuadrangle_1D2D"
-               label-id="Radial quadrangle 1D2D"
+               label-id="Radial Quadrangle 1D2D"
                icon-id="mesh_algo_quad.png"
                hypos="NumberOfLayers2D, LayerDistribution2D"
                input="EDGE"
index f9540e0046d526846c6e05291de07438572c5509..66601f3dfd478a4841ff615dab6905aadd3d2b16 100644 (file)
@@ -2737,30 +2737,37 @@ void CoplanarFaces::SetMesh( const SMDS_Mesh* theMesh )
       return;
 
     const double radianTol = myToler * M_PI / 180.;
-    typedef SMDS_StdIterator< const SMDS_MeshElement*, SMDS_ElemIteratorPtr > TFaceIt;
-    std::set<const SMDS_MeshElement*> checkedFaces, checkedNodes;
-    std::list<const SMDS_MeshElement*> faceQueue( 1, face );
+    std::set< SMESH_TLink > checkedLinks;
+
+    std::list< pair< const SMDS_MeshElement*, gp_Vec > > faceQueue;
+    faceQueue.push_back( make_pair( face, myNorm ));
     while ( !faceQueue.empty() )
     {
-      face = faceQueue.front();
-      if ( checkedFaces.insert( face ).second )
+      face   = faceQueue.front().first;
+      myNorm = faceQueue.front().second;
+      faceQueue.pop_front();
+
+      for ( int i = 0, nbN = face->NbCornerNodes(); i < nbN; ++i )
       {
-        gp_Vec norm = getNormale( static_cast<const SMDS_MeshFace*>(face), &normOK );
-        if (!normOK || myNorm.Angle( norm ) <= radianTol)
+        const SMDS_MeshNode*  n1 = face->GetNode( i );
+        const SMDS_MeshNode*  n2 = face->GetNode(( i+1 )%nbN);
+        if ( !checkedLinks.insert( SMESH_TLink( n1, n2 )).second )
+          continue;
+        SMDS_ElemIteratorPtr fIt = n1->GetInverseElementIterator(SMDSAbs_Face);
+        while ( fIt->more() )
         {
-          myCoplanarIDs.insert( face->GetID() );
-          std::set<const SMDS_MeshElement*> neighborFaces;
-          for ( int i = 0; i < face->NbCornerNodes(); ++i )
+          const SMDS_MeshElement* f = fIt->next();
+          if ( f->GetNodeIndex( n2 ) > -1 )
           {
-            const SMDS_MeshNode* n = face->GetNode( i );
-            if ( checkedNodes.insert( n ).second )
-              neighborFaces.insert( TFaceIt( n->GetInverseElementIterator(SMDSAbs_Face)),
-                                    TFaceIt());
+            gp_Vec norm = getNormale( static_cast<const SMDS_MeshFace*>(f), &normOK );
+            if (!normOK || myNorm.Angle( norm ) <= radianTol)
+            {
+              myCoplanarIDs.insert( f->GetID() );
+              faceQueue.push_back( make_pair( f, norm ));
+            }
           }
-          faceQueue.insert( faceQueue.end(), neighborFaces.begin(), neighborFaces.end() );
         }
       }
-      faceQueue.pop_front();
     }
   }
 }
@@ -2770,7 +2777,7 @@ bool CoplanarFaces::IsSatisfy( long theElementId )
 }
 
 /*
 *Class       : RangeOfIds
+ *Class       : RangeOfIds
   *Description : Predicate for Range of Ids.
   *              Range may be specified with two ways.
   *              1. Using AddToRange method
index 73895176fe7faa33672b36a5a1c9221a762de713..c04008f9477f5ea7053e4655182fa2cc972f1107 100644 (file)
 //
 #include "Driver_Mesh.h"
 
+#include "SMESH_Comment.hxx"
+
 #include <utilities.h>
 
 using namespace std;
 
 Driver_Mesh::Driver_Mesh():
   myFile(""),
-  myMeshId(-1)
+  myMeshId(-1),
+  myStatus( DRS_OK )
 {}
 
 
@@ -78,5 +81,23 @@ Driver_Mesh::Status Driver_Mesh::addMessage(const std::string& msg,
 #ifdef _DEBUG_
   cout << msg << endl;
 #endif
-  return isFatal ? DRS_FAIL : DRS_WARN_SKIP_ELEM;
+  return ( myStatus = isFatal ? DRS_FAIL : DRS_WARN_SKIP_ELEM );
+}
+
+//================================================================================
+/*!
+ * \brief Return a structure containing description of errors
+ */
+//================================================================================
+
+SMESH_ComputeErrorPtr Driver_Mesh::GetError()
+{
+  SMESH_Comment msg;
+  for ( size_t i = 0; i < myErrorMessages.size(); ++i )
+  {
+    msg << myErrorMessages[i];
+    if ( i+1 < myErrorMessages.size() )
+      msg << "\n";
+  }
+  return SMESH_ComputeError::New( myStatus == DRS_OK ? int(COMPERR_OK) : int(myStatus), msg );
 }
index 45861a82a784b15b22d4467fb4f373721894d346..fcaea2b3e6f0e54c4206aa30ee91d9a82ad918bb 100644 (file)
@@ -27,6 +27,8 @@
 #ifndef _INCLUDE_DRIVER_MESH
 #define _INCLUDE_DRIVER_MESH
 
+#include "SMESH_ComputeError.hxx"
+
 #include <string>
 #include <vector>
 
@@ -55,19 +57,26 @@ class MESHDRIVER_EXPORT Driver_Mesh
     DRS_FAIL            // general failure (exception etc.)
   };
 
-  virtual Status Perform() = 0;
-  void SetMeshId(int theMeshId);
-  void SetFile(const std::string& theFileName);
-  virtual void SetMeshName(const std::string& theMeshName);
+  void                SetMeshId(int theMeshId);
+  void                SetFile(const std::string& theFileName);
+  virtual void        SetMeshName(const std::string& theMeshName);
   virtual std::string GetMeshName() const;
 
+  virtual void        SetOption(const std::string& optionName,
+                                const std::string& optionValue) {}
+
+  virtual Status Perform() = 0;
+
+  virtual SMESH_ComputeErrorPtr GetError();
+
  protected:
   std::string myFile;
   std::string myMeshName;
-  int myMeshId;
+  int         myMeshId;
 
   Status addMessage(const std::string& msg, const bool isFatal=false);
   std::vector< std::string > myErrorMessages;
+  Status                     myStatus;
 };
 
 #endif
index 0062ee7744cec38f8eaee42768e7ba2f1626dd9a..a088c773a75ecab364db7bf60599330b27134e3c 100644 (file)
@@ -44,8 +44,10 @@ dist_libMeshDriver_la_SOURCES = \
 
 # additionnal information to compil and link file
 libMeshDriver_la_CPPFLAGS = \
+        $(BOOST_CPPFLAGS) \
        $(CAS_CPPFLAGS) \
        $(KERNEL_CXXFLAGS) \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS  
 
 libMeshDriver_la_LDFLAGS  = \
index 517a56f25afe361d8d45c93e042b7fd11926fcdc..edc474163b16f1616b63caf4a6502ab4990054e6 100644 (file)
@@ -139,7 +139,7 @@ namespace
       }
       {
         static int ids[] = { 0,3,2,1,4,7,6,5,11,10,9,8,12,15,14,13,19,18,17,16,
-                             20, 24,23,22,21, 25};
+                             20, 24,23,22,21, 25, 26};
         interlaces[SMDSEntity_TriQuad_Hexa] = ids;
         cgTypes   [SMDSEntity_TriQuad_Hexa] = CGNS_ENUMV( HEXA_27 );
       }
index 338bc1d17e5bcdc0c75cad22901a109fc9f3071b..232551eb34eef1f14ff3e533c101be981f04d809 100644 (file)
@@ -52,6 +52,7 @@ libMeshDriverDAT_la_CPPFLAGS = \
        $(BOOST_CPPFLAGS) \
        -I$(srcdir)/../Driver \
        -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS
 
 libMeshDriverDAT_la_LDFLAGS  = \
diff --git a/src/DriverGMF/DriverGMF_Read.cxx b/src/DriverGMF/DriverGMF_Read.cxx
new file mode 100644 (file)
index 0000000..332519b
--- /dev/null
@@ -0,0 +1,357 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, Read to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File      : DriverGMF_Read.cxx
+// Created   : Mon Sep 17 17:03:02 2012
+// Author    : Edward AGAPOV (eap)
+
+#include "DriverGMF_Read.hxx"
+#include "DriverGMF_Write.hxx"
+
+#include "SMESHDS_Group.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_Comment.hxx"
+
+extern "C"
+{
+#include "libmesh5.h"
+}
+
+#include <stdarg.h>
+
+// --------------------------------------------------------------------------------
+// Closing GMF mesh at destruction
+DriverGMF_MeshCloser::~DriverGMF_MeshCloser()
+{
+  if ( _gmfMeshID )
+    GmfCloseMesh( _gmfMeshID );
+}
+// --------------------------------------------------------------------------------
+DriverGMF_Read::DriverGMF_Read():
+  Driver_SMESHDS_Mesh()
+{
+}
+// --------------------------------------------------------------------------------
+DriverGMF_Read::~DriverGMF_Read()
+{
+}
+
+//================================================================================
+/*!
+ * \brief Read a GMF file
+ */
+//================================================================================
+
+Driver_Mesh::Status DriverGMF_Read::Perform()
+{
+  Status status = DRS_OK;
+
+  int dim, version;
+
+  // open the file
+  int meshID = GmfOpenMesh( myFile.c_str(), GmfRead, &version, &dim );
+  if ( !meshID )
+    return addMessage( SMESH_Comment("Can't open for reading ") << myFile, /*fatal=*/true );
+
+  DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
+
+  // Read nodes
+
+  int nbNodes = GmfStatKwd(meshID, GmfVertices);
+  if ( nbNodes < 1 )
+    return addMessage( "No nodes in the mesh", /*fatal=*/true );
+
+  GmfGotoKwd(meshID, GmfVertices);
+
+  int ref;
+
+  const int nodeIDShift = myMesh->GetMeshInfo().NbNodes();
+  if ( version != GmfFloat )
+  {
+    double x, y, z;
+    for ( int i = 1; i <= nbNodes; ++i )
+    {
+      GmfGetLin(meshID, GmfVertices, &x, &y, &z, &ref);
+      myMesh->AddNodeWithID( x,y,z, nodeIDShift + i);
+    }
+  }
+  else
+  {
+    float x, y, z;
+    for ( int i = 1; i <= nbNodes; ++i )
+    {
+      GmfGetLin(meshID, GmfVertices, &x, &y, &z, &ref);
+      myMesh->AddNodeWithID( x,y,z, nodeIDShift + i);
+    }
+  }
+
+  // Read elements
+
+  int iN[28];
+
+  /* Read edges */
+  const int edgeIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbEdges = GmfStatKwd(meshID, GmfEdges))
+  {
+    GmfGotoKwd(meshID, GmfEdges);
+    for ( int i = 1; i <= nbEdges; ++i )
+    {
+      GmfGetLin(meshID, GmfEdges, &iN[0], &iN[1], &ref);
+      if ( !myMesh->AddEdgeWithID( iN[0], iN[1], edgeIDShift + i ))
+        status = storeBadNodeIds( "GmfEdges",i, 2, iN[0], iN[1] );
+    }
+  }
+  /* Read quadratic edges */
+  const int edge2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbEdges = GmfStatKwd(meshID, GmfEdgesP2))
+  {
+    GmfGotoKwd(meshID, GmfEdgesP2);
+    for ( int i = 1; i <= nbEdges; ++i )
+    {
+      GmfGetLin(meshID, GmfEdgesP2, &iN[0], &iN[1], &iN[2], &ref);
+      if ( !myMesh->AddEdgeWithID( iN[0], iN[1], iN[2], edge2IDShift + i ))
+        status = storeBadNodeIds( "GmfEdgesP2",i, 3, iN[0], iN[1], iN[2] );
+    }
+  }
+  /* Read triangles */
+  const int triaIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTria = GmfStatKwd(meshID, GmfTriangles))
+  {
+    GmfGotoKwd(meshID, GmfTriangles);
+    for ( int i = 1; i <= nbTria; ++i )
+    {
+      GmfGetLin(meshID, GmfTriangles, &iN[0], &iN[1], &iN[2], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], triaIDShift + i ))
+        status = storeBadNodeIds( "GmfTriangles",i, 3, iN[0], iN[1], iN[2] );
+    }
+  }
+  /* Read quadratic triangles */
+  const int tria2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTria = GmfStatKwd(meshID, GmfTrianglesP2))
+  {
+    GmfGotoKwd(meshID, GmfTrianglesP2);
+    for ( int i = 1; i <= nbTria; ++i )
+    {
+      GmfGetLin(meshID, GmfTrianglesP2,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],
+                                   tria2IDShift + i ))
+        status = storeBadNodeIds( "GmfTrianglesP2",i, 6, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5] );
+    }
+  }
+  /* Read quadrangles */
+  const int quadIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilaterals))
+  {
+    GmfGotoKwd(meshID, GmfQuadrilaterals);
+    for ( int i = 1; i <= nbQuad; ++i )
+    {
+      GmfGetLin(meshID, GmfQuadrilaterals, &iN[0], &iN[1], &iN[2], &iN[3], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], iN[3], quadIDShift + i ))
+        status = storeBadNodeIds( "GmfQuadrilaterals",i, 4, iN[0], iN[1],iN[2], iN[3] );
+    }
+  }
+  /* Read bi-quadratic quadrangles */
+  const int quad2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilateralsQ2))
+  {
+    GmfGotoKwd(meshID, GmfQuadrilateralsQ2);
+    for ( int i = 1; i <= nbQuad; ++i )
+    {
+      GmfGetLin(meshID, GmfQuadrilateralsQ2,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &ref);
+      if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8],
+                                   quad2IDShift + i ))
+        status = storeBadNodeIds( "GmfQuadrilateralsQ2",i,
+                                  9, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8] );
+    }
+  }
+  /* Read terahedra */
+  const int tetIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedra))
+  {
+    GmfGotoKwd(meshID, GmfTetrahedra);
+    for ( int i = 1; i <= nbTet; ++i )
+    {
+      GmfGetLin(meshID, GmfTetrahedra, &iN[0], &iN[1], &iN[2], &iN[3], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], tetIDShift + i ))
+        status = storeBadNodeIds( "GmfTetrahedra",i, 4, iN[0], iN[1],iN[2], iN[3] );
+    }
+  }
+  /* Read quadratic terahedra */
+  const int tet2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedraP2))
+  {
+    GmfGotoKwd(meshID, GmfTetrahedraP2);
+    for ( int i = 1; i <= nbTet; ++i )
+    {
+      GmfGetLin(meshID, GmfTetrahedraP2, &iN[0], &iN[1], &iN[2],
+                &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &iN[9], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0],iN[2],iN[1],iN[3],
+                                     iN[6],iN[5],iN[4],
+                                     iN[7],iN[9],iN[8], tet2IDShift + i ))
+        status = storeBadNodeIds( "GmfTetrahedraP2",i, 10, iN[0],iN[1],iN[2],iN[3],
+                                  iN[4],iN[5],iN[6],iN[7],iN[8],iN[9] );
+    }
+  }
+  /* Read pyramids */
+  const int pyrIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbPyr = GmfStatKwd(meshID, GmfPyramids))
+  {
+    GmfGotoKwd(meshID, GmfPyramids);
+    for ( int i = 1; i <= nbPyr; ++i )
+    {
+      GmfGetLin(meshID, GmfPyramids, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[4], pyrIDShift + i ))
+        status = storeBadNodeIds( "GmfPyramids",i, 5, iN[0], iN[1],iN[2], iN[3], iN[4] );
+    }
+  }
+  /* Read hexahedra */
+  const int hexIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbHex = GmfStatKwd(meshID, GmfHexahedra))
+  {
+    GmfGotoKwd(meshID, GmfHexahedra);
+    for ( int i = 1; i <= nbHex; ++i )
+    {
+      GmfGetLin(meshID, GmfHexahedra,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[3], iN[2], iN[1], iN[4], iN[7], iN[6], iN[5],
+                                     hexIDShift + i))
+        status = storeBadNodeIds( "GmfHexahedra",i,
+                                  8, iN[0], iN[1],iN[2], iN[3], iN[4], iN[7], iN[6], iN[5] );
+    }
+  }
+  /* Read tri-quadratic hexahedra */
+  const int hex2IDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbHex = GmfStatKwd(meshID, GmfHexahedraQ2))
+  {
+    GmfGotoKwd(meshID, GmfHexahedraQ2);
+    for ( int i = 1; i <= nbHex; ++i )
+    {
+      GmfGetLin(meshID, GmfHexahedraQ2, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5],
+                &iN[6], &iN[7], &iN[8],&iN[9],&iN[10],&iN[11],&iN[12],&iN[13],&iN[14],
+                &iN[15],&iN[16],&iN[17],&iN[18],&iN[19],&iN[20],&iN[21],&iN[22],&iN[23],
+                &iN[24],&iN[25],&iN[26], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0],iN[3],iN[2],iN[1],iN[4],iN[7],iN[6],iN[5],iN[11],iN[10],
+                                     iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17],
+                                     iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26],
+                                     hex2IDShift + i ))
+        status = storeBadNodeIds( "GmfHexahedraQ2",i, 27,
+                                  iN[0],iN[3],iN[2],iN[1],iN[4], iN[7],iN[6],iN[5],iN[11],iN[10],
+                                  iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17],
+                                  iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26]);
+    }
+  }
+  /* Read prism */
+  const int prismIDShift = myMesh->GetMeshInfo().NbElements();
+  if ( int nbPrism = GmfStatKwd(meshID, GmfPrisms))
+  {
+    GmfGotoKwd(meshID, GmfPrisms);
+    for ( int i = 1; i <= nbPrism; ++i )
+    {
+      GmfGetLin(meshID, GmfPrisms,
+                &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref);
+      if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[5], iN[4], prismIDShift + i))
+        status = storeBadNodeIds( "GmfPrisms",i,
+                                  6, iN[0], iN[1],iN[2], iN[3], iN[4], iN[5] );
+    }
+  }
+
+  // Read required entities into groups
+
+  // get ids of existing groups
+  std::set< int > groupIDs;
+  const std::set<SMESHDS_GroupBase*>& groups = myMesh->GetGroups();
+  std::set<SMESHDS_GroupBase*>::const_iterator grIter = groups.begin();
+  for ( ; grIter != groups.end(); ++grIter )
+    groupIDs.insert( (*grIter)->GetID() );
+  if ( groupIDs.empty() ) groupIDs.insert( 0 );
+
+  const int kes[4][3] = { { GmfRequiredVertices,      SMDSAbs_Node, nodeIDShift },
+                          { GmfRequiredEdges,         SMDSAbs_Edge, edgeIDShift },
+                          { GmfRequiredTriangles,     SMDSAbs_Face, triaIDShift },
+                          { GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift }};
+  const char* names[4] = { "_required_Vertices"      ,
+                           "_required_Edges"         ,
+                           "_required_Triangles"     ,
+                           "_required_Quadrilaterals" };
+  for ( int i = 0; i < 4; ++i )
+  {
+    int                 gmfKwd = kes[i][0];
+    SMDSAbs_ElementType entity = (SMDSAbs_ElementType) kes[i][1];
+    int                 shift  = kes[i][2];
+    if ( int nb = GmfStatKwd(meshID, gmfKwd))
+    {
+      const int newID = *groupIDs.rbegin() + 1;
+      groupIDs.insert( newID );
+      SMESHDS_Group* group = new SMESHDS_Group( newID, myMesh, entity );
+      group->SetStoreName( names[i] );
+      myMesh->AddGroup( group );
+
+      GmfGotoKwd(meshID, gmfKwd);
+      for ( int i = 0; i < nb; ++i )
+      {
+        GmfGetLin(meshID, gmfKwd, &iN[0] );
+        group->Add( shift + iN[0] );
+      }
+    }
+  }
+
+  return status;
+}
+
+//================================================================================
+/*!
+ * \brief Store a message about invalid IDs of nodes
+ */
+//================================================================================
+
+Driver_Mesh::Status DriverGMF_Read::storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...)
+{
+  if ( myStatus != DRS_OK )
+    return myStatus;
+
+  SMESH_Comment msg;
+
+  va_list VarArg;
+  va_start(VarArg, nb);
+
+  for ( int i = 0; i < nb; ++i )
+  {
+    int id = va_arg(VarArg, int );
+    if ( !myMesh->FindNode( id ))
+      msg << " " << id;
+  }
+  va_end(VarArg);
+
+  if ( !msg.empty() )
+  {
+    std::string nbStr;
+    const char* nbNames[] = { "1-st ", "2-nd ", "3-d " };
+    if ( elemNb < 3 ) nbStr = nbNames[ elemNb-1 ];
+    else              nbStr = SMESH_Comment(elemNb) << "-th ";
+
+    return addMessage
+      ( SMESH_Comment("Wrong node IDs of ")<< nbStr << gmfKwd << ":" << msg,
+        /*fatal=*/false );
+  }
+  return DRS_OK;
+}
diff --git a/src/DriverGMF/DriverGMF_Read.hxx b/src/DriverGMF/DriverGMF_Read.hxx
new file mode 100644 (file)
index 0000000..a003804
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, Read to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File      : DriverGMF_Read.hxx
+// Created   : Mon Sep 17 15:36:47 2012
+// Author    : Edward AGAPOV (eap)
+
+
+#ifndef __DriverGMF_Read_HXX__
+#define __DriverGMF_Read_HXX__
+
+#include "SMESH_DriverGMF.hxx"
+
+#include "Driver_SMESHDS_Mesh.h"
+
+#include <vector>
+#include <string>
+
+/*!
+ * \brief Driver reading a mesh from the GMF file. The mesh to read is selected by 
+ *  an index (counted form 0) set via SetMeshId()
+ */
+class MESHDriverGMF_EXPORT DriverGMF_Read : public Driver_SMESHDS_Mesh
+{
+public:
+
+  DriverGMF_Read();
+  ~DriverGMF_Read();
+
+  virtual Status Perform();
+
+ private:
+
+  Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...);
+
+};
+
+
+#endif
diff --git a/src/DriverGMF/DriverGMF_Write.cxx b/src/DriverGMF/DriverGMF_Write.cxx
new file mode 100644 (file)
index 0000000..cdddd62
--- /dev/null
@@ -0,0 +1,317 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File      : DriverGMF_Write.cxx
+// Created   : Mon Sep 17 17:03:02 2012
+// Author    : Edward AGAPOV (eap)
+
+#include "DriverGMF_Write.hxx"
+
+#include "SMESHDS_GroupBase.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_Comment.hxx"
+
+extern "C"
+{
+#include "libmesh5.h"
+}
+
+#include <vector>
+
+#define BEGIN_ELEM_WRITE( SMDSEntity, GmfKwd, elem )                    \
+  elemIt = myMesh->elementEntityIterator( SMDSEntity );                 \
+  if ( elemIt->more() )                                                 \
+  {                                                                     \
+  GmfSetKwd(meshID, GmfKwd, myMesh->GetMeshInfo().NbEntities( SMDSEntity )); \
+  for ( int gmfID = 1; elemIt->more(); ++gmfID )                        \
+  {                                                                     \
+  const SMDS_MeshElement* elem = elemIt->next();                        \
+  GmfSetLin(meshID, GmfKwd,
+
+#define END_ELEM_WRITE( elem )                  \
+  elem->getshapeId() );                         \
+  }}                                            \
+
+#define END_ELEM_WRITE_ADD_TO_MAP( elem, e2id )         \
+  elem->getshapeId() );                                 \
+  e2id.insert( e2id.end(), make_pair( elem, gmfID ));   \
+  }}                                                    \
+
+
+DriverGMF_Write::DriverGMF_Write():
+  Driver_SMESHDS_Mesh()
+{
+}
+DriverGMF_Write::~DriverGMF_Write()
+{
+}
+
+Driver_Mesh::Status DriverGMF_Write::Perform()
+{
+  const int dim = 3, version = 3;
+
+  int meshID = GmfOpenMesh( myFile.c_str(), GmfWrite, version, dim );
+  if ( !meshID )
+    return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true );
+
+  DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
+
+  // nodes
+  std::map< const SMDS_MeshNode* , int > node2IdMap;
+  int iN = 0, nbNodes = myMesh->NbNodes();
+  GmfSetKwd( meshID, GmfVertices, nbNodes );
+  double xyz[3];
+  SMDS_NodeIteratorPtr nodeIt = myMesh->nodesIterator();
+  while ( nodeIt->more() )
+  {
+    const SMDS_MeshNode* n = nodeIt->next();
+    n->GetXYZ( xyz );
+    GmfSetLin( meshID, GmfVertices, xyz[0], xyz[1], xyz[2], n->getshapeId() );
+    node2IdMap.insert( node2IdMap.end(), make_pair( n, ++iN ));
+  }
+  if ( iN != nbNodes )
+    return addMessage("Wrong nb of nodes returned by nodesIterator", /*fatal=*/true);
+
+
+  SMDS_ElemIteratorPtr elemIt;
+  typedef std::map< const SMDS_MeshElement*, size_t, TIDCompare > TElem2IDMap;
+
+  // edges
+  TElem2IDMap edge2IDMap;
+  BEGIN_ELEM_WRITE( SMDSEntity_Edge, GmfEdges, edge )
+    node2IdMap[ edge->GetNode( 0 )],
+    node2IdMap[ edge->GetNode( 1 )],
+    END_ELEM_WRITE_ADD_TO_MAP( edge, edge2IDMap );
+    
+  // quadratic edges
+  BEGIN_ELEM_WRITE( SMDSEntity_Quad_Edge, GmfEdgesP2, edge )
+    node2IdMap[ edge->GetNode( 0 )],
+    node2IdMap[ edge->GetNode( 1 )],
+    node2IdMap[ edge->GetNode( 2 )],
+    END_ELEM_WRITE( edge );
+    
+  // triangles
+  TElem2IDMap tria2IDMap;
+  BEGIN_ELEM_WRITE( SMDSEntity_Triangle, GmfTriangles, tria )
+    node2IdMap[ tria->GetNode( 0 )],
+    node2IdMap[ tria->GetNode( 1 )],
+    node2IdMap[ tria->GetNode( 2 )],
+    END_ELEM_WRITE_ADD_TO_MAP( tria, tria2IDMap );
+    
+  // quadratic triangles
+  BEGIN_ELEM_WRITE( SMDSEntity_Quad_Triangle, GmfTrianglesP2, tria )
+    node2IdMap[ tria->GetNode( 0 )],
+    node2IdMap[ tria->GetNode( 1 )],
+    node2IdMap[ tria->GetNode( 2 )],
+    node2IdMap[ tria->GetNode( 3 )],
+    node2IdMap[ tria->GetNode( 4 )],
+    node2IdMap[ tria->GetNode( 5 )],
+    END_ELEM_WRITE( tria );
+    
+  // quadrangles
+  TElem2IDMap quad2IDMap;
+  BEGIN_ELEM_WRITE( SMDSEntity_Quadrangle, GmfQuadrilaterals, quad )
+    node2IdMap[ quad->GetNode( 0 )],
+    node2IdMap[ quad->GetNode( 1 )],
+    node2IdMap[ quad->GetNode( 2 )],
+    node2IdMap[ quad->GetNode( 3 )],
+    END_ELEM_WRITE_ADD_TO_MAP( quad, quad2IDMap );
+
+  // bi-quadratic quadrangles
+  BEGIN_ELEM_WRITE( SMDSEntity_BiQuad_Quadrangle, GmfQuadrilateralsQ2, quad )
+    node2IdMap[ quad->GetNode( 0 )],
+    node2IdMap[ quad->GetNode( 3 )],
+    node2IdMap[ quad->GetNode( 2 )],
+    node2IdMap[ quad->GetNode( 1 )],
+    node2IdMap[ quad->GetNode( 7 )],
+    node2IdMap[ quad->GetNode( 6 )],
+    node2IdMap[ quad->GetNode( 5 )],
+    node2IdMap[ quad->GetNode( 4 )],
+    node2IdMap[ quad->GetNode( 8 )],
+    END_ELEM_WRITE( quad );
+    
+  // terahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_Tetra, GmfTetrahedra, tetra )
+    node2IdMap[ tetra->GetNode( 0 )],
+    node2IdMap[ tetra->GetNode( 2 )],
+    node2IdMap[ tetra->GetNode( 1 )],
+    node2IdMap[ tetra->GetNode( 3 )],
+    END_ELEM_WRITE( tetra );
+    
+  // quadratic terahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_Quad_Tetra, GmfTetrahedraP2, tetra )
+    node2IdMap[ tetra->GetNode( 0 )],
+    node2IdMap[ tetra->GetNode( 2 )],
+    node2IdMap[ tetra->GetNode( 1 )],
+    node2IdMap[ tetra->GetNode( 3 )],
+    node2IdMap[ tetra->GetNode( 6 )],
+    node2IdMap[ tetra->GetNode( 5 )],
+    node2IdMap[ tetra->GetNode( 4 )],
+    node2IdMap[ tetra->GetNode( 7 )],
+    node2IdMap[ tetra->GetNode( 9 )],
+    node2IdMap[ tetra->GetNode( 8 )],
+    END_ELEM_WRITE( tetra );
+    
+  // pyramids
+  BEGIN_ELEM_WRITE( SMDSEntity_Pyramid, GmfPyramids, pyra )
+    node2IdMap[ pyra->GetNode( 0 )],
+    node2IdMap[ pyra->GetNode( 2 )],
+    node2IdMap[ pyra->GetNode( 1 )],
+    node2IdMap[ pyra->GetNode( 3 )],
+    node2IdMap[ pyra->GetNode( 4 )],
+    END_ELEM_WRITE( pyra );
+
+  // hexahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_Hexa, GmfHexahedra, hexa )
+    node2IdMap[ hexa->GetNode( 0 )],
+    node2IdMap[ hexa->GetNode( 3 )],
+    node2IdMap[ hexa->GetNode( 2 )],
+    node2IdMap[ hexa->GetNode( 1 )],
+    node2IdMap[ hexa->GetNode( 4 )],
+    node2IdMap[ hexa->GetNode( 7 )],
+    node2IdMap[ hexa->GetNode( 6 )],
+    node2IdMap[ hexa->GetNode( 5 )],
+    END_ELEM_WRITE( hexa );
+
+  // tri-quadratic hexahedra
+  BEGIN_ELEM_WRITE( SMDSEntity_TriQuad_Hexa, GmfHexahedraQ2, hexa )
+    node2IdMap[ hexa->GetNode( 0 )],
+    node2IdMap[ hexa->GetNode( 3 )],
+    node2IdMap[ hexa->GetNode( 2 )],
+    node2IdMap[ hexa->GetNode( 1 )],
+    node2IdMap[ hexa->GetNode( 4 )],
+    node2IdMap[ hexa->GetNode( 7 )],
+    node2IdMap[ hexa->GetNode( 6 )],
+    node2IdMap[ hexa->GetNode( 5 )],
+    node2IdMap[ hexa->GetNode( 11 )],
+    node2IdMap[ hexa->GetNode( 10 )],
+    node2IdMap[ hexa->GetNode( 9 )],
+    node2IdMap[ hexa->GetNode( 8 )],
+    node2IdMap[ hexa->GetNode( 12 )],
+    node2IdMap[ hexa->GetNode( 15 )],
+    node2IdMap[ hexa->GetNode( 14 )],
+    node2IdMap[ hexa->GetNode( 13 )],
+    node2IdMap[ hexa->GetNode( 19 )],
+    node2IdMap[ hexa->GetNode( 18 )],
+    node2IdMap[ hexa->GetNode( 17 )],
+    node2IdMap[ hexa->GetNode( 16 )],
+    node2IdMap[ hexa->GetNode( 20 )],
+    node2IdMap[ hexa->GetNode( 24 )],
+    node2IdMap[ hexa->GetNode( 23 )],
+    node2IdMap[ hexa->GetNode( 22 )],
+    node2IdMap[ hexa->GetNode( 21 )],
+    node2IdMap[ hexa->GetNode( 25 )],
+    node2IdMap[ hexa->GetNode( 26 )],
+    END_ELEM_WRITE( hexa );
+
+  // prism
+  BEGIN_ELEM_WRITE( SMDSEntity_Penta, GmfPrisms, prism )
+    node2IdMap[ prism->GetNode( 0 )],
+    node2IdMap[ prism->GetNode( 2 )],
+    node2IdMap[ prism->GetNode( 1 )],
+    node2IdMap[ prism->GetNode( 3 )],
+    node2IdMap[ prism->GetNode( 5 )],
+    node2IdMap[ prism->GetNode( 4 )],
+    END_ELEM_WRITE( prism );
+
+
+  // required entities
+  SMESH_Comment badGroups;
+  const std::set<SMESHDS_GroupBase*>&      groupSet = myMesh->GetGroups();
+  std::set<SMESHDS_GroupBase*>::const_iterator grIt = groupSet.begin();
+  for ( ; grIt != groupSet.end(); ++grIt )
+  {
+    const SMESHDS_GroupBase* group = *grIt;
+    std::string          groupName = group->GetStoreName();
+    std::string::size_type     pos = groupName.find( "_required_" );
+    if ( pos == std::string::npos ) continue;
+
+    int                    gmfKwd;
+    SMDSAbs_EntityType smdsEntity;
+    std::string entity = groupName.substr( pos + strlen("_required_"));
+    if      ( entity == "Vertices" ) {
+      gmfKwd   = GmfRequiredVertices;
+      smdsEntity = SMDSEntity_Node;
+    }
+    else if ( entity == "Edges" ) {
+      gmfKwd   = GmfRequiredEdges;
+      smdsEntity = SMDSEntity_Edge;
+    }
+    else if ( entity == "Triangles" ) {
+      gmfKwd   = GmfRequiredTriangles;
+      smdsEntity = SMDSEntity_Triangle;
+    }
+    else if ( entity == "Quadrilaterals" ) {
+      gmfKwd   = GmfRequiredQuadrilaterals;
+      smdsEntity = SMDSEntity_Quadrangle;
+    }
+    else {
+      addMessage( SMESH_Comment("Invalig gmf entity name: ") << entity, /*fatal=*/false );
+      continue;
+    }
+
+    // check elem type in the group
+    int nbOkElems = 0;
+    SMDS_ElemIteratorPtr elemIt = group->GetElements();
+    while ( elemIt->more() )
+      nbOkElems += ( elemIt->next()->GetEntityType() == smdsEntity );
+
+    if ( nbOkElems != group->Extent() && nbOkElems == 0 )
+    {
+      badGroups << " " << groupName;
+      continue;
+    }
+
+    // choose a TElem2IDMap
+    TElem2IDMap* elem2IDMap = 0;
+    if ( smdsEntity == SMDSEntity_Quadrangle && nbOkElems != myMesh->NbFaces() )
+      elem2IDMap = & quad2IDMap;
+    else if ( smdsEntity == SMDSEntity_Triangle && nbOkElems != myMesh->NbFaces() )
+      elem2IDMap = & tria2IDMap;
+    else if ( smdsEntity == SMDSEntity_Edge && nbOkElems != myMesh->NbEdges() )
+      elem2IDMap = & edge2IDMap;
+
+    // write the group
+    GmfSetKwd( meshID, gmfKwd, nbOkElems );
+    elemIt = group->GetElements();
+    if ( elem2IDMap )
+      for ( ; elemIt->more(); )
+      {
+        const SMDS_MeshElement* elem = elemIt->next();
+        if ( elem->GetEntityType() == smdsEntity )
+          GmfSetLin( meshID, gmfKwd, (*elem2IDMap)[ elem ] );
+      }
+    else
+      for ( int gmfID = 1; elemIt->more(); ++gmfID)
+      {
+        const SMDS_MeshElement* elem = elemIt->next();
+        if ( elem->GetEntityType() == smdsEntity )
+          GmfSetLin( meshID, gmfKwd, gmfID );
+      }
+
+  } // loop on groups
+
+  if ( !badGroups.empty() )
+    addMessage( SMESH_Comment("Groups of elements of inappropriate geometry:")
+                << badGroups, /*fatal=*/false );
+
+  return DRS_OK;
+}
diff --git a/src/DriverGMF/DriverGMF_Write.hxx b/src/DriverGMF/DriverGMF_Write.hxx
new file mode 100644 (file)
index 0000000..fd0918d
--- /dev/null
@@ -0,0 +1,59 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+// File      : DriverGMF_Write.hxx
+// Created   : Mon Sep 17 15:36:47 2012
+// Author    : Edward AGAPOV (eap)
+
+
+#ifndef __DriverGMF_Write_HXX__
+#define __DriverGMF_Write_HXX__
+
+#include "SMESH_DriverGMF.hxx"
+
+#include "Driver_SMESHDS_Mesh.h"
+#include "SMDSAbs_ElementType.hxx"
+
+/*!
+ * \brief Driver Writing a mesh into a GMF file.
+ */
+class MESHDriverGMF_EXPORT DriverGMF_Write : public Driver_SMESHDS_Mesh
+{
+public:
+
+  DriverGMF_Write();
+  ~DriverGMF_Write();
+
+  virtual Status Perform();
+};
+
+/*!
+ * \brief An object closing GMF mesh at destruction
+ */
+struct DriverGMF_MeshCloser
+{
+  int _gmfMeshID;
+  DriverGMF_MeshCloser( const int gmfMeshID ): _gmfMeshID(gmfMeshID) {}
+  ~DriverGMF_MeshCloser();
+};
+
+
+#endif
diff --git a/src/DriverGMF/Makefile.am b/src/DriverGMF/Makefile.am
new file mode 100644 (file)
index 0000000..895c83a
--- /dev/null
@@ -0,0 +1,50 @@
+# Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+# header files 
+salomeinclude_HEADERS = \
+       DriverGMF_Read.hxx \
+       DriverGMF_Write.hxx \
+       SMESH_DriverGMF.hxx \
+       libmesh5.h
+
+# Libraries targets
+lib_LTLIBRARIES = libMeshDriverGMF.la
+dist_libMeshDriverGMF_la_SOURCES = \
+       DriverGMF_Read.cxx \
+       DriverGMF_Write.cxx \
+       libmesh5.c
+
+# additionnal information to compil and link file
+libMeshDriverGMF_la_CPPFLAGS = \
+       $(KERNEL_CXXFLAGS) \
+       $(CAS_CPPFLAGS) \
+        $(VTK_INCLUDES) \
+       $(BOOST_CPPFLAGS) \
+       -I$(srcdir)/../Driver \
+       -I$(srcdir)/../SMESHUtils \
+       -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHDS
+
+libMeshDriverGMF_la_LDFLAGS  = \
+       $(BOOST_LIBS) \
+       ../Driver/libMeshDriver.la \
+       ../SMESHUtils/libSMESHUtils.la
diff --git a/src/DriverGMF/SMESH_DriverGMF.hxx b/src/DriverGMF/SMESH_DriverGMF.hxx
new file mode 100755 (executable)
index 0000000..dd901a3
--- /dev/null
@@ -0,0 +1,40 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+//  File   : SMESH_DriverGMF.hxx
+//  Author : Alexander A. BORODIN
+//  Module : SMESH
+//
+#ifndef _SMESH_DriverGMF_HXX_
+#define _SMESH_DriverGMF_HXX_
+
+#ifdef WNT
+ #if defined MESHDriverGMF_EXPORTS || defined MeshDriverGMF_EXPORTS
+  #define MESHDriverGMF_EXPORT __declspec( dllexport )
+ #else
+  #define MESHDriverGMF_EXPORT __declspec( dllimport )
+ #endif
+#else
+ #define MESHDriverGMF_EXPORT
+#endif
+
+#endif
diff --git a/src/DriverGMF/libmesh5.c b/src/DriverGMF/libmesh5.c
new file mode 100644 (file)
index 0000000..b16c39c
--- /dev/null
@@ -0,0 +1,1346 @@
+
+
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*                                             LIBMESH V 5.46                                          */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*     Description:            handle .meshb file format I/O           */
+/*     Author:                         Loic MARECHAL                                           */
+/*     Creation date:          feb 16 2007                                                     */
+/*     Last modification:      apr 03 2012                                                     */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+
+
+/*----------------------------------------------------------*/
+/* Includes                                                                                                    */
+/*----------------------------------------------------------*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+#include <math.h>
+#include <ctype.h>
+#include "libmesh5.h"
+
+
+/*----------------------------------------------------------*/
+/* Defines                                                                                                     */
+/*----------------------------------------------------------*/
+
+#define Asc 1
+#define Bin 2
+#define MshFil 4
+#define SolFil 8
+#define MaxMsh 100
+#define InfKwd 1
+#define RegKwd 2
+#define SolKwd 3
+#define WrdSiz 4
+#define BufSiz 10000
+
+
+/*----------------------------------------------------------*/
+/* Structures                                                                                          */
+/*----------------------------------------------------------*/
+
+typedef struct
+{
+       int typ, SolSiz, NmbWrd, NmbLin, NmbTyp, TypTab[ GmfMaxTyp ];
+       long pos;
+       char fmt[ GmfMaxTyp*9 ];
+}KwdSct;
+
+typedef struct
+{
+       int dim, ver, mod, typ, cod, pos;
+       long NexKwdPos, siz;
+       KwdSct KwdTab[ GmfMaxKwd + 1 ];
+       FILE *hdl;
+       int *IntBuf;
+       float *FltBuf;
+       unsigned char *buf;
+       char FilNam[ GmfStrSiz ];
+       double DblBuf[1000/8];
+       unsigned char blk[ BufSiz + 1000 ];
+}GmfMshSct;
+
+
+/*----------------------------------------------------------*/
+/* Global variables                                                                                    */
+/*----------------------------------------------------------*/
+
+static int GmfIniFlg=0;
+static GmfMshSct *GmfMshTab[ MaxMsh + 1 ];
+static const char *GmfKwdFmt[ GmfMaxKwd + 1 ][4] = 
+{      {"Reserved", "", "", ""},
+       {"MeshVersionFormatted", "", "", "i"},
+       {"Reserved", "", "", ""},
+       {"Dimension", "", "", "i"},
+       {"Vertices", "Vertex", "i", "dri"},
+       {"Edges", "Edge", "i", "iii"},
+       {"Triangles", "Triangle", "i", "iiii"},
+       {"Quadrilaterals", "Quadrilateral", "i", "iiiii"},
+       {"Tetrahedra", "Tetrahedron", "i", "iiiii"},
+       {"Prisms", "Prism", "i", "iiiiiii"},
+       {"Hexahedra", "Hexahedron", "i", "iiiiiiiii"},
+       {"IterationsAll", "IterationAll","","i"},
+       {"TimesAll", "TimeAll","","r"},                                 
+       {"Corners", "Corner", "i", "i"},
+       {"Ridges", "Ridge", "i", "i"},
+       {"RequiredVertices", "RequiredVertex", "i", "i"},
+       {"RequiredEdges", "RequiredEdge", "i", "i"},
+       {"RequiredTriangles", "RequiredTriangle", "i", "i"},
+       {"RequiredQuadrilaterals", "RequiredQuadrilateral", "i", "i"},
+       {"TangentAtEdgeVertices", "TangentAtEdgeVertex", "i", "iii"},
+       {"NormalAtVertices", "NormalAtVertex", "i", "ii"},
+       {"NormalAtTriangleVertices", "NormalAtTriangleVertex", "i", "iii"},
+       {"NormalAtQuadrilateralVertices", "NormalAtQuadrilateralVertex", "i", "iiii"},
+       {"AngleOfCornerBound", "", "", "r"},
+       {"TrianglesP2", "TriangleP2", "i", "iiiiiii"},
+       {"EdgesP2", "EdgeP2", "i", "iiii"},
+       {"SolAtPyramids", "SolAtPyramid", "i", "sr"},
+       {"QuadrilateralsQ2", "QuadrilateralQ2", "i", "iiiiiiiiii"},
+       {"ISolAtPyramids", "ISolAtPyramid", "i", "iiiii"},
+       {"SubDomainFromGeom", "SubDomainFromGeom", "i", "iiii"},
+       {"TetrahedraP2", "TetrahedronP2", "i", "iiiiiiiiiii"},
+       {"Fault_NearTri", "Fault_NearTri", "i", "i"},
+       {"Fault_Inter", "Fault_Inter", "i", "i"},
+       {"HexahedraQ2", "HexahedronQ2", "i", "iiiiiiiiiiiiiiiiiiiiiiiiiiii"},
+       {"ExtraVerticesAtEdges", "ExtraVerticesAtEdge", "i", "in"},
+       {"ExtraVerticesAtTriangles", "ExtraVerticesAtTriangle", "i", "in"},
+       {"ExtraVerticesAtQuadrilaterals", "ExtraVerticesAtQuadrilateral", "i", "in"},
+       {"ExtraVerticesAtTetrahedra", "ExtraVerticesAtTetrahedron", "i", "in"},
+       {"ExtraVerticesAtPrisms", "ExtraVerticesAtPrism", "i", "in"},
+       {"ExtraVerticesAtHexahedra", "ExtraVerticesAtHexahedron", "i", "in"},
+       {"VerticesOnGeometricVertices", "VertexOnGeometricVertex", "i", "iir"},
+       {"VerticesOnGeometricEdges", "VertexOnGeometricEdge", "i", "iirr"},
+       {"VerticesOnGeometricTriangles", "VertexOnGeometricTriangle", "i", "iirrr"},
+       {"VerticesOnGeometricQuadrilaterals", "VertexOnGeometricQuadrilateral", "i", "iirrr"},
+       {"EdgesOnGeometricEdges", "EdgeOnGeometricEdge", "i", "iir"},
+       {"Fault_FreeEdge", "Fault_FreeEdge", "i", "i"},
+       {"Polyhedra", "Polyhedron", "i", "iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"},
+       {"Polygons", "Polygon", "", "iiiiiiiii"},
+       {"Fault_Overlap", "Fault_Overlap", "i", "i"},
+       {"Pyramids", "Pyramid", "i", "iiiiii"},
+       {"BoundingBox", "", "", "drdr"},
+       {"Body","i", "drdrdrdr"},
+       {"PrivateTable", "PrivateTable", "i", "i"},
+       {"Fault_BadShape", "Fault_BadShape", "i", "i"},
+       {"End", "", "", ""},
+       {"TrianglesOnGeometricTriangles", "TriangleOnGeometricTriangle", "i", "iir"},
+       {"TrianglesOnGeometricQuadrilaterals", "TriangleOnGeometricQuadrilateral", "i", "iir"},
+       {"QuadrilateralsOnGeometricTriangles", "QuadrilateralOnGeometricTriangle", "i", "iir"},
+       {"QuadrilateralsOnGeometricQuadrilaterals", "QuadrilateralOnGeometricQuadrilateral", "i", "iir"},
+       {"Tangents", "Tangent", "i", "dr"},
+       {"Normals", "Normal", "i", "dr"},
+       {"TangentAtVertices", "TangentAtVertex", "i", "ii"},
+       {"SolAtVertices", "SolAtVertex", "i", "sr"},
+       {"SolAtEdges", "SolAtEdge", "i", "sr"},
+       {"SolAtTriangles", "SolAtTriangle", "i", "sr"},
+       {"SolAtQuadrilaterals", "SolAtQuadrilateral", "i", "sr"},
+       {"SolAtTetrahedra", "SolAtTetrahedron", "i", "sr"},
+       {"SolAtPrisms", "SolAtPrism", "i", "sr"},
+       {"SolAtHexahedra", "SolAtHexahedron", "i", "sr"},
+       {"DSolAtVertices", "DSolAtVertex", "i", "sr"},
+       {"ISolAtVertices", "ISolAtVertex", "i", "i"},
+       {"ISolAtEdges", "ISolAtEdge", "i", "ii"},
+       {"ISolAtTriangles", "ISolAtTriangle", "i", "iii"},
+       {"ISolAtQuadrilaterals", "ISolAtQuadrilateral", "i", "iiii"},
+       {"ISolAtTetrahedra", "ISolAtTetrahedron", "i", "iiii"},
+       {"ISolAtPrisms", "ISolAtPrism", "i", "iiiiii"},
+       {"ISolAtHexahedra", "ISolAtHexahedron", "i", "iiiiiiii"},
+       {"Iterations", "","","i"},
+       {"Time", "","","r"},
+       {"Fault_SmallTri", "Fault_SmallTri","i","i"},
+       {"CoarseHexahedra", "CoarseHexahedron", "i", "i"}
+ };
+
+
+/*----------------------------------------------------------*/
+/* Prototypes of local procedures                                                      */
+/*----------------------------------------------------------*/
+
+static void ScaWrd(GmfMshSct *, unsigned char *);
+static void ScaDblWrd(GmfMshSct *, unsigned char *);
+static void ScaBlk(GmfMshSct *, unsigned char *, int);
+static long GetPos(GmfMshSct *);
+static void RecWrd(GmfMshSct *, unsigned char *);
+static void RecDblWrd(GmfMshSct *, unsigned char *);
+static void RecBlk(GmfMshSct *, unsigned char *, int);
+static void SetPos(GmfMshSct *, long);
+static int ScaKwdTab(GmfMshSct *);
+static void ExpFmt(GmfMshSct *, int);
+static void ScaKwdHdr(GmfMshSct *, int);
+
+
+/*----------------------------------------------------------*/
+/* Open a mesh file in read or write mod                                       */
+/*----------------------------------------------------------*/
+
+int GmfOpenMesh(const char *FilNam, int mod, ...)
+{
+       int i, KwdCod, res, *PtrVer, *PtrDim, MshIdx=0;
+       char str[ GmfStrSiz ];
+       va_list VarArg;
+       GmfMshSct *msh;
+       char *ptr;
+       int k;
+
+       if(!GmfIniFlg)
+       {
+               for(i=0;i<=MaxMsh;i++)
+                       GmfMshTab[i] = NULL;
+
+               GmfIniFlg = 1;
+       }
+
+       /*---------------------*/
+       /* MESH STRUCTURE INIT */
+       /*---------------------*/
+
+       for(i=1;i<=MaxMsh;i++)
+               if(!GmfMshTab[i])
+               {
+                       MshIdx = i;
+                       break;
+               }
+
+       if( !MshIdx || !(msh = calloc(1, sizeof(GmfMshSct))) )
+               return(0);
+
+       /* Copy the FilNam into the structure */
+
+       if(strlen(FilNam) + 7 >= GmfStrSiz)
+        {
+                free (msh);
+               return(0);
+        }
+
+       strcpy(msh->FilNam, FilNam);
+
+       /* Store the opening mod (read or write) and guess the filetype (binary or ascii) depending on the extension */
+
+       msh->mod = mod;
+       msh->buf = (unsigned char *)msh->DblBuf;
+       msh->FltBuf = (float *)msh->DblBuf;
+       msh->IntBuf = (int *)msh->DblBuf;
+
+       k = strlen(msh->FilNam) - 6;
+       if(k < 0)
+               k = 0;
+       ptr = msh->FilNam+k;
+       if(strstr(ptr, ".meshb"))
+               msh->typ |= (Bin | MshFil);
+       else if(strstr(ptr, ".mesh"))
+               msh->typ |= (Asc | MshFil);
+       else if(strstr(ptr, ".solb"))
+               msh->typ |= (Bin | SolFil);
+       else if(strstr(ptr, ".sol"))
+               msh->typ |= (Asc | SolFil);
+       else {
+               free (msh);
+               return(0);
+       }
+
+       /* Open the file in the required mod and initialyse the mesh structure */
+
+       if(msh->mod == GmfRead)
+       {
+
+               /*-----------------------*/
+               /* OPEN FILE FOR READING */
+               /*-----------------------*/
+
+               va_start(VarArg, mod);
+               PtrVer = va_arg(VarArg, int *);
+               PtrDim = va_arg(VarArg, int *);
+               va_end(VarArg);
+
+               /* Create the name string and open the file */
+
+               if(!(msh->hdl = fopen(msh->FilNam, "rb")))
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               /* Read the endian coding tag, the mesh version and the mesh dimension (mandatory kwd) */
+
+               if(msh->typ & Bin)
+               {
+                       fread((unsigned char *)&msh->cod, WrdSiz, 1, msh->hdl);
+
+                       if( (msh->cod != 1) && (msh->cod != 16777216) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       ScaWrd(msh, (unsigned char *)&msh->ver);
+
+                       if( (msh->ver < 1) || (msh->ver > 3) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       if( (msh->ver == 3) && (sizeof(long) == 4) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       ScaWrd(msh, (unsigned char *)&KwdCod);
+
+                       if(KwdCod != GmfDimension)
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       GetPos(msh);
+                       ScaWrd(msh, (unsigned char *)&msh->dim);
+               }
+               else
+               {
+                       do
+                       {
+                               res = fscanf(msh->hdl, "%s", str);
+                       }while( (res != EOF) && strcmp(str, "MeshVersionFormatted") );
+
+                       if(res == EOF)
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       fscanf(msh->hdl, "%d", &msh->ver);
+
+                       if( (msh->ver < 1) || (msh->ver > 3) )
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       do
+                       {
+                               res = fscanf(msh->hdl, "%s", str);
+                       }while( (res != EOF) && strcmp(str, "Dimension") );
+
+                       if(res == EOF)
+                       {
+                               free (msh);
+                               return(0);
+                       }
+
+                       fscanf(msh->hdl, "%d", &msh->dim);
+               }
+
+               if( (msh->dim != 2) && (msh->dim != 3) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               (*PtrVer) = msh->ver;
+               (*PtrDim) = msh->dim;
+
+               /*------------*/
+               /* KW READING */
+               /*------------*/
+
+               /* Read the list of kw present in the file */
+
+               if(!ScaKwdTab(msh))
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               GmfMshTab[ MshIdx ] = msh;
+
+               return(MshIdx);
+       }
+       else if(msh->mod == GmfWrite)
+       {
+
+               /*-----------------------*/
+               /* OPEN FILE FOR WRITING */
+               /*-----------------------*/
+
+               msh->cod = 1;
+
+               /* Check if the user provided a valid version number and dimension */
+
+               va_start(VarArg, mod);
+               msh->ver = va_arg(VarArg, int);
+               msh->dim = va_arg(VarArg, int);
+               va_end(VarArg);
+
+               if( (msh->ver < 1) || (msh->ver > 3) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               if( (msh->ver == 3) && (sizeof(long) == 4) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               if( (msh->dim != 2) && (msh->dim != 3) )
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               /* Create the mesh file */
+
+               if(!(msh->hdl = fopen(msh->FilNam, "wb")))
+               {
+                       free (msh);
+                       return(0);
+               }
+
+               GmfMshTab[ MshIdx ] = msh;
+
+
+               /*------------*/
+               /* KW WRITING */
+               /*------------*/
+
+               /* Write the mesh version and dimension */
+
+               if(msh->typ & Asc)
+               {
+                       fprintf(msh->hdl, "%s %d\n\n", GmfKwdFmt[ GmfVersionFormatted ][0], msh->ver);
+                       fprintf(msh->hdl, "%s %d\n", GmfKwdFmt[ GmfDimension ][0], msh->dim);
+               }
+               else
+               {
+                       RecWrd(msh, (unsigned char *)&msh->cod);
+                       RecWrd(msh, (unsigned char *)&msh->ver);
+                       GmfSetKwd(MshIdx, GmfDimension, 0);
+                       RecWrd(msh, (unsigned char *)&msh->dim);
+               }
+
+               return(MshIdx);
+       }
+       else
+       {
+                free (msh);
+               return(0);
+        }
+}
+
+
+/*----------------------------------------------------------*/
+/* Close a meshfile in the right way                                           */
+/*----------------------------------------------------------*/
+
+int GmfCloseMesh(int MshIdx)
+{
+       int res = 1;
+       GmfMshSct *msh;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+       RecBlk(msh, msh->buf, 0);
+
+       /* In write down the "End" kw in write mode */
+
+       if(msh->mod == GmfWrite){
+               if(msh->typ & Asc)
+                       fprintf(msh->hdl, "\n%s\n", GmfKwdFmt[ GmfEnd ][0]);
+               else
+                       GmfSetKwd(MshIdx, GmfEnd, 0);
+       }
+       /* Close the file and free the mesh structure */
+
+       if(fclose(msh->hdl))
+               res = 0;
+
+       free(msh);
+       GmfMshTab[ MshIdx ] = NULL;
+
+       return(res);
+}
+
+
+/*----------------------------------------------------------*/
+/* Read the number of lines and set the position to this kwd*/
+/*----------------------------------------------------------*/
+
+int GmfStatKwd(int MshIdx, int KwdCod, ...)
+{
+       int i, *PtrNmbTyp, *PtrSolSiz, *TypTab;
+       GmfMshSct *msh;
+       KwdSct *kwd;
+       va_list VarArg;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+
+       if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) )
+               return(0);
+
+       kwd = &msh->KwdTab[ KwdCod ];
+
+       if(!kwd->NmbLin)
+               return(0);
+
+       /* Read further arguments if this kw is a sol */
+
+       if(kwd->typ == SolKwd)
+       {
+               va_start(VarArg, KwdCod);
+
+               PtrNmbTyp = va_arg(VarArg, int *);
+               *PtrNmbTyp = kwd->NmbTyp;
+
+               PtrSolSiz = va_arg(VarArg, int *);
+               *PtrSolSiz = kwd->SolSiz;
+
+               TypTab = va_arg(VarArg, int *);
+
+               for(i=0;i<kwd->NmbTyp;i++)
+                       TypTab[i] = kwd->TypTab[i];
+
+               va_end(VarArg);
+       }
+
+       return(kwd->NmbLin);
+}
+
+
+/*----------------------------------------------------------*/
+/* Set the current file position to a given kwd                                */
+/*----------------------------------------------------------*/
+
+int GmfGotoKwd(int MshIdx, int KwdCod)
+{
+       GmfMshSct *msh;
+       KwdSct *kwd;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+
+       if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) )
+               return(0);
+
+       kwd = &msh->KwdTab[ KwdCod ];
+
+       if(!kwd->NmbLin)
+               return(0);
+
+       return(fseek(msh->hdl, kwd->pos, SEEK_SET));
+}
+
+
+/*----------------------------------------------------------*/
+/* Write the kwd and set the number of lines                           */
+/*----------------------------------------------------------*/
+
+int GmfSetKwd(int MshIdx, int KwdCod, ...)
+{
+       int i, NmbLin=0, *TypTab;
+       long CurPos;
+       va_list VarArg;
+       GmfMshSct *msh;
+       KwdSct *kwd;
+
+       if( (MshIdx < 1) || (MshIdx > MaxMsh) )
+               return(0);
+
+       msh = GmfMshTab[ MshIdx ];
+       RecBlk(msh, msh->buf, 0);
+
+       if( (KwdCod < 1) || (KwdCod > GmfMaxKwd) )
+               return(0);
+
+       kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Read further arguments if this kw has a header */
+
+       if(strlen(GmfKwdFmt[ KwdCod ][2]))
+       {
+               va_start(VarArg, KwdCod);
+               NmbLin = va_arg(VarArg, int);
+
+               if(!strcmp(GmfKwdFmt[ KwdCod ][3], "sr"))
+               {
+                       kwd->NmbTyp = va_arg(VarArg, int);
+                       TypTab = va_arg(VarArg, int *);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               kwd->TypTab[i] = TypTab[i];
+               }
+
+               va_end(VarArg);
+       }
+
+       /* Setup the kwd info */
+
+       ExpFmt(msh, KwdCod);
+
+       if(!kwd->typ)
+               return(0);
+       else if(kwd->typ == InfKwd)
+               kwd->NmbLin = 1;
+       else
+               kwd->NmbLin = NmbLin;
+
+       /* Store the next kwd position in binary file */
+
+       if( (msh->typ & Bin) && msh->NexKwdPos )
+       {
+               CurPos = ftell(msh->hdl);
+               fseek(msh->hdl, msh->NexKwdPos, SEEK_SET);
+               SetPos(msh, CurPos);
+               fseek(msh->hdl, CurPos, SEEK_SET);
+       }
+
+       /* Write the header */
+
+       if(msh->typ & Asc)
+       {
+               fprintf(msh->hdl, "\n%s\n", GmfKwdFmt[ KwdCod ][0]);
+
+               if(kwd->typ != InfKwd)
+                       fprintf(msh->hdl, "%d\n", kwd->NmbLin);
+
+               /* In case of solution field, write the extended header */
+
+               if(kwd->typ == SolKwd)
+               {
+                       fprintf(msh->hdl, "%d ", kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               fprintf(msh->hdl, "%d ", kwd->TypTab[i]);
+
+                       fprintf(msh->hdl, "\n\n");
+               }
+       }
+       else
+       {
+               RecWrd(msh, (unsigned char *)&KwdCod);
+               msh->NexKwdPos = ftell(msh->hdl);
+               SetPos(msh, 0);
+
+               if(kwd->typ != InfKwd)
+                       RecWrd(msh, (unsigned char *)&kwd->NmbLin);
+
+               /* In case of solution field, write the extended header at once */
+
+               if(kwd->typ == SolKwd)
+               {
+                       RecWrd(msh, (unsigned char *)&kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               RecWrd(msh, (unsigned char *)&kwd->TypTab[i]);
+               }
+       }
+
+       /* Reset write buffer position */
+       msh->pos = 0;
+
+       /* Estimate the total file size and check whether it crosses the 2GB threshold */
+
+       msh->siz += kwd->NmbLin * kwd->NmbWrd * WrdSiz;
+
+       if(msh->siz > 2E9)
+               return(0);
+       else
+               return(kwd->NmbLin);
+}
+
+
+/*----------------------------------------------------------*/
+/* Read a full line from the current kwd                                       */
+/*----------------------------------------------------------*/
+
+void GmfGetLin(int MshIdx, int KwdCod, ...)
+{
+       int i, j;
+       float *FltSolTab;
+       double *DblSolTab;
+       va_list VarArg;
+       GmfMshSct *msh = GmfMshTab[ MshIdx ];
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Start decoding the arguments */
+
+       va_start(VarArg, KwdCod);
+
+       if(kwd->typ != SolKwd)
+       {
+               int k, nb_repeat = 0;
+
+               if(msh->ver == 1)
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fscanf(msh->hdl, "%f", va_arg(VarArg, float *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               fscanf(msh->hdl, "%d", &nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                       }
+                       else
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               ScaWrd(msh, (unsigned char *)va_arg(VarArg, float *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               ScaWrd(msh, (unsigned char *)&nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+                       }
+               }
+               else
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fscanf(msh->hdl, "%lf", va_arg(VarArg, double *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               fscanf(msh->hdl, "%d", &nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               fscanf(msh->hdl, "%d", va_arg(VarArg, int *));
+                       }
+                       else
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               ScaDblWrd(msh, (unsigned char *)va_arg(VarArg, double *));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               ScaWrd(msh, (unsigned char *)&nb_repeat);
+                                               *(va_arg(VarArg,  int *)) = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++)
+                                                       ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+                                       }
+                                       else
+                                               ScaWrd(msh, (unsigned char *)va_arg(VarArg, int *));
+               }
+       }
+       else
+       {
+               if(msh->ver == 1)
+               {
+                       FltSolTab = va_arg(VarArg, float *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fscanf(msh->hdl, "%f", &FltSolTab[j]);
+                       else
+                               ScaBlk(msh, (unsigned char *)FltSolTab, kwd->NmbWrd);
+               }
+               else
+               {
+                       DblSolTab = va_arg(VarArg, double *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fscanf(msh->hdl, "%lf", &DblSolTab[j]);
+                       else
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       ScaDblWrd(msh, (unsigned char *)&DblSolTab[j]);
+               }
+       }
+
+       va_end(VarArg);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a full line from the current kwd                                      */
+/*----------------------------------------------------------*/
+
+void GmfSetLin(int MshIdx, int KwdCod, ...)
+{
+       int i, j, pos, *IntBuf;
+       float *FltSolTab;
+       double *DblSolTab, *DblBuf;
+       va_list VarArg;
+       GmfMshSct *msh = GmfMshTab[ MshIdx ];
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Start decoding the arguments */
+
+       va_start(VarArg, KwdCod);
+
+       if(kwd->typ != SolKwd)
+       {
+               int k, nb_repeat = 0;
+
+               if(msh->ver == 1)
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fprintf(msh->hdl, "%g ", (float)va_arg(VarArg, double));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               nb_repeat = va_arg(VarArg, int);
+                                               fprintf(msh->hdl, "%d ", nb_repeat);
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                                       }
+                                       else
+                                               fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                       }
+                       else
+                       {
+                               int size_of_block = kwd->SolSiz;
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               msh->FltBuf[i] = va_arg(VarArg, double);
+                                       else if(kwd->fmt[i] == 'n') {
+                                               nb_repeat = va_arg(VarArg, int);
+                                               msh->FltBuf[i] = nb_repeat;
+                                               for(k=0;k<nb_repeat;k++) {
+                                                       msh->IntBuf[i+1+k] = va_arg(VarArg, int);
+                                                       size_of_block ++;
+                                               }
+                                       }
+                                       else
+                                               msh->IntBuf[i] = va_arg(VarArg, int);
+
+                               RecBlk(msh, msh->buf, size_of_block);
+                       }
+               }
+               else
+               {
+                       if(msh->typ & Asc)
+                       {
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                               fprintf(msh->hdl, "%.15lg ", va_arg(VarArg, double));
+                                       else if(kwd->fmt[i] == 'n') {
+                                               nb_repeat = va_arg(VarArg, int);
+                                               fprintf(msh->hdl, "%d ", nb_repeat);
+                                               for(k=0;k<nb_repeat;k++)
+                                                       fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                                       }
+                                       else
+                                               fprintf(msh->hdl, "%d ", va_arg(VarArg, int));
+                       }
+                       else
+                       {
+                               pos = 0;
+
+                               for(i=0;i<kwd->SolSiz;i++)
+                                       if(kwd->fmt[i] == 'r')
+                                       {
+                                               DblBuf = (double *)&msh->buf[ pos ];
+                                               *DblBuf = va_arg(VarArg, double);
+                                               pos += 8;
+                                       }
+                                       else if(kwd->fmt[i] == 'n')
+                                       {
+                                               IntBuf = (int *)&msh->buf[ pos ];
+                                               nb_repeat = va_arg(VarArg, int);
+                                               *IntBuf = nb_repeat;
+                                               pos += 4;
+                                               for(k=0;k<nb_repeat;k++) {
+                                                       IntBuf = (int *)&msh->buf[ pos ];
+                                                       *IntBuf = va_arg(VarArg, int);
+                                                       pos += 4;
+                                               }
+                                       }
+                                       else
+                                       {
+                                               IntBuf = (int *)&msh->buf[ pos ];
+                                               *IntBuf = va_arg(VarArg, int);
+                                               pos += 4;
+                                       }
+                               RecBlk(msh, msh->buf, pos/4);
+                       }
+               }
+       }
+       else
+       {
+               if(msh->ver == 1)
+               {
+                       FltSolTab = va_arg(VarArg, float *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fprintf(msh->hdl, "%g ", FltSolTab[j]);
+                       else
+                               RecBlk(msh, (unsigned char *)FltSolTab, kwd->NmbWrd);
+               }
+               else
+               {
+                       DblSolTab = va_arg(VarArg, double *);
+
+                       if(msh->typ & Asc)
+                               for(j=0;j<kwd->SolSiz;j++)
+                                       fprintf(msh->hdl, "%.15lg ", DblSolTab[j]);
+                       else
+                               RecBlk(msh, (unsigned char *)DblSolTab, kwd->NmbWrd);
+               }
+       }
+
+       va_end(VarArg);
+
+       if(msh->typ & Asc)
+               fprintf(msh->hdl, "\n");
+}
+
+
+/*----------------------------------------------------------*/
+/* Private procedure for transmesh : copy a whole line         */
+/*----------------------------------------------------------*/
+
+void GmfCpyLin(int InpIdx, int OutIdx, int KwdCod)
+{
+       double d;
+       float f;
+       int i, a;
+       GmfMshSct *InpMsh = GmfMshTab[ InpIdx ], *OutMsh = GmfMshTab[ OutIdx ];
+       KwdSct *kwd = &InpMsh->KwdTab[ KwdCod ];
+
+       for(i=0;i<kwd->SolSiz;i++)
+       {
+               if(kwd->fmt[i] == 'r')
+               {
+                       if(InpMsh->ver == 1)
+                       {
+                               if(InpMsh->typ & Asc)
+                                       fscanf(InpMsh->hdl, "%f", &f);
+                               else
+                                       ScaWrd(InpMsh, (unsigned char *)&f);
+
+                               d = f;
+                       }
+                       else
+                       {
+                               if(InpMsh->typ & Asc)
+                                       fscanf(InpMsh->hdl, "%lf", &d);
+                               else
+                                       ScaDblWrd(InpMsh, (unsigned char *)&d);
+
+                               f = (float)d;
+                       }
+
+                       if(OutMsh->ver == 1)
+                               if(OutMsh->typ & Asc)
+                                       fprintf(OutMsh->hdl, "%g ", f);
+                               else
+                                       RecWrd(OutMsh, (unsigned char *)&f);
+                       else
+                               if(OutMsh->typ & Asc)
+                                       fprintf(OutMsh->hdl, "%.15g ", d);
+                               else
+                                       RecDblWrd(OutMsh, (unsigned char *)&d);
+               }
+               else if(kwd->fmt[i] == 'n')
+               {
+                       int k, nb_repeat = 0;
+
+                       if(InpMsh->typ & Asc)
+                               fscanf(InpMsh->hdl, "%d", &a);
+                       else
+                               ScaWrd(InpMsh, (unsigned char *)&a);
+
+                       nb_repeat = a;
+
+                       if(OutMsh->typ & Asc)
+                               fprintf(OutMsh->hdl, "%d ", a);
+                       else
+                               RecWrd(OutMsh, (unsigned char *)&a);
+
+                       for(k=0;k<nb_repeat;k++) {
+                               if(InpMsh->typ & Asc)
+                                       fscanf(InpMsh->hdl, "%d", &a);
+                               else
+                                       ScaWrd(InpMsh, (unsigned char *)&a);
+
+                               if(OutMsh->typ & Asc)
+                                       fprintf(OutMsh->hdl, "%d ", a);
+                               else
+                                       RecWrd(OutMsh, (unsigned char *)&a);
+                       }
+               }
+               else
+               {
+                       if(InpMsh->typ & Asc)
+                               fscanf(InpMsh->hdl, "%d", &a);
+                       else
+                               ScaWrd(InpMsh, (unsigned char *)&a);
+
+                       if(OutMsh->typ & Asc)
+                               fprintf(OutMsh->hdl, "%d ", a);
+                       else
+                               RecWrd(OutMsh, (unsigned char *)&a);
+               }
+       }
+
+       if(OutMsh->typ & Asc)
+               fprintf(OutMsh->hdl, "\n");
+}
+
+
+/*----------------------------------------------------------*/
+/* Find every kw present in a meshfile                                         */
+/*----------------------------------------------------------*/
+
+static int ScaKwdTab(GmfMshSct *msh)
+{
+       int KwdCod;
+       long  NexPos, CurPos, EndPos;
+       char str[ GmfStrSiz ];
+
+       if(msh->typ & Asc)
+       {
+               /* Scan each string in the file until the end */
+
+               while(fscanf(msh->hdl, "%s", str) != EOF)
+               {
+                       /* Fast test in order to reject quickly the numeric values */
+
+                       if(isalpha(str[0]))
+                       {
+                               /* Search which kwd code this string is associated with, 
+                                       then get its header and save the curent position in file (just before the data) */
+
+                               for(KwdCod=1; KwdCod<= GmfMaxKwd; KwdCod++)
+                                       if(!strcmp(str, GmfKwdFmt[ KwdCod ][0]))
+                                       {
+                                               ScaKwdHdr(msh, KwdCod);
+                                               break;
+                                       }
+                       }
+                       else if(str[0] == '#')
+                               while(fgetc(msh->hdl) != '\n');
+               }
+       }
+       else
+       {
+               /* Get file size */
+
+               CurPos = ftell(msh->hdl);
+               fseek(msh->hdl, 0, SEEK_END);
+               EndPos = ftell(msh->hdl);
+               fseek(msh->hdl, CurPos, SEEK_SET);
+
+               /* Jump through kwd positions in the file */
+
+               do
+               {
+                       /* Get the kwd code and the next kwd position */
+
+                       ScaWrd(msh, (unsigned char *)&KwdCod);
+                       NexPos = GetPos(msh);
+
+                       if(NexPos > EndPos)
+                               return(0);
+
+                       /* Check if this kwd belongs to this mesh version */
+
+                       if( (KwdCod >= 1) && (KwdCod <= GmfMaxKwd) )
+                               ScaKwdHdr(msh, KwdCod);
+
+                       /* Go to the next kwd */
+
+                       if(NexPos)
+                               fseek(msh->hdl, NexPos, SEEK_SET);
+               }while(NexPos && (KwdCod != GmfEnd));
+       }
+
+       return(1);
+}
+
+
+/*----------------------------------------------------------*/
+/* Read and setup the keyword's header                                         */
+/*----------------------------------------------------------*/
+
+static void ScaKwdHdr(GmfMshSct *msh, int KwdCod)
+{
+       int i;
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       if(!strcmp("i", GmfKwdFmt[ KwdCod ][2]))
+       {
+               if(msh->typ & Asc)
+                       fscanf(msh->hdl, "%d", &kwd->NmbLin);
+               else
+                       ScaWrd(msh, (unsigned char *)&kwd->NmbLin);
+       }
+       else
+               kwd->NmbLin = 1;
+
+       if(!strcmp("sr", GmfKwdFmt[ KwdCod ][3]))
+       {
+               if(msh->typ & Asc)
+               {
+                       fscanf(msh->hdl, "%d", &kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               fscanf(msh->hdl, "%d", &kwd->TypTab[i]);
+               }
+               else
+               {
+                       ScaWrd(msh, (unsigned char *)&kwd->NmbTyp);
+
+                       for(i=0;i<kwd->NmbTyp;i++)
+                               ScaWrd(msh, (unsigned char *)&kwd->TypTab[i]);
+               }
+       }
+
+       ExpFmt(msh, KwdCod);
+       kwd->pos = ftell(msh->hdl);
+}
+
+
+/*----------------------------------------------------------*/
+/* Expand the compacted format and compute the line size       */
+/*----------------------------------------------------------*/
+
+static void ExpFmt(GmfMshSct *msh, int KwdCod)
+{
+       int i, j, TmpSiz=0;
+       char chr;
+       const char *InpFmt = GmfKwdFmt[ KwdCod ][3];
+       KwdSct *kwd = &msh->KwdTab[ KwdCod ];
+
+       /* Set the kwd's type */
+
+       if(!strlen(GmfKwdFmt[ KwdCod ][2]))
+               kwd->typ = InfKwd;
+       else if(!strcmp(InpFmt, "sr"))
+               kwd->typ = SolKwd;
+       else
+               kwd->typ = RegKwd;
+
+       /* Get the solution-field's size */
+
+       if(kwd->typ == SolKwd)
+               for(i=0;i<kwd->NmbTyp;i++)
+                       switch(kwd->TypTab[i])
+                       {
+                               case GmfSca    : TmpSiz += 1; break;
+                               case GmfVec    : TmpSiz += msh->dim; break;
+                               case GmfSymMat : TmpSiz += (msh->dim * (msh->dim+1)) / 2; break;
+                               case GmfMat    : TmpSiz += msh->dim * msh->dim; break;
+                       }
+
+       /* Scan each character from the format string */
+
+       i = kwd->SolSiz = kwd->NmbWrd = 0;
+
+       while(i < strlen(InpFmt))
+       {
+               chr = InpFmt[ i++ ];
+
+               if(chr == 'd')
+               {
+                       chr = InpFmt[i++];
+
+                       for(j=0;j<msh->dim;j++)
+                               kwd->fmt[ kwd->SolSiz++ ] = chr;
+               }
+               else if(chr == 's')
+               {
+                       chr = InpFmt[i++];
+
+                       for(j=0;j<TmpSiz;j++)
+                               kwd->fmt[ kwd->SolSiz++ ] = chr;
+               }
+               else
+                       kwd->fmt[ kwd->SolSiz++ ] = chr;
+       }
+
+       for(i=0;i<kwd->SolSiz;i++)
+               if(kwd->fmt[i] == 'i')
+                       kwd->NmbWrd++;
+               else if(msh->ver >= 2)
+                       kwd->NmbWrd += 2;
+               else
+                       kwd->NmbWrd++;
+}
+
+
+/*----------------------------------------------------------*/
+/* Read a four bytes word from a mesh file                                     */
+/*----------------------------------------------------------*/
+
+static void ScaWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       unsigned char swp;
+
+       fread(wrd, WrdSiz, 1, msh->hdl);
+
+       if(msh->cod == 1)
+               return;
+
+       swp = wrd[3];
+       wrd[3] = wrd[0];
+       wrd[0] = swp;
+
+       swp = wrd[2];
+       wrd[2] = wrd[1];
+       wrd[1] = swp;
+}
+
+
+/*----------------------------------------------------------*/
+/* Read an eight bytes word from a mesh file                           */
+/*----------------------------------------------------------*/
+
+static void ScaDblWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       int i;
+       unsigned char swp;
+
+       fread(wrd, WrdSiz, 2, msh->hdl);
+
+       if(msh->cod == 1)
+               return;
+
+       for(i=0;i<4;i++)
+       {
+               swp = wrd[7-i];
+               wrd[7-i] = wrd[i];
+               wrd[i] = swp;
+       }
+}
+
+
+/*----------------------------------------------------------*/
+/* Read ablock of four bytes word from a mesh file                     */
+/*----------------------------------------------------------*/
+
+static void ScaBlk(GmfMshSct *msh, unsigned char *blk, int siz)
+{
+       int i, j;
+       unsigned char swp, *wrd;
+
+       fread(blk, WrdSiz, siz, msh->hdl);
+
+       if(msh->cod == 1)
+               return;
+
+       for(i=0;i<siz;i++)
+       {
+               wrd = &blk[ i * 4 ];
+
+               for(j=0;j<2;j++)
+               {
+                       swp = wrd[ 3-j ];
+                       wrd[ 3-j ] = wrd[j];
+                       wrd[j] = swp;
+               }
+       }
+}
+
+
+/*----------------------------------------------------------*/
+/* Read a 4 or 8 bytes position in mesh file                           */
+/*----------------------------------------------------------*/
+
+static long GetPos(GmfMshSct *msh)
+{
+       int IntVal;
+       long pos;
+
+       if(msh->ver >= 3)
+               ScaDblWrd(msh, (unsigned char*)&pos);
+       else
+       {
+               ScaWrd(msh, (unsigned char*)&IntVal);
+               pos = IntVal;
+       }
+
+       return(pos);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a four bytes word to a mesh file                                      */
+/*----------------------------------------------------------*/
+
+static void RecWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       fwrite(wrd, WrdSiz, 1, msh->hdl);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write an eight bytes word to a mesh file                                    */
+/*----------------------------------------------------------*/
+
+static void RecDblWrd(GmfMshSct *msh, unsigned char *wrd)
+{
+       fwrite(wrd, WrdSiz, 2, msh->hdl);
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a block of four bytes word to a mesh file                     */
+/*----------------------------------------------------------*/
+
+static void RecBlk(GmfMshSct *msh, unsigned char *blk, int siz)
+{
+       /* Copy this line-block into the main mesh buffer */
+
+       if(siz)
+       {
+               memcpy(&msh->blk[ msh->pos ], blk, siz * WrdSiz);
+               msh->pos += siz * WrdSiz;
+       }
+
+       /* When the buffer is full or this procedure is called with a 0 size, flush the cache on disk */
+
+       if( (msh->pos > BufSiz) || (!siz && msh->pos) )
+       {
+               fwrite(msh->blk, 1, msh->pos, msh->hdl);
+               msh->pos = 0;
+       }
+}
+
+
+/*----------------------------------------------------------*/
+/* Write a 4 or 8 bytes position in a mesh file                                */
+/*----------------------------------------------------------*/
+
+static void SetPos(GmfMshSct *msh, long pos)
+{
+       int IntVal;
+
+       if(msh->ver >= 3)
+               RecDblWrd(msh, (unsigned char*)&pos);
+       else
+       {
+               IntVal = pos;
+               RecWrd(msh, (unsigned char*)&IntVal);
+       }
+}
diff --git a/src/DriverGMF/libmesh5.h b/src/DriverGMF/libmesh5.h
new file mode 100644 (file)
index 0000000..6657957
--- /dev/null
@@ -0,0 +1,155 @@
+
+
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*                                             LIBMESH V 5.46                                          */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+/*                                                                                                                     */
+/*     Description:            handle .meshb file format I/O           */
+/*     Author:                         Loic MARECHAL                                           */
+/*     Creation date:          feb 16 2007                                                     */
+/*     Last modification:      dec 09 2011                                                     */
+/*                                                                                                                     */
+/*----------------------------------------------------------*/
+
+
+/*----------------------------------------------------------*/
+/* Defines                                                                                                     */
+/*----------------------------------------------------------*/
+
+#include "SMESH_DriverGMF.hxx"
+
+#define GmfStrSiz 1024
+#define GmfMaxTyp 1000
+#define GmfMaxKwd 80
+#define GmfMshVer 1
+#define GmfRead 1
+#define GmfWrite 2
+#define GmfSca 1
+#define GmfVec 2
+#define GmfSymMat 3
+#define GmfMat 4
+#define GmfFloat 1
+#define GmfDouble 2
+
+enum GmfKwdCod
+{
+       GmfReserved1, \
+       GmfVersionFormatted, \
+       GmfReserved2, \
+       GmfDimension, \
+       GmfVertices, \
+       GmfEdges, \
+       GmfTriangles, \
+       GmfQuadrilaterals, \
+       GmfTetrahedra, \
+       GmfPrisms, \
+       GmfHexahedra, \
+       GmfIterationsAll, \
+       GmfTimesAll, \
+       GmfCorners, \
+       GmfRidges, \
+       GmfRequiredVertices, \
+       GmfRequiredEdges, \
+       GmfRequiredTriangles, \
+       GmfRequiredQuadrilaterals, \
+       GmfTangentAtEdgeVertices, \
+       GmfNormalAtVertices, \
+       GmfNormalAtTriangleVertices, \
+       GmfNormalAtQuadrilateralVertices, \
+       GmfAngleOfCornerBound, \
+       GmfTrianglesP2, \
+       GmfEdgesP2, \
+       GmfSolAtPyramids, \
+       GmfQuadrilateralsQ2, \
+       GmfISolAtPyramids, \
+       GmfSubDomainFromGeom, \
+       GmfTetrahedraP2, \
+       GmfFault_NearTri, \
+       GmfFault_Inter, \
+       GmfHexahedraQ2, \
+       GmfExtraVerticesAtEdges, \
+       GmfExtraVerticesAtTriangles, \
+       GmfExtraVerticesAtQuadrilaterals, \
+       GmfExtraVerticesAtTetrahedra, \
+       GmfExtraVerticesAtPrisms, \
+       GmfExtraVerticesAtHexahedra, \
+       GmfVerticesOnGeometricVertices, \
+       GmfVerticesOnGeometricEdges, \
+       GmfVerticesOnGeometricTriangles, \
+       GmfVerticesOnGeometricQuadrilaterals, \
+       GmfEdgesOnGeometricEdges, \
+       GmfFault_FreeEdge, \
+       GmfPolyhedra, \
+       GmfPolygons, \
+       GmfFault_Overlap, \
+       GmfPyramids, \
+       GmfBoundingBox, \
+       GmfBody, \
+       GmfPrivateTable, \
+       GmfFault_BadShape, \
+       GmfEnd, \
+       GmfTrianglesOnGeometricTriangles, \
+       GmfTrianglesOnGeometricQuadrilaterals, \
+       GmfQuadrilateralsOnGeometricTriangles, \
+       GmfQuadrilateralsOnGeometricQuadrilaterals, \
+       GmfTangents, \
+       GmfNormals, \
+       GmfTangentAtVertices, \
+       GmfSolAtVertices, \
+       GmfSolAtEdges, \
+       GmfSolAtTriangles, \
+       GmfSolAtQuadrilaterals, \
+       GmfSolAtTetrahedra, \
+       GmfSolAtPrisms, \
+       GmfSolAtHexahedra, \
+       GmfDSolAtVertices, \
+       GmfISolAtVertices, \
+       GmfISolAtEdges, \
+       GmfISolAtTriangles, \
+       GmfISolAtQuadrilaterals, \
+       GmfISolAtTetrahedra, \
+       GmfISolAtPrisms, \
+       GmfISolAtHexahedra, \
+       GmfIterations, \
+       GmfTime, \
+       GmfFault_SmallTri, \
+       GmfCoarseHexahedra
+};
+
+
+/*----------------------------------------------------------*/
+/* External procedures                                                                         */
+/*----------------------------------------------------------*/
+
+MESHDriverGMF_EXPORT extern int GmfOpenMesh(const char *, int, ...);
+MESHDriverGMF_EXPORT extern int GmfCloseMesh(int);
+MESHDriverGMF_EXPORT extern int GmfStatKwd(int, int, ...);
+MESHDriverGMF_EXPORT extern int GmfGotoKwd(int, int);
+MESHDriverGMF_EXPORT extern int GmfSetKwd(int, int, ...);
+MESHDriverGMF_EXPORT extern void GmfGetLin(int, int, ...);
+MESHDriverGMF_EXPORT extern void GmfSetLin(int, int, ...);
+
+
+/*----------------------------------------------------------*/
+/* Fortran 77 API                                                                                      */
+/*----------------------------------------------------------*/
+
+#if defined(F77_NO_UNDER_SCORE)
+#define call(x) x
+#else
+#define call(x) x ## _
+#endif
+
+
+/*----------------------------------------------------------*/
+/* Transmesh private API                                                                       */
+/*----------------------------------------------------------*/
+
+#ifdef TRANSMESH
+
+MESHDriverGMF_EXPORT extern char *GmfKwdFmt[ GmfMaxKwd + 1 ][4];
+MESHDriverGMF_EXPORT extern int GmfCpyLin(int, int, int);
+
+#endif
index a60b77ca9e33cde6123d5eb35e4c5c0f5d6a133b..35caa0286e17d144444063469d93701754119c82 100644 (file)
@@ -205,7 +205,7 @@ DriverMED_R_SMESHDS_Mesh
                 aNodeIds.resize( aNbBalls );
                 for(TInt iBall = 0; iBall < aNbBalls && anIsNodeNum; iBall++)
                 {
-                  aNodeIds[iBall] = aNodeInfo->GetElemNum(iBall);
+                  aNodeIds[iBall] = aNodeInfo->GetElemNum( (*aBallInfo->myConn)[ iBall ]-1 );
                   anIsNodeNum = myMesh->FindNode( aNodeIds[iBall] ) ? eVRAI : eFAUX;
                 }
               }
index 39b03f2d619cd4435c71d253ee0d0967f0ebc71f..9d1bf4adf7461c8b7c0c4482b1013f5bb82bb133 100644 (file)
@@ -411,7 +411,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
     if (myDoGroupOfFaces && nbFaces) myFacesDefaultFamilyId = REST_FACES_FAMILY;
     if (myDoGroupOfVolumes && nbVolumes) myVolumesDefaultFamilyId = REST_VOLUMES_FAMILY;
     if (myDoGroupOf0DElems && nb0DElements) my0DElementsDefaultFamilyId = REST_0DELEM_FAMILY;
-    if (myDoGroupOfVolumes && nbVolumes) myBallsDefaultFamilyId = REST_BALL_FAMILY;
+    if (myDoGroupOfBalls && nbBalls) myBallsDefaultFamilyId = REST_BALL_FAMILY;
 
     MESSAGE("Perform - aFamilyInfo");
     //cout << " DriverMED_Family::MakeFamilies() " << endl;
index 0e6d83571d93e754605fe18c5f8180b48c551076..7fbced58b7684e20e0ac7d3c84d2485551cc1b2c 100644 (file)
@@ -55,6 +55,7 @@ libMeshDriverMED_la_CPPFLAGS = \
        $(BOOST_CPPFLAGS) \
        -I$(srcdir)/../Driver \
        -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS
 
 libMeshDriverMED_la_LDFLAGS  = \
index 0e05ad76112e69364e0e7129a873f35d5337cdb2..c66dea1bc7a16abba183146b4c15870b721a093f 100644 (file)
@@ -67,6 +67,7 @@ libMeshDriverUNV_la_CPPFLAGS = \
        $(BOOST_CPPFLAGS) \
        -I$(srcdir)/../Driver \
        -I$(srcdir)/../SMDS \
+       -I$(srcdir)/../SMESHUtils \
        -I$(srcdir)/../SMESHDS
 
 libMeshDriverUNV_la_LDFLAGS  = \
index 0fff1bdc541cd6795c079895d29ea5bb1650960e..a48520cdb5a24f61bf10832cfbe745bd091829e1 100644 (file)
@@ -62,7 +62,7 @@ void UNV164::Write(std::ofstream& out_stream)
     EXCEPTION(runtime_error,"ERROR: Output file not good.");
   
   out_stream<<"    -1" << endl;
-  out_stream<<"  "<<_label_dataset << endl;
+  out_stream<<"   "<<_label_dataset << endl;
 
   out_stream<<"         1  SI: Meter (newton)         2"                                    << endl;
   out_stream<<"    1.0000000000000000E+0    1.0000000000000000E+0    1.0000000000000000E+0" << endl;
index b969674a181e6e8f3953ac794aa908348ae1e059..5276980b912dea34daa7c5a1e145b2d0a14a517c 100644 (file)
@@ -21,7 +21,6 @@
 #  Author : Patrick GOLDBRONN (CEA)
 #  Modified by : Alexander BORODIN (OCN) - autotools usage
 #  Module : SMESH
-#  $Header$
 #
 include $(top_srcdir)/adm_local/unix/make_common_starter.am
 
@@ -39,6 +38,7 @@ SUBDIRS = \
        DriverDAT \
        DriverUNV \
        DriverSTL \
+       DriverGMF \
        $(DriverCGNS_SUDIR) \
        SMESH \
        SMESH_I \
@@ -61,5 +61,6 @@ if SMESH_ENABLE_GUI
 endif
 
 DIST_SUBDIRS =         SMDS SMESHDS Controls Driver DriverMED DriverDAT DriverUNV DriverSTL DriverCGNS \
+               DriverGMF \
                SMESHUtils SMESH SMESH_I SMESHClient SMESH_SWIG MEFISTO2 StdMeshers StdMeshers_I OBJECT         \
                SMESHFiltersSelection SMESHGUI PluginUtils SMESH_SWIG_WITHIHM StdMeshersGUI SMESH_PY Tools
index 31cb50d27f5889b295cf2979181de257d1be387d..59cf1400c2bdd61cc5c0753eca4e910990ca5146 100644 (file)
@@ -37,7 +37,9 @@ salomeinclude_HEADERS = \
        SMESH_FaceOrientationFilter.h \
        SMESH_ScalarBarActor.h \
        SMESH_NodeLabelActor.h \
-       SMESH_CellLabelActor.h
+       SMESH_CellLabelActor.h \
+       SMESH_SVTKActor.h 
+
 
 # Libraries targets
 
@@ -52,7 +54,8 @@ dist_libSMESHObject_la_SOURCES = \
        SMESH_FaceOrientationFilter.cxx \
        SMESH_ScalarBarActor.cxx \
        SMESH_NodeLabelActor.cxx \
-       SMESH_CellLabelActor.cxx 
+       SMESH_CellLabelActor.cxx \
+       SMESH_SVTKActor.cxx 
 
 libSMESHObject_la_CPPFLAGS = \
         $(QT_INCLUDES) \
index 4daba11f8575cdb82ec8ed052654fa09dfb902c5..1463f03fe5d96aebeeddd5550a01377c3a6db7cb 100644 (file)
@@ -37,6 +37,7 @@
 #include "VTKViewer_ExtractUnstructuredGrid.h"
 #include "VTKViewer_FramedTextActor.h"
 #include "SALOME_InteractiveObject.hxx"
+#include "SMESH_SVTKActor.h"
 
 #include "SUIT_Session.h"
 #include "SUIT_ResourceMgr.h"
@@ -127,6 +128,12 @@ SMESH_ActorDef::SMESH_ActorDef()
   myIsPointsVisible = false;
   myIsEntityModeCache = false;
 
+  myHighlightActor = SMESH_SVTKActor::New();
+  myHighlightActor->Initialize();
+
+  myPreHighlightActor = SMESH_SVTKActor::New();
+  myPreHighlightActor->Initialize();
+
   myIsShrinkable = false;
   myIsShrunk = false;
 
@@ -141,6 +148,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   vtkFloatingPointType aElem0DSize   = SMESH::GetFloat("SMESH:elem0d_size",5);
   vtkFloatingPointType aBallElemSize = SMESH::GetFloat("SMESH:ball_elem_size",10);
   vtkFloatingPointType aLineWidth    = SMESH::GetFloat("SMESH:element_width",1);
+  vtkFloatingPointType aOutlineWidth = SMESH::GetFloat("SMESH:outline_width",1);
 
   vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New();
   VTKViewer_ExtractUnstructuredGrid* aFilter = NULL;
@@ -159,6 +167,15 @@ SMESH_ActorDef::SMESH_ActorDef()
   bfc = Qtx::mainColorToSecondary(ffc, delta);
   myBackSurfaceProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
 
+  myNormalVProp = vtkProperty::New();
+  SMESH::GetColor( "SMESH", "volume_color", ffc, delta, "255,0,170|-100" );
+  myNormalVProp->SetColor( ffc.redF(), ffc.greenF(), ffc.blueF() );
+  myDeltaVBrightness = delta;
+
+  myReversedVProp = vtkProperty::New();
+  bfc = Qtx::mainColorToSecondary(ffc, delta);
+  myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
+
   my2DActor = SMESH_CellLabelActor::New();
   my2DActor->SetStoreGemetryMapping(true);
   my2DActor->SetUserMatrix(aMatrix);
@@ -201,8 +218,8 @@ SMESH_ActorDef::SMESH_ActorDef()
   my3DActor->SetStoreGemetryMapping(true);
   my3DActor->SetUserMatrix(aMatrix);
   my3DActor->PickableOff();
-  my3DActor->SetProperty(mySurfaceProp);
-  my3DActor->SetBackfaceProperty(myBackSurfaceProp);
+  my3DActor->SetProperty(myNormalVProp);
+  my3DActor->SetBackfaceProperty(myReversedVProp);
   my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
   my3DActor->SetCoincident3DAllowed(true);
   aFilter = my3DActor->GetExtractUnstructuredGrid();
@@ -224,11 +241,19 @@ SMESH_ActorDef::SMESH_ActorDef()
   aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
 //#endif
 
+  my3DExtProp = vtkProperty::New();
+  my3DExtProp->DeepCopy(myNormalVProp);
+  SMESH::GetColor( "SMESH", "volume_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 170 ) );
+  anRGB[0] = 1 - anRGB[0];
+  anRGB[1] = 1 - anRGB[1];
+  anRGB[2] = 1 - anRGB[2];
+  my3DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
+
   my3DExtActor = SMESH_DeviceActor::New();
   my3DExtActor->SetUserMatrix(aMatrix);
   my3DExtActor->PickableOff();
-  my3DExtActor->SetProperty(my2DExtProp);
-  my3DExtActor->SetBackfaceProperty(my2DExtProp);
+  my3DExtActor->SetProperty(my3DExtProp);
+  my3DExtActor->SetBackfaceProperty(my3DExtProp);
   my3DExtActor->SetRepresentation(SMESH_DeviceActor::eSurface);
   my3DExtActor->SetCoincident3DAllowed(true);
   aFilter = my3DExtActor->GetExtractUnstructuredGrid();
@@ -318,7 +343,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   //Definition 0D device of the actor (ball elements)
   //-----------------------------------------------
   myBallProp = vtkProperty::New();
-  SMESH::GetColor( "SMESH", "ball_elem_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 0 ) );
+  SMESH::GetColor( "SMESH", "ball_elem_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 85, 255 ) );
   myBallProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
   myBallProp->SetPointSize(aBallElemSize);
 
@@ -330,9 +355,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   myBallActor->SetProperty(myBallProp);
   myBallActor->SetRepresentation(SMESH_DeviceActor::eSurface);
   aFilter = myBallActor->GetExtractUnstructuredGrid();
-  //aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
   aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
-  aFilter->RegisterCellsWithType(VTK_VERTEX);
   aFilter->RegisterCellsWithType(VTK_POLY_VERTEX);
   
   //my0DExtProp = vtkProperty::New();
@@ -410,14 +433,18 @@ SMESH_ActorDef::SMESH_ActorDef()
   myHighlightProp->SetLineWidth(aLineWidth);
   myHighlightProp->SetRepresentation(1);
 
+  myBallHighlightProp = vtkProperty::New();
+  myBallHighlightProp->DeepCopy(myHighlightProp);
+  myBallHighlightProp->SetPointSize(aBallElemSize);
+  
+
   myOutLineProp = vtkProperty::New();
   myOutLineProp->SetAmbient(1.0);
   myOutLineProp->SetDiffuse(0.0);
   myOutLineProp->SetSpecular(0.0);
   SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 70, 0 ) );
   myOutLineProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
-  myOutLineProp->SetPointSize(aElem0DSize); // ??
-  myOutLineProp->SetLineWidth(aLineWidth);
+  myOutLineProp->SetLineWidth(aOutlineWidth);
   myOutLineProp->SetRepresentation(1);
 
   myPreselectProp = vtkProperty::New();
@@ -430,6 +457,10 @@ SMESH_ActorDef::SMESH_ActorDef()
   myPreselectProp->SetLineWidth(aLineWidth);
   myPreselectProp->SetRepresentation(1);
 
+  myBallPreselectProp = vtkProperty::New();
+  myBallPreselectProp->DeepCopy(myPreselectProp);
+  myBallPreselectProp->SetPointSize(aBallElemSize);
+
   myHighlitableActor = SMESH_DeviceActor::New();
   myHighlitableActor->SetUserMatrix(aMatrix);
   myHighlitableActor->PickableOff();
@@ -490,7 +521,7 @@ SMESH_ActorDef::SMESH_ActorDef()
   my2DActor->SetQuadraticArcAngle(aQuadraticAngle);
   
   // Set colors of the name actor
-  SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
+  SMESH::GetColor( "SMESH", "default_grp_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
   myNameActor->SetBackgroundColor(anRGB[0], anRGB[1], anRGB[2]);
   SMESH::GetColor( "SMESH", "group_name_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) );
   myNameActor->SetForegroundColor(anRGB[0], anRGB[1], anRGB[2]);
@@ -499,6 +530,8 @@ SMESH_ActorDef::SMESH_ActorDef()
   my2dHistogram = 0;
 #endif
 
+  SetBallSize(aBallElemSize);
+  Set0DSize(aElem0DSize);
 }
 
 
@@ -518,6 +551,8 @@ SMESH_ActorDef::~SMESH_ActorDef()
 
   mySurfaceProp->Delete();
   myBackSurfaceProp->Delete();
+  myNormalVProp->Delete();
+  myReversedVProp->Delete();
   myOutLineProp->Delete();
 
   myEdgeProp->Delete();
@@ -544,6 +579,7 @@ SMESH_ActorDef::~SMESH_ActorDef()
   my2DExtProp->Delete();
   my2DExtActor->Delete();
   my3DActor->Delete();
+  my3DExtProp->Delete();
   my3DExtActor->Delete();
 
   myNodeActor->Delete();
@@ -555,6 +591,9 @@ SMESH_ActorDef::~SMESH_ActorDef()
   myImplicitBoolean->Delete();
 
   myTimeStamp->Delete();
+  myBallHighlightProp->Delete();
+  myBallPreselectProp->Delete();
+          
 }
 
 void SMESH_ActorDef::Delete()
@@ -639,15 +678,15 @@ bool SMESH_ActorDef::GetFacesOriented()
   return myIsFacesOriented;
 }
 
-void SMESH_ActorDef::SetFacesOrientationColor(vtkFloatingPointType theColor[3])
+void SMESH_ActorDef::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b)
 {
-  my2DActor->SetFacesOrientationColor( theColor );
-  my3DActor->SetFacesOrientationColor( theColor );
+  my2DActor->SetFacesOrientationColor( r, g, b );
+  my3DActor->SetFacesOrientationColor( r, g, b );
 }
 
-void SMESH_ActorDef::GetFacesOrientationColor(vtkFloatingPointType theColor[3])
+void SMESH_ActorDef::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b)
 {
-  my3DActor->GetFacesOrientationColor( theColor );
+  my3DActor->GetFacesOrientationColor( r, g, b );
 }
 
 void SMESH_ActorDef::SetFacesOrientationScale(vtkFloatingPointType theScale)
@@ -957,6 +996,9 @@ SetControlMode(eControl theMode,
 
 
 void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
+  
+  //myHighlightActor->AddToRender(theRenderer);
+
   theRenderer->AddActor(myBaseActor);  
   theRenderer->AddActor(myNodeExtActor);
   theRenderer->AddActor(my1DExtActor);
@@ -1053,6 +1095,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj,
   my2DActor->GetPolygonOffsetParameters(aFactor,aUnits);
   my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75);
   my2DExtActor->SetPolygonOffsetParameters(aFactor,aUnits*0.5);
+  my3DActor->SetPolygonOffsetParameters(2*aFactor,aUnits);
 
   SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
   if( !mgr )
@@ -1307,10 +1350,10 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
       myNodeActor->VisibilityOn();
     }
 
-    if(myEntityMode & e0DElements){
+    if(myEntityMode & e0DElements && GetRepresentation() != ePoint ){
       my0DActor->VisibilityOn();
     }
-    if(myEntityMode & eBallElem){
+    if(myEntityMode & eBallElem && GetRepresentation() != ePoint ){
       myBallActor->VisibilityOn();
     }
 
@@ -1492,6 +1535,8 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge);
   int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face);
   int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume);
+  int aNb0Ds       = myVisualObj->GetNbEntities(SMDSAbs_0DElement);
+  int aNbBalls       = myVisualObj->GetNbEntities(SMDSAbs_Ball);
 
   if (theMode < 0) {
     myRepresentation = eSurface;
@@ -1503,10 +1548,10 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   } else {
     switch (theMode) {
     case eEdge:
-      if (!aNbFaces && !aNbVolumes && !aNbEdges) return;
+      if (!aNbFaces && !aNbVolumes && !aNbEdges && !aNb0Ds && !aNbBalls) return;
       break;
     case eSurface:
-      if (!aNbFaces && !aNbVolumes) return;
+      if (!aNbFaces && !aNbVolumes && !aNb0Ds && !aNbBalls) return;
       break;
     }    
     myRepresentation = theMode;
@@ -1528,6 +1573,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
   myNodeActor->SetVisibility(false);
   myNodeExtActor->SetVisibility(false);
   vtkProperty *aProp = NULL, *aBackProp = NULL;
+  vtkProperty *aPropVN = NULL, *aPropVR = NULL;
   SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1);
   SMESH_Actor::EQuadratic2DRepresentation aQuadraticMode = GetQuadratic2DRepresentation();
   switch (myRepresentation) {
@@ -1535,16 +1581,18 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
     myPickableActor = myNodeActor;
     myNodeActor->SetVisibility(true);
     aQuadraticMode = SMESH_Actor::eLines;
-    aProp = aBackProp = myNodeProp;
+    aProp = aBackProp = aPropVN = aPropVR = myNodeProp;
     aReperesent = SMESH_DeviceActor::ePoint;
     break;
   case eEdge:
-    aProp = aBackProp = myEdgeProp;
+    aProp = aBackProp = aPropVN = aPropVR = myEdgeProp;
     aReperesent = SMESH_DeviceActor::eInsideframe;
     break;
   case eSurface:
     aProp = mySurfaceProp;
     aBackProp = myBackSurfaceProp;
+    aPropVN = myNormalVProp;
+    aPropVR = myReversedVProp;
     aReperesent = SMESH_DeviceActor::eSurface;
     break;
   }
@@ -1560,8 +1608,8 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
 
   my2DExtActor->SetRepresentation(aReperesent);
   
-  my3DActor->SetProperty(aProp);
-  my3DActor->SetBackfaceProperty(aBackProp);
+  my3DActor->SetProperty(aPropVN);
+  my3DActor->SetBackfaceProperty(aPropVR);
   my3DActor->SetRepresentation(aReperesent);
 
   //my0DExtActor->SetVisibility(false);
@@ -1633,9 +1681,12 @@ void SMESH_ActorDef::UpdateHighlight(){
     {
       if(myIsHighlighted) {
         myHighlitableActor->SetProperty(myHighlightProp);
+       myBallActor->SetProperty(myBallHighlightProp);
       }else if(myIsPreselected){
         myHighlitableActor->SetProperty(myPreselectProp);
+       myBallActor->SetProperty(myBallPreselectProp);
       } else if(anIsVisible){
+       myBallActor->SetProperty(myBallProp);
         (myRepresentation == eSurface) ? 
           myHighlitableActor->SetProperty(myOutLineProp) : myHighlitableActor->SetProperty(myEdgeProp);
       }
@@ -1777,10 +1828,15 @@ static void GetColor(vtkProperty *theProperty, vtkFloatingPointType& r,vtkFloati
 void SMESH_ActorDef::SetOpacity(vtkFloatingPointType theValue){
   mySurfaceProp->SetOpacity(theValue);
   myBackSurfaceProp->SetOpacity(theValue);
+  myNormalVProp->SetOpacity(theValue);
+  myReversedVProp->SetOpacity(theValue);
   myEdgeProp->SetOpacity(theValue);
+  myOutLineProp->SetOpacity(theValue);
   myNodeProp->SetOpacity(theValue);
 
   my1DProp->SetOpacity(theValue);
+  my0DProp->SetOpacity(theValue);
+  myBallProp->SetOpacity(theValue);
 }
 
 
@@ -1791,9 +1847,9 @@ vtkFloatingPointType SMESH_ActorDef::GetOpacity(){
 
 void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){
   mySurfaceProp->SetColor(r,g,b);
+  my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
   if( SMESH_GroupObj* aGroupObj = dynamic_cast<SMESH_GroupObj*>( myVisualObj.get() ) )
-    if( aGroupObj->GetElementType() == SMDSAbs_Face ||
-        aGroupObj->GetElementType() == SMDSAbs_Volume )
+    if( aGroupObj->GetElementType() == SMDSAbs_Face )
       myNameActor->SetBackgroundColor(r,g,b);
   
   myDeltaBrightness = delta;
@@ -1804,10 +1860,27 @@ void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType
 
 void SMESH_ActorDef::GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){
   ::GetColor(mySurfaceProp,r,g,b);
-  my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
   delta = myDeltaBrightness;
 }
 
+void SMESH_ActorDef::SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){
+  myNormalVProp->SetColor(r,g,b);
+  my3DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
+  if( SMESH_GroupObj* aGroupObj = dynamic_cast<SMESH_GroupObj*>( myVisualObj.get() ) )
+    if( aGroupObj->GetElementType() == SMDSAbs_Volume )
+      myNameActor->SetBackgroundColor(r,g,b);
+  
+  myDeltaVBrightness = delta;
+  QColor bfc = Qtx::mainColorToSecondary(QColor(int(r*255),int(g*255),int(b*255)), delta);
+  myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
+  Modified();
+}
+
+void SMESH_ActorDef::GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){
+  ::GetColor(myNormalVProp,r,g,b);
+  delta = myDeltaVBrightness;
+}
+
 void SMESH_ActorDef::SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){
   myEdgeProp->SetColor(r,g,b);
   my1DProp->SetColor(r,g,b);
@@ -1871,6 +1944,7 @@ void SMESH_ActorDef::GetBallColor(vtkFloatingPointType& r,vtkFloatingPointType&
 
 void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ 
   myHighlightProp->SetColor(r,g,b);
+  myBallHighlightProp->SetColor(r,g,b);
   Modified();
 }
 
@@ -1880,6 +1954,7 @@ void SMESH_ActorDef::GetHighlightColor(vtkFloatingPointType& r,vtkFloatingPointT
 
 void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){ 
   myPreselectProp->SetColor(r,g,b);
+  myBallPreselectProp->SetColor(r,g,b);
   Modified();
 }
 
@@ -1899,15 +1974,36 @@ void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){
   my1DProp->SetLineWidth(theVal + aLineWidthInc);
   my1DExtProp->SetLineWidth(theVal + aLineWidthInc);    
   my2DExtProp->SetLineWidth(theVal + aLineWidthInc);
+  my3DExtProp->SetLineWidth(theVal + aLineWidthInc);
   myOutLineProp->SetLineWidth(theVal);
   myHighlightProp->SetLineWidth(theVal);
   myPreselectProp->SetLineWidth(theVal);
   Modified();
 }
 
+vtkFloatingPointType SMESH_ActorDef::GetOutlineWidth()
+{
+  return myOutLineProp->GetLineWidth();
+}
+
+void SMESH_ActorDef::SetOutlineWidth(vtkFloatingPointType theVal)
+{
+  myOutLineProp->SetLineWidth(theVal);
+  Modified();
+}
 
 void SMESH_ActorDef::Set0DSize(vtkFloatingPointType theVal){
   my0DProp->SetPointSize(theVal);
+  myHighlightProp->SetPointSize(theVal);
+  myPreselectProp->SetPointSize(theVal);
+
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) {
+    aCustom->Set0DSize(theVal);
+  }
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) {
+    aCustom->Set0DSize(theVal);
+  }
+
   Modified();
 }
 
@@ -1917,6 +2013,15 @@ vtkFloatingPointType SMESH_ActorDef::Get0DSize(){
 
 void SMESH_ActorDef::SetBallSize(vtkFloatingPointType theVal){
   myBallProp->SetPointSize(theVal);
+  myBallHighlightProp->SetPointSize(theVal);
+  myBallPreselectProp->SetPointSize(theVal);
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) {
+    aCustom->SetBallSize(theVal);
+  }
+  if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) {
+    aCustom->SetBallSize(theVal);
+  }
+
   Modified();
 }
 
index 4e04546f42237bb77bfd10fb74bfb149a8d9c2dd..fc954253d052994d1848ef53fa1602e750fb52bd 100644 (file)
@@ -64,6 +64,9 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
   virtual void SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta ) = 0;
   virtual void GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta ) = 0;
     
+  virtual void SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta ) = 0;
+  virtual void GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta) = 0;
+
   virtual void SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) = 0;
   virtual void GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) = 0;
 
@@ -88,6 +91,9 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
   virtual vtkFloatingPointType GetLineWidth() = 0;
   virtual void SetLineWidth(vtkFloatingPointType theVal) = 0;
 
+  virtual vtkFloatingPointType GetOutlineWidth() = 0;
+  virtual void SetOutlineWidth(vtkFloatingPointType theVal) = 0;
+
   virtual void Set0DSize(vtkFloatingPointType size) = 0;
   virtual vtkFloatingPointType Get0DSize() = 0;
 
@@ -122,8 +128,8 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
   virtual void SetFacesOriented(bool theIsFacesOriented) = 0;
   virtual bool GetFacesOriented() = 0;
 
-  virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]) = 0;
-  virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]) = 0;
+  virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) = 0;
+  virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) = 0;
 
   virtual void SetFacesOrientationScale(vtkFloatingPointType theScale) = 0;
   virtual vtkFloatingPointType GetFacesOrientationScale() = 0;
index b346e68b467d50648abb1cbdf18b952d137e12b2..11d7fe41ac030f0ae2fa35d61108dc60a9a49b73 100644 (file)
@@ -106,6 +106,9 @@ class SMESH_ActorDef : public SMESH_Actor
   virtual void SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta );
   virtual void GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta);
 
+  virtual void SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta );
+  virtual void GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta);
+
   virtual void SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
   virtual void GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
 
@@ -131,6 +134,9 @@ class SMESH_ActorDef : public SMESH_Actor
   virtual vtkFloatingPointType GetLineWidth();
   virtual void SetLineWidth(vtkFloatingPointType theVal);
 
+  virtual vtkFloatingPointType GetOutlineWidth();
+  virtual void SetOutlineWidth(vtkFloatingPointType theVal);
+
   virtual void Set0DSize(vtkFloatingPointType size);
   virtual vtkFloatingPointType Get0DSize();
 
@@ -180,8 +186,8 @@ class SMESH_ActorDef : public SMESH_Actor
   virtual void SetFacesOriented(bool theIsFacesOriented);
   virtual bool GetFacesOriented();
 
-  virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]);
-  virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]);
+  virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
+  virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
 
   virtual void SetFacesOrientationScale(vtkFloatingPointType theScale);
   virtual vtkFloatingPointType GetFacesOrientationScale();
@@ -233,6 +239,8 @@ class SMESH_ActorDef : public SMESH_Actor
 
   vtkProperty* mySurfaceProp;
   vtkProperty* myBackSurfaceProp;
+  vtkProperty* myNormalVProp;
+  vtkProperty* myReversedVProp;
   vtkProperty* myEdgeProp;
   vtkProperty* myNodeProp;
 
@@ -243,12 +251,16 @@ class SMESH_ActorDef : public SMESH_Actor
   vtkProperty* myHighlightProp;
   vtkProperty* myOutLineProp;
   vtkProperty* myPreselectProp;
+
+  vtkProperty* myBallHighlightProp;
+  vtkProperty* myBallPreselectProp;
           
   SMESH_DeviceActor* myHighlitableActor;
 
   eControl myControlMode;
   SMESH::Controls::FunctorPtr myFunctor;
   vtkProperty* my2DExtProp;
+  vtkProperty* my3DExtProp;
   SMESH_CellLabelActor* my2DActor;
   SMESH_DeviceActor* my2DExtActor;
   SMESH_CellLabelActor* my3DActor;
@@ -292,6 +304,7 @@ class SMESH_ActorDef : public SMESH_Actor
   bool myIsFacesOriented;
   
   int myDeltaBrightness;
+  int myDeltaVBrightness;
 
   VTK::MarkerTexture myMarkerTexture;
 
index 7a88f701b6751579b33bba7b74e96f3924701c0b..d53765d79baf12703c580dad0c702028a1d3c08c 100644 (file)
@@ -642,16 +642,16 @@ SMESH_DeviceActor
 
 void
 SMESH_DeviceActor
-::SetFacesOrientationColor(vtkFloatingPointType theColor[3])
+::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b)
 {
-  myFaceOrientation->GetProperty()->SetColor( theColor );
+  myFaceOrientation->GetProperty()->SetColor( r, g, b );
 }
 
 void
 SMESH_DeviceActor
-::GetFacesOrientationColor(vtkFloatingPointType theColor[3])
+::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b)
 {
-  myFaceOrientation->GetProperty()->GetColor( theColor );
+  myFaceOrientation->GetProperty()->GetColor( r, g, b );
 }
 
 void
index 8c3abb7ae87f956077a9cf2e02171513a8ab01b1..554af35d9462d64691e611ec5de367a04f561bea 100644 (file)
@@ -79,8 +79,8 @@ class SMESHOBJECT_EXPORT SMESH_DeviceActor: public vtkLODActor{
   virtual void SetFacesOriented(bool theIsFacesOriented);
   virtual bool GetFacesOriented() { return myIsFacesOriented; }
 
-  virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]);
-  virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]);
+  virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
+  virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
 
   virtual void SetFacesOrientationScale(vtkFloatingPointType theScale);
   virtual vtkFloatingPointType GetFacesOrientationScale();
index e137a1c6d202d47ec858db715030421bd8653246..30bef057940ff267aebc4eed6203d4e94baf83a5 100644 (file)
@@ -82,14 +82,14 @@ static int MYDEBUGWITHFILES = 0;
 // purpose  : Get type of VTK cell
 //=================================================================================
 static inline vtkIdType getCellType( const SMDSAbs_ElementType theType,
-                                     const bool thePoly,
-                                     const int theNbNodes )
+                                     const bool                thePoly,
+                                     const int                 theNbNodes )
 {
   switch( theType )
   {
     case SMDSAbs_0DElement:         return VTK_VERTEX;
 
-    case SMDSAbs_Ball:   return VTK_POLY_VERTEX;
+    case SMDSAbs_Ball:              return VTK_POLY_VERTEX;
 
     case SMDSAbs_Edge: 
       if( theNbNodes == 2 )         return VTK_LINE;
@@ -345,16 +345,21 @@ void SMESH_VisualObjDef::buildElemPrs()
 
   // Calculate cells size
 
-  static SMDSAbs_ElementType aTypes[ 5 ] =
-    { SMDSAbs_Ball, SMDSAbs_0DElement, SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume };
+  const int nbTypes = 5;
+  static SMDSAbs_ElementType aTypes[ nbTypes ] =
+    { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume, SMDSAbs_Ball, SMDSAbs_0DElement };
 
   // get entity data
   map<SMDSAbs_ElementType,int> nbEnts;
   map<SMDSAbs_ElementType,TEntityList> anEnts;
 
-  for ( int i = 0; i <= 3; i++ )
-    nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
+  vtkIdType aNbCells = 0;
 
+  for ( int i = 0; i < nbTypes; i++ )
+  {
+    nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
+    aNbCells += nbEnts[ aTypes [ i ]];
+  }
   // PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead,
   // so check remaining memory size for safety
   SMDS_Mesh::CheckMemory(); // PAL16631
@@ -362,7 +367,7 @@ void SMESH_VisualObjDef::buildElemPrs()
   vtkIdType aCellsSize =  2 * nbEnts[ SMDSAbs_0DElement ] + 3 * nbEnts[ SMDSAbs_Edge ];
   aCellsSize += 2 * nbEnts[ SMDSAbs_Ball ];
 
-  for ( int i = 2; i <= 3; i++ ) // iterate through faces and volumes
+  for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes
   {
     if ( nbEnts[ aTypes[ i ] ] )
     {
@@ -388,11 +393,6 @@ void SMESH_VisualObjDef::buildElemPrs()
       }
     }
   }
-  
-  vtkIdType aNbCells =
-    nbEnts[ SMDSAbs_0DElement ] + nbEnts[ SMDSAbs_Ball ] + nbEnts[ SMDSAbs_Edge ] +
-    nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ];
-
   if ( MYDEBUG )
     MESSAGE( "Update - aNbCells = "<<aNbCells<<"; aCellsSize = "<<aCellsSize );
 
@@ -417,7 +417,7 @@ void SMESH_VisualObjDef::buildElemPrs()
 
   SMDS_Mesh::CheckMemory(); // PAL16631
 
-  for ( int i = 0; i <= 3; i++ ) // iterate through 0d elements, edges, faces and volumes
+  for ( int i = 0; i < nbTypes; i++ ) // iterate through all types of elements
   {
     if ( nbEnts[ aTypes[ i ] ] > 0 ) {
       
diff --git a/src/OBJECT/SMESH_SVTKActor.cxx b/src/OBJECT/SMESH_SVTKActor.cxx
new file mode 100644 (file)
index 0000000..b86c81d
--- /dev/null
@@ -0,0 +1,184 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+//  SMESH OBJECT : interactive object for SMESH visualization
+//  File   : SMESH_SVTKActor.cxx
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+
+#include "SMESH_SVTKActor.h"
+
+#include <SVTK_Utils.h>
+#include <SALOME_Actor.h>
+
+
+#include <SVTK_DeviceActor.h>
+#include <vtkPoints.h>
+#include <vtkRenderer.h>
+#include <vtkObjectFactory.h>
+#include <vtkUnstructuredGrid.h>
+#include <vtkCell.h>
+#include <vtkDataSetMapper.h>
+
+vtkStandardNewMacro(SMESH_SVTKActor);
+
+/*!
+  Constructor
+*/
+SMESH_SVTKActor::SMESH_SVTKActor():
+  my0DGrid(vtkUnstructuredGrid::New()),
+  myBallGrid(vtkUnstructuredGrid::New())
+{
+  my0DActor = SVTK_DeviceActor::New();
+  myBallActor = SVTK_DeviceActor::New();
+
+  myBallActor->SetResolveCoincidentTopology(false);
+  myBallActor->SetCoincident3DAllowed(true);
+  myBallActor->PickableOff();
+  my0DActor->SetResolveCoincidentTopology(false);
+  my0DActor->SetCoincident3DAllowed(true);
+  my0DActor->PickableOff();
+
+  my0DGrid->Allocate();
+  myBallGrid->Allocate();
+}
+
+/*!
+  Constructor
+*/
+SMESH_SVTKActor::~SMESH_SVTKActor() {
+  my0DActor->Delete();
+  myBallActor->Delete();
+  my0DGrid->Delete();
+  myBallGrid->Delete();
+}
+
+/*!
+  Publishes the actor in all its internal devices
+*/
+void SMESH_SVTKActor::AddToRender(vtkRenderer* theRenderer) {
+  Superclass::AddToRender(theRenderer);
+  float a0D = my0DActor->GetProperty()->GetPointSize();
+  float aBall = myBallActor->GetProperty()->GetPointSize();
+  my0DActor->GetProperty()->DeepCopy(GetProperty());
+  myBallActor->GetProperty()->DeepCopy(GetProperty());
+  my0DActor->GetProperty()->SetPointSize(a0D);
+  myBallActor->GetProperty()->SetPointSize(aBall);
+  theRenderer->AddActor(my0DActor);
+  theRenderer->AddActor(myBallActor);
+  
+}
+
+/*!
+  Removes the actor from all its internal devices
+*/
+void 
+SMESH_SVTKActor
+::RemoveFromRender(vtkRenderer* theRenderer)
+{
+  Superclass::RemoveFromRender(theRenderer);
+  theRenderer->RemoveActor( myBallActor );
+  theRenderer->RemoveActor( my0DActor );
+}
+
+void
+SMESH_SVTKActor
+::MapCells(SALOME_Actor* theMapActor,
+           const TColStd_IndexedMapOfInteger& theMapIndex)
+{
+  myUnstructuredGrid->Initialize();
+  myUnstructuredGrid->Allocate();
+
+  my0DGrid->Initialize();
+  my0DGrid->Allocate();
+
+  myBallGrid->Initialize();
+  myBallGrid->Allocate();
+
+  vtkDataSet *aSourceDataSet = theMapActor->GetInput();
+  SVTK::CopyPoints( GetSource(), aSourceDataSet );
+  SVTK::CopyPoints( myBallGrid, aSourceDataSet );
+  SVTK::CopyPoints( my0DGrid,    aSourceDataSet );
+
+  int aNbOfParts = theMapIndex.Extent();
+  for(int ind = 1; ind <= aNbOfParts; ind++){
+    int aPartId = theMapIndex( ind );
+    if(vtkCell* aCell = theMapActor->GetElemCell(aPartId))
+      {
+#if VTK_XVERSION > 50700
+      if (aCell->GetCellType() != VTK_POLYHEDRON)
+#endif
+      if(aCell->GetCellType() == VTK_VERTEX ) {
+       my0DGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+      } else if(aCell->GetCellType() == VTK_POLY_VERTEX ) {
+       myBallGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+      } else {
+        myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
+      }
+#if VTK_XVERSION > 50700
+      else
+        {
+          vtkPolyhedron *polyhedron = dynamic_cast<vtkPolyhedron*>(aCell);
+          if (!polyhedron)
+            throw SALOME_Exception(LOCALIZED ("not a polyhedron"));
+          vtkIdType *pts = polyhedron->GetFaces();
+          myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),pts[0], pts+1);
+        }
+#endif
+      }
+    
+  UnShrink();
+  if(theMapActor->IsShrunk()){
+    SetShrinkFactor(theMapActor->GetShrinkFactor());
+    SetShrink();
+  }
+
+  myMapIndex = theMapIndex;
+  }
+}
+  
+void
+SMESH_SVTKActor
+::Initialize()
+{
+  Superclass::Initialize();
+  my0DActor->SetInput(my0DGrid);
+  myBallActor->SetInput(myBallGrid);
+}
+
+
+void SMESH_SVTKActor::SetVisibility( int theVisibility ) {
+  Superclass::SetVisibility( theVisibility );  
+  my0DActor->SetVisibility( theVisibility );
+  myBallActor->SetVisibility( theVisibility );
+}
+
+
+void SMESH_SVTKActor::Set0DSize(float theSize) {
+  my0DActor->GetProperty()->SetPointSize(theSize);  
+}
+
+void SMESH_SVTKActor::SetBallSize(float theSize) {
+  myBallActor->GetProperty()->SetPointSize(theSize);
+}
+
diff --git a/src/OBJECT/SMESH_SVTKActor.h b/src/OBJECT/SMESH_SVTKActor.h
new file mode 100644 (file)
index 0000000..54b3ad3
--- /dev/null
@@ -0,0 +1,82 @@
+// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+//  SMESH OBJECT : interactive object for SMESH visualization
+//  File   : SMESH_SVTKActor.h
+//  Author : Roman NIKOLAEV
+//  Module : SMESH
+//
+#ifndef SMESH_SVTKACTOR_H
+#define SMESH_SVTKACTOR_H
+
+#include "SMESH_Object.h"
+#include <SVTK_Actor.h>
+
+
+class SVTK_Actor;
+class vtkUnstructureGrid;
+class vtkDataSetMapper;
+
+class SMESHOBJECT_EXPORT SMESH_SVTKActor : public SVTK_Actor {
+
+public:
+  static SMESH_SVTKActor* New();
+
+  vtkTypeMacro(SMESH_SVTKActor, SVTK_Actor);
+
+  void SetBallSize(float theSize);
+  void Set0DSize(float theSize);
+
+  //! To publish the actor an all its internal devices
+  virtual
+  void
+  AddToRender(vtkRenderer* theRendere); 
+
+  virtual void SetVisibility( int theVisibility );
+
+  //! Initialiaze the instance completely
+  virtual void
+  Initialize();
+
+  //! Allow to recostruct selected cells from source SALOME_Actor and map of subindexes
+  virtual void
+  MapCells(SALOME_Actor* theMapActor,
+           const TColStd_IndexedMapOfInteger& theMapIndex);
+
+
+  //! To remove the actor an all its internal devices
+  virtual
+  void
+  RemoveFromRender(vtkRenderer* theRendere);
+
+ protected:
+  SVTK_DeviceActor* my0DActor;
+  SVTK_DeviceActor* myBallActor;
+
+  vtkUnstructuredGrid* my0DGrid;
+  vtkUnstructuredGrid* myBallGrid;
+  
+  SMESH_SVTKActor();
+  virtual ~SMESH_SVTKActor();
+};
+
+#endif
index 56854fd1da7e00dfc8236684b898740517eaca9c..c4557b2361ed42188d8c4f99e849c8d83c532031 100644 (file)
@@ -42,7 +42,7 @@ typedef struct
   int nbElems;
 } ListElemByNodesType; // TODO resize for polyhedrons
 
-class DownIdType
+class SMDS_EXPORT DownIdType
 {
 public:
   DownIdType(int a, unsigned char b) :
@@ -64,7 +64,7 @@ struct DownIdCompare
   }
 };
 
-class SMDS_Downward
+class SMDS_EXPORT SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
   friend class SMDS_Down2D;
@@ -109,7 +109,7 @@ protected:
   static std::vector<int> _cellDimension; //!< conversion table: type --> dimension
 };
 
-class SMDS_Down1D: public SMDS_Downward
+class SMDS_EXPORT SMDS_Down1D: public SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -140,7 +140,7 @@ protected:
   std::vector<int> _upCellIndex; //!< compacted storage after connectivity calculation
 };
 
-class SMDS_Down2D: public SMDS_Downward
+class SMDS_EXPORT SMDS_Down2D: public SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
   friend class SMDS_Down1D;
@@ -171,7 +171,7 @@ protected:
   int _nbNodes; //!< number of nodes in a face
 };
 
-class SMDS_Down3D: public SMDS_Downward
+class SMDS_EXPORT SMDS_Down3D: public SMDS_Downward
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -188,7 +188,7 @@ protected:
   int FindFaceByNodes(int cellId, ElemByNodesType& faceByNodes);
 };
 
-class SMDS_DownEdge: public SMDS_Down1D
+class SMDS_EXPORT SMDS_DownEdge: public SMDS_Down1D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -197,7 +197,7 @@ protected:
   ~SMDS_DownEdge();
 };
 
-class SMDS_DownQuadEdge: public SMDS_Down1D
+class SMDS_EXPORT SMDS_DownQuadEdge: public SMDS_Down1D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -206,7 +206,7 @@ protected:
   ~SMDS_DownQuadEdge();
 };
 
-class SMDS_DownTriangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownTriangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -217,7 +217,7 @@ protected:
   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
 };
 
-class SMDS_DownQuadTriangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownQuadTriangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -228,7 +228,7 @@ protected:
   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
 };
 
-class SMDS_DownQuadrangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownQuadrangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -239,7 +239,7 @@ protected:
   virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
 };
 
-class SMDS_DownQuadQuadrangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownQuadQuadrangle: public SMDS_Down2D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -266,7 +266,7 @@ protected:
 //protected:
 //};
 
-class SMDS_DownTetra: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownTetra: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -278,7 +278,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadTetra: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadTetra: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -290,7 +290,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownPyramid: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownPyramid: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -302,7 +302,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadPyramid: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadPyramid: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -314,7 +314,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownPenta: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownPenta: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -326,7 +326,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadPenta: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadPenta: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -338,7 +338,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownHexa: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownHexa: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
@@ -350,7 +350,7 @@ protected:
   virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
 };
 
-class SMDS_DownQuadHexa: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownQuadHexa: public SMDS_Down3D
 {
   friend class SMDS_UnstructuredGrid;
 public:
index 78966bc5795fda355d610bb51f09ce9069995d02..1f6712a74b9ce5d29dca2a3488b3e3ef80f613bd 100644 (file)
@@ -45,7 +45,7 @@ public:
   double X() const; // ! NOT thread safe methods !
   double Y() const;
   double Z() const;
-  void   GetXYZ(double xyx[3]) const; // thread safe getting coords
+  void   GetXYZ(double xyz[3]) const; // thread safe getting coords
   SMDS_ElemIteratorPtr    GetInverseElementIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
   int                     NbInverseElements(SMDSAbs_ElementType type=SMDSAbs_All) const;
   const SMDS_PositionPtr& GetPosition() const;
index 0d9b1e6c3c458775feb84294a542778c70e26bf4..1eb5c445d60e5e13ed1af797359a7f258ceb53d5 100644 (file)
@@ -763,7 +763,7 @@ void SMDS_UnstructuredGrid::BuildDownwardConnectivity(bool withEdges)
  * @param vtkId the vtk id of the cell
  * @return number of neighbors
  */
-int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId)
+int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId, bool getSkin)
 {
   int vtkType = this->GetCellType(vtkId);
   int cellDim = SMDS_Downward::getCellDimension(vtkType);
@@ -798,9 +798,27 @@ int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsi
           downIds[nb] = downId;
           downTypes[nb] = cellType;
           nb++;
+          if (nb >= NBMAXNEIGHBORS)
+            {
+              INFOS("SMDS_UnstructuredGrid::GetNeighbors problem: NBMAXNEIGHBORS=" <<NBMAXNEIGHBORS << " not enough");
+              return nb;
+            }
+        }
+      if (getSkin)
+        {
+          if (cellDim == 3 && nbUp == 1) // this face is on the skin of the volume
+            {
+              neighborsVtkIds[nb] = _downArray[cellType]->getVtkCellId(downId); // OK if skin present
+              downIds[nb] = downId;
+              downTypes[nb] = cellType;
+              nb++;
+              if (nb >= NBMAXNEIGHBORS)
+                {
+                  INFOS("SMDS_UnstructuredGrid::GetNeighbors problem: NBMAXNEIGHBORS=" <<NBMAXNEIGHBORS << " not enough");
+                  return nb;
+                }
+            }
         }
-      if (nb >= NBMAXNEIGHBORS)
-        assert(0);
     }
   return nb;
 }
index 4c1cc7b80934ba768daedd1f73e4287421c11831..774c54e2780ce100982b60448ff76e38da556eb4 100644 (file)
@@ -83,7 +83,7 @@ public:
   void setCellIdToDownId(int vtkCellId, int downId);
   void CleanDownwardConnectivity();
   void BuildDownwardConnectivity(bool withEdges);
-  int GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId);
+  int GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId, bool getSkin=false);
   int GetParentVolumes(int* volVtkIds, int vtkId);
   int GetParentVolumes(int* volVtkIds, int downId, unsigned char downType);
   void GetNodeIds(std::set<int>& nodeSet, int downId, unsigned char downType);
index 841d2354078e16761d4f199c4c189b93391d6c91..2c7c401cb00ecdb4ce3f64d4393b4b927a97804d 100644 (file)
@@ -1452,6 +1452,45 @@ double SMDS_VolumeTool::MinLinearSize2() const
   return minSize;
 }
 
+//================================================================================
+/*!
+ * \brief Return maximal square distance between connected corner nodes
+ */
+//================================================================================
+
+double SMDS_VolumeTool::MaxLinearSize2() const
+{
+  double maxSize = -1e+100;
+  int iQ = myVolume->IsQuadratic() ? 2 : 1;
+
+  // store current face data
+  int curFace = myCurFace, nbN = myFaceNbNodes;
+  int* ind = myFaceNodeIndices;
+  myFaceNodeIndices = NULL;
+  const SMDS_MeshNode** nodes = myFaceNodes;
+  myFaceNodes = NULL;
+  
+  // it seems that compute distance twice is faster than organization of a sole computing
+  myCurFace = -1;
+  for ( int iF = 0; iF < myNbFaces; ++iF )
+  {
+    setFace( iF );
+    for ( int iN = 0; iN < myFaceNbNodes; iN += iQ )
+    {
+      XYZ n1( myFaceNodes[ iN ]);
+      XYZ n2( myFaceNodes[(iN + iQ) % myFaceNbNodes]);
+      maxSize = std::max( maxSize, (n1 - n2).SquareMagnitude());
+    }
+  }
+  // restore current face data
+  myCurFace         = curFace;
+  myFaceNbNodes     = nbN;
+  myFaceNodeIndices = ind;
+  delete [] myFaceNodes; myFaceNodes = nodes;
+
+  return maxSize;
+}
+
 //================================================================================
 /*!
  * \brief check that only one volume is build on the face nodes
index 5c22c3edab61f1063f2c9e118ea0daccf5a69e2e..ff067eb3a94bed4913814c1444725d92d282c883 100644 (file)
@@ -128,6 +128,9 @@ class SMDS_EXPORT SMDS_VolumeTool
   double MinLinearSize2() const;
   // Return minimal square distance between connected corner nodes
 
+  double MaxLinearSize2() const;
+  // Return maximal square distance between connected corner nodes
+
   // -------------
   // info on faces
   // -------------
index 3008e024fe790155b5fff9483b1339205a00a2c2..72cc31ce1895d328def29aaf40b7cecc1e2c5f4b 100644 (file)
@@ -34,10 +34,6 @@ salomeinclude_HEADERS = \
        SMESH_Hypothesis.hxx \
        SMESH_HypoFilter.hxx \
        SMESH_Algo.hxx \
-       SMESH_0D_Algo.hxx \
-       SMESH_1D_Algo.hxx \
-       SMESH_2D_Algo.hxx \
-       SMESH_3D_Algo.hxx \
        SMESH_Group.hxx \
        SMESH_MeshEditor.hxx \
        SMESH_Pattern.hxx \
@@ -56,10 +52,6 @@ dist_libSMESHimpl_la_SOURCES = \
        SMESH_subMesh.cxx \
        SMESH_Hypothesis.cxx \
        SMESH_Algo.cxx \
-       SMESH_0D_Algo.cxx \
-       SMESH_1D_Algo.cxx \
-       SMESH_2D_Algo.cxx \
-       SMESH_3D_Algo.cxx \
        SMESH_Group.cxx \
        SMESH_MeshEditor.cxx \
        SMESH_Pattern.cxx \
@@ -83,6 +75,7 @@ libSMESHimpl_la_CPPFLAGS = \
        -I$(srcdir)/../DriverUNV \
        -I$(srcdir)/../DriverSTL \
        -I$(srcdir)/../DriverCGNS \
+       -I$(srcdir)/../DriverGMF \
        -I$(srcdir)/../SMDS \
        -I$(srcdir)/../SMESHDS \
        -I$(srcdir)/../SMESHUtils
@@ -98,8 +91,9 @@ libSMESHimpl_la_LDFLAGS = \
        ../DriverSTL/libMeshDriverSTL.la \
        ../DriverMED/libMeshDriverMED.la \
        ../DriverUNV/libMeshDriverUNV.la \
+       ../DriverGMF/libMeshDriverGMF.la \
        $(DriverCGNS_LIB) \
        ../SMESHUtils/libSMESHUtils.la \
        $(BOOST_LIB_THREAD)  \
        $(GEOM_LDFLAGS) -lNMTTools \
-       $(CAS_LDPATH) -lTKShHealing -lTKPrim -lTKG2d
+       $(CAS_LDPATH) -lTKShHealing -lTKPrim -lTKG2d -lTKCDF
diff --git a/src/SMESH/SMESH_0D_Algo.cxx b/src/SMESH/SMESH_0D_Algo.cxx
deleted file mode 100644 (file)
index bc3461d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_0D_Algo.cxx
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_0D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_0D_Algo::SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-  _type = ALGO_0D;
-  gen->_map0D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_0D_Algo::~SMESH_0D_Algo()
-{
-}
-
diff --git a/src/SMESH/SMESH_0D_Algo.hxx b/src/SMESH/SMESH_0D_Algo.hxx
deleted file mode 100644 (file)
index d7ba782..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_0D_Algo.hxx
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_0D_ALGO_HXX_
-#define _SMESH_0D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
-{
-public:
-  SMESH_0D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
-  virtual ~SMESH_0D_Algo();
-};
-
-#endif
diff --git a/src/SMESH/SMESH_1D_Algo.cxx b/src/SMESH/SMESH_1D_Algo.cxx
deleted file mode 100644 (file)
index 3027f82..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_1D_Algo.cxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_1D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_subMesh.hxx"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-//   _compatibleHypothesis.push_back("hypothese_1D_bidon");
-  _type = ALGO_1D;
-  gen->_map1D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_1D_Algo::~SMESH_1D_Algo()
-{
-}
-
diff --git a/src/SMESH/SMESH_1D_Algo.hxx b/src/SMESH/SMESH_1D_Algo.hxx
deleted file mode 100644 (file)
index e10aa19..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_1D_Algo.hxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_1D_ALGO_HXX_
-#define _SMESH_1D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_EXPORT SMESH_1D_Algo:
-  public SMESH_Algo
-{
-public:
-  SMESH_1D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
-  virtual ~SMESH_1D_Algo();
-};
-
-#endif
diff --git a/src/SMESH/SMESH_2D_Algo.cxx b/src/SMESH/SMESH_2D_Algo.cxx
deleted file mode 100644 (file)
index a4feece..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_2D_Algo.cxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_2D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "utilities.h"
-
-#include <TopExp_Explorer.hxx>
-#include <TopExp.hxx>
-#include <TopoDS.hxx>
-
-using namespace std;
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-//   _compatibleHypothesis.push_back("hypothese_2D_bidon");
-  _type = ALGO_2D;
-  gen->_map2D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_2D_Algo::~SMESH_2D_Algo()
-{
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-int SMESH_2D_Algo::NumberOfWires(const TopoDS_Shape& S)
-{
-  int i = 0;
-  for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
-    i++;
-  return i;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-int SMESH_2D_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
-{
-  int nbPoints = 0;
-  for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) {
-    const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
-    int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
-    if(_quadraticMesh)
-      nb = nb/2;
-    nbPoints += nb + 1; // internal points plus 1 vertex of 2 (last point ?)
-  }
-  return nbPoints;
-}
-
-
diff --git a/src/SMESH/SMESH_2D_Algo.hxx b/src/SMESH/SMESH_2D_Algo.hxx
deleted file mode 100644 (file)
index 0a2a127..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_2D_Algo.hxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_2D_ALGO_HXX_
-#define _SMESH_2D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-#include "SMESH_subMesh.hxx"
-#include "TopoDS_Wire.hxx"
-
-class SMESH_EXPORT SMESH_2D_Algo:
-  public SMESH_Algo
-{
-public:
-  SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
-  virtual ~SMESH_2D_Algo();
-
-  int NumberOfWires(const TopoDS_Shape& S);
-  int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
-
-};
-
-#endif
diff --git a/src/SMESH/SMESH_3D_Algo.cxx b/src/SMESH/SMESH_3D_Algo.cxx
deleted file mode 100644 (file)
index d7a0ed8..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_3D_Algo.cxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#include "SMESH_3D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
-  : SMESH_Algo(hypId, studyId, gen)
-{
-//   _compatibleHypothesis.push_back("hypothese_3D_bidon");
-  _type = ALGO_3D;
-  gen->_map3D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *  
- */
-//=============================================================================
-
-SMESH_3D_Algo::~SMESH_3D_Algo()
-{
-}
-
-
diff --git a/src/SMESH/SMESH_3D_Algo.hxx b/src/SMESH/SMESH_3D_Algo.hxx
deleted file mode 100644 (file)
index 2b64d9e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-//  SMESH SMESH : implementaion of SMESH idl descriptions
-//  File   : SMESH_3D_Algo.hxx
-//  Author : Paul RASCLE, EDF
-//  Module : SMESH
-//  $Header$
-//
-#ifndef _SMESH_3D_ALGO_HXX_
-#define _SMESH_3D_ALGO_HXX_
-
-#include "SMESH_SMESH.hxx"
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_EXPORT SMESH_3D_Algo:
-  public SMESH_Algo
-{
-public:
-  SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
-  virtual ~SMESH_3D_Algo();
-
-};
-
-#endif
index 9768eb04976821b7074851e63a137942747a2409..f7bd7f9bf3b2bf85824bab37264a6da3a0453e12 100644 (file)
@@ -39,6 +39,7 @@
 #include "SMESH_HypoFilter.hxx"
 #include "SMESH_Mesh.hxx"
 #include "SMESH_TypeDefs.hxx"
+#include "SMESH_subMesh.hxx"
 
 #include <Basics_OCCTVersion.hxx>
 
@@ -49,6 +50,7 @@
 #include <GeomAdaptor_Curve.hxx>
 #include <Geom_Surface.hxx>
 #include <TopExp.hxx>
+#include <TopExp_Explorer.hxx>
 #include <TopLoc_Location.hxx>
 #include <TopTools_ListIteratorOfListOfShape.hxx>
 #include <TopTools_ListOfShape.hxx>
@@ -56,6 +58,7 @@
 #include <TopoDS_Edge.hxx>
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Vertex.hxx>
+#include <TopoDS_Wire.hxx>
 #include <gp_Pnt.hxx>
 #include <gp_Pnt2d.hxx>
 #include <gp_Vec.hxx>
@@ -96,6 +99,41 @@ SMESH_Algo::~SMESH_Algo()
 {
 }
 
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+SMESH_0D_Algo::SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_VERTEX);
+  _type = ALGO_0D;
+  gen->_map0D_Algo[hypId] = this;
+}
+SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_EDGE);
+  _type = ALGO_1D;
+  gen->_map1D_Algo[hypId] = this;
+}
+SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_FACE);
+  _type = ALGO_2D;
+  gen->_map2D_Algo[hypId] = this;
+}
+SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
+  : SMESH_Algo(hypId, studyId, gen)
+{
+  _shapeType = (1 << TopAbs_SOLID);
+  _type = ALGO_3D;
+  gen->_map3D_Algo[hypId] = this;
+}
+
 //=============================================================================
 /*!
  * Usually an algoritm has nothing to save
@@ -309,7 +347,14 @@ bool SMESH_Algo::IsReversedSubMesh (const TopoDS_Face&  theFace,
   // face normal at node position
   TopLoc_Location loc;
   Handle(Geom_Surface) surf = BRep_Tool::Surface( theFace, loc );
-  if ( surf.IsNull() || surf->Continuity() < GeomAbs_C1 ) return isReversed;
+  // if ( surf.IsNull() || surf->Continuity() < GeomAbs_C1 )
+  // some surfaces not detected as GeomAbs_C1 are nevertheless correct for meshing
+  if ( surf.IsNull() || surf->Continuity() < GeomAbs_C0 )
+    {
+      if (!surf.IsNull())
+        MESSAGE("surf->Continuity() < GeomAbs_C1 " << (surf->Continuity() < GeomAbs_C1));
+      return isReversed;
+    }
   gp_Vec d1u, d1v;
   surf->D1( u, v, nPnt[0], d1u, d1v );
   gp_Vec Nf = (d1u ^ d1v).Transformed( loc );
@@ -777,3 +822,38 @@ void SMESH_Algo::addBadInputElement(const SMDS_MeshElement* elem)
   if ( elem )
     _badInputElements.push_back( elem );
 }
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+int SMESH_Algo::NumberOfWires(const TopoDS_Shape& S)
+{
+  int i = 0;
+  for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
+    i++;
+  return i;
+}
+
+//=============================================================================
+/*!
+ *  
+ */
+//=============================================================================
+
+int SMESH_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
+{
+  int nbPoints = 0;
+  for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) {
+    const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
+    int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
+    if(_quadraticMesh)
+      nb = nb/2;
+    nbPoints += nb + 1; // internal points plus 1 vertex of 2 (last point ?)
+  }
+  return nbPoints;
+}
+
+
index 580445b48057b0cc1c100d6ef30f66ce65cbdde0..1a3be0876eb8dc012a137455948ae486836bff51 100644 (file)
@@ -47,6 +47,7 @@ class SMESH_Gen;
 class SMESH_Mesh;
 class SMESH_HypoFilter;
 class TopoDS_Vertex;
+class TopoDS_Wire;
 class TopoDS_Face;
 class TopoDS_Shape;
 class SMESHDS_Mesh;
@@ -301,6 +302,9 @@ public:
    */
   static bool FaceNormal(const SMDS_MeshElement* F, gp_XYZ& normal, bool normalized=true);
 
+  static int NumberOfWires(const TopoDS_Shape& S);
+  int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
+
   /*!
    * \brief Return continuity of two edges
     * \param E1 - the 1st edge
@@ -373,8 +377,8 @@ protected:
   bool _requireShape;           // work with GetDim()-1 mesh bound to geom only. Default TRUE
   bool _supportSubmeshes;       // if !_requireDiscreteBoundary. Default FALSE
 
-  // quadratic mesh creation required,
-  // is usually set trough SMESH_MesherHelper::IsQuadraticSubMesh()
+  // indicates if quadratic mesh creation is required,
+  // is usually set like this: _quadraticMesh = SMESH_MesherHelper::IsQuadraticSubMesh(shape)
   bool _quadraticMesh;
 
   int         _error;    //!< SMESH_ComputeErrorName or anything algo specific
@@ -384,4 +388,28 @@ protected:
   volatile bool _computeCanceled; //!< is set to True while computing to stop it
 };
 
+class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_0D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_1D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_1D_Algo(int hypId, int studyId,  SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_2D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
+class SMESH_EXPORT SMESH_3D_Algo: public SMESH_Algo
+{
+public:
+  SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
+};
+
 #endif
index dae945eec5e6b328942f1f362a686f9df6e1184b..c18ace19422797d527205633cda50237eff59425 100644 (file)
 #include "Utils_ExceptHandlers.hxx"
 
 #include <TopoDS_Iterator.hxx>
+#include <LDOMParser.hxx>
 
 #include "memoire.h"
 
+#ifdef WNT
+  #include <windows.h>
+#endif\r
+
 using namespace std;
 
 //=============================================================================
@@ -374,7 +379,9 @@ bool SMESH_Gen::Compute(SMESH_Mesh &          aMesh,
   {
     SMESH_MesherHelper aHelper( aMesh );
     if ( aHelper.IsQuadraticMesh() != SMESH_MesherHelper::LINEAR )
-      aHelper.FixQuadraticElements();
+    {
+      aHelper.FixQuadraticElements( sm->GetComputeError() );
+    }
   }
   return ret;
 }
@@ -645,7 +652,8 @@ static bool checkMissing(SMESH_Gen*                aGen,
                          set<SMESH_subMesh*>&      aCheckedMap,
                          list< SMESH_Gen::TAlgoStateError > & theErrors)
 {
-  if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX)
+  if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX ||
+       aCheckedMap.count( aSubMesh ))
     return true;
 
   //MESSAGE("=====checkMissing");
@@ -701,8 +709,15 @@ static bool checkMissing(SMESH_Gen*                aGen,
     break;
   }
   case SMESH_subMesh::HYP_OK:
-    algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() );
+    algo = aSubMesh->GetAlgo();
     ret = true;
+    if (!algo->NeedDiscreteBoundary())
+    {
+      SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false,
+                                                                       /*complexShapeFirst=*/false);
+      while ( itsub->more() )
+        aCheckedMap.insert( itsub->next() );
+    }
     break;
   default: ASSERT(0);
   }
@@ -721,7 +736,6 @@ static bool checkMissing(SMESH_Gen*                aGen,
     {
       // sub-meshes should not be checked further more
       SMESH_subMesh* sm = itsub->next();
-      aCheckedMap.insert( sm );
 
       if (isTopLocalAlgo)
       {
@@ -735,6 +749,7 @@ static bool checkMissing(SMESH_Gen*                aGen,
             checkNoAlgo2 = false;
         }
       }
+      aCheckedMap.insert( sm );
     }
   }
   return ret;
@@ -768,9 +783,9 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh&               theMesh,
   bool ret = true;
   bool hasAlgo = false;
 
-  SMESH_subMesh* sm = theMesh.GetSubMesh(theShape);
+  SMESH_subMesh*          sm = theMesh.GetSubMesh(theShape);
   const SMESHDS_Mesh* meshDS = theMesh.GetMeshDS();
-  TopoDS_Shape mainShape = meshDS->ShapeToMesh();
+  TopoDS_Shape     mainShape = meshDS->ShapeToMesh();
 
   // -----------------
   // get global algos
@@ -896,6 +911,177 @@ bool SMESH_Gen::IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& a
   return aMesh.GetHypothesis( aMesh.GetMeshDS()->ShapeToMesh(), filter, false );
 }
 
+//================================================================================
+/*!
+ * \brief Return paths to xml files of plugins
+ */
+//================================================================================
+
+std::vector< std::string > SMESH_Gen::GetPluginXMLPaths()
+{
+  // Get paths to xml files of plugins
+  vector< string > xmlPaths;
+  string sep;
+  if ( const char* meshersList = getenv("SMESH_MeshersList") )
+  {
+    string meshers = meshersList, plugin;
+    string::size_type from = 0, pos;
+    while ( from < meshers.size() )
+    {
+      // cut off plugin name
+      pos = meshers.find( ':', from );
+      if ( pos != string::npos )
+        plugin = meshers.substr( from, pos-from );
+      else
+        plugin = meshers.substr( from ), pos = meshers.size();
+      from = pos + 1;
+
+      // get PLUGIN_ROOT_DIR path
+      string rootDirVar, pluginSubDir = plugin;
+      if ( plugin == "StdMeshers" )
+        rootDirVar = "SMESH", pluginSubDir = "smesh";
+      else
+        for ( pos = 0; pos < plugin.size(); ++pos )
+          rootDirVar += toupper( plugin[pos] );
+      rootDirVar += "_ROOT_DIR";
+
+      const char* rootDir = getenv( rootDirVar.c_str() );
+      if ( !rootDir || strlen(rootDir) == 0 )
+      {
+        rootDirVar = plugin + "_ROOT_DIR"; // HexoticPLUGIN_ROOT_DIR
+        rootDir = getenv( rootDirVar.c_str() );
+        if ( !rootDir || strlen(rootDir) == 0 ) continue;
+      }
+
+      // get a separator from rootDir
+      for ( pos = strlen( rootDir )-1; pos >= 0 && sep.empty(); --pos )
+        if ( rootDir[pos] == '/' || rootDir[pos] == '\\' )
+        {
+          sep = rootDir[pos];
+          break;
+        }
+#ifdef WNT
+      if (sep.empty() ) sep = "\\";
+#else
+      if (sep.empty() ) sep = "/";
+#endif
+
+      // get a path to resource file
+      string xmlPath = rootDir;
+      if ( xmlPath[ xmlPath.size()-1 ] != sep[0] )
+        xmlPath += sep;
+      xmlPath += "share" + sep + "salome" + sep + "resources" + sep;
+      for ( pos = 0; pos < pluginSubDir.size(); ++pos )
+        xmlPath += tolower( pluginSubDir[pos] );
+      xmlPath += sep + plugin + ".xml";
+      bool fileOK;
+#ifdef WNT
+      fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES);
+#else
+      fileOK = (access(xmlPath.c_str(), F_OK) == 0);
+#endif
+      if ( fileOK )
+        xmlPaths.push_back( xmlPath );
+    }
+  }
+
+  return xmlPaths;
+}
+
+//=======================================================================
+namespace // Access to type of input and output of an algorithm
+//=======================================================================
+{
+  struct AlgoData
+  {
+    int                       _dim;
+    set<SMDSAbs_GeometryType> _inElemTypes; // acceptable types of input mesh element
+    set<SMDSAbs_GeometryType> _outElemTypes; // produced types of mesh elements
+
+    bool IsCompatible( const AlgoData& algo2 ) const
+    {
+      if ( _dim > algo2._dim ) return algo2.IsCompatible( *this );
+      // algo2 is of highter dimension
+      if ( _outElemTypes.empty() || algo2._inElemTypes.empty() )
+        return false;
+      bool compatible = true;
+      set<SMDSAbs_GeometryType>::const_iterator myOutType = _outElemTypes.begin();
+      for ( ; myOutType != _outElemTypes.end() && compatible; ++myOutType )
+        compatible = algo2._inElemTypes.count( *myOutType );
+      return compatible;
+    }
+  };
+
+  //================================================================================
+  /*!
+   * \brief Return AlgoData of the algorithm
+   */
+  //================================================================================
+
+  const AlgoData& getAlgoData( const SMESH_Algo* algo )
+  {
+    static map< string, AlgoData > theDataByName;
+    if ( theDataByName.empty() )
+    {
+      // Read Plugin.xml files
+      vector< string > xmlPaths = SMESH_Gen::GetPluginXMLPaths();
+      LDOMParser xmlParser;
+      for ( size_t iXML = 0; iXML < xmlPaths.size(); ++iXML )
+      {
+        bool error = xmlParser.parse( xmlPaths[iXML].c_str() );
+        if ( error )
+        {
+          TCollection_AsciiString data;
+          INFOS( xmlParser.GetError(data) );
+          continue;
+        }
+        // <algorithm type="Regular_1D"
+        //            ...
+        //            input="EDGE"
+        //            output="QUAD,TRIA">
+        //
+        LDOM_Document xmlDoc = xmlParser.getDocument();
+        LDOM_NodeList algoNodeList = xmlDoc.getElementsByTagName( "algorithm" );
+        for ( int i = 0; i < algoNodeList.getLength(); ++i )
+        {
+          LDOM_Node     algoNode           = algoNodeList.item( i );
+          LDOM_Element& algoElem           = (LDOM_Element&) algoNode;
+          TCollection_AsciiString algoType = algoElem.getAttribute("type");
+          TCollection_AsciiString input    = algoElem.getAttribute("input");
+          TCollection_AsciiString output   = algoElem.getAttribute("output");
+          TCollection_AsciiString dim      = algoElem.getAttribute("dim");
+          if ( algoType.IsEmpty() ) continue;
+          AlgoData & data                  = theDataByName[ algoType.ToCString() ];
+          data._dim = dim.IntegerValue();
+          for ( int isInput = 0; isInput < 2; ++isInput )
+          {
+            TCollection_AsciiString&   typeStr = isInput ? input : output;
+            set<SMDSAbs_GeometryType>& typeSet = isInput ? data._inElemTypes : data._outElemTypes;
+            int beg = 1, end;
+            while ( beg <= typeStr.Length() )
+            {
+              while ( beg < typeStr.Length() && !isalpha( typeStr.Value( beg ) ))
+                ++beg;
+              end = beg;
+              while ( end < typeStr.Length() && isalpha( typeStr.Value( end + 1 ) ))
+                ++end;
+              if ( end > beg )
+              {
+                TCollection_AsciiString typeName = typeStr.SubString( beg, end );
+                if      ( typeName == "EDGE" ) typeSet.insert( SMDSGeom_EDGE );
+                else if ( typeName == "TRIA" ) typeSet.insert( SMDSGeom_TRIANGLE );
+                else if ( typeName == "QUAD" ) typeSet.insert( SMDSGeom_QUADRANGLE );
+              }
+              beg = end + 1;
+            }
+          }
+        }
+      }
+    }
+    return theDataByName[ algo->GetName() ];
+  }
+}
+
 //=============================================================================
 /*!
  * Finds algo to mesh a shape. Optionally returns a shape the found algo is bound to
@@ -909,7 +1095,63 @@ SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_Mesh &         aMesh,
   SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
   filter.And( filter.IsApplicableTo( aShape ));
 
-  return (SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, assignedTo );
+  TopoDS_Shape assignedToShape;
+  SMESH_Algo* algo =
+    (SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, &assignedToShape );
+
+  if ( algo &&
+       aShape.ShapeType() == TopAbs_FACE &&
+       !aShape.IsSame( assignedToShape ) &&
+       SMESH_MesherHelper::NbAncestors( aShape, aMesh, TopAbs_SOLID ) > 1 )
+  {
+    // Issue 0021559. If there is another 2D algo with different types of output
+    // elements that can be used to mesh aShape, and 3D algos on adjacent SOLIDs
+    // have different types of input elements, we choose a most appropriate 2D algo.
+
+    // try to find a concurrent 2D algo
+    filter.AndNot( filter.Is( algo ));
+    TopoDS_Shape assignedToShape2;
+    SMESH_Algo* algo2 =
+      (SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, &assignedToShape2 );
+    if ( algo2 &&                                                  // algo found
+         !assignedToShape2.IsSame( aMesh.GetShapeToMesh() ) &&     // algo is local
+         ( SMESH_MesherHelper::GetGroupType( assignedToShape2 ) == // algo of the same level
+           SMESH_MesherHelper::GetGroupType( assignedToShape )) &&
+         aMesh.IsOrderOK( aMesh.GetSubMesh( assignedToShape2 ),    // no forced order
+                          aMesh.GetSubMesh( assignedToShape  )))
+    {
+      // get algos on the adjacent SOLIDs
+      filter.Init( filter.IsAlgo() ).And( filter.HasDim( 3 ));
+      vector< SMESH_Algo* > algos3D;
+      PShapeIteratorPtr solidIt = SMESH_MesherHelper::GetAncestors( aShape, aMesh,
+                                                                    TopAbs_SOLID );
+      while ( const TopoDS_Shape* solid = solidIt->next() )
+        if ( SMESH_Algo* algo3D = (SMESH_Algo*) aMesh.GetHypothesis( *solid, filter, true ))
+        {
+          algos3D.push_back( algo3D );
+          filter.AndNot( filter.HasName( algo3D->GetName() ));
+        }
+      // check compatibility of algos
+      if ( algos3D.size() > 1 )
+      {
+        const AlgoData& algoData    = getAlgoData( algo );
+        const AlgoData& algoData2   = getAlgoData( algo2 );
+        const AlgoData& algoData3d0 = getAlgoData( algos3D[0] );
+        const AlgoData& algoData3d1 = getAlgoData( algos3D[1] );
+        if (( algoData2.IsCompatible( algoData3d0 ) &&
+              algoData2.IsCompatible( algoData3d1 ))
+            &&
+            !(algoData.IsCompatible( algoData3d0 ) &&
+              algoData.IsCompatible( algoData3d1 )))
+          algo = algo2;
+      }
+    }
+  }
+
+  if ( assignedTo && algo )
+    * assignedTo = assignedToShape;
+
+  return algo;
 }
 
 //=============================================================================
index 353cba6df6c66568b8e0dac8dc3413d02581d51c..b7854786fc072753e187141e1b6014bba1ae255a 100644 (file)
 #include "SMESH_Hypothesis.hxx"
 #include "SMESH_ComputeError.hxx"
 #include "SMESH_Algo.hxx"
-#include "SMESH_0D_Algo.hxx"
-#include "SMESH_1D_Algo.hxx"
-#include "SMESH_2D_Algo.hxx"
-#include "SMESH_3D_Algo.hxx"
 #include "SMESH_Mesh.hxx"
 
 #include "chrono.hxx"
@@ -47,6 +43,8 @@
 
 #include <map>
 #include <list>
+#include <vector>
+#include <string>
 
 class SMESHDS_Document;
 
@@ -144,9 +142,13 @@ public:
   static int GetShapeDim(const TopAbs_ShapeEnum & aShapeType);
   static int GetShapeDim(const TopoDS_Shape & aShape)
   { return GetShapeDim( aShape.ShapeType() ); }
+
   SMESH_Algo* GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, TopoDS_Shape* assignedTo=0);
+
   static bool IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& aMesh);
 
+  static std::vector< std::string > GetPluginXMLPaths();
+
   int GetANewId();
 
   std::map < int, SMESH_Algo * >_mapAlgo;
index 7ef568593a2f492f535a7fb6a1b0934fa444a11f..dae4e3188a91d31d9013538df35bf7222b062b57 100644 (file)
@@ -24,7 +24,6 @@
 //  File   : SMESH_Group.cxx
 //  Author : Michael Sazonov (OCC)
 //  Module : SMESH
-//  $Header$
 //
 #include "SMESH_Group.hxx"
 #include "SMESH_Mesh.hxx"
@@ -60,6 +59,7 @@ SMESH_Group::SMESH_Group (int                       theID,
     myGroupDS = new SMESHDS_Group (theID,
                                    const_cast<SMESH_Mesh*>(theMesh)->GetMeshDS(),
                                    theType);
+  myGroupDS->SetStoreName( theName );
 }
 
 //================================================================================
@@ -76,7 +76,7 @@ SMESH_Group::SMESH_Group (SMESHDS_GroupBase* groupDS): myGroupDS( groupDS )
 
 //=============================================================================
 /*!
- *  
+ *  Destructor deletes myGroupDS
  */
 //=============================================================================
 
@@ -84,3 +84,15 @@ SMESH_Group::~SMESH_Group ()
 {
   delete myGroupDS; myGroupDS=0;
 }
+
+//================================================================================
+/*!
+ * \brief Sets a new name
+ */
+//================================================================================
+
+void SMESH_Group::SetName (const char* theName)
+{
+  myName = theName;
+  myGroupDS->SetStoreName( theName );
+}
index f378be29696008a32361cbc0a2c04536b002abf5..edb14b900522e2b4c901770ae4e047d0a0e7b5db 100644 (file)
@@ -52,7 +52,7 @@ class SMESH_EXPORT  SMESH_Group
   SMESH_Group (SMESHDS_GroupBase* groupDS);
   ~SMESH_Group ();
 
-  void SetName (const char* theName) { myName = theName; }
+  void SetName (const char* theName);
 
   const char* GetName () const { return myName.c_str(); }
 
index fee310f27caa8a44af2a462ba3b359f0074b916a..48f293a565c8ddba91f58dc7b02e3013922438da 100644 (file)
@@ -43,7 +43,6 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
                                    int studyId,
                                    SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId)
 {
-  //MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis");
   _gen = gen;
   _studyId = studyId;
   StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
@@ -51,9 +50,8 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
   _type = PARAM_ALGO;
   _shapeType = 0; // to be set by algo with TopAbs_Enum
   _param_algo_dim = -1; // to be set by algo parameter
-  _parameters = string();
-  _lastParameters = string();
-  _libName = string();
+  //_parameters = string();
+  //_lastParameters = string();
 }
 
 //=============================================================================
@@ -65,6 +63,8 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
 SMESH_Hypothesis::~SMESH_Hypothesis()
 {
   MESSAGE("SMESH_Hypothesis::~SMESH_Hypothesis");
+  StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
+  myStudyContext->mapHypothesis[_hypId] = 0;
 }
 
 //=============================================================================
@@ -177,53 +177,53 @@ SMESH_Mesh* SMESH_Hypothesis::GetMeshByPersistentID(int id)
  * 
  */
 //=============================================================================
-void SMESH_Hypothesis::SetParameters(const char *theParameters)
-{
-  string aNewParameters(theParameters);
-  if(aNewParameters.size()==0 && _parameters.size()==0)
-    aNewParameters = " ";
-  if(_parameters.size()>0)
-    _parameters +="|";
-  _parameters +=aNewParameters;
-  SetLastParameters(theParameters);
-}
-
-//=============================================================================
-/*!
- * 
- */
-//=============================================================================
-void SMESH_Hypothesis::ClearParameters()
-{
-  _parameters = string();
-}
-
-//=============================================================================
-/*!
- * 
- */
-//=============================================================================
-char* SMESH_Hypothesis::GetParameters() const
-{
-  return (char*)_parameters.c_str();
-}
-
-//=============================================================================
-/*!
- * 
- */
-//=============================================================================
-char* SMESH_Hypothesis::GetLastParameters() const
-{
-  return (char*)_lastParameters.c_str();
-}
-
-//=============================================================================
-/*!
- * 
- */
-//=============================================================================
-void SMESH_Hypothesis::SetLastParameters(const char* theParameters)
-{
-  _lastParameters = string(theParameters);
-}
+// void SMESH_Hypothesis::SetParameters(const char *theParameters)
+// {
+//   string aNewParameters(theParameters);
+//   if(aNewParameters.size()==0 && _parameters.size()==0)
+//     aNewParameters = " ";
+//   if(_parameters.size()>0)
+//     _parameters +="|";
+//   _parameters +=aNewParameters;
+//   SetLastParameters(theParameters);
+// }
+
+// //=============================================================================
+// /*!
+//  * 
+//  */
+// //=============================================================================
+// void SMESH_Hypothesis::ClearParameters()
+// {
+//   _parameters = string();
+// }
+
+// //=============================================================================
+// /*!
+//  * 
+//  */
+// //=============================================================================
+// char* SMESH_Hypothesis::GetParameters() const
+// {
+//   return (char*)_parameters.c_str();
+// }
+
+// //=============================================================================
+// /*!
+//  * 
+//  */
+// //=============================================================================
+// char* SMESH_Hypothesis::GetLastParameters() const
+// {
+//   return (char*)_lastParameters.c_str();
+// }
+
+// //=============================================================================
+// /*!
+//  * 
+//  */
+// //=============================================================================
+// void SMESH_Hypothesis::SetLastParameters(const char* theParameters)
+// {
+//   _lastParameters = string(theParameters);
+// }
index 0c81caac7a248b7785cae8af9ff5660e6126b9fe..4c29ff333f7923fe42f6d59b168a4c639464aa5e 100644 (file)
@@ -51,7 +51,7 @@ public:
   {
     HYP_OK = 0,
     HYP_MISSING,      // algo misses a hypothesis
-    HYP_CONCURENT,    // several applicable hypotheses
+    HYP_CONCURENT,    // several applicable hypotheses assigned to father shapes
     HYP_BAD_PARAMETER,// hypothesis has a bad parameter value
     HYP_HIDDEN_ALGO,  // an algo is hidden by an upper dim algo generating all-dim elements
     HYP_HIDING_ALGO,  // an algo hides lower dim algos by generating all-dim elements
@@ -59,7 +59,7 @@ public:
                       //      for Add/RemoveHypothesis operations
     HYP_INCOMPATIBLE, // hypothesis does not fit algo
     HYP_NOTCONFORM,   // not conform mesh is produced appling a hypothesis
-    HYP_ALREADY_EXIST,// such hypothesis already exist
+    HYP_ALREADY_EXIST,// several applicable hypothesis of same priority assigned
     HYP_BAD_DIM,      // bad dimension
     HYP_BAD_SUBSHAPE, // shape is neither the main one, nor its sub-shape, nor a group
     HYP_BAD_GEOMETRY, // shape geometry mismatches algorithm's expectation
@@ -77,12 +77,12 @@ public:
   virtual const char* GetLibName() const;
   void  SetLibName(const char* theLibName);
 
-  void  SetParameters(const char *theParameters);
-  char* GetParameters() const;
+  //void  SetParameters(const char *theParameters);
+  //char* GetParameters() const;
 
-  void SetLastParameters(const char* theParameters);
-  char* GetLastParameters() const;
-  void ClearParameters();
+  // void SetLastParameters(const char* theParameters);
+  // char* GetLastParameters() const;
+  // void ClearParameters();
   
   /*!
    * \brief Initialize my parameter values by the mesh built on the geometry
@@ -122,14 +122,14 @@ public:
 
 protected:
   SMESH_Gen* _gen;
-  int _studyId;
-  int _shapeType;
-  int _param_algo_dim; // to be set at descendant hypothesis constructor
+  int        _studyId;
+  int        _shapeType;
+  int        _param_algo_dim; // to be set at descendant hypothesis constructor
 
 private:
-  std::string _libName;
-  std::string _parameters;
-  std::string _lastParameters;
+  std::string _libName; // name of library of plug-in Engine
+  //std::string _parameters;
+  //std::string _lastParameters;
 };
 
 #endif
index 1057d3deee69e87f7e9ea71f983b7a9638267865..0b171a6efbb293fddecff2e4c8f44059ca114d11 100644 (file)
 
 #include "utilities.h"
 
-#include "DriverMED_W_SMESHDS_Mesh.h"
 #include "DriverDAT_W_SMDS_Mesh.h"
-#include "DriverUNV_W_SMDS_Mesh.h"
-#include "DriverSTL_W_SMDS_Mesh.h"
-
+#include "DriverGMF_Read.hxx"
+#include "DriverGMF_Write.hxx"
 #include "DriverMED_R_SMESHDS_Mesh.h"
-#include "DriverUNV_R_SMDS_Mesh.h"
+#include "DriverMED_W_SMESHDS_Mesh.h"
 #include "DriverSTL_R_SMDS_Mesh.h"
+#include "DriverSTL_W_SMDS_Mesh.h"
+#include "DriverUNV_R_SMDS_Mesh.h"
+#include "DriverUNV_W_SMDS_Mesh.h"
 #ifdef WITH_CGNS
 #include "DriverCGNS_Read.hxx"
 #include "DriverCGNS_Write.hxx"
@@ -538,6 +539,26 @@ int SMESH_Mesh::CGNSToMesh(const char*  theFileName,
   return res;
 }
 
+//================================================================================
+/*!
+ * \brief Fill its data by reading a GMF file
+ */
+//================================================================================
+
+SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName)
+{
+  DriverGMF_Read myReader;
+  myReader.SetMesh(_myMeshDS);
+  myReader.SetFile(theFileName);
+  myReader.Perform();
+  //theMeshName = myReader.GetMeshName();
+
+  // create groups
+  SynchronizeGroups();
+
+  return myReader.GetError();
+}
+
 //=============================================================================
 /*!
  * 
@@ -1391,6 +1412,21 @@ void SMESH_Mesh::ExportCGNS(const char *        file,
     throw SALOME_Exception("Export failed");
 }
 
+//================================================================================
+/*!
+ * \brief Export the mesh to a GMF file
+ */
+//================================================================================
+
+void SMESH_Mesh::ExportGMF(const char *        file,
+                           const SMESHDS_Mesh* meshDS)
+{
+  DriverGMF_Write myWriter;
+  myWriter.SetFile( file );
+  myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS ));
+  myWriter.Perform();
+}
+
 //================================================================================
 /*!
  * \brief Return number of nodes in the mesh
@@ -1651,6 +1687,35 @@ SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType,
   return aGroup;
 }
 
+//================================================================================
+/*!
+ * \brief Creates a group based on an existing SMESHDS group. Group ID should be unique
+ */
+//================================================================================
+
+SMESH_Group* SMESH_Mesh::AddGroup (SMESHDS_GroupBase* groupDS) throw(SALOME_Exception)
+{
+  if ( !groupDS ) 
+    throw SALOME_Exception(LOCALIZED ("SMESH_Mesh::AddGroup(): NULL SMESHDS_GroupBase"));
+
+  map <int, SMESH_Group*>::iterator i_g = _mapGroup.find( groupDS->GetID() );
+  if ( i_g != _mapGroup.end() && i_g->second )
+  {
+    if ( i_g->second->GetGroupDS() == groupDS )
+      return i_g->second;
+    else
+      throw SALOME_Exception(LOCALIZED ("SMESH_Mesh::AddGroup() wrong ID of SMESHDS_GroupBase"));
+  }
+  SMESH_Group* aGroup = new SMESH_Group (groupDS);
+  _mapGroup[ groupDS->GetID() ] = aGroup;
+  GetMeshDS()->AddGroup( aGroup->GetGroupDS() );
+
+  _groupId = 1 + _mapGroup.rbegin()->first;
+
+  return aGroup;
+}
+
+
 //================================================================================
 /*!
  * \brief Creates SMESH_Groups for not wrapped SMESHDS_Groups
@@ -1955,6 +2020,13 @@ void SMESH_Mesh::fillAncestorsMap(const TopoDS_Shape& theShape)
                                         (TopAbs_ShapeEnum) ancType,
                                         _mapAncestors );
   }
+  // visit COMPOUNDs inside a COMPOUND that are not reachable by TopExp_Explorer
+  if ( theShape.ShapeType() == TopAbs_COMPOUND )
+  {
+    for ( TopoDS_Iterator sIt(theShape); sIt.More(); sIt.Next() )
+      if ( sIt.Value().ShapeType() == TopAbs_COMPOUND )
+        fillAncestorsMap( sIt.Value() );
+  }
 }
 
 //=============================================================================
@@ -1977,9 +2049,9 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
   typedef list<SMESH_subMesh*>::iterator TPosInList;
   map< int, TPosInList > sortedPos;
   TPosInList smBeg = theListToSort.begin(), smEnd = theListToSort.end();
-  TListOfListOfInt::const_iterator listIddIt = _mySubMeshOrder.begin();
-  for( ; listIddIt != _mySubMeshOrder.end(); listIddIt++) {
-    const TListOfInt& listOfId = *listIddIt;
+  TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin();
+  for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++) {
+    const TListOfInt& listOfId = *listIdsIt;
     TListOfInt::const_iterator idIt = listOfId.begin();
     for ( ; idIt != listOfId.end(); idIt++ ) {
       if ( SMESH_subMesh * sm = GetSubMeshContaining( *idIt )) {
@@ -2006,6 +2078,30 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
   return res;
 }
 
+//================================================================================
+/*!
+ * \brief Return true if given order of sub-meshes is OK
+ */
+//================================================================================
+
+bool SMESH_Mesh::IsOrderOK( const SMESH_subMesh* smBefore,
+                            const SMESH_subMesh* smAfter ) const
+{
+  TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin();
+  TListOfInt::const_iterator idBef, idAft;
+  for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++)
+  {
+    const TListOfInt& listOfId = *listIdsIt;
+    idBef = std::find( listOfId.begin(), listOfId.end(), smBefore->GetId() );
+    if ( idBef != listOfId.end() )
+      idAft = std::find( listOfId.begin(), listOfId.end(), smAfter->GetId() );
+    if ( idAft != listOfId.end () )
+      return ( std::distance( listOfId.begin(), idBef ) <
+               std::distance( listOfId.begin(), idAft )   );
+  }
+  return true; // no order imposed to given submeshes
+} 
+
 //=============================================================================
 /*!
  * \brief sort submeshes according to stored mesh order
@@ -2014,8 +2110,8 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
  */
 //=============================================================================
 
-list<SMESH_subMesh*> SMESH_Mesh::getAncestorsSubMeshes
-  (const TopoDS_Shape& theSubShape) const
+list<SMESH_subMesh*>
+SMESH_Mesh::getAncestorsSubMeshes (const TopoDS_Shape& theSubShape) const
 {
   list<SMESH_subMesh*> listOfSubMesh;
   TopTools_ListIteratorOfListOfShape it( GetAncestors( theSubShape ));
index 5ae3cc61c74899b386205e1231d7e81a630e89c6..5bd9b9c14476db90d122ac265088b584205e1460 100644 (file)
 
 #include "SMESH_SMESH.hxx"
 
-#include "SMESH_Hypothesis.hxx"
-#include "SMESH_Controls.hxx"
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_Command.hxx"
 #include "SMDSAbs_ElementType.hxx"
+#include "SMESHDS_Command.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_ComputeError.hxx"
+#include "SMESH_Controls.hxx"
+#include "SMESH_Hypothesis.hxx"
 
 #include "Utils_SALOME_Exception.hxx"
 
@@