src/DriverMED/Makefile \
src/DriverSTL/Makefile \
src/DriverUNV/Makefile \
+ src/DriverGMF/Makefile \
src/DriverCGNS/Makefile \
src/MEFISTO2/Makefile \
src/OBJECT/Makefile \
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
--- /dev/null
+#!/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
#---------------------------------------------------------------------------
#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
#---------------------------------------------------------------------------
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
\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".
\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.
*/
\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,
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>
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
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:
<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.
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>
<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>
<br><b>See Also</b> a sample TUI Script of a
\ref tui_cutting_quadrangles "Cutting Quadrangles" operation.
-*/
\ No newline at end of file
+*/
\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>
<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>
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
\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>
\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
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()
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()
\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
\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
]
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
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 ""
<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.
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>
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
{
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
* \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
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);
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,
#define _SMESH_MESHEDITOR_IDL_
#include "SMESH_Mesh.idl"
+#include "SMESH_Gen.idl"
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
*/
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
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
* \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);
};
};
<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" />
<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"/>
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"
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();
}
}
}
}
/*
- *Class : RangeOfIds
+ *Class : RangeOfIds
*Description : Predicate for Range of Ids.
* Range may be specified with two ways.
* 1. Using AddToRange method
//
#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 )
{}
#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 );
}
#ifndef _INCLUDE_DRIVER_MESH
#define _INCLUDE_DRIVER_MESH
+#include "SMESH_ComputeError.hxx"
+
#include <string>
#include <vector>
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
# 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 = \
}
{
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 );
}
$(BOOST_CPPFLAGS) \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMDS \
+ -I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMESHDS
libMeshDriverDAT_la_LDFLAGS = \
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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
--- /dev/null
+// 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;
+}
--- /dev/null
+// 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
--- /dev/null
+# 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
--- /dev/null
+// 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
--- /dev/null
+
+
+/*----------------------------------------------------------*/
+/* */
+/* 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);
+ }
+}
--- /dev/null
+
+
+/*----------------------------------------------------------*/
+/* */
+/* 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
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;
}
}
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;
$(BOOST_CPPFLAGS) \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMDS \
+ -I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMESHDS
libMeshDriverMED_la_LDFLAGS = \
$(BOOST_CPPFLAGS) \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMDS \
+ -I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMESHDS
libMeshDriverUNV_la_LDFLAGS = \
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;
# Author : Patrick GOLDBRONN (CEA)
# Modified by : Alexander BORODIN (OCN) - autotools usage
# Module : SMESH
-# $Header$
#
include $(top_srcdir)/adm_local/unix/make_common_starter.am
DriverDAT \
DriverUNV \
DriverSTL \
+ DriverGMF \
$(DriverCGNS_SUDIR) \
SMESH \
SMESH_I \
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
SMESH_FaceOrientationFilter.h \
SMESH_ScalarBarActor.h \
SMESH_NodeLabelActor.h \
- SMESH_CellLabelActor.h
+ SMESH_CellLabelActor.h \
+ SMESH_SVTKActor.h
+
# Libraries targets
SMESH_FaceOrientationFilter.cxx \
SMESH_ScalarBarActor.cxx \
SMESH_NodeLabelActor.cxx \
- SMESH_CellLabelActor.cxx
+ SMESH_CellLabelActor.cxx \
+ SMESH_SVTKActor.cxx
libSMESHObject_la_CPPFLAGS = \
$(QT_INCLUDES) \
#include "VTKViewer_ExtractUnstructuredGrid.h"
#include "VTKViewer_FramedTextActor.h"
#include "SALOME_InteractiveObject.hxx"
+#include "SMESH_SVTKActor.h"
#include "SUIT_Session.h"
#include "SUIT_ResourceMgr.h"
myIsPointsVisible = false;
myIsEntityModeCache = false;
+ myHighlightActor = SMESH_SVTKActor::New();
+ myHighlightActor->Initialize();
+
+ myPreHighlightActor = SMESH_SVTKActor::New();
+ myPreHighlightActor->Initialize();
+
myIsShrinkable = false;
myIsShrunk = false;
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;
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);
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();
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();
//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);
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();
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();
myPreselectProp->SetLineWidth(aLineWidth);
myPreselectProp->SetRepresentation(1);
+ myBallPreselectProp = vtkProperty::New();
+ myBallPreselectProp->DeepCopy(myPreselectProp);
+ myBallPreselectProp->SetPointSize(aBallElemSize);
+
myHighlitableActor = SMESH_DeviceActor::New();
myHighlitableActor->SetUserMatrix(aMatrix);
myHighlitableActor->PickableOff();
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]);
my2dHistogram = 0;
#endif
+ SetBallSize(aBallElemSize);
+ Set0DSize(aElem0DSize);
}
mySurfaceProp->Delete();
myBackSurfaceProp->Delete();
+ myNormalVProp->Delete();
+ myReversedVProp->Delete();
myOutLineProp->Delete();
myEdgeProp->Delete();
my2DExtProp->Delete();
my2DExtActor->Delete();
my3DActor->Delete();
+ my3DExtProp->Delete();
my3DExtActor->Delete();
myNodeActor->Delete();
myImplicitBoolean->Delete();
myTimeStamp->Delete();
+ myBallHighlightProp->Delete();
+ myBallPreselectProp->Delete();
+
}
void SMESH_ActorDef::Delete()
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)
void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
+
+ //myHighlightActor->AddToRender(theRenderer);
+
theRenderer->AddActor(myBaseActor);
theRenderer->AddActor(myNodeExtActor);
theRenderer->AddActor(my1DExtActor);
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 )
myNodeActor->VisibilityOn();
}
- if(myEntityMode & e0DElements){
+ if(myEntityMode & e0DElements && GetRepresentation() != ePoint ){
my0DActor->VisibilityOn();
}
- if(myEntityMode & eBallElem){
+ if(myEntityMode & eBallElem && GetRepresentation() != ePoint ){
myBallActor->VisibilityOn();
}
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;
} 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;
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) {
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;
}
my2DExtActor->SetRepresentation(aReperesent);
- my3DActor->SetProperty(aProp);
- my3DActor->SetBackfaceProperty(aBackProp);
+ my3DActor->SetProperty(aPropVN);
+ my3DActor->SetBackfaceProperty(aPropVR);
my3DActor->SetRepresentation(aReperesent);
//my0DExtActor->SetVisibility(false);
{
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);
}
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);
}
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;
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);
void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){
myHighlightProp->SetColor(r,g,b);
+ myBallHighlightProp->SetColor(r,g,b);
Modified();
}
void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){
myPreselectProp->SetColor(r,g,b);
+ myBallPreselectProp->SetColor(r,g,b);
Modified();
}
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();
}
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();
}
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;
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;
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;
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);
virtual vtkFloatingPointType GetLineWidth();
virtual void SetLineWidth(vtkFloatingPointType theVal);
+ virtual vtkFloatingPointType GetOutlineWidth();
+ virtual void SetOutlineWidth(vtkFloatingPointType theVal);
+
virtual void Set0DSize(vtkFloatingPointType size);
virtual vtkFloatingPointType Get0DSize();
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();
vtkProperty* mySurfaceProp;
vtkProperty* myBackSurfaceProp;
+ vtkProperty* myNormalVProp;
+ vtkProperty* myReversedVProp;
vtkProperty* myEdgeProp;
vtkProperty* myNodeProp;
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;
bool myIsFacesOriented;
int myDeltaBrightness;
+ int myDeltaVBrightness;
VTK::MarkerTexture myMarkerTexture;
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
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();
// 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;
// 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
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 ] ] )
{
}
}
}
-
- 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 );
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 ) {
--- /dev/null
+// 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);
+}
+
--- /dev/null
+// 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
int nbElems;
} ListElemByNodesType; // TODO resize for polyhedrons
-class DownIdType
+class SMDS_EXPORT DownIdType
{
public:
DownIdType(int a, unsigned char b) :
}
};
-class SMDS_Downward
+class SMDS_EXPORT SMDS_Downward
{
friend class SMDS_UnstructuredGrid;
friend class SMDS_Down2D;
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:
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;
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:
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:
~SMDS_DownEdge();
};
-class SMDS_DownQuadEdge: public SMDS_Down1D
+class SMDS_EXPORT SMDS_DownQuadEdge: public SMDS_Down1D
{
friend class SMDS_UnstructuredGrid;
public:
~SMDS_DownQuadEdge();
};
-class SMDS_DownTriangle: public SMDS_Down2D
+class SMDS_EXPORT SMDS_DownTriangle: public SMDS_Down2D
{
friend class SMDS_UnstructuredGrid;
public:
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:
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:
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:
//protected:
//};
-class SMDS_DownTetra: public SMDS_Down3D
+class SMDS_EXPORT SMDS_DownTetra: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
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:
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:
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:
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:
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:
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:
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:
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;
* @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);
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;
}
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);
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
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
// -------------
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 \
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 \
-I$(srcdir)/../DriverUNV \
-I$(srcdir)/../DriverSTL \
-I$(srcdir)/../DriverCGNS \
+ -I$(srcdir)/../DriverGMF \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHDS \
-I$(srcdir)/../SMESHUtils
../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
+++ /dev/null
-// 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()
-{
-}
-
+++ /dev/null
-// 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
+++ /dev/null
-// 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()
-{
-}
-
+++ /dev/null
-// 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
+++ /dev/null
-// 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;
-}
-
-
+++ /dev/null
-// 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
+++ /dev/null
-// 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()
-{
-}
-
-
+++ /dev/null
-// 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
#include "SMESH_HypoFilter.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_TypeDefs.hxx"
+#include "SMESH_subMesh.hxx"
#include <Basics_OCCTVersion.hxx>
#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>
#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>
{
}
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+
+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
// 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 );
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;
+}
+
+
class SMESH_Mesh;
class SMESH_HypoFilter;
class TopoDS_Vertex;
+class TopoDS_Wire;
class TopoDS_Face;
class TopoDS_Shape;
class SMESHDS_Mesh;
*/
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
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
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
#include "Utils_ExceptHandlers.hxx"
#include <TopoDS_Iterator.hxx>
+#include <LDOMParser.hxx>
#include "memoire.h"
+#ifdef WNT
+ #include <windows.h>
+#endif\r
+
using namespace std;
//=============================================================================
{
SMESH_MesherHelper aHelper( aMesh );
if ( aHelper.IsQuadraticMesh() != SMESH_MesherHelper::LINEAR )
- aHelper.FixQuadraticElements();
+ {
+ aHelper.FixQuadraticElements( sm->GetComputeError() );
+ }
}
return ret;
}
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");
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);
}
{
// sub-meshes should not be checked further more
SMESH_subMesh* sm = itsub->next();
- aCheckedMap.insert( sm );
if (isTopLocalAlgo)
{
checkNoAlgo2 = false;
}
}
+ aCheckedMap.insert( sm );
}
}
return ret;
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
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
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;
}
//=============================================================================
#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"
#include <map>
#include <list>
+#include <vector>
+#include <string>
class SMESHDS_Document;
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;
// File : SMESH_Group.cxx
// Author : Michael Sazonov (OCC)
// Module : SMESH
-// $Header$
//
#include "SMESH_Group.hxx"
#include "SMESH_Mesh.hxx"
myGroupDS = new SMESHDS_Group (theID,
const_cast<SMESH_Mesh*>(theMesh)->GetMeshDS(),
theType);
+ myGroupDS->SetStoreName( theName );
}
//================================================================================
//=============================================================================
/*!
- *
+ * Destructor deletes myGroupDS
*/
//=============================================================================
{
delete myGroupDS; myGroupDS=0;
}
+
+//================================================================================
+/*!
+ * \brief Sets a new name
+ */
+//================================================================================
+
+void SMESH_Group::SetName (const char* theName)
+{
+ myName = theName;
+ myGroupDS->SetStoreName( theName );
+}
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(); }
int studyId,
SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId)
{
- //MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis");
_gen = gen;
_studyId = studyId;
StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
_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();
}
//=============================================================================
SMESH_Hypothesis::~SMESH_Hypothesis()
{
MESSAGE("SMESH_Hypothesis::~SMESH_Hypothesis");
+ StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
+ myStudyContext->mapHypothesis[_hypId] = 0;
}
//=============================================================================
*
*/
//=============================================================================
-void SMESH_Hypothesis::SetParameters(const char *theParameters)
-{
- string aNewParameters(theParameters);
- if(aNewParameters.size()==0 && _parameters.size()==0)
- aNewParameters = " ";
- if(_parameters.size()>0)
- _parameters +="|";
- _parameters +=aNewParameters;
- SetLastParameters(theParameters);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-void SMESH_Hypothesis::ClearParameters()
-{
- _parameters = string();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-char* SMESH_Hypothesis::GetParameters() const
-{
- return (char*)_parameters.c_str();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-char* SMESH_Hypothesis::GetLastParameters() const
-{
- return (char*)_lastParameters.c_str();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-void SMESH_Hypothesis::SetLastParameters(const char* theParameters)
-{
- _lastParameters = string(theParameters);
-}
+// 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);
+// }
{
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
// 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
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
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
#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"
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();
+}
+
//=============================================================================
/*!
*
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
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
(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() );
+ }
}
//=============================================================================
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 )) {
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
*/
//=============================================================================
-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 ));
#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"