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"
#include <map>
#include <list>
+
#ifdef WNT
#pragma warning(disable:4251) // Warning DLL Interface ...
#pragma warning(disable:4290) // Warning Exception ...
int CGNSToMesh(const char* theFileName, const int theMeshIndex, std::string& theMeshName);
+ SMESH_ComputeErrorPtr GMFToMesh(const char* theFileName);
+
SMESH_Hypothesis::Hypothesis_Status
AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
throw(SALOME_Exception);
const SMESHDS_Mesh* meshPart = 0) throw(SALOME_Exception);
void ExportCGNS(const char * file,
const SMESHDS_Mesh* mesh);
+ void ExportGMF(const char * file,
+ const SMESHDS_Mesh* mesh);
void ExportSAUV(const char *file,
const char* theMeshName = NULL,
bool theAutoGroups = true) throw(SALOME_Exception);
int& theId,
const TopoDS_Shape& theShape=TopoDS_Shape(),
const SMESH_PredicatePtr& thePredicate=SMESH_PredicatePtr());
-
+
+ SMESH_Group* AddGroup (SMESHDS_GroupBase* groupDS) throw(SALOME_Exception);
+
typedef boost::shared_ptr< SMDS_Iterator<SMESH_Group*> > GroupIteratorPtr;
GroupIteratorPtr GetGroups() const;
void SetMeshOrder(const TListOfListOfInt& theOrder );
const TListOfListOfInt& GetMeshOrder() const;
- /*!
- * \brief sort submeshes according to stored mesh order
- * \param theListToSort in out list to be sorted
- * \return FALSE if nothing sorted
- */
+ // sort submeshes according to stored mesh order
bool SortByMeshOrder(std::list<SMESH_subMesh*>& theListToSort) const;
- //
-
+ // return true if given order of sub-meshes is OK
+ bool IsOrderOK( const SMESH_subMesh* smBefore,
+ const SMESH_subMesh* smAfter ) const;
+
ostream& Dump(ostream & save);
private:
//=======================================================================
//function : edgeConnectivity
-//purpose : auxilary
+//purpose : auxilary
// return number of the edges connected with the theNode.
// if theEdges has connections with the other type of the
-// elements, return -1
+// elements, return -1
//=======================================================================
static int nbEdgeConnectivity(const SMDS_MeshNode* theNode)
{
SMESHDS_SubMesh* subMesh = 0;//GetMeshDS()->MeshElements(1);
SMESHDS_SubMesh* fSubMesh = 0;//subMesh;
-
+
SMESH_SequenceOfElemPtr newNodes, newElems;
// map face of volume to it's baricenrtic node
const SMDS_MeshElement* elem = elemIt->next();
if(elem->GetType() == SMDSAbs_0DElement)
continue;
-
+
SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator();
if ( elem->GetType() == SMDSAbs_Volume )
{
//MESSAGE("sweepElement " << nbSteps);
SMESHDS_Mesh* aMesh = GetMeshDS();
- const int nbNodes = elem->NbNodes();
+ const int nbNodes = elem->NbNodes();
const int nbCorners = elem->NbCornerNodes();
- SMDSAbs_EntityType baseType = elem->GetEntityType(); /* it can change in case of
+ SMDSAbs_EntityType baseType = elem->GetEntityType(); /* it can change in case of
polyhedron creation !!! */
// Loop on elem nodes:
// find new nodes and detect same nodes indices
midlNod[0], midlNod[1], midlNod[2], midlNod[3]);
}
else if(nbSame==1) {
- // ---> pyramid + pentahedron - can not be created since it is needed
+ // ---> pyramid + pentahedron - can not be created since it is needed
// additional middle node at the center of face
INFOS( " Sweep for face " << elem->GetID() << " can not be created" );
return;
{
const SMDS_MeshNode* node =
static_cast<const SMDS_MeshNode*>( nList->first );
+ if ( newElemsMap.count( node ))
+ continue; // node was extruded into edge
SMDS_ElemIteratorPtr eIt = node->GetInverseElementIterator();
int nbInitElems = 0;
const SMDS_MeshElement* el = 0;
list< list<SMESH_MeshEditor_PathPoint> > LLPPs;
int startNid = theN1->GetID();
TColStd_MapOfInteger UsedNums;
-
+
int NbEdges = Edges.Length();
int i = 1;
for(; i<=NbEdges; i++) {
if( !theTrack->GetMeshDS()->Contains(theN1) ) {
return EXTR_BAD_STARTING_NODE;
}
-
+
conn = nbEdgeConnectivity(theN1);
if(conn > 2)
return EXTR_PATH_NOT_EDGE;
if(currentNode == prevNode)
currentNode = static_cast<const SMDS_MeshNode*>(nIt->next());
aNodesList.push_back(currentNode);
- } else {
+ } else {
nIt = currentElem->nodesIterator();
while( nIt->more() ) {
currentNode = static_cast<const SMDS_MeshNode*>(nIt->next());
if(currentNode == prevNode)
currentNode = static_cast<const SMDS_MeshNode*>(nIt->next());
aNodesList.push_back(currentNode);
-
+
//case of the closed mesh
if(currentNode == theN1) {
nbEdges++;
conn = nbEdgeConnectivity(currentNode);
if(conn > 2) {
- return EXTR_PATH_NOT_EDGE;
+ return EXTR_PATH_NOT_EDGE;
}else if( conn == 1 && nbEdges > 0 ) {
//End of the path
nbEdges++;
nbEdges++;
}
}
- }
-
+ }
+
if(nbEdges != totalNbEdges)
return EXTR_PATH_NOT_EDGE;
x1 = aNodesList[i-1]->X();x2 = aNodesList[i]->X();
y1 = aNodesList[i-1]->Y();y2 = aNodesList[i]->Y();
z1 = aNodesList[i-1]->Z();z2 = aNodesList[i]->Z();
- TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp_Pnt(x1,y1,z1),gp_Pnt(x2,y2,z2));
+ TopoDS_Edge e = BRepBuilderAPI_MakeEdge(gp_Pnt(x1,y1,z1),gp_Pnt(x2,y2,z2));
list<SMESH_MeshEditor_PathPoint> LPP;
aPrms.clear();
MakeEdgePathPoints(aPrms, e, (aNodesList[i-1]->GetID()==startNid), LPP);
fullList.pop_back();
}
fullList.push_back(PP1);
-
+
} // Sub-shape for the Pattern must be an Edge or Wire
else if( aS.ShapeType() == TopAbs_EDGE ) {
aTrackEdge = TopoDS::Edge( aS );
SMDSAbs_GeometryType geomType = elem->GetGeomType();
int nbNodes = elem->NbNodes();
- if ( geomType == SMDSGeom_POINT ) continue; // node
+ if ( geomType == SMDSGeom_NONE ) continue; // node
switch ( geomType ) {
// Sort existing groups by types and collect their names
// to store an old group and a generated new one
- typedef pair< SMESHDS_GroupBase*, SMDS_MeshGroup* > TOldNewGroup;
+ typedef pair< SMESHDS_GroupBase*, SMESHDS_Group* > TOldNewGroup;
vector< list< TOldNewGroup > > groupsByType( SMDSAbs_NbElementTypes );
+ vector< TOldNewGroup* > orderedOldNewGroups; // in order of old groups
// group names
set< string > groupNames;
- //
- SMDS_MeshGroup* nullNewGroup = (SMDS_MeshGroup*) 0;
+
SMESH_Mesh::GroupIteratorPtr groupIt = GetMesh()->GetGroups();
- while ( groupIt->more() ) {
+ if ( !groupIt->more() ) return newGroupIDs;
+
+ int newGroupID = mesh->GetGroupIds().back()+1;
+ while ( groupIt->more() )
+ {
SMESH_Group * group = groupIt->next();
if ( !group ) continue;
SMESHDS_GroupBase* groupDS = group->GetGroupDS();
if ( !groupDS || groupDS->IsEmpty() ) continue;
groupNames.insert( group->GetName() );
groupDS->SetStoreName( group->GetName() );
- groupsByType[ groupDS->GetType() ].push_back( make_pair( groupDS, nullNewGroup ));
+ SMESHDS_Group* newGroup = new SMESHDS_Group( newGroupID++, mesh->GetMeshDS(),
+ groupDS->GetType() );
+ groupsByType[ groupDS->GetType() ].push_back( make_pair( groupDS, newGroup ));
+ orderedOldNewGroups.push_back( & groupsByType[ groupDS->GetType() ].back() );
}
- // Groups creation
+ // Loop on nodes and elements to add them in new groups
- // loop on nodes and elements
for ( int isNodes = 0; isNodes < 2; ++isNodes )
{
const SMESH_SequenceOfElemPtr& gens = isNodes ? nodeGens : elemGens;
continue;
}
list< TOldNewGroup > & groupsOldNew = groupsByType[ sourceElem->GetType() ];
- if ( groupsOldNew.empty() ) {
+ if ( groupsOldNew.empty() ) { // no groups of this type at all
while ( iElem < gens.Length() && gens( iElem+1 ) == sourceElem )
++iElem; // skip all elements made by sourceElem
continue;
if ( const SMDS_MeshElement* resElem = elems( ++iElem ))
if ( resElem != sourceElem )
resultElems.push_back( resElem );
- // do not generate element groups from node ones
-// if ( sourceElem->GetType() == SMDSAbs_Node &&
-// elems( iElem )->GetType() != SMDSAbs_Node )
-// continue;
// add resultElems to groups made by ones the sourceElem belongs to
list< TOldNewGroup >::iterator gOldNew, gLast = groupsOldNew.end();
for ( gOldNew = groupsOldNew.begin(); gOldNew != gLast; ++gOldNew )
{
SMESHDS_GroupBase* oldGroup = gOldNew->first;
- if ( oldGroup->Contains( sourceElem )) // sourceElem in oldGroup
+ if ( oldGroup->Contains( sourceElem )) // sourceElem is in oldGroup
{
- SMDS_MeshGroup* & newGroup = gOldNew->second;
- if ( !newGroup )// create a new group
- {
- // make a name
- string name = oldGroup->GetStoreName();
- if ( !targetMesh ) {
- name += "_";
- name += postfix;
- int nb = 0;
- while ( !groupNames.insert( name ).second ) // name exists
- {
- if ( nb == 0 ) {
- name += "_1";
- }
- else {
- TCollection_AsciiString nbStr(nb+1);
- name.resize( name.rfind('_')+1 );
- name += nbStr.ToCString();
- }
- ++nb;
- }
- }
- // make a group
- int id;
- SMESH_Group* group = mesh->AddGroup( resultElems.back()->GetType(),
- name.c_str(), id );
- SMESHDS_Group* groupDS = static_cast<SMESHDS_Group*>(group->GetGroupDS());
- newGroup = & groupDS->SMDSGroup();
- newGroupIDs->push_back( id );
- }
-
// fill in a new group
+ SMDS_MeshGroup & newGroup = gOldNew->second->SMDSGroup();
list< const SMDS_MeshElement* >::iterator resLast = resultElems.end(), resElemIt;
for ( resElemIt = resultElems.begin(); resElemIt != resLast; ++resElemIt )
- newGroup->Add( *resElemIt );
+ newGroup.Add( *resElemIt );
}
}
} // loop on created elements
}// loop on nodes and elements
+ // Create new SMESH_Groups from SMESHDS_Groups and remove empty SMESHDS_Groups
+
+ for ( size_t i = 0; i < orderedOldNewGroups.size(); ++i )
+ {
+ SMESHDS_GroupBase* oldGroupDS = orderedOldNewGroups[i]->first;
+ SMESHDS_Group* newGroupDS = orderedOldNewGroups[i]->second;
+ if ( newGroupDS->IsEmpty() )
+ {
+ mesh->GetMeshDS()->RemoveGroup( newGroupDS );
+ }
+ else
+ {
+ // make a name
+ string name = oldGroupDS->GetStoreName();
+ if ( !targetMesh ) {
+ name += "_";
+ name += postfix;
+ int nb = 1;
+ while ( !groupNames.insert( name ).second ) // name exists
+ name = SMESH_Comment( oldGroupDS->GetStoreName() ) << "_" << postfix << "_" << nb++;
+ }
+ newGroupDS->SetStoreName( name.c_str() );
+
+ // make a SMESH_Groups
+ mesh->AddGroup( newGroupDS );
+ newGroupIDs->push_back( newGroupDS->GetID() );
+
+ // set group type
+ newGroupDS->SetType( newGroupDS->GetElements()->next()->GetType() );
+ }
+ }
+
return newGroupIDs;
}
*/
//=======================================================================
-SMESH_NodeSearcher* SMESH_MeshEditor::GetNodeSearcher()
+SMESH_NodeSearcher* SMESH_MeshEditor::GetNodeSearcher()
{
return new SMESH_NodeSearcherImpl( GetMeshDS() );
}
GeomAPI_ExtremaCurveCurve anExtCC;
Handle(Geom_Curve) lineCurve = new Geom_Line( line );
-
+
int nbNodes = face->IsQuadratic() ? face->NbNodes()/2 : face->NbNodes();
for ( int i = 0; i < nbNodes && nbInts < 2; ++i )
{
GC_MakeSegment edge( SMESH_TNodeXYZ( face->GetNode( i )),
- SMESH_TNodeXYZ( face->GetNode( (i+1)%nbNodes) ));
+ SMESH_TNodeXYZ( face->GetNode( (i+1)%nbNodes) ));
anExtCC.Init( lineCurve, edge);
if ( anExtCC.NbExtrema() > 0 && anExtCC.LowerDistance() <= tol)
{
while (( f = SMESH_MeshEditor::FindFaceInSet(link.node1(), link.node2(), emptySet, faces )))
faces.insert( f );
- // select another outer face among the found
+ // select another outer face among the found
const SMDS_MeshElement* outerFace2 = 0;
if ( faces.size() == 2 )
{
// There are internal boundaries touching the outher one,
// find all faces of internal boundaries in order to find
// faces of boundaries of holes, if any.
-
+
}
else
{
int nbInter = u2inters.size();
if ( nbInter == 0 )
- return TopAbs_OUT;
+ return TopAbs_OUT;
double f = u2inters.begin()->first, l = u2inters.rbegin()->first;
if ( nbInter == 1 ) // not closed mesh
return TopAbs_ON;
if ( nbIntBeforePoint == 0 || nbIntAfterPoint == 0)
- return TopAbs_OUT;
+ return TopAbs_OUT;
if ( nbIntBeforePoint + nbIntAfterPoint == 1 ) // not closed mesh
return fabs( f ) < tolerance ? TopAbs_ON : TopAbs_UNKNOWN;
if ( !theForce3d )
{ // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
aHelper.SetSubShape(0); // apply FixQuadraticElements() to the whole mesh
- aHelper.FixQuadraticElements();
+ aHelper.FixQuadraticElements(myError);
}
}
/*!
* \brief Makes given elements quadratic
* \param theForce3d - if true, the medium nodes will be placed in the middle of link
- * \param theElements - elements to make quadratic
+ * \param theElements - elements to make quadratic
*/
//================================================================================
// we believe that all theElements are of the same type
const SMDSAbs_ElementType elemType = (*theElements.begin())->GetType();
-
+
// get all nodes shared by theElements
TIDSortedNodeSet allNodes;
TIDSortedElemSet::iterator eIt = theElements.begin();
if ( !theForce3d && !getenv("NO_FixQuadraticElements"))
{ // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
helper.SetSubShape(0); // apply FixQuadraticElements() to the whole mesh
- helper.FixQuadraticElements();
+ helper.FixQuadraticElements( myError );
}
}
\param theElems - the list of elements (edges or faces) to be replicated
The nodes for duplication could be found from these elements
\param theNodesNot - list of nodes to NOT replicate
- \param theAffectedElems - the list of elements (cells and edges) to which the
+ \param theAffectedElems - the list of elements (cells and edges) to which the
replicated nodes should be associated to.
\return TRUE if operation has been completed successfully, FALSE otherwise
*/
std::vector<const SMDS_MeshNode*> newNodes( anElem->NbNodes() );
SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
int ind = 0;
- while ( anIter->more() )
- {
+ while ( anIter->more() )
+ {
SMDS_MeshNode* aCurrNode = (SMDS_MeshNode*)anIter->next();
SMDS_MeshNode* aNewNode = aCurrNode;
/*!
\brief Creates a hole in a mesh by doubling the nodes of some particular elements
\param theNodes - identifiers of nodes to be doubled
- \param theModifiedElems - identifiers of elements to be updated by the new (doubled)
- nodes. If list of element identifiers is empty then nodes are doubled but
+ \param theModifiedElems - identifiers of elements to be updated by the new (doubled)
+ nodes. If list of element identifiers is empty then nodes are doubled but
they not assigned to elements
\return TRUE if operation has been completed successfully, FALSE otherwise
*/
//================================================================================
-bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes,
+bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes,
const std::list< int >& theListOfModifiedElems )
{
MESSAGE("DoubleNodes");
std::map< SMDS_MeshElement*, vector<const SMDS_MeshNode*> > anElemToNodes;
std::list< int >::const_iterator anElemIter;
- for ( anElemIter = theListOfModifiedElems.begin();
+ for ( anElemIter = theListOfModifiedElems.begin();
anElemIter != theListOfModifiedElems.end(); ++anElemIter )
{
int aCurr = *anElemIter;
SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
int ind = 0;
- while ( anIter->more() )
- {
+ while ( anIter->more() )
+ {
SMDS_MeshNode* aCurrNode = (SMDS_MeshNode*)anIter->next();
if ( aCurr && anOldNodeToNewNode.find( aCurrNode ) != anOldNodeToNewNode.end() )
{
anElemToNodes[ anElem ] = aNodeArr;
}
- // Change nodes of elements
+ // Change nodes of elements
std::map< SMDS_MeshElement*, vector<const SMDS_MeshNode*> >::iterator
anElemToNodesIter = anElemToNodes.begin();
};
}
+//================================================================================
+/*!
+ \brief Identify the elements that will be affected by node duplication (actual duplication is not performed.
+ This method is the first step of DoubleNodeElemGroupsInRegion.
+ \param theElems - list of groups of elements (edges or faces) to be replicated
+ \param theNodesNot - list of groups of nodes not to replicated
+ \param theShape - shape to detect affected elements (element which geometric center
+ located on or inside shape).
+ The replicated nodes should be associated to affected elements.
+ \return groups of affected elements
+ \sa DoubleNodeElemGroupsInRegion()
+ */
+//================================================================================
+
+bool SMESH_MeshEditor::AffectedElemGroupsInRegion( const TIDSortedElemSet& theElems,
+ const TIDSortedElemSet& theNodesNot,
+ const TopoDS_Shape& theShape,
+ TIDSortedElemSet& theAffectedElems)
+{
+ if ( theShape.IsNull() )
+ return false;
+
+ const double aTol = Precision::Confusion();
+ auto_ptr< BRepClass3d_SolidClassifier> bsc3d;
+ auto_ptr<_FaceClassifier> aFaceClassifier;
+ if ( theShape.ShapeType() == TopAbs_SOLID )
+ {
+ bsc3d.reset( new BRepClass3d_SolidClassifier(theShape));;
+ bsc3d->PerformInfinitePoint(aTol);
+ }
+ else if (theShape.ShapeType() == TopAbs_FACE )
+ {
+ aFaceClassifier.reset( new _FaceClassifier(TopoDS::Face(theShape)));
+ }
+
+ // iterates on indicated elements and get elements by back references from their nodes
+ TIDSortedElemSet::const_iterator elemItr = theElems.begin();
+ for ( ; elemItr != theElems.end(); ++elemItr )
+ {
+ SMDS_MeshElement* anElem = (SMDS_MeshElement*)*elemItr;
+ if (!anElem)
+ continue;
+
+ SMDS_ElemIteratorPtr nodeItr = anElem->nodesIterator();
+ while ( nodeItr->more() )
+ {
+ const SMDS_MeshNode* aNode = cast2Node(nodeItr->next());
+ if ( !aNode || theNodesNot.find(aNode) != theNodesNot.end() )
+ continue;
+ SMDS_ElemIteratorPtr backElemItr = aNode->GetInverseElementIterator();
+ while ( backElemItr->more() )
+ {
+ const SMDS_MeshElement* curElem = backElemItr->next();
+ if ( curElem && theElems.find(curElem) == theElems.end() &&
+ ( bsc3d.get() ?
+ isInside( curElem, *bsc3d, aTol ) :
+ isInside( curElem, *aFaceClassifier, aTol )))
+ theAffectedElems.insert( curElem );
+ }
+ }
+ }
+ return true;
+}
+
//================================================================================
/*!
\brief Creates a hole in a mesh by doubling the nodes of some particular elements
// --- build a map (face to duplicate --> volume to modify)
// with all the faces shared by 2 domains (group of elements)
// and corresponding volume of this domain, for each shared face.
- // a volume has a face shared by 2 domains if it has a neighbor which is not in is domain.
+ // a volume has a face shared by 2 domains if it has a neighbor which is not in his domain.
//MESSAGE("Domain " << idom);
const TIDSortedElemSet& domain = theElems[idom];
{
int oldId = *itn;
//MESSAGE(" node " << oldId);
- std::set<int> cells;
- cells.clear();
vtkCellLinks::Link l = grid->GetCellLinks()->GetLink(oldId);
for (int i=0; i<l.ncells; i++)
{
//no cells created after BuildDownWardConnectivity
}
DownIdType aCell(downId, vtkType);
- if (celldom.count(vtkId))
- continue;
+ if (!cellDomains.count(aCell))
+ cellDomains[aCell] = emptyMap; // create an empty entry for cell
cellDomains[aCell][idomain] = vtkId;
celldom[vtkId] = idomain;
//MESSAGE(" cell " << vtkId << " domain " << idomain);
std::set<int> oldNodes;
oldNodes.clear();
grid->GetNodeIds(oldNodes, face.cellId, face.cellType);
- bool isMultipleDetected = false;
std::set<int>::iterator itn = oldNodes.begin();
for (; itn != oldNodes.end(); ++itn)
{
int oldId = *itn;
- //MESSAGE(" node " << oldId);
+ //MESSAGE("-+-+-a node " << oldId);
if (!nodeDomains.count(oldId))
nodeDomains[oldId] = emptyMap; // create an empty entry for node
if (nodeDomains[oldId].empty())
- nodeDomains[oldId][idomain] = oldId; // keep the old node in the first domain
+ {
+ nodeDomains[oldId][idomain] = oldId; // keep the old node in the first domain
+ //MESSAGE("-+-+-b oldNode " << oldId << " domain " << idomain);
+ }
std::map<int, int>::iterator itdom = domvol.begin();
for (; itdom != domvol.end(); ++itdom)
{
{
vector<int> orderedDoms;
//MESSAGE("multiple node " << oldId);
- isMultipleDetected =true;
if (mutipleNodes.count(oldId))
orderedDoms = mutipleNodes[oldId];
else
SMDS_MeshNode *newNode = meshDS->AddNode(coords[0], coords[1], coords[2]);
int newId = newNode->getVtkId();
nodeDomains[oldId][idom] = newId; // cloned node for other domains
- //MESSAGE(" newNode " << newId << " oldNode " << oldId << " size=" <<nodeDomains[oldId].size());
- }
- if (nodeDomains[oldId].size() >= 3)
- {
- //MESSAGE("confirm multiple node " << oldId);
- isMultipleDetected =true;
+ //MESSAGE("-+-+-c oldNode " << oldId << " domain " << idomain << " newNode " << newId << " domain " << idom << " size=" <<nodeDomains[oldId].size());
}
}
}
- if (isMultipleDetected) // check if an edge of the face is shared between 3 or more domains
+ }
+ }
+
+ for (int idomain = 0; idomain < theElems.size(); idomain++)
+ {
+ itface = faceDomains.begin();
+ for (; itface != faceDomains.end(); ++itface)
+ {
+ std::map<int, int> domvol = itface->second;
+ if (!domvol.count(idomain))
+ continue;
+ DownIdType face = itface->first;
+ //MESSAGE(" --- face " << face.cellId);
+ std::set<int> oldNodes;
+ oldNodes.clear();
+ grid->GetNodeIds(oldNodes, face.cellId, face.cellType);
+ int nbMultipleNodes = 0;
+ std::set<int>::iterator itn = oldNodes.begin();
+ for (; itn != oldNodes.end(); ++itn)
+ {
+ int oldId = *itn;
+ if (mutipleNodes.count(oldId))
+ nbMultipleNodes++;
+ }
+ if (nbMultipleNodes > 1) // check if an edge of the face is shared between 3 or more domains
{
//MESSAGE("multiple Nodes detected on a shared face");
int downId = itface->first.cellId;
if (mutipleNodes.count(nodes[i]))
if (!mutipleNodesToFace.count(nodes[i]))
mutipleNodesToFace[nodes[i]] = mutipleNodes[nodes[i]];
- }
+ }
else // shared face (between two volumes)
{
int nbEdges = grid->getDownArray(cellType)->getNumberOfDownCells(downId);
{
vector<int> vn0 = mutipleNodes[nodes[0]];
vector<int> vn1 = mutipleNodes[nodes[nbNodes - 1]];
- sort( vn0.begin(), vn0.end() );
- sort( vn1.begin(), vn1.end() );
- if (vn0 == vn1)
+ vector<int> doms;
+ for (int i0 = 0; i0 < vn0.size(); i0++)
+ for (int i1 = 0; i1 < vn1.size(); i1++)
+ if (vn0[i0] == vn1[i1])
+ doms.push_back(vn0[i0]);
+ if (doms.size() >2)
{
//MESSAGE(" detect edgesMultiDomains " << nodes[0] << " " << nodes[nbNodes - 1]);
double *coords = grid->GetPoint(nodes[0]);
map<int, SMDS_VtkVolume*> domvol; // domain --> a volume with the edge
map<int, double> angleDom; // oriented angles between planes defined by edge and volume centers
int nbvol = grid->GetParentVolumes(vtkVolIds, downEdgeIds[ie], edgeType[ie]);
- for (int id=0; id < vn0.size(); id++)
+ for (int id=0; id < doms.size(); id++)
{
- int idom = vn0[id];
+ int idom = doms[id];
for (int ivol=0; ivol<nbvol; ivol++)
{
int smdsId = meshDS->fromVtkToSmds(vtkVolIds[ivol]);
if (createJointElems)
{
+ int idg;
+ string joints2DName = "joints2D";
+ mapOfJunctionGroups[joints2DName] = this->myMesh->AddGroup(SMDSAbs_Face, joints2DName.c_str(), idg);
+ SMESHDS_Group *joints2DGrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[joints2DName]->GetGroupDS());
+ string joints3DName = "joints3D";
+ mapOfJunctionGroups[joints3DName] = this->myMesh->AddGroup(SMDSAbs_Volume, joints3DName.c_str(), idg);
+ SMESHDS_Group *joints3DGrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[joints3DName]->GetGroupDS());
+
itface = faceDomains.begin();
for (; itface != faceDomains.end(); ++itface)
{
grpname << dom1 << "_" << dom2;
else
grpname << dom2 << "_" << dom1;
- int idg;
string namegrp = grpname.str();
if (!mapOfJunctionGroups.count(namegrp))
mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(vol->GetType(), namegrp.c_str(), idg);
SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[namegrp]->GetGroupDS());
if (sgrp)
sgrp->Add(vol->GetID());
+ if (vol->GetType() == SMDSAbs_Volume)
+ joints3DGrp->Add(vol->GetID());
+ else if (vol->GetType() == SMDSAbs_Face)
+ joints2DGrp->Add(vol->GetID());
}
}
orderedNodes.push_back( nodeDomains[nodes[ino]][orderDom[idom]] );
SMDS_MeshVolume* vol = this->GetMeshDS()->AddVolumeFromVtkIds(orderedNodes);
- stringstream grpname;
- grpname << "mj_";
- grpname << 0 << "_" << 0;
int idg;
- string namegrp = grpname.str();
+ string namegrp = "jointsMultiples";
if (!mapOfJunctionGroups.count(namegrp))
mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(SMDSAbs_Volume, namegrp.c_str(), idg);
SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[namegrp]->GetGroupDS());
}
else
{
- MESSAGE("Quadratic multiple joints not implemented");
+ INFOS("Quadratic multiple joints not implemented");
// TODO quadratic nodes
}
}
return true;
}
+/*!
+ * \brief identify all the elements around a geom shape, get the faces delimiting the hole
+ * Build groups of volume to remove, groups of faces to replace on the skin of the object,
+ * groups of faces to remove inside the object, (idem edges).
+ * Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+ */
+void SMESH_MeshEditor::CreateHoleSkin(double radius,
+ const TopoDS_Shape& theShape,
+ SMESH_NodeSearcher* theNodeSearcher,
+ const char* groupName,
+ std::vector<double>& nodesCoords,
+ std::vector<std::vector<int> >& listOfListOfNodes)
+{
+ MESSAGE("--------------------------------");
+ MESSAGE("SMESH_MeshEditor::CreateHoleSkin");
+ MESSAGE("--------------------------------");
+
+ // --- zone of volumes to remove is given :
+ // 1 either by a geom shape (one or more vertices) and a radius,
+ // 2 either by a group of nodes (representative of the shape)to use with the radius,
+ // 3 either by a group of nodes where all the elements build on one of this nodes are to remove,
+ // In the case 2, the group of nodes is an external group of nodes from another mesh,
+ // In the case 3, the group of nodes is an internal group of the mesh (obtained for instance by a filter),
+ // defined by it's name.
+
+ SMESHDS_GroupBase* groupDS = 0;
+ SMESH_Mesh::GroupIteratorPtr groupIt = this->myMesh->GetGroups();
+ while ( groupIt->more() )
+ {
+ groupDS = 0;
+ SMESH_Group * group = groupIt->next();
+ if ( !group ) continue;
+ groupDS = group->GetGroupDS();
+ if ( !groupDS || groupDS->IsEmpty() ) continue;
+ std::string grpName = group->GetName();
+ if (grpName == groupName)
+ break;
+ }
+
+ bool isNodeGroup = false;
+ bool isNodeCoords = false;
+ if (groupDS)
+ {
+ if (groupDS->GetType() != SMDSAbs_Node)
+ return;
+ isNodeGroup = true; // a group of nodes exists and it is in this mesh
+ }
+
+ if (nodesCoords.size() > 0)
+ isNodeCoords = true; // a list o nodes given by their coordinates
+
+ // --- define groups to build
+
+ int idg; // --- group of SMDS volumes
+ string grpvName = groupName;
+ grpvName += "_vol";
+ SMESH_Group *grp = this->myMesh->AddGroup(SMDSAbs_Volume, grpvName.c_str(), idg);
+ if (!grp)
+ {
+ MESSAGE("group not created " << grpvName);
+ return;
+ }
+ SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(grp->GetGroupDS());
+
+ int idgs; // --- group of SMDS faces on the skin
+ string grpsName = groupName;
+ grpsName += "_skin";
+ SMESH_Group *grps = this->myMesh->AddGroup(SMDSAbs_Face, grpsName.c_str(), idgs);
+ if (!grps)
+ {
+ MESSAGE("group not created " << grpsName);
+ return;
+ }
+ SMESHDS_Group *sgrps = dynamic_cast<SMESHDS_Group*>(grps->GetGroupDS());
+
+ int idgi; // --- group of SMDS faces internal (several shapes)
+ string grpiName = groupName;
+ grpiName += "_internalFaces";
+ SMESH_Group *grpi = this->myMesh->AddGroup(SMDSAbs_Face, grpiName.c_str(), idgi);
+ if (!grpi)
+ {
+ MESSAGE("group not created " << grpiName);
+ return;
+ }
+ SMESHDS_Group *sgrpi = dynamic_cast<SMESHDS_Group*>(grpi->GetGroupDS());
+
+ int idgei; // --- group of SMDS faces internal (several shapes)
+ string grpeiName = groupName;
+ grpeiName += "_internalEdges";
+ SMESH_Group *grpei = this->myMesh->AddGroup(SMDSAbs_Edge, grpeiName.c_str(), idgei);
+ if (!grpei)
+ {
+ MESSAGE("group not created " << grpeiName);
+ return;
+ }
+ SMESHDS_Group *sgrpei = dynamic_cast<SMESHDS_Group*>(grpei->GetGroupDS());
+
+ // --- build downward connectivity
+
+ SMESHDS_Mesh *meshDS = this->myMesh->GetMeshDS();
+ meshDS->BuildDownWardConnectivity(true);
+ SMDS_UnstructuredGrid* grid = meshDS->getGrid();
+
+ // --- set of volumes detected inside
+
+ std::set<int> setOfInsideVol;
+ std::set<int> setOfVolToCheck;
+
+ std::vector<gp_Pnt> gpnts;
+ gpnts.clear();
+
+ if (isNodeGroup) // --- a group of nodes is provided : find all the volumes using one or more of this nodes
+ {
+ MESSAGE("group of nodes provided");
+ SMDS_ElemIteratorPtr elemIt = groupDS->GetElements();
+ while ( elemIt->more() )
+ {
+ const SMDS_MeshElement* elem = elemIt->next();
+ if (!elem)
+ continue;
+ const SMDS_MeshNode* node = dynamic_cast<const SMDS_MeshNode*>(elem);
+ if (!node)
+ continue;
+ SMDS_MeshElement* vol = 0;
+ SMDS_ElemIteratorPtr volItr = node->GetInverseElementIterator(SMDSAbs_Volume);
+ while (volItr->more())
+ {
+ vol = (SMDS_MeshElement*)volItr->next();
+ setOfInsideVol.insert(vol->getVtkId());
+ sgrp->Add(vol->GetID());
+ }
+ }
+ }
+ else if (isNodeCoords)
+ {
+ MESSAGE("list of nodes coordinates provided");
+ int i = 0;
+ int k = 0;
+ while (i < nodesCoords.size()-2)
+ {
+ double x = nodesCoords[i++];
+ double y = nodesCoords[i++];
+ double z = nodesCoords[i++];
+ gp_Pnt p = gp_Pnt(x, y ,z);
+ gpnts.push_back(p);
+ MESSAGE("TopoDS_Vertex " << k++ << " " << p.X() << " " << p.Y() << " " << p.Z());
+ }
+ }
+ else // --- no group, no coordinates : use the vertices of the geom shape provided, and radius
+ {
+ MESSAGE("no group of nodes provided, using vertices from geom shape, and radius");
+ TopTools_IndexedMapOfShape vertexMap;
+ TopExp::MapShapes( theShape, TopAbs_VERTEX, vertexMap );
+ gp_Pnt p = gp_Pnt(0,0,0);
+ if (vertexMap.Extent() < 1)
+ return;
+
+ for ( int i = 1; i <= vertexMap.Extent(); ++i )
+ {
+ const TopoDS_Vertex& vertex = TopoDS::Vertex( vertexMap( i ));
+ p = BRep_Tool::Pnt(vertex);
+ gpnts.push_back(p);
+ MESSAGE("TopoDS_Vertex " << i << " " << p.X() << " " << p.Y() << " " << p.Z());
+ }
+ }
+
+ if (gpnts.size() > 0)
+ {
+ int nodeId = 0;
+ const SMDS_MeshNode* startNode = theNodeSearcher->FindClosestTo(gpnts[0]);
+ if (startNode)
+ nodeId = startNode->GetID();
+ MESSAGE("nodeId " << nodeId);
+
+ double radius2 = radius*radius;
+ MESSAGE("radius2 " << radius2);
+
+ // --- volumes on start node
+
+ setOfVolToCheck.clear();
+ SMDS_MeshElement* startVol = 0;
+ SMDS_ElemIteratorPtr volItr = startNode->GetInverseElementIterator(SMDSAbs_Volume);
+ while (volItr->more())
+ {
+ startVol = (SMDS_MeshElement*)volItr->next();
+ setOfVolToCheck.insert(startVol->getVtkId());
+ }
+ if (setOfVolToCheck.empty())
+ {
+ MESSAGE("No volumes found");
+ return;
+ }
+
+ // --- starting with central volumes then their neighbors, check if they are inside
+ // or outside the domain, until no more new neighbor volume is inside.
+ // Fill the group of inside volumes
+
+ std::map<int, double> mapOfNodeDistance2;
+ mapOfNodeDistance2.clear();
+ std::set<int> setOfOutsideVol;
+ while (!setOfVolToCheck.empty())
+ {
+ std::set<int>::iterator it = setOfVolToCheck.begin();
+ int vtkId = *it;
+ MESSAGE("volume to check, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+ bool volInside = false;
+ vtkIdType npts = 0;
+ vtkIdType* pts = 0;
+ grid->GetCellPoints(vtkId, npts, pts);
+ for (int i=0; i<npts; i++)
+ {
+ double distance2 = 0;
+ if (mapOfNodeDistance2.count(pts[i]))
+ {
+ distance2 = mapOfNodeDistance2[pts[i]];
+ MESSAGE("point " << pts[i] << " distance2 " << distance2);
+ }
+ else
+ {
+ double *coords = grid->GetPoint(pts[i]);
+ gp_Pnt aPoint = gp_Pnt(coords[0], coords[1], coords[2]);
+ distance2 = 1.E40;
+ for (int j=0; j<gpnts.size(); j++)
+ {
+ double d2 = aPoint.SquareDistance(gpnts[j]);
+ if (d2 < distance2)
+ {
+ distance2 = d2;
+ if (distance2 < radius2)
+ break;
+ }
+ }
+ mapOfNodeDistance2[pts[i]] = distance2;
+ MESSAGE(" point " << pts[i] << " distance2 " << distance2 << " coords " << coords[0] << " " << coords[1] << " " << coords[2]);
+ }
+ if (distance2 < radius2)
+ {
+ volInside = true; // one or more nodes inside the domain
+ sgrp->Add(meshDS->fromVtkToSmds(vtkId));
+ break;
+ }
+ }
+ if (volInside)
+ {
+ setOfInsideVol.insert(vtkId);
+ MESSAGE(" volume inside, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+ int neighborsVtkIds[NBMAXNEIGHBORS];
+ int downIds[NBMAXNEIGHBORS];
+ unsigned char downTypes[NBMAXNEIGHBORS];
+ int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+ for (int n = 0; n < nbNeighbors; n++)
+ if (!setOfInsideVol.count(neighborsVtkIds[n]) ||setOfOutsideVol.count(neighborsVtkIds[n]))
+ setOfVolToCheck.insert(neighborsVtkIds[n]);
+ }
+ else
+ {
+ setOfOutsideVol.insert(vtkId);
+ MESSAGE(" volume outside, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+ }
+ setOfVolToCheck.erase(vtkId);
+ }
+ }
+
+ // --- for outside hexahedrons, check if they have more than one neighbor volume inside
+ // If yes, add the volume to the inside set
+
+ bool addedInside = true;
+ std::set<int> setOfVolToReCheck;
+ while (addedInside)
+ {
+ MESSAGE(" --------------------------- re check");
+ addedInside = false;
+ std::set<int>::iterator itv = setOfInsideVol.begin();
+ for (; itv != setOfInsideVol.end(); ++itv)
+ {
+ int vtkId = *itv;
+ int neighborsVtkIds[NBMAXNEIGHBORS];
+ int downIds[NBMAXNEIGHBORS];
+ unsigned char downTypes[NBMAXNEIGHBORS];
+ int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+ for (int n = 0; n < nbNeighbors; n++)
+ if (!setOfInsideVol.count(neighborsVtkIds[n]))
+ setOfVolToReCheck.insert(neighborsVtkIds[n]);
+ }
+ setOfVolToCheck = setOfVolToReCheck;
+ setOfVolToReCheck.clear();
+ while (!setOfVolToCheck.empty())
+ {
+ std::set<int>::iterator it = setOfVolToCheck.begin();
+ int vtkId = *it;
+ if (grid->GetCellType(vtkId) == VTK_HEXAHEDRON)
+ {
+ MESSAGE("volume to recheck, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+ int countInside = 0;
+ int neighborsVtkIds[NBMAXNEIGHBORS];
+ int downIds[NBMAXNEIGHBORS];
+ unsigned char downTypes[NBMAXNEIGHBORS];
+ int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+ for (int n = 0; n < nbNeighbors; n++)
+ if (setOfInsideVol.count(neighborsVtkIds[n]))
+ countInside++;
+ MESSAGE("countInside " << countInside);
+ if (countInside > 1)
+ {
+ MESSAGE(" volume inside, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+ setOfInsideVol.insert(vtkId);
+ sgrp->Add(meshDS->fromVtkToSmds(vtkId));
+ addedInside = true;
+ }
+ else
+ setOfVolToReCheck.insert(vtkId);
+ }
+ setOfVolToCheck.erase(vtkId);
+ }
+ }
+
+ // --- map of Downward faces at the boundary, inside the global volume
+ // map of Downward faces on the skin of the global volume (equivalent to SMDS faces on the skin)
+ // fill group of SMDS faces inside the volume (when several volume shapes)
+ // fill group of SMDS faces on the skin of the global volume (if skin)
+
+ std::map<DownIdType, int, DownIdCompare> boundaryFaces; // boundary faces inside the volume --> corresponding cell
+ std::map<DownIdType, int, DownIdCompare> skinFaces; // faces on the skin of the global volume --> corresponding cell
+ std::set<int>::iterator it = setOfInsideVol.begin();
+ for (; it != setOfInsideVol.end(); ++it)
+ {
+ int vtkId = *it;
+ //MESSAGE(" vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
+ int neighborsVtkIds[NBMAXNEIGHBORS];
+ int downIds[NBMAXNEIGHBORS];
+ unsigned char downTypes[NBMAXNEIGHBORS];
+ int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId, true);
+ for (int n = 0; n < nbNeighbors; n++)
+ {
+ int neighborDim = SMDS_Downward::getCellDimension(grid->GetCellType(neighborsVtkIds[n]));
+ if (neighborDim == 3)
+ {
+ if (! setOfInsideVol.count(neighborsVtkIds[n])) // neighbor volume is not inside : face is boundary
+ {
+ DownIdType face(downIds[n], downTypes[n]);
+ boundaryFaces[face] = vtkId;
+ }
+ // if the face between to volumes is in the mesh, get it (internal face between shapes)
+ int vtkFaceId = grid->getDownArray(downTypes[n])->getVtkCellId(downIds[n]);
+ if (vtkFaceId >= 0)
+ {
+ sgrpi->Add(meshDS->fromVtkToSmds(vtkFaceId));
+ // find also the smds edges on this face
+ int nbEdges = grid->getDownArray(downTypes[n])->getNumberOfDownCells(downIds[n]);
+ const int* dEdges = grid->getDownArray(downTypes[n])->getDownCells(downIds[n]);
+ const unsigned char* dTypes = grid->getDownArray(downTypes[n])->getDownTypes(downIds[n]);
+ for (int i = 0; i < nbEdges; i++)
+ {
+ int vtkEdgeId = grid->getDownArray(dTypes[i])->getVtkCellId(dEdges[i]);
+ if (vtkEdgeId >= 0)
+ sgrpei->Add(meshDS->fromVtkToSmds(vtkEdgeId));
+ }
+ }
+ }
+ else if (neighborDim == 2) // skin of the volume
+ {
+ DownIdType face(downIds[n], downTypes[n]);
+ skinFaces[face] = vtkId;
+ int vtkFaceId = grid->getDownArray(downTypes[n])->getVtkCellId(downIds[n]);
+ if (vtkFaceId >= 0)
+ sgrps->Add(meshDS->fromVtkToSmds(vtkFaceId));
+ }
+ }
+ }
+
+ // --- identify the edges constituting the wire of each subshape on the skin
+ // define polylines with the nodes of edges, equivalent to wires
+ // project polylines on subshapes, and partition, to get geom faces
+
+ std::map<int, std::set<int> > shapeIdToVtkIdSet; // shapeId --> set of vtkId on skin
+ std::set<int> emptySet;
+ emptySet.clear();
+ std::set<int> shapeIds;
+
+ SMDS_ElemIteratorPtr itelem = sgrps->GetElements();
+ while (itelem->more())
+ {
+ const SMDS_MeshElement *elem = itelem->next();
+ int shapeId = elem->getshapeId();
+ int vtkId = elem->getVtkId();
+ if (!shapeIdToVtkIdSet.count(shapeId))
+ {
+ shapeIdToVtkIdSet[shapeId] = emptySet;
+ shapeIds.insert(shapeId);
+ }
+ shapeIdToVtkIdSet[shapeId].insert(vtkId);
+ }
+
+ std::map<int, std::set<DownIdType, DownIdCompare> > shapeIdToEdges; // shapeId --> set of downward edges
+ std::set<DownIdType, DownIdCompare> emptyEdges;
+ emptyEdges.clear();
+
+ std::map<int, std::set<int> >::iterator itShape = shapeIdToVtkIdSet.begin();
+ for (; itShape != shapeIdToVtkIdSet.end(); ++itShape)
+ {
+ int shapeId = itShape->first;
+ MESSAGE(" --- Shape ID --- "<< shapeId);
+ shapeIdToEdges[shapeId] = emptyEdges;
+
+ std::vector<int> nodesEdges;
+
+ std::set<int>::iterator its = itShape->second.begin();
+ for (; its != itShape->second.end(); ++its)
+ {
+ int vtkId = *its;
+ MESSAGE(" " << vtkId);
+ int neighborsVtkIds[NBMAXNEIGHBORS];
+ int downIds[NBMAXNEIGHBORS];
+ unsigned char downTypes[NBMAXNEIGHBORS];
+ int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
+ for (int n = 0; n < nbNeighbors; n++)
+ {
+ if (neighborsVtkIds[n]<0) // only smds faces are considered as neighbors here
+ continue;
+ int smdsId = meshDS->fromVtkToSmds(neighborsVtkIds[n]);
+ const SMDS_MeshElement* elem = meshDS->FindElement(smdsId);
+ if ( shapeIds.count(elem->getshapeId()) && !sgrps->Contains(elem)) // edge : neighbor in the set of shape, not in the group
+ {
+ DownIdType edge(downIds[n], downTypes[n]);
+ if (!shapeIdToEdges[shapeId].count(edge))
+ {
+ shapeIdToEdges[shapeId].insert(edge);
+ int vtkNodeId[3];
+ int nbNodes = grid->getDownArray(downTypes[n])->getNodes(downIds[n],vtkNodeId);
+ nodesEdges.push_back(vtkNodeId[0]);
+ nodesEdges.push_back(vtkNodeId[nbNodes-1]);
+ MESSAGE(" --- nodes " << vtkNodeId[0]+1 << " " << vtkNodeId[nbNodes-1]+1);
+ }
+ }
+ }
+ }
+
+ std::list<int> order;
+ order.clear();
+ if (nodesEdges.size() > 0)
+ {
+ order.push_back(nodesEdges[0]); MESSAGE(" --- back " << order.back()+1); // SMDS id = VTK id + 1;
+ nodesEdges[0] = -1;
+ order.push_back(nodesEdges[1]); MESSAGE(" --- back " << order.back()+1);
+ nodesEdges[1] = -1; // do not reuse this edge
+ bool found = true;
+ while (found)
+ {
+ int nodeTofind = order.back(); // try first to push back
+ int i = 0;
+ for (i = 0; i<nodesEdges.size(); i++)
+ if (nodesEdges[i] == nodeTofind)
+ break;
+ if (i == nodesEdges.size())
+ found = false; // no follower found on back
+ else
+ {
+ if (i%2) // odd ==> use the previous one
+ if (nodesEdges[i-1] < 0)
+ found = false;
+ else
+ {
+ order.push_back(nodesEdges[i-1]); MESSAGE(" --- back " << order.back()+1);
+ nodesEdges[i-1] = -1;
+ }
+ else // even ==> use the next one
+ if (nodesEdges[i+1] < 0)
+ found = false;
+ else
+ {
+ order.push_back(nodesEdges[i+1]); MESSAGE(" --- back " << order.back()+1);
+ nodesEdges[i+1] = -1;
+ }
+ }
+ if (found)
+ continue;
+ // try to push front
+ found = true;
+ nodeTofind = order.front(); // try to push front
+ for (i = 0; i<nodesEdges.size(); i++)
+ if (nodesEdges[i] == nodeTofind)
+ break;
+ if (i == nodesEdges.size())
+ {
+ found = false; // no predecessor found on front
+ continue;
+ }
+ if (i%2) // odd ==> use the previous one
+ if (nodesEdges[i-1] < 0)
+ found = false;
+ else
+ {
+ order.push_front(nodesEdges[i-1]); MESSAGE(" --- front " << order.front()+1);
+ nodesEdges[i-1] = -1;
+ }
+ else // even ==> use the next one
+ if (nodesEdges[i+1] < 0)
+ found = false;
+ else
+ {
+ order.push_front(nodesEdges[i+1]); MESSAGE(" --- front " << order.front()+1);
+ nodesEdges[i+1] = -1;
+ }
+ }
+ }
+
+
+ std::vector<int> nodes;
+ nodes.push_back(shapeId);
+ std::list<int>::iterator itl = order.begin();
+ for (; itl != order.end(); itl++)
+ {
+ nodes.push_back((*itl) + 1); // SMDS id = VTK id + 1;
+ MESSAGE(" ordered node " << nodes[nodes.size()-1]);
+ }
+ listOfListOfNodes.push_back(nodes);
+ }
+
+ // partition geom faces with blocFissure
+ // mesh blocFissure and geom faces of the skin (external wires given, triangle algo to choose)
+ // mesh volume around blocFissure (skin triangles and quadrangle given, tetra algo to choose)
+
+ return;
+}
+
+
//================================================================================
/*!
* \brief Generates skin mesh (containing 2D cells) from 3D mesh
missType,
/*noMedium=*/false))
continue;
- SMDS_MeshElement* elem =
+ SMDS_MeshElement* elem =
tgtEditor.AddElement(nodes, missType, !iQuad && nodes.size()/(iQuad+1)>4);
++nbAddedBnd;
{
presentEditor->myLastCreatedElems.Append(presentBndElems[i]);
}
-
+
} // loop on given elements
// ---------------------------------------------
#include "SMESH_Controls.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_TypeDefs.hxx"
+#include "SMESH_ComputeError.hxx"
#include <utilities.h>
SMESH_MeshEditor( SMESH_Mesh* theMesh );
+ SMESH_Mesh * GetMesh() { return myMesh; }
+ SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
+
+ const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
+ const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
+
+ SMESH_ComputeErrorPtr & GetError() { return myError; }
+
/*!
* \brief Add element
*/
// Return an index of the shape theElem is on
// or zero if a shape not found
- SMESH_Mesh * GetMesh() { return myMesh; }
-
- SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
-
- const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
-
- const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
-
bool DoubleNodes( const std::list< int >& theListOfNodes,
const std::list< int >& theListOfModifiedElems );
const TIDSortedElemSet& theNodesNot,
const TIDSortedElemSet& theAffectedElems );
+ bool AffectedElemGroupsInRegion( const TIDSortedElemSet& theElems,
+ const TIDSortedElemSet& theNodesNot,
+ const TopoDS_Shape& theShape,
+ TIDSortedElemSet& theAffectedElems);
+
bool DoubleNodesInRegion( const TIDSortedElemSet& theElems,
const TIDSortedElemSet& theNodesNot,
const TopoDS_Shape& theShape );
bool CreateFlatElementsOnFacesGroups( const std::vector<TIDSortedElemSet>& theElems );
+ void CreateHoleSkin(double radius,
+ const TopoDS_Shape& theShape,
+ SMESH_NodeSearcher* theNodeSearcher,
+ const char* groupName,
+ std::vector<double>& nodesCoords,
+ std::vector<std::vector<int> >& listOfListOfNodes);
+
/*!
* \brief Generated skin mesh (containing 2D cells) from 3D mesh
* The created 2D mesh elements based on nodes of free faces of boundary volumes
private:
- SMESH_Mesh * myMesh;
+ SMESH_Mesh * myMesh;
- /*!
- * Sequence for keeping nodes created during last operation
- */
- SMESH_SequenceOfElemPtr myLastCreatedNodes;
-
- /*!
- * Sequence for keeping elements created during last operation
- */
- SMESH_SequenceOfElemPtr myLastCreatedElems;
+ // Nodes and elements created during last operation
+ SMESH_SequenceOfElemPtr myLastCreatedNodes, myLastCreatedElems;
+ // Description of error/warning occured during last operation
+ SMESH_ComputeErrorPtr myError;
};
#endif
//
#include "SMESH_MesherHelper.hxx"
-#include "SMDS_FacePosition.hxx"
#include "SMDS_EdgePosition.hxx"
+#include "SMDS_FaceOfNodes.hxx"
+#include "SMDS_FacePosition.hxx"
+#include "SMDS_IteratorOnIterators.hxx"
#include "SMDS_VolumeTool.hxx"
-#include "SMESH_subMesh.hxx"
#include "SMESH_ProxyMesh.hxx"
+#include "SMESH_subMesh.hxx"
+#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx>
+#include <BRepClass3d_SolidClassifier.hxx>
#include <BRepTools.hxx>
#include <BRepTools_WireExplorer.hxx>
#include <BRep_Tool.hxx>
{
int iN1 = iNodes[i++];
int iN12 = iNodes[i++];
- int iN2 = iNodes[i++];
+ int iN2 = iNodes[i];
if ( iN1 > iN2 ) std::swap( iN1, iN2 );
int linkID = iN1 * vTool.NbNodes() + iN2;
pair< set<int>::iterator, bool > it_isNew = addedLinks.insert( linkID );
return elem;
}
+namespace
+{
+ //================================================================================
+ /*!
+ * \brief Check if a node belongs to any face of sub-mesh
+ */
+ //================================================================================
+
+ bool isNodeInSubMesh( const SMDS_MeshNode* n, const SMESHDS_SubMesh* sm )
+ {
+ SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator( SMDSAbs_Face );
+ while ( fIt->more() )
+ if ( sm->Contains( fIt->next() ))
+ return true;
+ return false;
+ }
+}
+
//=======================================================================
//function : LoadNodeColumns
//purpose : Load nodes bound to face into a map of node columns
SMESH_Algo::GetSortedNodesOnEdge( theMesh, *edge,/*noMedium=*/true, sortedBaseNodes);
if ( sortedBaseNodes.empty() ) continue;
+ map< double, const SMDS_MeshNode*>::iterator u_n = sortedBaseNodes.begin();
+ if ( theProxyMesh ) // from sortedBaseNodes remove nodes not shared by faces of faceSubMesh
+ {
+ const SMDS_MeshNode* n1 = sortedBaseNodes.begin()->second;
+ const SMDS_MeshNode* n2 = sortedBaseNodes.rbegin()->second;
+ bool allNodesAreProxy = ( n1 != theProxyMesh->GetProxyNode( n1 ) &&
+ n2 != theProxyMesh->GetProxyNode( n2 ));
+ if ( allNodesAreProxy )
+ for ( u_n = sortedBaseNodes.begin(); u_n != sortedBaseNodes.end(); u_n++ )
+ u_n->second = theProxyMesh->GetProxyNode( u_n->second );
+
+ if ( u_n = sortedBaseNodes.begin(), !isNodeInSubMesh( u_n->second, faceSubMesh ))
+ {
+ while ( ++u_n != sortedBaseNodes.end() && !isNodeInSubMesh( u_n->second, faceSubMesh ));
+ sortedBaseNodes.erase( sortedBaseNodes.begin(), u_n );
+ }
+ else if ( u_n = --sortedBaseNodes.end(), !isNodeInSubMesh( u_n->second, faceSubMesh ))
+ {
+ while ( u_n != sortedBaseNodes.begin() && !isNodeInSubMesh( (--u_n)->second, faceSubMesh ));
+ sortedBaseNodes.erase( ++u_n, sortedBaseNodes.end() );
+ }
+ if ( sortedBaseNodes.empty() ) continue;
+ }
+
double f, l;
BRep_Tool::Range( *edge, f, l );
if ( edge->Orientation() == TopAbs_REVERSED ) std::swap( f, l );
const double coeff = 1. / ( l - f ) * length[iE] / fullLen;
const double prevPar = theParam2ColumnMap.empty() ? 0 : theParam2ColumnMap.rbegin()->first;
- map< double, const SMDS_MeshNode*>::iterator u_n = sortedBaseNodes.begin();
- for ( ; u_n != sortedBaseNodes.end(); u_n++ )
+ for ( u_n = sortedBaseNodes.begin(); u_n != sortedBaseNodes.end(); u_n++ )
{
double par = prevPar + coeff * ( u_n->first - f );
TParam2ColumnMap::iterator u2nn =
u2nn->second.push_back( u_n->second );
}
}
- TParam2ColumnMap::iterator par_nVec_2, par_nVec_1 = theParam2ColumnMap.begin();
- if ( theProxyMesh )
- {
- for ( ; par_nVec_1 != theParam2ColumnMap.end(); ++par_nVec_1 )
- {
- const SMDS_MeshNode* & n = par_nVec_1->second[0];
- n = theProxyMesh->GetProxyNode( n );
- }
- }
+ if ( theParam2ColumnMap.empty() )
+ return false;
+
int nbRows = 1 + faceSubMesh->NbElements() / ( theParam2ColumnMap.size()-1 );
// fill theParam2ColumnMap column by column by passing from nodes on
// theBaseEdge up via mesh faces on theFace
+ TParam2ColumnMap::iterator par_nVec_1, par_nVec_2;
par_nVec_2 = theParam2ColumnMap.begin();
par_nVec_1 = par_nVec_2++;
TIDSortedElemSet emptySet, avoidSet;
return ( vIt.More() ? TopoDS::Vertex(vIt.Value()) : TopoDS_Vertex() );
}
+//================================================================================
+/*!
+ * \brief Return type of shape contained in a group
+ * \param group - a shape of type TopAbs_COMPOUND
+ * \param avoidCompound - not to return TopAbs_COMPOUND
+ */
+//================================================================================
+
+TopAbs_ShapeEnum SMESH_MesherHelper::GetGroupType(const TopoDS_Shape& group,
+ const bool avoidCompound)
+{
+ if ( !group.IsNull() )
+ {
+ if ( group.ShapeType() != TopAbs_COMPOUND )
+ return group.ShapeType();
+
+ // iterate on a compound
+ TopoDS_Iterator it( group );
+ if ( it.More() )
+ return avoidCompound ? GetGroupType( it.Value() ) : it.Value().ShapeType();
+ }
+ return TopAbs_SHAPE;
+}
+
//=======================================================================
//function : IsQuadraticMesh
//purpose : Check mesh without geometry for: if all elements on this shape are quadratic,
int NbFacesAndEdges=0;
//All faces and edges
NbAllEdgsAndFaces = myMesh->NbEdges() + myMesh->NbFaces();
+ if ( NbAllEdgsAndFaces == 0 )
+ return SMESH_MesherHelper::LINEAR;
//Quadratic faces and edges
NbQuadFacesAndEdgs = myMesh->NbEdges(ORDER_QUADRATIC) + myMesh->NbFaces(ORDER_QUADRATIC);
return _OK;
}
+
+ //================================================================================
+ /*!
+ * \brief Place medium nodes at the link middle for elements whose corner nodes
+ * are out of geometrical boundary to prevent distorting elements.
+ * Issue 0020982, note 0013990
+ */
+ //================================================================================
+
+ void force3DOutOfBoundary( SMESH_MesherHelper& theHelper,
+ SMESH_ComputeErrorPtr& theError)
+ {
+ SMESHDS_Mesh* meshDS = theHelper.GetMeshDS();
+ TopoDS_Shape shape = theHelper.GetSubShape().Oriented( TopAbs_FORWARD );
+ if ( shape.IsNull() ) return;
+
+ if ( !theError ) theError = SMESH_ComputeError::New();
+
+ gp_XYZ faceNorm;
+
+ if ( shape.ShapeType() == TopAbs_FACE ) // 2D
+ {
+ if ( theHelper.GetMesh()->NbTriangles( ORDER_QUADRATIC ) < 1 ) return;
+
+ SMESHDS_SubMesh* faceSM = meshDS->MeshElements( shape );
+ if ( !faceSM ) return;
+
+ const TopoDS_Face& face = TopoDS::Face( shape );
+ Handle(Geom_Surface) surface = BRep_Tool::Surface( face );
+
+ TopExp_Explorer edgeIt( face, TopAbs_EDGE );
+ for ( ; edgeIt.More(); edgeIt.Next() ) // loop on EDGEs of a FACE
+ {
+ // check if the EDGE needs checking
+ const TopoDS_Edge& edge = TopoDS::Edge( edgeIt.Current() );
+ if ( BRep_Tool::Degenerated( edge ) )
+ continue;
+ if ( theHelper.IsRealSeam( edge ) &&
+ edge.Orientation() == TopAbs_REVERSED )
+ continue;
+
+ SMESHDS_SubMesh* edgeSM = meshDS->MeshElements( edge );
+ if ( !edgeSM ) continue;
+
+ double f,l;
+ Handle(Geom2d_Curve) pcurve = BRep_Tool::CurveOnSurface( edge, face, f, l );
+ BRepAdaptor_Curve curve3D( edge );
+ switch ( curve3D.GetType() ) {
+ case GeomAbs_Line: continue;
+ case GeomAbs_Circle:
+ case GeomAbs_Ellipse:
+ case GeomAbs_Hyperbola:
+ case GeomAbs_Parabola:
+ try
+ {
+ gp_Vec D1, D2, Du1, Dv1; gp_Pnt p;
+ curve3D.D2( 0.5 * ( f + l ), p, D1, D2 );
+ gp_Pnt2d uv = pcurve->Value( 0.5 * ( f + l ) );
+ surface->D1( uv.X(), uv.Y(), p, Du1, Dv1 );
+ gp_Vec fNorm = Du1 ^ Dv1;
+ if ( fNorm.IsParallel( D2, M_PI * 25./180. ))
+ continue; // face is normal to the curve3D
+
+ gp_Vec curvNorm = fNorm ^ D1;
+ if ( edge.Orientation() == TopAbs_REVERSED ) curvNorm.Reverse();
+ if ( curvNorm * D2 > 0 )
+ continue; // convex edge
+ }
+ catch ( Standard_Failure )
+ {
+ continue;
+ }
+ }
+ // get nodes shared by faces that may be distorted
+ SMDS_NodeIteratorPtr nodeIt;
+ if ( edgeSM->NbNodes() > 0 ) {
+ nodeIt = edgeSM->GetNodes();
+ }
+ else {
+ SMESHDS_SubMesh* vertexSM = meshDS->MeshElements( theHelper.IthVertex( 0, edge ));
+ if ( !vertexSM )
+ vertexSM = meshDS->MeshElements( theHelper.IthVertex( 1, edge ));
+ if ( !vertexSM ) continue;
+ nodeIt = vertexSM->GetNodes();
+ }
+
+ // find suspicious faces
+ TIDSortedElemSet checkedFaces;
+ vector< const SMDS_MeshNode* > nOnEdge( 2 );
+ const SMDS_MeshNode* nOnFace;
+ while ( nodeIt->more() )
+ {
+ const SMDS_MeshNode* n = nodeIt->next();
+ SMDS_ElemIteratorPtr faceIt = n->GetInverseElementIterator( SMDSAbs_Face );
+ while ( faceIt->more() )
+ {
+ const SMDS_MeshElement* f = faceIt->next();
+ if ( !faceSM->Contains( f ) ||
+ f->NbNodes() != 6 || // check quadratic triangles only
+ !checkedFaces.insert( f ).second )
+ continue;
+
+ // get nodes on EDGE and on FACE of a suspicious face
+ nOnEdge.clear(); nOnFace = 0;
+ SMDS_MeshElement::iterator triNode = f->begin_nodes();
+ for ( int nbN = 0; nbN < 3; ++triNode, ++nbN )
+ {
+ n = *triNode;
+ if ( n->GetPosition()->GetDim() == 2 )
+ nOnFace = n;
+ else
+ nOnEdge.push_back( n );
+ }
+
+ // check if nOnFace is inside the FACE
+ if ( nOnFace && nOnEdge.size() == 2 )
+ {
+ theHelper.AddTLinks( static_cast< const SMDS_MeshFace* > ( f ));
+ if ( !SMESH_Algo::FaceNormal( f, faceNorm, /*normalized=*/false ))
+ continue;
+ gp_XYZ edgeDir = SMESH_TNodeXYZ( nOnEdge[0] ) - SMESH_TNodeXYZ( nOnEdge[1] );
+ gp_XYZ edgeNorm = faceNorm ^ edgeDir;
+ n = theHelper.GetMediumNode( nOnEdge[0], nOnEdge[1], true );
+ gp_XYZ pN0 = SMESH_TNodeXYZ( nOnEdge[0] );
+ gp_XYZ pMedium = SMESH_TNodeXYZ( n ); // on-edge node location
+ gp_XYZ pFaceN = SMESH_TNodeXYZ( nOnFace ); // on-face node location
+ double hMedium = edgeNorm * gp_Vec( pN0, pMedium ).XYZ();
+ double hFace = edgeNorm * gp_Vec( pN0, pFaceN ).XYZ();
+ if ( Abs( hMedium ) > Abs( hFace * 0.6 ))
+ {
+ // nOnFace is out of FACE, move a medium on-edge node to the middle
+ gp_XYZ pMid3D = 0.5 * ( pN0 + SMESH_TNodeXYZ( nOnEdge[1] ));
+ meshDS->MoveNode( n, pMid3D.X(), pMid3D.Y(), pMid3D.Z() );
+ MSG( "move OUT of face " << n );
+ theError->myBadElements.push_back( f );
+ }
+ }
+ }
+ }
+ }
+ if ( !theError->myBadElements.empty() )
+ theError->myName = EDITERR_NO_MEDIUM_ON_GEOM;
+ return;
+
+ } // 2D ==============================================================================
+
+ if ( shape.ShapeType() == TopAbs_SOLID ) // 3D
+ {
+ if ( theHelper.GetMesh()->NbTetras ( ORDER_QUADRATIC ) < 1 &&
+ theHelper.GetMesh()->NbPyramids( ORDER_QUADRATIC ) < 1 ) return;
+
+ SMESHDS_SubMesh* solidSM = meshDS->MeshElements( shape );
+ if ( !solidSM ) return;
+
+ // check if the SOLID is bound by concave FACEs
+ vector< TopoDS_Face > concaveFaces;
+ TopExp_Explorer faceIt( shape, TopAbs_FACE );
+ for ( ; faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
+ {
+ const TopoDS_Face& face = TopoDS::Face( faceIt.Current() );
+ if ( !meshDS->MeshElements( face )) continue;
+
+ BRepAdaptor_Surface surface( face );
+ switch ( surface.GetType() ) {
+ case GeomAbs_Plane: continue;
+ case GeomAbs_Cylinder:
+ case GeomAbs_Cone:
+ case GeomAbs_Sphere:
+ try
+ {
+ double u = 0.5 * ( surface.FirstUParameter() + surface.LastUParameter() );
+ double v = 0.5 * ( surface.FirstVParameter() + surface.LastVParameter() );
+ gp_Vec Du1, Dv1, Du2, Dv2, Duv2; gp_Pnt p;
+ surface.D2( u,v, p, Du1, Dv1, Du2, Dv2, Duv2 );
+ gp_Vec fNorm = Du1 ^ Dv1;
+ if ( face.Orientation() == TopAbs_REVERSED ) fNorm.Reverse();
+ bool concaveU = ( fNorm * Du2 > 1e-100 );
+ bool concaveV = ( fNorm * Dv2 > 1e-100 );
+ if ( concaveU || concaveV )
+ concaveFaces.push_back( face );
+ }
+ catch ( Standard_Failure )
+ {
+ concaveFaces.push_back( face );
+ }
+ }
+ }
+ if ( concaveFaces.empty() )
+ return;
+
+ // fix 2D mesh on the SOLID
+ for ( faceIt.ReInit(); faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
+ {
+ SMESH_MesherHelper faceHelper( *theHelper.GetMesh() );
+ faceHelper.SetSubShape( faceIt.Current() );
+ force3DOutOfBoundary( faceHelper, theError );
+ }
+
+ // get an iterator over faces on concaveFaces
+ vector< SMDS_ElemIteratorPtr > faceIterVec( concaveFaces.size() );
+ for ( size_t i = 0; i < concaveFaces.size(); ++i )
+ faceIterVec[i] = meshDS->MeshElements( concaveFaces[i] )->GetElements();
+ typedef SMDS_IteratorOnIterators
+ < const SMDS_MeshElement*, vector< SMDS_ElemIteratorPtr > > TIterOnIter;
+ SMDS_ElemIteratorPtr faceIter( new TIterOnIter( faceIterVec ));
+
+ // a seacher to check if a volume is close to a concave face
+ std::auto_ptr< SMESH_ElementSearcher > faceSearcher
+ ( SMESH_MeshEditor( theHelper.GetMesh() ).GetElementSearcher( faceIter ));
+
+ // classifier
+ //BRepClass3d_SolidClassifier solidClassifier( shape );
+
+ TIDSortedElemSet checkedVols, movedNodes;
+ for ( faceIt.ReInit(); faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
+ {
+ const TopoDS_Shape& face = faceIt.Current();
+ SMESHDS_SubMesh* faceSM = meshDS->MeshElements( face );
+ if ( !faceSM ) continue;
+
+ // get nodes shared by volumes (tet and pyra) on the FACE that may be distorted
+ SMDS_NodeIteratorPtr nodeIt;
+ if ( faceSM->NbNodes() > 0 ) {
+ nodeIt = faceSM->GetNodes();
+ }
+ else {
+ TopExp_Explorer vertex( face, TopAbs_VERTEX );
+ SMESHDS_SubMesh* vertexSM = meshDS->MeshElements( vertex.Current() );
+ if ( !vertexSM ) continue;
+ nodeIt = vertexSM->GetNodes();
+ }
+
+ // find suspicious volumes adjacent to the FACE
+ vector< const SMDS_MeshNode* > nOnFace( 4 );
+ const SMDS_MeshNode* nInSolid;
+ //vector< const SMDS_MeshElement* > intersectedFaces;
+ while ( nodeIt->more() )
+ {
+ const SMDS_MeshNode* n = nodeIt->next();
+ SMDS_ElemIteratorPtr volIt = n->GetInverseElementIterator( SMDSAbs_Volume );
+ while ( volIt->more() )
+ {
+ const SMDS_MeshElement* vol = volIt->next();
+ int nbN = vol->NbCornerNodes();
+ if ( ( nbN != 4 && nbN != 5 ) ||
+ !solidSM->Contains( vol ) ||
+ !checkedVols.insert( vol ).second )
+ continue;
+
+ // get nodes on FACE and in SOLID of a suspicious volume
+ nOnFace.clear(); nInSolid = 0;
+ SMDS_MeshElement::iterator volNode = vol->begin_nodes();
+ for ( int nb = nbN; nb > 0; ++volNode, --nb )
+ {
+ n = *volNode;
+ if ( n->GetPosition()->GetDim() == 3 )
+ nInSolid = n;
+ else
+ nOnFace.push_back( n );
+ }
+ if ( !nInSolid || nOnFace.size() != nbN - 1 )
+ continue;
+
+ // get size of the vol
+ SMESH_TNodeXYZ pInSolid( nInSolid ), pOnFace0( nOnFace[0] );
+ double volLength = pInSolid.SquareDistance( nOnFace[0] );
+ for ( size_t i = 1; i < nOnFace.size(); ++i )
+ {
+ volLength = Max( volLength, pOnFace0.SquareDistance( nOnFace[i] ));
+ }
+
+ // check if vol is close to concaveFaces
+ const SMDS_MeshElement* closeFace =
+ faceSearcher->FindClosestTo( pInSolid, SMDSAbs_Face );
+ if ( !closeFace ||
+ pInSolid.SquareDistance( closeFace->GetNode(0) ) > 4 * volLength )
+ continue;
+
+ // check if vol is distorted, i.e. a medium node is much closer
+ // to nInSolid than the link middle
+ bool isDistorted = false;
+ SMDS_FaceOfNodes onFaceTria( nOnFace[0], nOnFace[1], nOnFace[2] );
+ if ( !SMESH_Algo::FaceNormal( &onFaceTria, faceNorm, /*normalized=*/false ))
+ continue;
+ theHelper.AddTLinks( static_cast< const SMDS_MeshVolume* > ( vol ));
+ vector< pair< SMESH_TLink, const SMDS_MeshNode* > > links;
+ for ( size_t i = 0; i < nOnFace.size(); ++i ) // loop on links between nOnFace
+ for ( size_t j = i+1; j < nOnFace.size(); ++j )
+ {
+ SMESH_TLink link( nOnFace[i], nOnFace[j] );
+ TLinkNodeMap::const_iterator linkIt =
+ theHelper.GetTLinkNodeMap().find( link );
+ if ( linkIt != theHelper.GetTLinkNodeMap().end() )
+ {
+ links.push_back( make_pair( linkIt->first, linkIt->second ));
+ if ( !isDistorted ) {
+ // compare projections of nInSolid and nMedium to face normal
+ gp_Pnt pMedium = SMESH_TNodeXYZ( linkIt->second );
+ double hMedium = faceNorm * gp_Vec( pOnFace0, pMedium ).XYZ();
+ double hVol = faceNorm * gp_Vec( pOnFace0, pInSolid ).XYZ();
+ isDistorted = ( Abs( hMedium ) > Abs( hVol * 0.5 ));
+ }
+ }
+ }
+ // move medium nodes to link middle
+ if ( isDistorted )
+ {
+ for ( size_t i = 0; i < links.size(); ++i )
+ {
+ const SMDS_MeshNode* nMedium = links[i].second;
+ if ( movedNodes.insert( nMedium ).second )
+ {
+ gp_Pnt pMid3D = 0.5 * ( SMESH_TNodeXYZ( links[i].first.node1() ) +
+ SMESH_TNodeXYZ( links[i].first.node2() ));
+ meshDS->MoveNode( nMedium, pMid3D.X(), pMid3D.Y(), pMid3D.Z() );
+ MSG( "move OUT of solid " << nMedium );
+ }
+ }
+ theError->myBadElements.push_back( vol );
+ }
+ } // loop on volumes sharing a node on FACE
+ } // loop on nodes on FACE
+ } // loop on FACEs of a SOLID
+
+ if ( !theError->myBadElements.empty() )
+ theError->myName = EDITERR_NO_MEDIUM_ON_GEOM;
+ } // 3D case
+ }
+
} //namespace
//=======================================================================
/*!
* \brief Move medium nodes of faces and volumes to fix distorted elements
+ * \param error - container of fixed distorted elements
* \param volumeOnly - to fix nodes on faces or not, if the shape is solid
*
* Issue 0020307: EDF 992 SMESH : Linea/Quadratic with Medium Node on Geometry
*/
//=======================================================================
-void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
+void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
+ bool volumeOnly)
{
// setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
if ( getenv("NO_FixQuadraticElements") )
#endif
SMESH_MesherHelper h(*myMesh);
h.SetSubShape( s.Current() );
- h.FixQuadraticElements(false);
+ h.FixQuadraticElements( error, false );
}
}
// fix nodes on geom faces
MSG("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key()));
SMESH_MesherHelper h(*myMesh);
h.SetSubShape( fIt.Key() );
- h.FixQuadraticElements(true);
+ h.FixQuadraticElements( error, true);
h.ToFixNodeParameters(true);
}
//perf_print_all_meters(1);
+ if ( error && error->myName == EDITERR_NO_MEDIUM_ON_GEOM )
+ error->myComment = "during conversion to quadratic, "
+ "some medium nodes were not placed on geometry to avoid distorting elements";
return;
}
TIDSortedNodeSet apexOfPyramid;
const int apexIndex = 4;
+ // Issue 0020982
+ // Move medium nodes to the link middle for elements whose corner nodes
+ // are out of geometrical boundary to fix distorted elements.
+ force3DOutOfBoundary( *this, error );
+
if ( elemType == SMDSAbs_Volume )
{
while ( elemIt->more() ) // loop on volumes
} // loop on chains of links
} // loop on 2 directions of propagation from quadrangle
} // loop on faces
- }
+ } // fix faces and/or volumes
// 4. Move nodes
// -------------
-// vector<const SMDS_MeshElement*> vols( 100 );
-// vector<double> volSize( 100 );
-// int nbVols;
-// bool ok;
for ( pLink = links.begin(); pLink != links.end(); ++pLink ) {
if ( pLink->IsMoved() ) {
gp_Pnt p = pLink->MiddlePnt() + pLink->Move();
GetMeshDS()->MoveNode( pLink->_mediumNode, p.X(), p.Y(), p.Z());
- //
-// gp_Pnt pNew = pLink->MiddlePnt() + pLink->Move();
-// if ( pLink->MediumPos() != SMDS_TOP_3DSPACE )
-// {
-// // avoid making distorted volumes near boundary
-// SMDS_ElemIteratorPtr volIt =
-// (*pLink)._mediumNode->GetInverseElementIterator( SMDSAbs_Volume );
-// for ( nbVols = 0; volIt->more() && volTool.Set( volIt->next() ); ++nbVols )
-// {
-// vols [ nbVols ] = volTool.Element();
-// volSize[ nbVols ] = volTool.GetSize();
-// }
-// gp_Pnt pOld = pLink->MediumPnt();
-// const_cast<SMDS_MeshNode*>( pLink->_mediumNode )->setXYZ( pNew.X(), pNew.Y(), pNew.Z() );
-// ok = true;
-// while ( nbVols-- && ok )
-// {
-// volTool.Set( vols[ nbVols ]);
-// ok = ( volSize[ nbVols ] * volTool.GetSize() > 1e-20 );
-// }
-// if ( !ok )
-// {
-// const_cast<SMDS_MeshNode*>( pLink->_mediumNode )->setXYZ( pOld.X(), pOld.Y(), pOld.Z() );
-// MSG( "Do NOT move \t" << pLink->_mediumNode->GetID()
-// << " because of distortion of volume " << vols[ nbVols+1 ]->GetID());
-// continue;
-// }
-// }
-// GetMeshDS()->MoveNode( pLink->_mediumNode, pNew.X(), pNew.Y(), pNew.Z() );
- }
- }
-
- //return;
-
- // issue 0020982
- // Move the apex of pyramid together with the most curved link
-
- TIDSortedNodeSet::iterator apexIt = apexOfPyramid.begin();
- for ( ; apexIt != apexOfPyramid.end(); ++apexIt )
- {
- SMESH_TNodeXYZ apex = *apexIt;
-
- gp_Vec maxMove( 0,0,0 );
- double maxMoveSize2 = 0;
-
- // shift of node index to get medium nodes between the base nodes
- const int base2MediumShift = 5;
-
- // find maximal movement of medium node
- SMDS_ElemIteratorPtr volIt = apex._node->GetInverseElementIterator( SMDSAbs_Volume );
- vector< const SMDS_MeshElement* > pyramids;
- while ( volIt->more() )
- {
- const SMDS_MeshElement* pyram = volIt->next();
- if ( pyram->GetEntityType() != SMDSEntity_Quad_Pyramid ) continue;
- pyramids.push_back( pyram );
-
- for ( int iBase = 0; iBase < apexIndex; ++iBase )
- {
- SMESH_TNodeXYZ medium = pyram->GetNode( iBase + base2MediumShift );
- if ( medium._node->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE )
- {
- SMESH_TNodeXYZ n1 = pyram->GetNode( iBase );
- SMESH_TNodeXYZ n2 = pyram->GetNode( ( iBase+1 ) % 4 );
- gp_Pnt middle = 0.5 * ( n1 + n2 );
- gp_Vec move( middle, medium );
- double moveSize2 = move.SquareMagnitude();
- if ( moveSize2 > maxMoveSize2 )
- maxMove = move, maxMoveSize2 = moveSize2;
- }
- }
- }
-
- // move the apex
- if ( maxMoveSize2 > 1e-20 )
- {
- apex += maxMove.XYZ();
- GetMeshDS()->MoveNode( apex._node, apex.X(), apex.Y(), apex.Z());
-
- // move medium nodes neighboring the apex to the middle
- const int base2MediumShift_2 = 9;
- for ( unsigned i = 0; i < pyramids.size(); ++i )
- for ( int iBase = 0; iBase < apexIndex; ++iBase )
- {
- SMESH_TNodeXYZ base = pyramids[i]->GetNode( iBase );
- const SMDS_MeshNode* medium = pyramids[i]->GetNode( iBase + base2MediumShift_2 );
- gp_XYZ middle = 0.5 * ( apex + base );
- GetMeshDS()->MoveNode( medium, middle.X(), middle.Y(), middle.Z());
- }
}
}
+
+ // Issue 0020982
+ // Move the apex of pyramid together with the most curved link.
+ // TIDSortedNodeSet::iterator apexIt = apexOfPyramid.begin();
+ // for ( ; apexIt != apexOfPyramid.end(); ++apexIt )
+ // {
+ // SMESH_TNodeXYZ apex = *apexIt;
+
+ // gp_Vec maxMove( 0,0,0 );
+ // double maxMoveSize2 = 0;
+
+ // // shift of node index to get medium nodes between the base nodes
+ // const int base2MediumShift = 5;
+
+ // // find maximal movement of medium node
+ // SMDS_ElemIteratorPtr volIt = apex._node->GetInverseElementIterator( SMDSAbs_Volume );
+ // vector< const SMDS_MeshElement* > pyramids;
+ // while ( volIt->more() )
+ // {
+ // const SMDS_MeshElement* pyram = volIt->next();
+ // if ( pyram->GetEntityType() != SMDSEntity_Quad_Pyramid ) continue;
+ // pyramids.push_back( pyram );
+
+ // for ( int iBase = 0; iBase < apexIndex; ++iBase )
+ // {
+ // SMESH_TNodeXYZ medium = pyram->GetNode( iBase + base2MediumShift );
+ // if ( medium._node->GetPosition()->GetTypeOfPosition() != SMDS_TOP_3DSPACE )
+ // {
+ // SMESH_TNodeXYZ n1 = pyram->GetNode( iBase );
+ // SMESH_TNodeXYZ n2 = pyram->GetNode( ( iBase+1 ) % 4 );
+ // gp_Pnt middle = 0.5 * ( n1 + n2 );
+ // gp_Vec move( middle, medium );
+ // double moveSize2 = move.SquareMagnitude();
+ // if ( moveSize2 > maxMoveSize2 )
+ // maxMove = move, maxMoveSize2 = moveSize2;
+ // }
+ // }
+ // }
+
+ // // move the apex
+ // if ( maxMoveSize2 > 1e-20 )
+ // {
+ // apex += maxMove.XYZ();
+ // GetMeshDS()->MoveNode( apex._node, apex.X(), apex.Y(), apex.Z());
+
+ // // move medium nodes neighboring the apex to the middle
+ // const int base2MediumShift_2 = 9;
+ // for ( unsigned i = 0; i < pyramids.size(); ++i )
+ // for ( int iBase = 0; iBase < apexIndex; ++iBase )
+ // {
+ // SMESH_TNodeXYZ base = pyramids[i]->GetNode( iBase );
+ // const SMDS_MeshNode* medium = pyramids[i]->GetNode( iBase + base2MediumShift_2 );
+ // gp_XYZ middle = 0.5 * ( apex + base );
+ // GetMeshDS()->MoveNode( medium, middle.X(), middle.Y(), middle.Z());
+ // }
+ // }
+ // }
}
static TopoDS_Vertex IthVertex( const bool is2nd, TopoDS_Edge anEdge, const bool CumOri=true );
+ static TopAbs_ShapeEnum GetGroupType(const TopoDS_Shape& group,
+ const bool avoidCompound=false);
+
public:
// ---------- PUBLIC INSTANCE METHODS ----------
/*!
* \brief Move medium nodes of faces and volumes to fix distorted elements
+ * \param error - container of fixed distorted elements
* \param volumeOnly - fix nodes on geom faces or not if the shape is solid
*/
- void FixQuadraticElements(bool volumeOnly=true);
+ void FixQuadraticElements(SMESH_ComputeErrorPtr& error, bool volumeOnly=true);
/*!
* \brief To set created elements on the shape set by IsQuadraticSubMesh()
{
insertDependence(exp.Current());
}
+ for (TopExp_Explorer exp(_subShape, TopAbs_VERTEX, TopAbs_EDGE); exp.More();exp.Next())
+ {
+ insertDependence(exp.Current());
+ }
break;
}
case TopAbs_COMPSOLID:
else
ret = false;
}
+ // check if an error reported on any sub-shape
+ bool isComputeErrorSet = !checkComputeError( algo, ret, shape );
+ // check if anything was built
TopExp_Explorer subS(shape, _subShape.ShapeType());
- if (ret) // check if anything was built
+ if (ret)
{
for (; ret && subS.More(); subS.Next())
ret = _father->GetSubMesh( subS.Current() )->IsMeshComputed();
}
- bool isComputeErrorSet = !checkComputeError( algo, shape );
+ // Set _computeError
if (!ret && !isComputeErrorSet)
{
- // Set _computeError
for (subS.ReInit(); subS.More(); subS.Next())
{
SMESH_subMesh* sm = _father->GetSubMesh( subS.Current() );
*/
//=======================================================================
-bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& theShape)
+bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo,
+ const bool theComputeOK,
+ const TopoDS_Shape& theShape)
{
bool noErrors = true;
{
SMESH_subMeshIteratorPtr smIt = getDependsOnIterator(false,false);
while ( smIt->more() )
- if ( !smIt->next()->checkComputeError( theAlgo ))
+ if ( !smIt->next()->checkComputeError( theAlgo, theComputeOK ))
noErrors = false;
}
for (TopoDS_Iterator subIt( theShape ); subIt.More(); subIt.Next()) {
SMESH_subMesh* sm = _father->GetSubMesh( subIt.Value() );
if ( sm != this ) {
- if ( !sm->checkComputeError( theAlgo, sm->GetSubShape() ))
+ if ( !sm->checkComputeError( theAlgo, theComputeOK, sm->GetSubShape() ))
noErrors = false;
updateDependantsState( SUBMESH_COMPUTED ); // send event SUBMESH_COMPUTED
}
}
}
{
- // Check my state
+
+ // Set my _computeState
+
if ( !_computeError || _computeError->IsOK() )
{
// no error description is set to this sub-mesh, check if any mesh is computed
_computeState = IsMeshComputed() ? COMPUTE_OK : FAILED_TO_COMPUTE;
+ if ( _computeState != COMPUTE_OK )
+ {
+ if ( _subShape.ShapeType() == TopAbs_EDGE &&
+ BRep_Tool::Degenerated( TopoDS::Edge( _subShape )) )
+ _computeState = COMPUTE_OK;
+ else if ( theComputeOK )
+ _computeError = SMESH_ComputeError::New(COMPERR_NO_MESH_ON_SHAPE,"",theAlgo);
+ }
}
- else
+
+ if ( _computeError && !_computeError->IsOK() )
{
if ( !_computeError->myAlgo )
_computeError->myAlgo = theAlgo;
return 0;
}
+//================================================================================
+/*!
+ * \brief Return an event listener data
+ * \param listenerName - the listener name
+ * \retval EventListenerData* - found data, maybe NULL
+ */
+//================================================================================
+
+EventListenerData* SMESH_subMesh::GetEventListenerData(const string& listenerName) const
+{
+ map< EventListener*, EventListenerData* >::const_iterator l_d = _eventListeners.begin();
+ for ( ; l_d != _eventListeners.end(); ++l_d )
+ if ( listenerName == l_d->first->GetName() )
+ return l_d->second;
+ return 0;
+}
+
//================================================================================
/*!
* \brief Notify stored event listeners on the occured event
map< EventListener*, EventListenerData* >::iterator l_d =
_eventListeners.find( listener );
if ( l_d != _eventListeners.end() ) {
- if ( l_d->first && l_d->first->IsDeletable() ) delete l_d->first;
- if ( l_d->second && l_d->second->IsDeletable() ) delete l_d->second;
+ if ( l_d->first && l_d->first->IsDeletable() )
+ {
+ l_d->first->BeforeDelete( this, l_d->second );
+ delete l_d->first;
+ }
+ if ( l_d->second && l_d->second->IsDeletable() )
+ {
+ delete l_d->second;
+ }
_eventListeners.erase( l_d );
}
}
*/
EventListenerData* GetEventListenerData(EventListener* listener) const;
+ /*!
+ * \brief Return an event listener data
+ * \param listenerName - the listener name
+ * \retval EventListenerData* - found data, maybe NULL
+ */
+ EventListenerData* GetEventListenerData(const std::string& listenerName) const;
+
/*!
* \brief Unregister the listener and delete it and it's data
* \param listener - the event listener to delete
* \brief Update compute_state by _computeError
* \retval bool - false if there are errors
*/
- bool checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& theShape=TopoDS_Shape());
+ bool checkComputeError(SMESH_Algo* theAlgo,
+ const bool theComputeOK,
+ const TopoDS_Shape& theShape=TopoDS_Shape());
/*!
* \brief Return a hypothesis attached to theShape.
{
bool myIsDeletable; //!< if true, it will be deleted by SMESH_subMesh
mutable std::set<SMESH_subMesh*> myBusySM; //!< to avoid infinite recursion via events
+ const char* myName; //!< identifier
friend class SMESH_subMesh;
-#ifdef _DEBUG_
- const char* myName; //!< identifier used for debug
-#endif
public:
- SMESH_subMeshEventListener(bool isDeletable, const char* name) :myIsDeletable(isDeletable)
-#ifdef _DEBUG_
- ,myName(name)
-#endif
+ SMESH_subMeshEventListener(bool isDeletable, const char* name)
+ :myIsDeletable(isDeletable), myName(name) {}
+ virtual ~SMESH_subMeshEventListener() {}
+ bool IsDeletable() const { return myIsDeletable; }
+ const char* GetName() const { return myName; }
+ virtual void BeforeDelete(SMESH_subMesh* subMesh,
+ SMESH_subMeshEventListenerData* data)
{}
- bool IsDeletable() const { return myIsDeletable; }
/*!
* \brief Do something on a certain event
* \param event - algo_event or compute_event itself (of SMESH_subMesh)
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHDS \
-I$(srcdir)/../SMESH \
+ -I$(srcdir)/../SMESHUtils \
-I$(top_builddir)/idl
libSMESHClient_la_LDFLAGS = \
{
public:
SMESHDS_Document(int UserID);
- int NewMesh(bool theIsEmbeddedMode);
- void RemoveMesh(int MeshID);
- SMESHDS_Mesh * GetMesh(int MeshID);
- void AddHypothesis(SMESHDS_Hypothesis * H);
- void RemoveHypothesis(int HypID);
+ ~SMESHDS_Document();
+ int NewMesh(bool theIsEmbeddedMode);
+ void RemoveMesh(int MeshID);
+ SMESHDS_Mesh * GetMesh(int MeshID);
+ void AddHypothesis(SMESHDS_Hypothesis * H);
+ void RemoveHypothesis(int HypID);
SMESHDS_Hypothesis * GetHypothesis(int HypID);
- int NbMeshes();
- int NbHypothesis();
- void InitMeshesIterator();
- SMESHDS_Mesh * NextMesh();
- bool MoreMesh();
- void InitHypothesisIterator();
+ int NbMeshes();
+ int NbHypothesis();
+ void InitMeshesIterator();
+ SMESHDS_Mesh * NextMesh();
+ bool MoreMesh();
+ void InitHypothesisIterator();
SMESHDS_Hypothesis * NextHypothesis();
- bool MoreHypothesis();
- ~SMESHDS_Document();
+ bool MoreHypothesis();
private:
- int myUserID;
- std::map<int,SMESHDS_Mesh*> myMeshes;
- std::map<int,SMESHDS_Hypothesis*> myHypothesis;
- std::map<int,SMESHDS_Mesh*>::iterator myMeshesIt;
+ int myUserID;
+ std::map<int,SMESHDS_Mesh*> myMeshes;
+ std::map<int,SMESHDS_Hypothesis*> myHypothesis;
+ std::map<int,SMESHDS_Mesh*>::iterator myMeshesIt;
std::map<int,SMESHDS_Hypothesis*>::iterator myHypothesisIt;
};
// File : SMESHDS_Hypothesis.hxx
// Author : Paul RASCLE, EDF
// Module : SMESH
-// $Header$
//
#ifndef _SMESHDS_HYPOTHESIS_HXX_
#define _SMESHDS_HYPOTHESIS_HXX_
class SMESHDS_EXPORT SMESHDS_Hypothesis
{
-public:
+ public:
SMESHDS_Hypothesis(int hypId);
virtual ~SMESHDS_Hypothesis();
virtual bool operator==(const SMESHDS_Hypothesis& other) const;
bool operator!=(const SMESHDS_Hypothesis& other) const { return !(*this==other); }
-enum hypothesis_type {PARAM_ALGO, ALGO_0D, ALGO_1D, ALGO_2D, ALGO_3D};
+ enum hypothesis_type { PARAM_ALGO, ALGO_0D, ALGO_1D, ALGO_2D, ALGO_3D };
-protected:
- std::string _name;
- int _hypId;
- int _type;
+ protected:
+ std::string _name; // identifier if hypothesis type
+ int _hypId; // ID unique within application session
+ int _type; // enum hypothesis_type
};
#endif
SMESHGUI_RemoveElementsDlg.h \
SMESHGUI_MeshInfo.h \
SMESHGUI_Measurements.h \
- SMESHGUI_Preferences_ColorDlg.h \
SMESHGUI_Preferences_ScalarBarDlg.h \
SMESHGUI_AddMeshElementDlg.h \
SMESHGUI_XmlHandler.h \
SMESHGUI_CopyMeshDlg.h \
SMESHGUI_PreviewDlg.h \
SMESHGUI_ReorientFacesDlg.h \
+ SMESHGUI_PropertiesDlg.h \
SMESH_SMESHGUI.hxx
# Libraries targets
SMESHGUI_RemoveElementsDlg.cxx \
SMESHGUI_MeshInfo.cxx \
SMESHGUI_Measurements.cxx \
- SMESHGUI_Preferences_ColorDlg.cxx \
SMESHGUI_Preferences_ScalarBarDlg.cxx \
SMESHGUI_AddMeshElementDlg.cxx \
SMESHGUI_XmlHandler.cxx \
SMESHGUI_CopyMeshDlg.cxx \
SMESHGUI_FileValidator.cxx \
SMESHGUI_PreviewDlg.cxx \
- SMESHGUI_ReorientFacesDlg.cxx
+ SMESHGUI_ReorientFacesDlg.cxx \
+ SMESHGUI_PropertiesDlg.cxx
MOC_FILES = \
SMESHGUI_moc.cxx \
SMESHGUI_RemoveElementsDlg_moc.cxx \
SMESHGUI_MeshInfo_moc.cxx \
SMESHGUI_Measurements_moc.cxx \
- SMESHGUI_Preferences_ColorDlg_moc.cxx \
SMESHGUI_Preferences_ScalarBarDlg_moc.cxx \
SMESHGUI_AddMeshElementDlg_moc.cxx \
SMESHGUI_FilterDlg_moc.cxx \
SMESHGUI_CopyMeshDlg_moc.cxx \
SMESHGUI_MeshOrderOp_moc.cxx \
SMESHGUI_PreviewDlg_moc.cxx \
- SMESHGUI_ReorientFacesDlg_moc.cxx
+ SMESHGUI_ReorientFacesDlg_moc.cxx \
+ SMESHGUI_PropertiesDlg_moc.cxx
nodist_libSMESH_la_SOURCES= \
$(MOC_FILES)
#include "SMESHGUI_MeshPatternDlg.h"
#include "SMESHGUI_MultiEditDlg.h"
#include "SMESHGUI_NodesDlg.h"
-#include "SMESHGUI_Preferences_ColorDlg.h"
#include "SMESHGUI_Preferences_ScalarBarDlg.h"
+#include "SMESHGUI_PropertiesDlg.h"
#include "SMESHGUI_RemoveElementsDlg.h"
#include "SMESHGUI_RemoveNodesDlg.h"
#include "SMESHGUI_RenumberingDlg.h"
filter.append( QObject::tr( "SAUV files (*.sauv*)" ) );
filter.append( QObject::tr( "All files (*)" ) );
}
+ else if ( theCommandID == 118 ) {
+ filter.append( QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" );
+ filter.append( QObject::tr( "GMF_BINARY_FILES_FILTER") + " (*.meshb)" );
+ }
QString anInitialPath = "";
if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
}
break;
}
+ case 118:
+ {
+ // GMF format
+ SMESH::ComputeError_var res;
+ aMeshes->length( 1 );
+ aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toLatin1().constData(), res.out() );
+ if ( res->code != SMESH::DRS_OK ) {
+ errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
+ arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res->code ).toLatin1().data() ) ) );
+ if ( strlen( res->comment.in() ) > 0 ) {
+ errors.back() += ": ";
+ errors.back() += res->comment.in();
+ }
+ }
+ break;
+ }
}
}
catch ( const SALOME::SALOME_Exception& S_ex ) {
const bool isSTL = ( theCommandID == 140 || theCommandID == 141 );
const bool isCGNS= ( theCommandID == 142 || theCommandID == 143 );
const bool isSAUV= ( theCommandID == 144 || theCommandID == 145 );
+ const bool isGMF = ( theCommandID == 146 || theCommandID == 147 );
// actually, the following condition can't be met (added for insurance)
if( selected.Extent() == 0 ||
aMeshIter = aMeshList.begin();
SMESH::SMESH_IDSource_var aMeshOrGroup = (*aMeshIter).first;
- SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh();
- QString aMeshName = (*aMeshIter).second;
+ SMESH::SMESH_Mesh_var aMesh = aMeshOrGroup->GetMesh();
+ QString aMeshName = (*aMeshIter).second;
- if ( isMED || isCGNS || isSAUV )
+ if ( isMED || isCGNS || isSAUV ) // formats where group names must be unique
{
// check for equal group names within each mesh
for( aMeshIter = aMeshList.begin(); aMeshIter != aMeshList.end(); aMeshIter++ ) {
notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
}
+ else if ( isGMF )
+ {
+ format = "GMF";
+ notSupportedElemTypes.push_back( SMESH::Entity_0D );
+ notSupportedElemTypes.push_back( SMESH::Entity_Quad_Quadrangle );
+ notSupportedElemTypes.push_back( SMESH::Entity_Polygon );
+ notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polygon );
+ notSupportedElemTypes.push_back( SMESH::Entity_Quad_Pyramid );
+ notSupportedElemTypes.push_back( SMESH::Entity_Quad_Hexa );
+ notSupportedElemTypes.push_back( SMESH::Entity_Quad_Penta );
+ notSupportedElemTypes.push_back( SMESH::Entity_Hexagonal_Prism );
+ notSupportedElemTypes.push_back( SMESH::Entity_Polyhedra );
+ notSupportedElemTypes.push_back( SMESH::Entity_Quad_Polyhedra );
+ notSupportedElemTypes.push_back( SMESH::Entity_Ball );
+ }
if ( ! notSupportedElemTypes.empty() )
{
SMESH::long_array_var nbElems = aMeshOrGroup->GetMeshInfo();
// Get parameters of export operation
- QString aFilename;
+ QString aFilename;
SMESH::MED_VERSION aFormat;
// Init the parameters with the default values
- bool aIsASCII_STL = true;
+ bool aIsASCII_STL = true;
bool toCreateGroups = false;
SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
if ( resMgr )
if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
anInitialPath = QDir::currentPath();
- if ( isUNV || isDAT )
+ // Get a file name to write in and additional otions
+ if ( isUNV || isDAT || isGMF ) // Export w/o options
{
if ( isUNV )
aFilter = QObject::tr( "IDEAS_FILES_FILTER" ) + " (*.unv)";
- else
+ else if ( isDAT )
aFilter = QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)";
+ else if ( isGMF )
+ aFilter = QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" +
+ ";;" + QObject::tr( "GMF_BINARY_FILES_FILTER" ) + " (*.meshb)";
if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
anInitialPath + QString("/") + aMeshName,
toOverwrite && aMeshIndex == 0 );
}
}
+ else if ( isGMF )
+ {
+ aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data() );
+ }
}
catch (const SALOME::SALOME_Exception& S_ex){
wc.suspend();
SALOMEDS::Color aColor = aGroupObject->GetColor();
_PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject);
if (aGroupSObject) {
+ QColor c;
+ int delta;
if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) {
switch ( aGroupObject->GetType ()) {
case SMESH::NODE:
anActor->Set0DColor( aColor.R, aColor.G, aColor.B ); break;
case SMESH::BALL:
anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break;
+ case SMESH::VOLUME:
+ SMESH::GetColor("SMESH", "volume_color", c, delta, "255,0,170|-100");
+ anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break;
+ case SMESH::FACE:
default:
- QColor c;
- int delta;
SMESH::GetColor("SMESH", "fill_color", c, delta, "0,170,255|-100");
anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta );
}
(new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show();
return;
}
- case 1132:{
- QColor c, e, b, n, c0D, cBall, o, outl, selection, preselection;
- int delta;
- int size0D = 0, ballSize = 0;
- int Edgewidth = 0;
- vtkFloatingPointType Shrink = 0.0;
- vtkFloatingPointType faces_orientation_scale = 0.0;
- bool faces_orientation_3dvectors = false;
-
- VTK::MarkerType aMarkerTypeCurrent = VTK::MT_NONE;
- VTK::MarkerScale aMarkerScaleCurrent = VTK::MS_NONE;
- int aMarkerTextureCurrent = 0;
+ case 1132: {
+ vtkFloatingPointType color[3];
+ QColor faceColor, edgeColor, nodeColor, elem0dColor, ballColor;
+ QColor orientationColor, outlineColor, volumeColor;
+ int deltaF = 0, deltaV = 0;
+ int elem0dSize = 1;
+ int ballSize = 1;
+ int edgeWidth = 1;
+ int outlineWidth = 1;
+ vtkFloatingPointType shrinkCoef = 0.0;
+ vtkFloatingPointType orientationScale = 0.0;
+ bool orientation3d = false;
+ VTK::MarkerType markerType = VTK::MT_NONE;
+ VTK::MarkerScale markerScale = VTK::MS_NONE;
+ int markerId = 0;
+ bool hasNodes = false;
+ int presentEntities = 0;
+ bool firstTime = true;
SALOME_ListIteratorOfListIO It( selected );
- for( ; It.More(); It.Next()){
+ for ( ; It.More(); It.Next() ) {
Handle(SALOME_InteractiveObject) IObject = It.Value();
- if(IObject->hasEntry()){
- if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
- vtkFloatingPointType color[3];
- anActor->GetSufaceColor(color[0], color[1], color[2],delta);
- int c0 = int (color[0] * 255);
- int c1 = int (color[1] * 255);
- int c2 = int (color[2] * 255);
- c.setRgb(c0, c1, c2);
-
- vtkFloatingPointType edgecolor[3];
- anActor->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]);
- c0 = int (edgecolor[0] * 255);
- c1 = int (edgecolor[1] * 255);
- c2 = int (edgecolor[2] * 255);
- e.setRgb(c0, c1, c2);
-
- vtkFloatingPointType nodecolor[3];
- anActor->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]);
- c0 = int (nodecolor[0] * 255);
- c1 = int (nodecolor[1] * 255);
- c2 = int (nodecolor[2] * 255);
- n.setRgb(c0, c1, c2);
-
- vtkFloatingPointType color0D[3];
- anActor->Get0DColor(color0D[0], color0D[1], color0D[2]);
- c0 = int (color0D[0] * 255);
- c1 = int (color0D[1] * 255);
- c2 = int (color0D[2] * 255);
- c0D.setRgb(c0, c1, c2);
-
- vtkFloatingPointType ballcolor[3];
- anActor->GetBallColor(ballcolor[0], ballcolor[1], ballcolor[2]);
- c0 = int (ballcolor[0] * 255);
- c1 = int (ballcolor[1] * 255);
- c2 = int (ballcolor[2] * 255);
- cBall.setRgb(c0, c1, c2);
-
- vtkFloatingPointType outlineColor[3];
- anActor->GetOutlineColor(outlineColor[0], outlineColor[1], outlineColor[2]);
- c0 = int (outlineColor[0] * 255);
- c1 = int (outlineColor[1] * 255);
- c2 = int (outlineColor[2] * 255);
- outl.setRgb(c0, c1, c2);
-
- vtkFloatingPointType hColor[3];
- anActor->GetHighlightColor(hColor[0], hColor[1], hColor[2]);
- c0 = int (hColor[0] * 255);
- c1 = int (hColor[1] * 255);
- c2 = int (hColor[2] * 255);
- selection.setRgb(c0, c1, c2);
-
- vtkFloatingPointType phColor[3];
- anActor->GetPreHighlightColor(phColor[0], phColor[1], phColor[2]);
- c0 = int (phColor[0] * 255);
- c1 = int (phColor[1] * 255);
- c2 = int (phColor[2] * 255);
- preselection.setRgb(c0, c1, c2);
-
- size0D = (int)anActor->Get0DSize();
- if(size0D == 0)
- size0D = 1;
- ballSize = (int)anActor->GetBallSize();
- if(ballSize == 0)
- ballSize = 1;
- Edgewidth = (int)anActor->GetLineWidth();
- if(Edgewidth == 0)
- Edgewidth = 1;
- Shrink = anActor->GetShrinkFactor();
-
- vtkFloatingPointType faces_orientation_color[3];
- anActor->GetFacesOrientationColor(faces_orientation_color);
- c0 = int (faces_orientation_color[0] * 255);
- c1 = int (faces_orientation_color[1] * 255);
- c2 = int (faces_orientation_color[2] * 255);
- o.setRgb(c0, c1, c2);
-
- faces_orientation_scale = anActor->GetFacesOrientationScale();
- faces_orientation_3dvectors = anActor->GetFacesOrientation3DVectors();
-
- aMarkerTypeCurrent = anActor->GetMarkerType();
- aMarkerScaleCurrent = anActor->GetMarkerScale();
- aMarkerTextureCurrent = anActor->GetMarkerTexture();
-
- // even if there are multiple objects in the selection,
- // we need only the first one to get values for the dialog
- break;
- }
+ if ( !IObject->hasEntry() ) continue;
+ SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
+ if ( !anActor || !anActor->GetObject() ) continue;
+
+ if ( firstTime ) {
+ // nodes: color, marker
+ anActor->GetNodeColor( color[0], color[1], color[2] );
+ nodeColor.setRgbF( color[0], color[1], color[2] );
+ markerType = anActor->GetMarkerType();
+ markerScale = anActor->GetMarkerScale();
+ markerId = anActor->GetMarkerTexture();
+ // edges: color, width
+ anActor->GetEdgeColor( color[0], color[1], color[2] );
+ edgeColor.setRgbF( color[0], color[1], color[2] );
+ edgeWidth = qMax( (int)anActor->GetLineWidth(), 1 ); // minimum allowed width is 1
+ // faces: front color, back color (delta)
+ anActor->GetSufaceColor( color[0], color[1], color[2], deltaF );
+ faceColor.setRgbF( color[0], color[1], color[2] );
+ // faces: front color, back color (delta)
+ anActor->GetVolumeColor( color[0], color[1], color[2], deltaV );
+ volumeColor.setRgbF( color[0], color[1], color[2] );
+ // 0d elements: color, size
+ anActor->Get0DColor( color[0], color[1], color[2] );
+ elem0dColor.setRgbF( color[0], color[1], color[2] );
+ elem0dSize = qMax( (int)anActor->Get0DSize(), 1 ); // minimum allowed size is 1
+ // balls: color, size
+ anActor->GetBallColor( color[0], color[1], color[2] );
+ ballColor.setRgbF( color[0], color[1], color[2] );
+ ballSize = qMax( (int)anActor->GetBallSize(), 1 ); // minimum allowed size is 1
+ // outlines: color
+ anActor->GetOutlineColor( color[0], color[1], color[2] );
+ outlineColor.setRgbF( color[0], color[1], color[2] );
+ outlineWidth = qMax( (int)anActor->GetOutlineWidth(), 1 ); // minimum allowed width is 1
+ // orientation vectors: color, scale, 3d flag
+ anActor->GetFacesOrientationColor( color[0], color[1], color[2] );
+ orientationColor.setRgbF( color[0], color[1], color[2] );
+ orientationScale = anActor->GetFacesOrientationScale();
+ orientation3d = anActor->GetFacesOrientation3DVectors();
+ // shrink factor
+ shrinkCoef = anActor->GetShrinkFactor();
}
+
+ firstTime = false; // we only take properties from first object (for performance reasons)
+
+ if ( !hasNodes )
+ hasNodes = anActor->GetObject()->GetNbEntities( SMDSAbs_Node );
+ if ( !(presentEntities & SMESH_Actor::eEdges) && anActor->GetObject()->GetNbEntities( SMDSAbs_Edge ) )
+ presentEntities = presentEntities | SMESH_Actor::eEdges;
+ if ( !(presentEntities & SMESH_Actor::eFaces) && anActor->GetObject()->GetNbEntities( SMDSAbs_Face ) )
+ presentEntities = presentEntities | SMESH_Actor::eFaces;
+ if ( !(presentEntities & SMESH_Actor::eVolumes) && anActor->GetObject()->GetNbEntities( SMDSAbs_Volume ) )
+ presentEntities = presentEntities | SMESH_Actor::eVolumes;
+ if ( !(presentEntities & SMESH_Actor::e0DElements) && anActor->GetObject()->GetNbEntities( SMDSAbs_0DElement ) )
+ presentEntities = presentEntities | SMESH_Actor::e0DElements;
+ if ( !(presentEntities & SMESH_Actor::eBallElem) && anActor->GetObject()->GetNbEntities( SMDSAbs_Ball ) )
+ presentEntities = presentEntities | SMESH_Actor::eBallElem;
+
+ // as we know that all types of elements are present, we can exit the loop
+ if ( presentEntities == SMESH_Actor::eAllEntity )
+ break;
}
- SMESHGUI_Preferences_ColorDlg *aDlg =
- new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI() );
- aDlg->SetBooleanValue(1, faces_orientation_3dvectors);
- aDlg->SetColor(1, c);
- aDlg->SetColor(2, e);
- aDlg->SetColor(3, n);
- aDlg->SetColor(4, outl);
- aDlg->SetColor(5, c0D);
- aDlg->SetColor(6, cBall);
- aDlg->SetColor(7, o);
- aDlg->SetColor(8, selection);
- aDlg->SetColor(9, preselection);
- aDlg->SetDeltaBrightness(delta);
- aDlg->SetDoubleValue(1, faces_orientation_scale);
- aDlg->SetIntValue(1, Edgewidth);
- aDlg->SetIntValue(2, int(Shrink*100.));
- aDlg->SetIntValue(3, size0D);
- aDlg->SetIntValue(4, ballSize);
-
- aDlg->setCustomMarkerMap( theMarkerMap[ aStudy->StudyId() ] );
-
- if( aMarkerTypeCurrent != VTK::MT_USER )
- aDlg->setStandardMarker( aMarkerTypeCurrent, aMarkerScaleCurrent );
+ SMESHGUI_PropertiesDlg dlg( theMarkerMap[ aStudy->StudyId() ], SMESHGUI::desktop() );
+ // nodes: color, marker
+ dlg.setNodeColor( nodeColor );
+ if( markerType != VTK::MT_USER )
+ dlg.setNodeMarker( markerType, markerScale );
else
- aDlg->setCustomMarker( aMarkerTextureCurrent );
-
- if(aDlg->exec()){
- QColor color = aDlg->GetColor(1);
- QColor edgecolor = aDlg->GetColor(2);
- QColor nodecolor = aDlg->GetColor(3);
- QColor outlinecolor = aDlg->GetColor(4);
- QColor color0D = aDlg->GetColor(5);
- QColor ballcolor = aDlg->GetColor(6);
- QColor faces_orientation_color = aDlg->GetColor(7);
- QColor selectioncolor = aDlg->GetColor(8);
- QColor preSelectioncolor = aDlg->GetColor(9);
- int delta = aDlg->GetDeltaBrightness();
-
- /* Point marker */
- theMarkerMap[ aStudy->StudyId() ] = aDlg->getCustomMarkerMap();
-
+ dlg.setNodeCustomMarker( markerId );
+ // edges: color, line width
+ dlg.setEdgeColor( edgeColor );
+ dlg.setEdgeWidth( edgeWidth );
+ // faces: front color, back color
+ dlg.setFaceColor( faceColor, deltaF );
+ // volumes: normal color, reversed color
+ dlg.setVolumeColor( volumeColor, deltaV );
+ // outlines: color, line width
+ dlg.setOutlineColor( outlineColor );
+ dlg.setOutlineWidth( outlineWidth );
+ // 0d elements: color, size
+ dlg.setElem0dColor( elem0dColor );
+ dlg.setElem0dSize( elem0dSize );
+ // balls: color, size
+ dlg.setBallColor( ballColor );
+ dlg.setBallSize( ballSize );
+ // orientation: color, scale, 3d flag
+ dlg.setOrientationColor( orientationColor );
+ dlg.setOrientationSize( int( orientationScale * 100. ) );
+ dlg.setOrientation3d( orientation3d );
+ // shrink: scale factor
+ dlg.setShrinkCoef( int( shrinkCoef * 100. ) );
+ // hide unused controls
+ dlg.showControls( presentEntities, hasNodes );
+
+ if ( dlg.exec() ) {
+ nodeColor = dlg.nodeColor();
+ markerType = dlg.nodeMarkerType();
+ markerScale = dlg.nodeMarkerScale();
+ markerId = dlg.nodeMarkerId();
+ edgeColor = dlg.edgeColor();
+ edgeWidth = dlg.edgeWidth();
+ faceColor = dlg.faceColor();
+ deltaF = dlg.faceColorDelta();
+ volumeColor = dlg.volumeColor();
+ deltaV = dlg.volumeColorDelta();
+ outlineColor = dlg.outlineColor();
+ outlineWidth = dlg.outlineWidth();
+ elem0dColor = dlg.elem0dColor();
+ elem0dSize = dlg.elem0dSize();
+ ballColor = dlg.ballColor();
+ ballSize = dlg.ballSize();
+ orientationColor = dlg.orientationColor();
+ orientationScale = dlg.orientationSize() / 100.;
+ orientation3d = dlg.orientation3d();
+ shrinkCoef = dlg.shrinkCoef() / 100.;
+
+ // store point markers map that might be changed by the user
+ theMarkerMap[ aStudy->StudyId() ] = dlg.customMarkers();
+
+ // set properties from dialog box to the presentations
SALOME_ListIteratorOfListIO It( selected );
- for( ; It.More(); It.Next()){
+ for ( ; It.More(); It.Next() ) {
Handle(SALOME_InteractiveObject) IObject = It.Value();
- if(IObject->hasEntry()){
- if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){
- /* actor color and backface color */
- anActor->SetSufaceColor(vtkFloatingPointType (color.red()) / 255.,
- vtkFloatingPointType (color.green()) / 255.,
- vtkFloatingPointType (color.blue()) / 255.,
- delta);
- /* edge color */
- anActor->SetEdgeColor(vtkFloatingPointType (edgecolor.red()) / 255.,
- vtkFloatingPointType (edgecolor.green()) / 255.,
- vtkFloatingPointType (edgecolor.blue()) / 255.);
- /* edge outline */
- anActor->SetOutlineColor(vtkFloatingPointType (outlinecolor.red()) / 255.,
- vtkFloatingPointType (outlinecolor.green()) / 255.,
- vtkFloatingPointType (outlinecolor.blue()) / 255.);
-
- /* selection */
- anActor->SetHighlightColor(vtkFloatingPointType (selectioncolor.red()) / 255.,
- vtkFloatingPointType (selectioncolor.green()) / 255.,
- vtkFloatingPointType (selectioncolor.blue()) / 255.);
- /* pre-selection */
- anActor->SetPreHighlightColor(vtkFloatingPointType (preSelectioncolor.red()) / 255.,
- vtkFloatingPointType (preSelectioncolor.green()) / 255.,
- vtkFloatingPointType (preSelectioncolor.blue()) / 255.);
-
-
- /* Shrink factor and size edges */
- anActor->SetShrinkFactor(aDlg->GetIntValue(2) / 100.);
- anActor->SetLineWidth(aDlg->GetIntValue(1));
-
- /* Nodes color and size */
- anActor->SetNodeColor(vtkFloatingPointType (nodecolor.red()) / 255.,
- vtkFloatingPointType (nodecolor.green()) / 255.,
- vtkFloatingPointType (nodecolor.blue()) / 255.);
-
- /* 0D elements */
- anActor->Set0DColor(vtkFloatingPointType (color0D.red()) / 255.,
- vtkFloatingPointType (color0D.green()) / 255.,
- vtkFloatingPointType (color0D.blue()) / 255.);
- anActor->Set0DSize(aDlg->GetIntValue(3));
-
- /* Ball elements */
- anActor->SetBallColor(vtkFloatingPointType (ballcolor.red()) / 255.,
- vtkFloatingPointType (ballcolor.green()) / 255.,
- vtkFloatingPointType (ballcolor.blue()) / 255.);
- anActor->SetBallSize(aDlg->GetIntValue(4));
-
- /* Faces orientation */
- vtkFloatingPointType c[3] = {vtkFloatingPointType(faces_orientation_color.redF()),
- vtkFloatingPointType(faces_orientation_color.greenF()),
- vtkFloatingPointType(faces_orientation_color.blueF())};
- anActor->SetFacesOrientationColor(c);
- anActor->SetFacesOrientationScale(aDlg->GetDoubleValue(1));
- anActor->SetFacesOrientation3DVectors(aDlg->GetBooleanValue(1));
-
- VTK::MarkerType aMarkerTypeNew = aDlg->getMarkerType();
- VTK::MarkerScale aMarkerScaleNew = aDlg->getStandardMarkerScale();
- int aMarkerTextureNew = aDlg->getCustomMarkerID();
- if( aMarkerTypeNew != VTK::MT_USER )
- anActor->SetMarkerStd( aMarkerTypeNew, aMarkerScaleNew );
- else {
- const VTK::MarkerMap& aMarkerMap = theMarkerMap[ aStudy->StudyId() ];
- VTK::MarkerMap::const_iterator anIter = aMarkerMap.find( aMarkerTextureNew );
- if( anIter != aMarkerMap.end() )
- anActor->SetMarkerTexture( aMarkerTextureNew, anIter->second.second );
- }
-
- SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
- if( !aGroupObject->_is_nil() )
- {
- SMESH::ElementType anElementType = aGroupObject->GetType();
- QColor aColor;
- switch( anElementType )
- {
- case SMESH::NODE: aColor = nodecolor; break;
- case SMESH::EDGE: aColor = edgecolor; break;
- default: aColor = color; break;
- }
-
- SALOMEDS::Color aGroupColor;
- aGroupColor.R = (float)aColor.red() / 255.0;
- aGroupColor.G = (float)aColor.green() / 255.0;
- aGroupColor.B = (float)aColor.blue() / 255.0;
- aGroupObject->SetColor( aGroupColor );
- }
- }
+ if ( !IObject->hasEntry() ) continue;
+ SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
+ if ( !anActor ) continue;
+
+ // nodes: color, marker
+ anActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
+ if ( markerType != VTK::MT_USER ) {
+ anActor->SetMarkerStd( markerType, markerScale );
}
- }
+ else {
+ const VTK::MarkerMap& markerMap = theMarkerMap[ aStudy->StudyId() ];
+ VTK::MarkerMap::const_iterator iter = markerMap.find( markerId );
+ if ( iter != markerMap.end() )
+ anActor->SetMarkerTexture( markerId, iter->second.second );
+ }
+ // volumes: normal color, reversed color (delta)
+ anActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV );
+ // faces: front color, back color (delta)
+ anActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
+ // edges: color, width
+ anActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() );
+ anActor->SetLineWidth( edgeWidth );
+ // outlines: color
+ anActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() );
+ anActor->SetOutlineWidth( outlineWidth );
+ // 0D elements: color, size
+ anActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() );
+ anActor->Set0DSize( elem0dSize );
+ // balls: color, size
+ anActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
+ anActor->SetBallSize( ballSize );
+ // orientation: color, scale, 3d flag
+ anActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
+ anActor->SetFacesOrientationScale( orientationScale );
+ anActor->SetFacesOrientation3DVectors( orientation3d );
+ // shrink factor
+ anActor->SetShrinkFactor( shrinkCoef );
+
+ // for groups, set also proper color
+ SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>(IObject);
+ if ( !aGroupObject->_is_nil() ) {
+ SMESH::ElementType anElementType = aGroupObject->GetType();
+ QColor aColor;
+ switch( anElementType ) {
+ case SMESH::NODE:
+ aColor = nodeColor; break;
+ case SMESH::EDGE:
+ aColor = edgeColor; break;
+ case SMESH::FACE:
+ aColor = faceColor; break;
+ case SMESH::VOLUME:
+ aColor = volumeColor; break;
+ case SMESH::ELEM0D:
+ aColor = elem0dColor; break;
+ case SMESH::BALL:
+ aColor = ballColor; break;
+ default: break;
+ }
+
+ if ( aColor.isValid() ) {
+ SALOMEDS::Color aGroupColor;
+ aGroupColor.R = aColor.redF();
+ aGroupColor.G = aColor.greenF();
+ aGroupColor.B = aColor.blueF();
+ aGroupObject->SetColor( aGroupColor );
+ }
+ } // if ( !aGroupObject->_is_nil() )
+ } // for ( ; It.More(); It.Next() )
SMESH::RepaintCurrentView();
- }
- delete aDlg;
+ } // if ( dlg.exec() )
return;
- }
- }
+ } // case 1132:
+ } // switch(theCommandID)
SALOME_ListIteratorOfListIO It( selected );
for( ; It.More(); It.Next()){
Handle(SALOME_InteractiveObject) IObject = It.Value();
case 116:
case 115:
case 117:
+ case 118:
case 113:
case 112:
case 111: // IMPORT
case 143:
case 144:
case 145:
+ case 146:
+ case 147:
{
::ExportMeshToFile(theCommandID);
break;
// ----- create actions --------------
- createSMESHAction( 111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
+ //createSMESHAction( 111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
createSMESHAction( 112, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_U) );
createSMESHAction( 113, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
createSMESHAction( 114, "NUM" );
- createSMESHAction( 115, "IMPORT_STL" );
+ createSMESHAction( 115, "IMPORT_STL" );
createSMESHAction( 116, "IMPORT_CGNS" );
createSMESHAction( 117, "IMPORT_SAUV" );
+ createSMESHAction( 118, "IMPORT_GMF" );
createSMESHAction( 121, "DAT" );
createSMESHAction( 122, "MED" );
createSMESHAction( 123, "UNV" );
createSMESHAction( 140, "STL" );
- createSMESHAction( 142, "CGNS" );
- createSMESHAction( 144, "SAUV" );
+ createSMESHAction( 142, "CGNS");
+ createSMESHAction( 144, "SAUV");
+ createSMESHAction( 146, "GMF" );
createSMESHAction( 124, "EXPORT_DAT" );
createSMESHAction( 125, "EXPORT_MED" );
createSMESHAction( 126, "EXPORT_UNV" );
createSMESHAction( 141, "EXPORT_STL" );
- createSMESHAction( 143, "EXPORT_CGNS" );
- createSMESHAction( 145, "EXPORT_SAUV" );
+ createSMESHAction( 143, "EXPORT_CGNS");
+ createSMESHAction( 145, "EXPORT_SAUV");
+ createSMESHAction( 147, "EXPORT_GMF" );
createSMESHAction( 150, "FILE_INFO" );
createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete );
createSMESHAction( 5105, "SEL_FILTER_LIB" );
renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ),
transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 );
- createMenu( 111, importId, -1 );
+ //createMenu( 111, importId, -1 );
createMenu( 112, importId, -1 );
createMenu( 113, importId, -1 );
createMenu( 115, importId, -1 );
createMenu( 116, importId, -1 );
#endif
createMenu( 117, importId, -1 );
+ createMenu( 118, importId, -1 );
createMenu( 121, exportId, -1 );
createMenu( 122, exportId, -1 );
createMenu( 123, exportId, -1 );
createMenu( 142, exportId, -1 ); // export to CGNS
#endif
createMenu( 144, exportId, -1 ); // export to SAUV
+ createMenu( 146, exportId, -1 ); // export to GMF
createMenu( separator(), fileId, 10 );
createMenu( 33, editId, -1 );
createPopupItem( 143, OB, mesh_group, multiple_non_empty ); // EXPORT_CGNS
#endif
createPopupItem( 145, OB, mesh_group, multiple_non_empty ); // EXPORT_SAUV
+ createPopupItem( 147, OB, mesh_group, multiple_non_empty ); // EXPORT_GMF
createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE
createPopupItem( 813, OB, group ); // DEL_GROUP with contents
popupMgr()->insert( separator(), -1, 0 );
// end of GEOM plugins loading
// Reset actions accelerator keys
- action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
+ //action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
action(112)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_U)); // Import UNV
action(113)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); // Import MED
EmitSignalCloseAllDialogs();
// Unset actions accelerator keys
- action(111)->setShortcut(QKeySequence()); // Import DAT
+ //action(111)->setShortcut(QKeySequence()); // Import DAT
action(112)->setShortcut(QKeySequence()); // Import UNV
action(113)->setShortcut(QKeySequence()); // Import MED
setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab );
- setPreferenceProperty( elemGroup, "columns", 2 );
+ //setPreferenceProperty( elemGroup, "columns", 2 );
- int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
+ int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
+ setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
+ ColorId = addPreference( tr( "PREF_VOLUME" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "volume_color" );
+ setPreferenceProperty( ColorId, "text", tr("PREF_REVERSEDVOLUME") );
addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" );
addPreference( tr( "PREF_BALL_COLOR" ), elemGroup, LightApp_Preferences::Color, "SMESH", "ball_elem_color" );
addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" );
addPreference( tr( "PREF_WIREFRAME" ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" );
- setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab );
setPreferenceProperty( grpGroup, "columns", 2 );
addPreference( tr( "PREF_GRP_NAMES" ), grpGroup, LightApp_Preferences::Color, "SMESH", "group_name_color" );
+ addPreference( tr( "PREF_GRP_DEF_COLOR" ), grpGroup, LightApp_Preferences::Color, "SMESH", "default_grp_color" );
int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size");
int elemW = addPreference(tr("PREF_WIDTH"), elemGroup,
LightApp_Preferences::IntSpin, "SMESH", "element_width");
+ int outW = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup,
+ LightApp_Preferences::IntSpin, "SMESH", "outline_width");
int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup,
LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff");
setPreferenceProperty( elemW, "min", 1 );
setPreferenceProperty( elemW, "max", 5 );
+ setPreferenceProperty( outW, "min", 1 );
+ setPreferenceProperty( outW, "max", 5 );
+
setPreferenceProperty( shrink, "min", 0 );
setPreferenceProperty( shrink, "max", 100 );
aColor.setHsv( aHue, 255, 255 );
SALOMEDS::Color aSColor;
- aSColor.R = (double)aColor.red() / 255.0;
- aSColor.G = (double)aColor.green() / 255.0;
- aSColor.B = (double)aColor.blue() / 255.0;
+ aSColor.R = aColor.redF();
+ aSColor.G = aColor.greenF();
+ aSColor.B = aColor.blueF();
return aSColor;
}
int idx = 0;
if( addToGroup ) {
aGroupName = ComboBox_GroupName->currentText();
- for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+ for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
QString aName = ComboBox_GroupName->itemText( i );
if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
idx = i;
}
- if ( idx > 0 && idx < myGroups.count() ) {
+ if ( idx > 0 && idx <= myGroups.count() ) {
SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
if ( !aGeomGroup->_is_nil() ) {
int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
int idx = 0;
if( addToGroup ) {
aGroupName = ComboBox_GroupName->currentText();
- for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+ for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
QString aName = ComboBox_GroupName->itemText( i );
if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
idx = i;
}
- if ( idx > 0 && idx < myGroups.count() ) {
+ if ( idx > 0 && idx <= myGroups.count() ) {
SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
if ( !aGeomGroup->_is_nil() ) {
int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
ActorList = new QListWidget(GroupPlanes);
ActorList->setSelectionMode(QAbstractItemView::SingleSelection);
-
+
SelectAllCheckBox = new QCheckBox(tr("SELECT_ALL"), GroupPlanes);
GroupPlanesLayout->addWidget(ComboBoxPlanes, 0, 0);
connect(SpinBoxRot1, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam()));
connect(SpinBoxRot2, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam()));
connect(PreviewCheckBox, SIGNAL(toggled(bool)), this, SLOT(OnPreviewToggle(bool)));
- connect(AutoApplyCheckBox, SIGNAL(toggled(bool)), this, SLOT(ClickOnApply()));
+ connect(AutoApplyCheckBox, SIGNAL(toggled(bool)), this, SLOT(onAutoApply(bool)));
connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
SMESHGUI_ClippingPlaneInfoList::const_iterator anIter2 = aClippingPlaneInfoList.begin();
for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) {
const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2;
- SMESH::TPlane aTPlane( aClippingPlaneInfo.Plane );
+ SMESH::OrientedPlane* anOrientedPlane = SMESH::OrientedPlane::New(myViewWindow);
+ anOrientedPlane->ShallowCopy(aClippingPlaneInfo.Plane);
+ SMESH::TPlane aTPlane( anOrientedPlane );
SMESH::TPlaneData aPlaneData( aTPlane, aClippingPlaneInfo.ActorList );
myPlanes.push_back( aPlaneData );
}
}
printf( "----------------------------------\n" );
}
+
+void SMESHGUI_ClippingDlg::onAutoApply(bool toggled)
+{
+ if ( toggled ) ClickOnApply();
+}
void onSelectOrientation( int );
void SetCurrentPlaneParam();
void OnPreviewToggle( bool );
+ void onAutoApply(bool);
void ClickOnOk();
void ClickOnCancel();
void ClickOnApply();
{
QString text;
switch ( errCode ) {
- CASE2TEXT( COMPERR_OK );
- CASE2TEXT( COMPERR_BAD_INPUT_MESH);
- CASE2TEXT( COMPERR_STD_EXCEPTION );
- CASE2TEXT( COMPERR_OCC_EXCEPTION );
+ CASE2TEXT( COMPERR_OK );
+ CASE2TEXT( COMPERR_BAD_INPUT_MESH );
+ CASE2TEXT( COMPERR_STD_EXCEPTION );
+ CASE2TEXT( COMPERR_OCC_EXCEPTION );
case SMESH::COMPERR_SLM_EXCEPTION: break; // avoid double "Salome exception"
- CASE2TEXT( COMPERR_EXCEPTION );
- CASE2TEXT( COMPERR_MEMORY_PB );
- CASE2TEXT( COMPERR_BAD_SHAPE );
- CASE2TEXT( COMPERR_CANCELED );
+ CASE2TEXT( COMPERR_EXCEPTION );
+ CASE2TEXT( COMPERR_MEMORY_PB );
+ CASE2TEXT( COMPERR_BAD_SHAPE );
+ CASE2TEXT( COMPERR_CANCELED );
+ CASE2TEXT( COMPERR_NO_MESH_ON_SHAPE );
case SMESH::COMPERR_ALGO_FAILED:
if ( strlen(comment) == 0 )
text = QObject::tr("COMPERR_ALGO_FAILED");
myTable->hideColumn( COL_SHAPEID );
myTable->hideColumn( COL_BAD_MESH );
myTable->horizontalHeader()->setResizeMode( COL_ERROR, QHeaderView::Interactive );
+ myTable->setWordWrap( true );
+ myTable->horizontalHeader()->setStretchLastSection( true );
+ myTable->setMinimumWidth( 500 );
QStringList headers;
headers << tr( "COL_ALGO_HEADER" );
QGridLayout* grpLayout = new QGridLayout(myCompErrorGroup);
grpLayout->setSpacing(SPACING);
grpLayout->setMargin(MARGIN);
- grpLayout->addWidget( myWarningLabel, 0, 0 );
- grpLayout->addWidget( myTable, 1, 0, 4, 1 );
- grpLayout->addWidget( myShowBtn, 1, 1 );
+ grpLayout->addWidget( myWarningLabel, 0, 0, 1, 4 );
+ grpLayout->addWidget( myTable, 1, 0, 1, 4 );
+ grpLayout->addWidget( myShowBtn, 2, 0 );
grpLayout->addWidget( myPublishBtn, 2, 1 );
- grpLayout->addWidget( myBadMeshBtn, 3, 1 );
- grpLayout->setRowStretch( 4, 1 );
+ grpLayout->addWidget( myBadMeshBtn, 2, 2 );
+ grpLayout->setColumnStretch( 3, 1 );
// Hypothesis definition errors
{
bool onlyWarnings = !theNoCompError; // == valid mesh computed but there are errors reported
for ( int i = 0; i < theCompErrors->length() && onlyWarnings; ++i )
- onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING );
+ onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING ||
+ theCompErrors[ i ].code == SMESH::COMPERR_NO_MESH_ON_SHAPE );
// full or brief mesh info
SMESH::long_array_var aRes = myMesh->GetMeshInfo();
}
tbl->resizeColumnToContents( COL_ALGO );
tbl->resizeColumnToContents( COL_SHAPE );
+ tbl->setWordWrap( true );
if ( hasBadMesh )
aCompDlg->myBadMeshBtn->show();
SMESH::MeshPreviewStruct_var aMeshData = gen->GetBadInputElements(myMesh,curSub);
vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3);
vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
- // delete property !!!!!!!!!!
vtkProperty* prop = vtkProperty::New();
prop->SetLineWidth( aLineWidth * 3 );
prop->SetPointSize( aPointSize * 3 );
prop->SetColor( 250, 0, 250 );
myBadMeshDisplayer->GetActor()->SetProperty( prop );
myBadMeshDisplayer->SetData( aMeshData._retn() );
+ prop->Delete();
}
}
}
}
tbl->resizeColumnToContents( COL_ALGO );
tbl->resizeColumnToContents( COL_SHAPE );
+ tbl->setWordWrap( true );
if ( hasBadMesh )
aCompDlg->myBadMeshBtn->show();
#include "SMESHGUI.h"
#include "SMESHGUI_ConvToQuadDlg.h"
+#include "SMESHGUI_MeshEditPreview.h"
#include "SMESHGUI_Utils.h"
-#include "SMDSAbs_ElementType.hxx"
-
+#include "SMESH_ActorUtils.h"
#include "SMESH_TypeFilter.hxx"
+#include "SMDSAbs_ElementType.hxx"
// SALOME GUI includes
#include <LightApp_UpdateFlags.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
#include <SalomeApp_Tools.h>
+#include <SALOME_Actor.h>
// IDL includes
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
+// VTK includes
+#include <vtkProperty.h>
+
//================================================================================
/*!
* \brief Constructor
//================================================================================
SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp()
: SMESHGUI_SelectionOp(),
- myDlg( 0 )
+ myDlg( 0 ),
+ myBadElemsPreview(0)
{
}
//================================================================================
SMESHGUI_ConvToQuadOp::~SMESHGUI_ConvToQuadOp()
{
- if ( myDlg )
- delete myDlg;
+ if ( myDlg ) delete myDlg;
+ if ( myBadElemsPreview ) delete myBadElemsPreview;
}
//================================================================================
SMESH::SMESH_Mesh_var sourceMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pObj );
if( !myDlg->CurrentRB() )
{
- bool aParam = true;
+ bool force3d = true;
if( myDlg->IsEnabledCheck() )
- aParam = myDlg->IsMediumNdsOnGeom();
+ force3d = myDlg->IsMediumNdsOnGeom();
if ( sourceMesh->_is_nil() )
- aEditor->ConvertToQuadraticObject( aParam, idSource );
+ aEditor->ConvertToQuadraticObject( force3d, idSource );
else
- aEditor->ConvertToQuadratic( aParam );
+ aEditor->ConvertToQuadratic( force3d );
+
+ if ( !force3d )
+ {
+ SMESH::ComputeError_var error = aEditor->GetLastError();
+ if ( error->hasBadMesh )
+ {
+ if ( myBadElemsPreview ) delete myBadElemsPreview; // viewWindow may change
+ myBadElemsPreview = new SMESHGUI_MeshEditPreview( viewWindow() );
+
+ vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3);
+ vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
+ vtkProperty* prop = vtkProperty::New();
+ prop->SetLineWidth( aLineWidth * 3 );
+ prop->SetPointSize( aPointSize * 3 );
+ prop->SetColor( 250, 0, 250 );
+ myBadElemsPreview->GetActor()->SetProperty( prop );
+ prop->Delete();
+
+ SMESH::MeshPreviewStruct_var previewData = aEditor->GetPreviewData();
+ myBadElemsPreview->SetData( & previewData.in() );
+ myBadElemsPreview->SetVisibility(true);
+
+ SUIT_MessageBox* mb = new SUIT_MessageBox(SUIT_MessageBox::Warning,
+ tr( "SMESH_WRN_WARNING" ),
+ tr("EDITERR_NO_MEDIUM_ON_GEOM"),
+ SUIT_MessageBox::Ok, myDlg);
+ mb->setWindowModality( Qt::NonModal );
+ mb->setAttribute( Qt::WA_DeleteOnClose );
+ mb->show();
+ connect ( mb, SIGNAL( finished(int) ), this, SLOT( onWarningWinFinished() ));
+ //connect ( mb, SIGNAL( rejected() ), this, SLOT( onWarningWinFinished() ));
+ }
+ }
}
else
{
return aResult;
}
+//================================================================================
+/*!
+ * \brief SLOT called when a warning window is closed
+ */
+//================================================================================
+
+void SMESHGUI_ConvToQuadOp::onWarningWinFinished()
+{
+ if ( myBadElemsPreview )
+ myBadElemsPreview->SetVisibility(false);
+}
+
//================================================================================
/*! ConsistMesh
* Determines, what elements this mesh contains.
#include CORBA_SERVER_HEADER(SMESH_Mesh)
class SMESHGUI_ConvToQuadDlg;
+class SMESHGUI_MeshEditPreview;
class SMESHGUI_EXPORT SMESHGUI_ConvToQuadOp : public SMESHGUI_SelectionOp
{
protected slots:
virtual bool onApply();
void ConnectRadioButtons( int );
+ void onWarningWinFinished();
private:
SMESHGUI_ConvToQuadDlg* myDlg;
+ SMESHGUI_MeshEditPreview* myBadElemsPreview;
};
#endif // SMESHGUI_CONVTOQUADOP_H
int idx = 0;
if( addToGroup ) {
aGroupName = ComboBox_GroupName->currentText();
- for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+ for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
QString aName = ComboBox_GroupName->itemText( i );
if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
idx = i;
}
- if ( idx > 0 && idx < myGroups.count() ) {
+ if ( idx > 0 && idx <= myGroups.count() ) {
SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
if ( !aGeomGroup->_is_nil() ) {
int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
mySMESHGUI->SetActiveDialogBox(this);
// Costruction of the logical filter for the elements: mesh/sub-mesh/group
- SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
- SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP);
-
QList<SUIT_SelectionFilter*> aListOfFilters;
- if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
- if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter);
-
- myMeshOrSubMeshOrGroupFilter =
- new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
+ aListOfFilters.append(new SMESH_TypeFilter (MESH));
+ aListOfFilters.append(new SMESH_TypeFilter (SUBMESH_VERTEX));
+ aListOfFilters.append(new SMESH_TypeFilter (GROUP_NODE));
+ myMeshOrSubMeshOrGroupFilter0D =
+ new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
+ aListOfFilters[0] = new SMESH_TypeFilter (MESH);
+ aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_EDGE);
+ aListOfFilters[2] = new SMESH_TypeFilter (GROUP_EDGE);
+ myMeshOrSubMeshOrGroupFilter1D =
+ new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
+ aListOfFilters[0] = new SMESH_TypeFilter (MESH);
+ aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_FACE);
+ aListOfFilters[2] = new SMESH_TypeFilter (GROUP_FACE);
+ myMeshOrSubMeshOrGroupFilter2D =
+ new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
myHelpFileName = "extrusion_page.html";
myFilterDlg->setParent( 0 );
delete myFilterDlg;
}
+ if ( myMeshOrSubMeshOrGroupFilter0D ) delete myMeshOrSubMeshOrGroupFilter0D;
+ if ( myMeshOrSubMeshOrGroupFilter1D ) delete myMeshOrSubMeshOrGroupFilter1D;
+ if ( myMeshOrSubMeshOrGroupFilter2D ) delete myMeshOrSubMeshOrGroupFilter2D;
}
//=================================================================================
if (send == SelectElementsButton) {
myEditCurrentArgument = (QWidget*)LineEditElements;
- if (CheckBoxMesh->isChecked()) {
+ if (CheckBoxMesh->isChecked())
+ {
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection);
- mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
- } else {
+ switch( GetConstructorId() ) {
+ case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
+ case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
+ case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
+ }
+ }
+ else
+ {
int aConstructorId = GetConstructorId();
switch(aConstructorId) {
- case 0:
- {
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(NodeSelection);
- break;
- }
- case 1:
- {
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(EdgeSelection);
- break;
- }
- case 2:
- {
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ case 0:
+ {
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ aViewWindow->SetSelectionMode(NodeSelection);
+ break;
+ }
+ case 1:
+ {
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
+ aViewWindow->SetSelectionMode(EdgeSelection);
+ break;
+ }
+ case 2:
+ {
+ if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(FaceSelection);
- break;
- }
+ break;
+ }
}
}
}
mySelectionMgr->clearFilters();
- if (toSelectMesh) {
+ if (toSelectMesh)
+ {
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection);
- mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
+ switch( GetConstructorId() ) {
+ case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
+ case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
+ case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
+ }
LineEditElements->setReadOnly(true);
LineEditElements->setValidator(0);
- } else {
+ }
+ else
+ {
int aConstructorId = GetConstructorId();
switch(aConstructorId) {
case 0:
SMESH::long_array_var myElementsId;
SMESH_Actor* myActor;
Handle(SALOME_InteractiveObject) myIO;
- SUIT_SelectionFilter* myMeshOrSubMeshOrGroupFilter;
+ SUIT_SelectionFilter* myMeshOrSubMeshOrGroupFilter0D;
+ SUIT_SelectionFilter* myMeshOrSubMeshOrGroupFilter1D;
+ SUIT_SelectionFilter* myMeshOrSubMeshOrGroupFilter2D;
// widgets
QGroupBox* ConstructorsBox;
// name : SMESHGUI_FilterDlg::Init
// Purpose : Init dialog fields, connect signals and slots, show dialog
//=======================================================================
-void SMESHGUI_FilterDlg::Init (const int type)
+void SMESHGUI_FilterDlg::Init (const int type, const bool setInViewer)
{
QList<int> aTypes;
aTypes.append(type);
- Init(aTypes);
+ Init(aTypes,setInViewer);
}
//=======================================================================
// name : SMESHGUI_FilterDlg::Init
// Purpose : Init dialog fields, connect signals and slots, show dialog
//=======================================================================
-void SMESHGUI_FilterDlg::Init (const QList<int>& theTypes)
+void SMESHGUI_FilterDlg::Init (const QList<int>& theTypes, const bool setInViewer)
{
mySourceWg = 0;
myTypes = theTypes;
if (myInsertState.contains(theTypes.first()))
mySetInViewer->setChecked(myInsertState[ theTypes.first() ]);
else
- mySetInViewer->setChecked(true);
+ mySetInViewer->setChecked(setInViewer);
mySourceGrp->button(myApplyToState.contains(theTypes.first()) ?
myApplyToState[ theTypes.first() ] :
//=======================================================================
// name : SMESHGUI_FilterDlg::SetSourceWg
-// Purpose : Set widget of parent dialog containing idsto be filtered if
+// Purpose : Set widget of parent dialog containing ids to be filtered if
// user select corresponding source radio button
//=======================================================================
void SMESHGUI_FilterDlg::SetSourceWg (QWidget* theWg,
}
else
{
+ mySelector->SetSelectionMode( getSelMode( myTable->GetType() ));
+
if (myIsSelectionChanged) {
// mySelectionMgr->installFilter( new GEOM_TypeFilter( aStudy, -1 ) ); // This filter deactivates selection
// Impossible to select any object in the OB on the second opening of FilterDlg
SMESHGUI_FilterDlg( SMESHGUI*, const int );
virtual ~SMESHGUI_FilterDlg();
- void Init( const QList<int>& );
- void Init( const int );
+ void Init( const QList<int>&, const bool setInViewer=true );
+ void Init( const int, const bool setInViewer=true );
void SetSelection();
void SetMesh (SMESH::SMESH_Mesh_var);
if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : EdgeSelection);
break;
case grpBallSelection:
- //if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : BallSelection);
+ if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : BallSelection);
break;
case grpFaceSelection:
if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : FaceSelection);
if ( aMeshGroupSO )
if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
anActor->setName(myName->text().toLatin1().data());
+ QColor c;
+ int delta;
switch ( myTypeId ) {
case grpNodeSelection: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
case grpBallSelection: anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break;
case grpEdgeSelection: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
- case grpFaceSelection:
case grpVolumeSelection:
+ SMESH::GetColor("SMESH", "volume_color", c , delta, "255,0,170|-100");
+ anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break;
+ break;
+ case grpFaceSelection:
default:
- QColor c;
- int delta;
SMESH::GetColor("SMESH", "fill_color", c , delta, "0,170,255|-100");
anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta ); break;
+ break;
}
}
}
break;
case grpBallSelection:
aType = SMESH::BALL;
- //mySelector->SetSelectionMode(BallSelection);
+ mySelector->SetSelectionMode(BallSelection);
break;
case grpEdgeSelection:
aType = SMESH::EDGE;
if( !isAutoColor )
{
int r = 0, g = 0, b = 0;
- SMESH::GetColor( "SMESH", "fill_color", r, g, b, QColor( 0, 170, 255 ) );
+ SMESH::GetColor( "SMESH", "default_grp_color", r, g, b, QColor( 255, 170, 0 ) );
aQColor.setRgb( r, g, b );
}
else
anEntryList.append( aSObject->GetID().c_str() );
}
}
- update( UF_ObjBrowser | UF_Model );
-
SMESHGUI::Modified();
+ update( UF_ObjBrowser | UF_Model );
+
// Re-init controls to create the next group
myElemGeoIDs.clear();
myNodeGeoIDs.clear();
myDlg->myNodeGeomBtn->setChecked(false);
myDlg->updateButtons();
- update( UF_ObjBrowser | UF_Model );
-
if( LightApp_Application* anApp =
dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ) )
anApp->browseObjects( anEntryList, isApplyAndClose() );
if(myCreator) {
QVariant pluginName = myCreator->property( PLUGIN_NAME );
if( pluginName.isValid() ) {
- QString rootDir = pluginName.toString() + "PLUGIN_ROOT_DIR";
- QString varValue = QString( getenv(rootDir.toLatin1().constData()));
- if(!varValue.isEmpty())
- name = pluginName.toString() + "PLUGIN";
+ QString rootDir = pluginName.toString() + "PLUGIN_ROOT_DIR";
+ QString varValue = QString( getenv(rootDir.toLatin1().constData()));
+ if(!varValue.isEmpty())
+ name = pluginName.toString() + "PLUGIN";
}
}
app->onHelpContextModule(name, myHelpFileName);
// BUG 0020378
//myHypCreatorMap[aHypType] = aCreator;
- //rnv : This dynamic property of the QObject stores the name of the plugin.
- // It is used to obtain plugin root dir environment variable
+ //rnv : This dynamic property of the QObject stores the name of the plugin.
+ // It is used to obtain plugin root dir environment variable
// in the SMESHGUI_HypothesisDlg class. Plugin root dir environment
- // variable is used to display documentation.
- aCreator->setProperty(PLUGIN_NAME,aHypData->PluginName);
+ // variable is used to display documentation.
+ aCreator->setProperty(PLUGIN_NAME,aHypData->PluginName);
}
}
}
my0DElem = new QLabel( this );
l->addWidget( my0DElem, row, 1 );
+ // balls
+ row = l->rowCount(); // retrieve current row count
+ // --
+ lab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_BALLS")), this );
+ l->addWidget( lab, row, 0 );
+ // --
+ myBall = new QLabel( this );
+ l->addWidget( myBall, row, 1 );
+
addSeparator(this); // add separator
// edges
int idx = 0;
if( addToGroup ) {
aGroupName = ComboBox_GroupName->currentText();
- for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
+ for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
QString aName = ComboBox_GroupName->itemText( i );
if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
idx = i;
}
- if ( idx > 0 && idx < myGroups.count() ) {
+ if ( idx > 0 && idx <= myGroups.count() ) {
SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
if ( !aGeomGroup->_is_nil() ) {
int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),
+++ /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 SMESHGUI : GUI for SMESH component
-// File : SMESHGUI_Preferences_ColorDlg.cxx
-// Author : Nicolas REJNERI, Open CASCADE S.A.S.
-// SMESH includes
-//
-#include "SMESHGUI_Preferences_ColorDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_SpinBox.h"
-#include "SMESHGUI_Utils.h"
-
-// SALOME GUI includes
-#include <SUIT_Desktop.h>
-#include <SUIT_MessageBox.h>
-#include <SUIT_ResourceMgr.h>
-#include <SUIT_Session.h>
-#include <QtxColorButton.h>
-#include <VTKViewer_MarkerWidget.h>
-#include <LightApp_Application.h>
-#include <SalomeApp_IntSpinBox.h>
-
-// Qt includes
-#include <QGroupBox>
-#include <QLabel>
-#include <QPushButton>
-#include <QVBoxLayout>
-#include <QHBoxLayout>
-#include <QGridLayout>
-#include <QCheckBox>
-#include <QKeyEvent>
-
-#define SPACING 6
-#define MARGIN 11
-
-//=================================================================================
-// function : SMESHGUI_Preferences_ColorDlg()
-// purpose : Constructs a SMESHGUI_Preferences_ColorDlg which is a child
-// of 'parent', with the name 'name' and widget flags set to 'f'
-// The dialog will by default be modeless, unless you
-// set'modal' to true to construct a modal dialog.
-//=================================================================================
-SMESHGUI_Preferences_ColorDlg::SMESHGUI_Preferences_ColorDlg( SMESHGUI* theModule )
- : QDialog( SMESH::GetDesktop( theModule ) ),
- mySMESHGUI( theModule )
-{
- setModal( true );
- setWindowTitle( tr( "DIALOG_TITLE" ) );
- setSizeGripEnabled( true );
-
- // -------------------------------
- QVBoxLayout* topLayout = new QVBoxLayout( this );
- topLayout->setSpacing( SPACING );
- topLayout->setMargin( MARGIN );
-
- // -------------------------------
- QGroupBox* ButtonGroup1 = new QGroupBox( tr( "GRP_ELEMENTS" ), this );
- QGridLayout* ButtonGroup1Layout = new QGridLayout( ButtonGroup1 );
- ButtonGroup1Layout->setSpacing( SPACING );
- ButtonGroup1Layout->setMargin( MARGIN );
-
- QLabel* TextLabel_Fill = new QLabel( tr( "SURFACE_COLOR_LBL" ), ButtonGroup1 );
-
- toolSurfColor = new QtxBiColorTool(ButtonGroup1);
- toolSurfColor->setText( tr( "BACKSURFACE_COLOR_LBL" ));
-
- QLabel* TextLabel_Outline = new QLabel( tr( "OUTLINE_COLOR_LBL" ), ButtonGroup1 );
- btnOutlineColor = new QtxColorButton( ButtonGroup1 );
-
- QLabel* TextLabel_Wireframe = new QLabel( tr( "WIREFRAME_COLOR_LBL" ), ButtonGroup1 );
- btnWireframeColor = new QtxColorButton( ButtonGroup1 );
-
- QLabel* TextLabel_0DElements_Color = new QLabel( tr( "0D_ELEMENTS_COLOR_LBL" ), ButtonGroup1 );
- btn0DElementsColor = new QtxColorButton( ButtonGroup1 );
-
- QLabel* TextLabel_0DElements_Size = new QLabel( tr( "0D_ELEMENTS_SIZE_LBL" ), ButtonGroup1 );
- SpinBox_0DElements_Size = new SalomeApp_IntSpinBox( ButtonGroup1 );
- SpinBox_0DElements_Size->setAcceptNames( false ); // No Notebook variables allowed
- SpinBox_0DElements_Size->setRange( 1, 10 );
- SpinBox_0DElements_Size->setSingleStep( 1 );
- SpinBox_0DElements_Size->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
- SpinBox_0DElements_Size->setButtonSymbols( QSpinBox::PlusMinus );
-
- QLabel* TextLabel_BallElem_Color = new QLabel( tr( "0D_ELEMENTS_COLOR_LBL" ), ButtonGroup1 );
- btnBallElemColor = new QtxColorButton( ButtonGroup1 );
-
- QLabel* TextLabel_BallElem_Size = new QLabel( tr( "BALLELEM_SIZE_LBL" ), ButtonGroup1 );
- SpinBox_BallElem_Size = new SalomeApp_IntSpinBox( ButtonGroup1 );
- SpinBox_BallElem_Size->setAcceptNames( false ); // No Notebook variables allowed
- SpinBox_BallElem_Size->setRange( 1, 10 );
- SpinBox_BallElem_Size->setSingleStep( 1 );
- SpinBox_BallElem_Size->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
- SpinBox_BallElem_Size->setButtonSymbols( QSpinBox::PlusMinus );
-
- QLabel* TextLabel_Width = new QLabel( tr( "LINE_WIDTH_LBL" ), ButtonGroup1 );
- SpinBox_Width = new SalomeApp_IntSpinBox( ButtonGroup1 );
- SpinBox_Width->setAcceptNames( false ); // No Notebook variables allowed
- SpinBox_Width->setRange( 1, 5 );
- SpinBox_Width->setSingleStep( 1 );
- SpinBox_Width->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
- SpinBox_Width->setButtonSymbols( QSpinBox::PlusMinus );
-
- QLabel* TextLabel_ShrinkCoeff = new QLabel( tr( "SHRINK_COEF_LBL" ), ButtonGroup1 );
- SpinBox_Shrink = new SalomeApp_IntSpinBox( ButtonGroup1 );
- SpinBox_Shrink->setAcceptNames( false ); // No Notebook variables allowed
- SpinBox_Shrink->setRange( 20, 100 );
- SpinBox_Shrink->setSingleStep( 1 );
- SpinBox_Shrink->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
- SpinBox_Shrink->setButtonSymbols( QSpinBox::PlusMinus );
-
- ButtonGroup1Layout->addWidget( TextLabel_Fill, 0, 0 );
- ButtonGroup1Layout->addWidget( toolSurfColor, 0, 1, 1, 3 );
-
- ButtonGroup1Layout->addWidget( TextLabel_Outline, 1, 0 );
- ButtonGroup1Layout->addWidget( btnOutlineColor, 1, 1 );
- ButtonGroup1Layout->addWidget( TextLabel_Wireframe, 1, 2 );
- ButtonGroup1Layout->addWidget( btnWireframeColor, 1, 3 );
-
- ButtonGroup1Layout->addWidget( TextLabel_0DElements_Color, 2, 0 );
- ButtonGroup1Layout->addWidget( btn0DElementsColor, 2, 1 );
-
- ButtonGroup1Layout->addWidget( TextLabel_0DElements_Size, 2, 2 );
- ButtonGroup1Layout->addWidget( SpinBox_0DElements_Size, 2, 3 );
-
- ButtonGroup1Layout->addWidget( TextLabel_BallElem_Color, 2, 0 );
- ButtonGroup1Layout->addWidget( btnBallElemColor, 2, 1 );
-
- ButtonGroup1Layout->addWidget( TextLabel_BallElem_Size, 2, 2 );
- ButtonGroup1Layout->addWidget( SpinBox_BallElem_Size, 2, 3 );
-
- ButtonGroup1Layout->addWidget( TextLabel_Width, 3, 0 );
- ButtonGroup1Layout->addWidget( SpinBox_Width, 3, 1 );
- ButtonGroup1Layout->addWidget( TextLabel_ShrinkCoeff, 3, 2 );
- ButtonGroup1Layout->addWidget( SpinBox_Shrink, 3, 3 );
-
- // -------------------------------
- QGroupBox* ButtonGroup2 = new QGroupBox( tr( "GRP_NODES" ), this );
- QGridLayout* ButtonGroup2Layout = new QGridLayout( ButtonGroup2 );
- ButtonGroup2Layout->setSpacing( SPACING );
- ButtonGroup2Layout->setMargin( MARGIN );
-
- QLabel* TextLabel_Nodes_Color = new QLabel( tr( "NODES_COLOR_LBL" ), ButtonGroup2 );
- btnNodeColor = new QtxColorButton( ButtonGroup2 );
-
- QGroupBox* MarkerGroup = new QGroupBox( tr( "NODES_MARKER_LBL" ), ButtonGroup2 );
- QVBoxLayout* MarkerGroupLayout = new QVBoxLayout( MarkerGroup );
- MarkerGroupLayout->setSpacing( 0 );
- MarkerGroupLayout->setMargin( 0 );
-
- MarkerWidget = new VTKViewer_MarkerWidget( MarkerGroup );
-
- MarkerGroupLayout->addWidget( MarkerWidget );
-
- ButtonGroup2Layout->addWidget( TextLabel_Nodes_Color, 0, 0 );
- ButtonGroup2Layout->addWidget( btnNodeColor, 0, 1 );
- ButtonGroup2Layout->addWidget( MarkerGroup, 1, 0, 1, 3 );
- ButtonGroup2Layout->setColumnStretch( 2, 1 );
-
- // -------------------------------
- QGroupBox* ButtonGroup3 = new QGroupBox( tr( "GRP_ORIENTATION" ), this );
- QGridLayout* ButtonGroup3Layout = new QGridLayout( ButtonGroup3 );
- ButtonGroup3Layout->setSpacing( SPACING );
- ButtonGroup3Layout->setMargin( MARGIN );
-
- QLabel* TextLabel_Orientation_Color = new QLabel( tr( "ORIENTATION_COLOR_LBL" ), ButtonGroup3 );
- btnOrientationColor = new QtxColorButton( ButtonGroup3 );
-
- QLabel* TextLabel_Orientation_Scale = new QLabel( tr( "ORIENTATION_SCALE_LBL" ), ButtonGroup3 );
- SpinBox_Orientation_Scale = new SMESHGUI_SpinBox( ButtonGroup3 );
- SpinBox_Orientation_Scale->setAcceptNames( false ); // No Notebook variables allowed
- SpinBox_Orientation_Scale->RangeStepAndValidator( .05, .5, .05, "parametric_precision" );
- SpinBox_Orientation_Scale->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
- SpinBox_Orientation_Scale->setButtonSymbols( QSpinBox::PlusMinus );
-
- CheckBox_Orientation_3DVectors = new QCheckBox( tr( "3D_VECTORS_LBL" ), ButtonGroup3 );
-
- ButtonGroup3Layout->addWidget( TextLabel_Orientation_Color, 0, 0 );
- ButtonGroup3Layout->addWidget( btnOrientationColor, 0, 1 );
- ButtonGroup3Layout->addWidget( TextLabel_Orientation_Scale, 0, 2 );
- ButtonGroup3Layout->addWidget( SpinBox_Orientation_Scale, 0, 3 );
- ButtonGroup3Layout->addWidget( CheckBox_Orientation_3DVectors, 1, 0, 1, 4 );
-
- // -------------------------------
- QGroupBox* ButtonGroup4 = new QGroupBox( tr( "GRP_SELECTION" ), this );
- QGridLayout* ButtonGroup4Layout = new QGridLayout( ButtonGroup4 );
- ButtonGroup3Layout->setSpacing( SPACING );
- ButtonGroup3Layout->setMargin( MARGIN );
-
- QLabel* TextLabel_Selection_Color = new QLabel( tr( "SELECTION_COLOR_LBL" ), ButtonGroup4 );
- btnSelectionColor = new QtxColorButton( ButtonGroup4 );
-
- QLabel* TextLabel_Preselection_Color = new QLabel( tr( "PRESELECTION_COLOR_LBL" ), ButtonGroup4 );
- btnPreselectionColor = new QtxColorButton( ButtonGroup4 );
-
- ButtonGroup4Layout->addWidget( TextLabel_Selection_Color, 0, 0 );
- ButtonGroup4Layout->addWidget( btnSelectionColor, 0, 1 );
- ButtonGroup4Layout->addWidget( TextLabel_Preselection_Color, 0, 2 );
- ButtonGroup4Layout->addWidget( btnPreselectionColor, 0, 3 );
-
- // -------------------------------
- QGroupBox* GroupButtons = new QGroupBox( this );
- QHBoxLayout* GroupButtonsLayout = new QHBoxLayout( GroupButtons );
- GroupButtonsLayout->setSpacing( SPACING );
- GroupButtonsLayout->setMargin( MARGIN );
-
- QPushButton* buttonOk = new QPushButton( tr( "SMESH_BUT_OK" ), GroupButtons );
- buttonOk->setAutoDefault( true );
- buttonOk->setDefault( true );
-
- QPushButton* buttonCancel = new QPushButton( tr( "SMESH_BUT_CANCEL" ), GroupButtons );
- buttonCancel->setAutoDefault( true );
-
- QPushButton* buttonHelp = new QPushButton( tr( "SMESH_BUT_HELP" ), GroupButtons );
- buttonHelp->setAutoDefault( true );
-
- GroupButtonsLayout->addWidget( buttonOk );
- GroupButtonsLayout->addSpacing( 10 );
- GroupButtonsLayout->addStretch();
- GroupButtonsLayout->addWidget( buttonCancel );
- GroupButtonsLayout->addWidget( buttonHelp );
-
- // -------------------------------
- topLayout->addWidget( ButtonGroup1 );
- topLayout->addWidget( ButtonGroup2 );
- topLayout->addWidget( ButtonGroup3 );
- // rnv: Selection and preselection colors are defined only in the Preferences
- // topLayout->addWidget( ButtonGroup4 );
- ButtonGroup4->hide();
- topLayout->addWidget( GroupButtons );
-
- // -------------------------------
- mySMESHGUI->SetActiveDialogBox( this );
-
- myHelpFileName = "colors_size_page.html";
-
- /* signals and slots connections */
- connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) );
- connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) );
- connect( buttonHelp, SIGNAL( clicked() ), this, SLOT( ClickOnHelp() ) );
-
- connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ),
- this, SLOT( DeactivateActiveDialog() ) );
- /* to close dialog if study change */
- connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ),
- this, SLOT( ClickOnCancel() ) );
-}
-
-//=================================================================================
-// function : ~SMESHGUI_Preferences_ColorDlg()
-// purpose : Destructor
-//=================================================================================
-SMESHGUI_Preferences_ColorDlg::~SMESHGUI_Preferences_ColorDlg()
-{
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnOk()
-{
- mySMESHGUI->ResetState();
- accept();
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnCancel()
-{
- mySMESHGUI->ResetState();
- reject();
-}
-
-//=================================================================================
-// function : ClickOnHelp()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnHelp()
-{
- LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
- if (app)
- app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName);
- else {
- QString platform;
-#ifdef WIN32
- platform = "winapplication";
-#else
- platform = "application";
-#endif
- SUIT_MessageBox::warning(this, tr("WRN_WARNING"),
- tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE").
- arg(app->resourceMgr()->stringValue("ExternalBrowser",
- platform)).
- arg(myHelpFileName));
- }
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::DeactivateActiveDialog()
-{
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::closeEvent( QCloseEvent* )
-{
- ClickOnCancel(); /* same than click on cancel button */
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ActivateThisDialog()
-{
- /* Emit a signal to deactivate any active dialog */
- mySMESHGUI->EmitSignalDeactivateDialog();
-}
-
-//=================================================================================
-// function : SetColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetColor( int type, const QColor& color )
-{
- switch ( type ) {
- case 1 : toolSurfColor->setMainColor( color ); break; // fill
- case 2 : btnWireframeColor->setColor( color ); break; // wireframe
- case 3 : btnNodeColor->setColor( color ); break; // node
- case 4 : btnOutlineColor->setColor( color ); break; // outline
- case 5 : btn0DElementsColor->setColor( color ); break; // 0d elements
- case 6 : btnBallElemColor->setColor( color ); break; // ball elements
- case 7 : btnOrientationColor->setColor( color ); break; // orientation of faces
- case 8 : btnSelectionColor->setColor( color ); break; // selection color
- case 9 : btnPreselectionColor->setColor( color ); break; // pre-selection color
- default: break;
- }
-}
-
-//=================================================================================
-// function : GetColor()
-// purpose :
-//=================================================================================
-QColor SMESHGUI_Preferences_ColorDlg::GetColor( int type )
-{
- QColor color;
- switch ( type ) {
- case 1 : color = toolSurfColor->mainColor(); break; // fill
- case 2 : color = btnWireframeColor->color(); break; // outline
- case 3 : color = btnNodeColor->color(); break; // node
- case 4 : color = btnOutlineColor->color(); break; // node
- case 5 : color = btn0DElementsColor->color(); break; // 0d elements
- case 6 : color = btnBallElemColor->color(); break; // 0d elements
- case 7 : color = btnOrientationColor->color(); break; // orientation of faces
- case 8 : color = btnSelectionColor->color(); break; // selection color
- case 9 : color = btnPreselectionColor->color(); break; // pre-selection color
-
- default: break;
- }
- return color;
-}
-
-//=================================================================================
-// function : SetIntValue()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetIntValue( int type, int value )
-{
- switch ( type ) {
- case 1 : SpinBox_Width->setValue( value ); break; // width
- case 2 : SpinBox_Shrink->setValue( value ); break; // shrink coeff
- case 3 : SpinBox_0DElements_Size->setValue( value ); break; // 0d elements
- case 4 : SpinBox_BallElem_Size->setValue( value ); break; // 0d elements
- default: break;
- }
-}
-
-//=================================================================================
-// function : GetIntValue()
-// purpose :
-//=================================================================================
-int SMESHGUI_Preferences_ColorDlg::GetIntValue( int type )
-{
- int res = 0;
- switch ( type ) {
- case 1 : res = SpinBox_Width->value(); break; // width
- case 2 : res = SpinBox_Shrink->value(); break; // shrink coeff
- case 3 : res = SpinBox_0DElements_Size->value(); break; // 0d elements
- case 4 : res = SpinBox_BallElem_Size->value(); break; // 0d elements
- default: break;
- }
- return res;
-}
-
-//=================================================================================
-// function : SetDoubleValue()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetDoubleValue( int type, double value )
-{
- switch ( type ) {
- case 1 : SpinBox_Orientation_Scale->setValue( value ); break; // orientation scale
- default: break;
- }
-}
-
-//=================================================================================
-// function : GetDoubleValue()
-// purpose :
-//=================================================================================
-double SMESHGUI_Preferences_ColorDlg::GetDoubleValue( int type )
-{
- double res = 0;
- switch ( type ) {
- case 1 : res = SpinBox_Orientation_Scale->value(); break; // orientation scale
- default: break;
- }
- return res;
-}
-
-//=================================================================================
-// function : SetBooleanValue()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetBooleanValue( int type, bool value )
-{
- switch ( type ) {
- case 1 : CheckBox_Orientation_3DVectors->setChecked( value ); break; // 3D vectors
- default: break;
- }
-}
-
-//=================================================================================
-// function : GetBooleanValue()
-// purpose :
-//=================================================================================
-bool SMESHGUI_Preferences_ColorDlg::GetBooleanValue( int type )
-{
- bool res = false;
- switch ( type ) {
- case 1 : res = CheckBox_Orientation_3DVectors->isChecked(); break; // 3D vectors
- default: break;
- }
- return res;
-}
-
-//=================================================================================
-// function : setCustomMarkerMap()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::setCustomMarkerMap( VTK::MarkerMap theMarkerMap )
-{
- MarkerWidget->setCustomMarkerMap( theMarkerMap );
-}
-
-//=================================================================================
-// function : getCustomMarkerMap()
-// purpose :
-//=================================================================================
-VTK::MarkerMap SMESHGUI_Preferences_ColorDlg::getCustomMarkerMap()
-{
- return MarkerWidget->getCustomMarkerMap();
-}
-
-//=================================================================================
-// function : setStandardMarker()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::setStandardMarker( VTK::MarkerType theMarkerType,
- VTK::MarkerScale theMarkerScale )
-{
- MarkerWidget->setStandardMarker( theMarkerType, theMarkerScale );
-}
-
-//=================================================================================
-// function : setCustomMarker()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::setCustomMarker( int theId )
-{
- MarkerWidget->setCustomMarker( theId );
-}
-
-//=================================================================================
-// function : getMarkerType()
-// purpose :
-//=================================================================================
-VTK::MarkerType SMESHGUI_Preferences_ColorDlg::getMarkerType() const
-{
- return MarkerWidget->getMarkerType();
-}
-
-//=================================================================================
-// function : getStandardMarkerScale()
-// purpose :
-//=================================================================================
-VTK::MarkerScale SMESHGUI_Preferences_ColorDlg::getStandardMarkerScale() const
-{
- return MarkerWidget->getStandardMarkerScale();
-}
-
-//=================================================================================
-// function : getCustomMarkerID()
-// purpose :
-//=================================================================================
-int SMESHGUI_Preferences_ColorDlg::getCustomMarkerID() const
-{
- return MarkerWidget->getCustomMarkerID();
-}
-
-//=================================================================================
-// function : SetDeltaBrightness(int)
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetDeltaBrightness(int delta)
-{
- toolSurfColor->setDelta(delta);
-}
-//=================================================================================
-// function : GetDeltaBrightness()
-// purpose :
-//=================================================================================
-int SMESHGUI_Preferences_ColorDlg::GetDeltaBrightness()
-{
- return toolSurfColor->delta();
-}
-
-//=================================================================================
-// function : keyPressEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::keyPressEvent( QKeyEvent* e )
-{
- QDialog::keyPressEvent( e );
- if ( e->isAccepted() )
- return;
-
- if ( e->key() == Qt::Key_F1 ) {
- e->accept();
- ClickOnHelp();
- }
-}
+++ /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 SMESHGUI : GUI for SMESH component
-// File : SMESHGUI_Preferences_ColorDlg.h
-// Author : Nicolas REJNERI, Open CASCADE S.A.S.
-//
-#ifndef SMESHGUI_PREFERENCES_COLORDLG_H
-#define SMESHGUI_PREFERENCES_COLORDLG_H
-
-// SMESH includes
-#include "SMESH_SMESHGUI.hxx"
-
-// SALOME GUI includes
-#include <VTKViewer_MarkerDef.h>
-#include <QtxBiColorTool.h>
-
-// Qt includes
-#include <QDialog>
-
-class QCheckBox;
-class SMESHGUI;
-class SMESHGUI_SpinBox;
-class SalomeApp_IntSpinBox;
-class QtxColorButton;
-class VTKViewer_MarkerWidget;
-
-class SMESHGUI_EXPORT SMESHGUI_Preferences_ColorDlg : public QDialog
-{
- Q_OBJECT
-
-public:
- SMESHGUI_Preferences_ColorDlg( SMESHGUI* );
- ~SMESHGUI_Preferences_ColorDlg();
-
- void SetColor( int, const QColor& );
- QColor GetColor( int );
- void SetIntValue( int, int );
- int GetIntValue( int );
- void SetDoubleValue( int, double );
- double GetDoubleValue( int );
- void SetBooleanValue( int, bool );
- bool GetBooleanValue( int );
-
- void setCustomMarkerMap( VTK::MarkerMap );
- VTK::MarkerMap getCustomMarkerMap();
-
- void SetDeltaBrightness(int);
- int GetDeltaBrightness();
-
- void setStandardMarker( VTK::MarkerType, VTK::MarkerScale );
- void setCustomMarker( int );
- VTK::MarkerType getMarkerType() const;
- VTK::MarkerScale getStandardMarkerScale() const;
- int getCustomMarkerID() const;
-
-protected:
- void closeEvent( QCloseEvent* );
- void keyPressEvent( QKeyEvent* );
-
-private slots:
- void ClickOnOk();
- void ClickOnCancel();
- void ClickOnHelp();
- void DeactivateActiveDialog();
- void ActivateThisDialog();
-
-private:
- SMESHGUI* mySMESHGUI;
-
- QtxBiColorTool* toolSurfColor;
- QtxColorButton* btnWireframeColor;
- QtxColorButton* btnOutlineColor;
- QtxColorButton* btn0DElementsColor;
- QtxColorButton* btnBallElemColor;
- SalomeApp_IntSpinBox* SpinBox_0DElements_Size;
- SalomeApp_IntSpinBox* SpinBox_BallElem_Size;
- SalomeApp_IntSpinBox* SpinBox_Width;
- SalomeApp_IntSpinBox* SpinBox_Shrink;
- QtxColorButton* btnNodeColor;
- VTKViewer_MarkerWidget* MarkerWidget;
- QtxColorButton* btnOrientationColor;
- SMESHGUI_SpinBox* SpinBox_Orientation_Scale;
- QCheckBox* CheckBox_Orientation_3DVectors;
- QtxColorButton* btnPreselectionColor;
- QtxColorButton* btnSelectionColor;
-
- QString myHelpFileName;
-};
-
-#endif // SMESHGUI_PREFERENCES_COLORDLG_H
--- /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 : SMESHGUI_PropertiesDlg.cxx
+// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
+
+#include "SMESHGUI_PropertiesDlg.h"
+#include "SMESH_Actor.h"
+
+#include <QCheckBox>
+#include <QFrame>
+#include <QGroupBox>
+#include <QHBoxLayout>
+#include <QLabel>
+
+#include <QtxBiColorTool.h>
+#include <QtxColorButton.h>
+#include <QtxIntSpinBox.h>
+#include <VTKViewer_MarkerWidget.h>
+#include <SUIT_Session.h>
+#include <LightApp_Application.h>
+
+const int MARGIN = 9;
+const int SPACING = 6;
+
+/*!
+ \class SMESHGUI_PropertiesDlg
+ \brief Dialog box to set-up mesh presentation properties: colors,
+ sizes of elements, width of lines etc
+*/
+
+/*
+ \brief Constructor
+ \param customMarkers custom node markers
+ \param parent parent widget
+*/
+SMESHGUI_PropertiesDlg::SMESHGUI_PropertiesDlg( const VTK::MarkerMap& customMarkers, QWidget* parent )
+ : SMESHGUI_Dialog( parent, true, true, Standard )
+{
+ // set title
+ setWindowTitle( tr( "TITLE" ) );
+
+ // create widgets
+
+ QHBoxLayout* hl;
+ int widthLab1 = 0, widthLab2 = 0;
+
+ // -- node controls
+ myNodeGrp = new QGroupBox( tr( "NODES" ), mainFrame() );
+ QLabel* nodeColorLab = new QLabel( tr( "COLOR" ), myNodeGrp );
+ myNodeColor = new QtxColorButton( myNodeGrp );
+ myNodeMarker = new VTKViewer_MarkerWidget( myNodeGrp );
+ hl = new QHBoxLayout( myNodeGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( nodeColorLab );
+ hl->addWidget( myNodeColor );
+ hl->addWidget( myNodeMarker );
+ widthLab1 = qMax( widthLab1, nodeColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, myNodeMarker->typeLabel()->minimumSizeHint().width() );
+
+ // -- edge controls
+ myEdgeGrp = new QGroupBox( tr( "EDGES" ), mainFrame() );
+ QLabel* edgeColorLab = new QLabel( tr( "COLOR" ), myEdgeGrp );
+ myEdgeColor = new QtxColorButton( myEdgeGrp );
+ QLabel* edgeWidthLab = new QLabel( tr( "WIDTH" ), myEdgeGrp );
+ myEdgeWidth = new QtxIntSpinBox( myEdgeGrp );
+ hl = new QHBoxLayout( myEdgeGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( edgeColorLab );
+ hl->addWidget( myEdgeColor );
+ hl->addWidget( edgeWidthLab );
+ hl->addWidget( myEdgeWidth );
+ widthLab1 = qMax( widthLab1, edgeColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, edgeWidthLab->minimumSizeHint().width() );
+
+ // -- face controls
+ myFaceGrp = new QGroupBox( tr( "FACES" ), mainFrame() );
+ QLabel* faceColorLab = new QLabel( tr( "FACE_FRONT" ), myFaceGrp );
+ myFaceColor = new QtxBiColorTool( myFaceGrp );
+ myFaceColor->label()->setText( tr( "FACE_BACK" ) );
+ hl = new QHBoxLayout( myFaceGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( faceColorLab );
+ hl->addWidget( myFaceColor );
+ widthLab1 = qMax( widthLab1, faceColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, myFaceColor->label()->minimumSizeHint().width() );
+
+ // -- volumes
+ myVolumeGrp = new QGroupBox( tr( "VOLUMES" ), mainFrame() );
+ QLabel* volumeColorLab = new QLabel( tr( "VOLUME_NORMAL" ), myVolumeGrp );
+ myVolumeColor = new QtxBiColorTool( myVolumeGrp );
+ myVolumeColor->label()->setText( tr( "VOLUME_REVERSED" ) );
+ hl = new QHBoxLayout( myVolumeGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( volumeColorLab );
+ hl->addWidget( myVolumeColor );
+ widthLab1 = qMax( widthLab1, volumeColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, myVolumeColor->label()->minimumSizeHint().width() );
+
+ // -- outline controls
+ myOutlineGrp = new QGroupBox( tr( "OUTLINES" ), mainFrame() );
+ QLabel* outlineColorLab = new QLabel( tr( "COLOR" ), myOutlineGrp );
+ myOutlineColor = new QtxColorButton( myOutlineGrp );
+ QLabel* outlineWidthLab = new QLabel( tr( "WIDTH" ), myOutlineGrp );
+ myOutlineWidth = new QtxIntSpinBox( myOutlineGrp );
+ hl = new QHBoxLayout( myOutlineGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( outlineColorLab );
+ hl->addWidget( myOutlineColor );
+ hl->addWidget( outlineWidthLab );
+ hl->addWidget( myOutlineWidth );
+ widthLab1 = qMax( widthLab1, outlineColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, outlineWidthLab->minimumSizeHint().width() );
+
+ // -- 0d element controls
+ myElem0dGrp = new QGroupBox( tr( "0D_ELEMENTS" ), mainFrame() );
+ QLabel* elem0dColorLab = new QLabel( tr( "COLOR" ), myElem0dGrp );
+ myElem0dColor = new QtxColorButton( myElem0dGrp );
+ QLabel* elem0dSizeLab = new QLabel( tr( "SIZE" ), myElem0dGrp );
+ myElem0dSize = new QtxIntSpinBox( myElem0dGrp );
+ hl = new QHBoxLayout( myElem0dGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( elem0dColorLab );
+ hl->addWidget( myElem0dColor );
+ hl->addWidget( elem0dSizeLab );
+ hl->addWidget( myElem0dSize );
+ widthLab1 = qMax( widthLab1, elem0dColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, elem0dSizeLab->minimumSizeHint().width() );
+
+ // -- ball controls
+ myBallGrp = new QGroupBox( tr( "BALLS" ), mainFrame() );
+ QLabel* ballColorLab = new QLabel( tr( "COLOR" ), myBallGrp );
+ myBallColor = new QtxColorButton( myBallGrp );
+ QLabel* ballSizeLab = new QLabel( tr( "SIZE" ), myBallGrp );
+ myBallSize = new QtxIntSpinBox( myBallGrp );
+ hl = new QHBoxLayout( myBallGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( ballColorLab );
+ hl->addWidget( myBallColor );
+ hl->addWidget( ballSizeLab );
+ hl->addWidget( myBallSize );
+ widthLab1 = qMax( widthLab1, ballColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, ballSizeLab->minimumSizeHint().width() );
+
+ // -- orientation vector controls
+ myOrientationGrp = new QGroupBox( tr( "ORIENTATIONS" ), mainFrame() );
+ QLabel* orientationColorLab = new QLabel( tr( "COLOR" ), myOrientationGrp );
+ myOrientationColor = new QtxColorButton( myOrientationGrp );
+ QLabel* orientationScaleLab = new QLabel( tr( "ORIENTATION_SCALE" ), myOrientationGrp );
+ myOrientationSize = new QtxIntSpinBox( myOrientationGrp );
+ myOrientationSize->setSuffix( "% ");
+ myOrientation3d = new QCheckBox( tr("ORIENTATION_3D"), myOrientationGrp );
+ hl = new QHBoxLayout( myOrientationGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( orientationColorLab );
+ hl->addWidget( myOrientationColor );
+ hl->addWidget( orientationScaleLab );
+ hl->addWidget( myOrientationSize );
+ hl->addWidget( myOrientation3d );
+ widthLab1 = qMax( widthLab1, orientationColorLab->minimumSizeHint().width() );
+ widthLab2 = qMax( widthLab2, orientationScaleLab->minimumSizeHint().width() );
+
+ // -- other controls
+ myExtraGrp = new QFrame( mainFrame() );
+ QLabel* shrinkSizeLab = new QLabel( tr( "SHRINK" ), myExtraGrp );
+ myShrinkSize = new QtxIntSpinBox( myExtraGrp );
+ myShrinkSize->setSuffix( "% ");
+ hl = new QHBoxLayout( myExtraGrp );
+ hl->setMargin( MARGIN );
+ hl->setSpacing( SPACING );
+ hl->addWidget( shrinkSizeLab );
+ hl->addWidget( myShrinkSize );
+ hl->addStretch();
+ widthLab1 = qMax( widthLab1, shrinkSizeLab->minimumSizeHint().width() );
+
+ // layout widgets
+ QVBoxLayout* vl = new QVBoxLayout( mainFrame() );
+ vl->setMargin( 0 );
+ vl->setSpacing( SPACING );
+ vl->addWidget( myNodeGrp );
+ vl->addWidget( myEdgeGrp );
+ vl->addWidget( myFaceGrp );
+ vl->addWidget( myVolumeGrp );
+ vl->addWidget( myOutlineGrp );
+ vl->addWidget( myElem0dGrp );
+ vl->addWidget( myBallGrp );
+ vl->addWidget( myOrientationGrp );
+ vl->addWidget( myExtraGrp );
+
+ nodeColorLab->setMinimumWidth( widthLab1 );
+ edgeColorLab->setMinimumWidth( widthLab1 );
+ faceColorLab->setMinimumWidth( widthLab1 );
+ volumeColorLab->setMinimumWidth( widthLab1 );
+ outlineColorLab->setMinimumWidth( widthLab1 );
+ elem0dColorLab->setMinimumWidth( widthLab1 );
+ ballColorLab->setMinimumWidth( widthLab1 );
+ orientationColorLab->setMinimumWidth( widthLab1 );
+ shrinkSizeLab->setMinimumWidth( widthLab1 );
+
+ myNodeMarker->typeLabel()->setMinimumWidth( widthLab2 );
+ edgeWidthLab->setMinimumWidth( widthLab2 );
+ myFaceColor->label()->setMinimumWidth( widthLab2 );
+ myVolumeColor->label()->setMinimumWidth( widthLab2 );
+ outlineWidthLab->setMinimumWidth( widthLab2 );
+ elem0dSizeLab->setMinimumWidth( widthLab2 );
+ ballSizeLab->setMinimumWidth( widthLab2 );
+ orientationScaleLab->setMinimumWidth( widthLab2 );
+
+ myEdgeWidth->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+ myOutlineWidth->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+ myElem0dSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+ myBallSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+ myOrientationSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+ myShrinkSize->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed );
+
+ // initialize widgets
+ myNodeMarker->setCustomMarkers( customMarkers );
+ myElem0dSize->setRange( 1, 10 );
+ myBallSize->setRange( 1, 10 );
+ myEdgeWidth->setRange( 1, 5 );
+ myOutlineWidth->setRange( 1, 5 );
+ myShrinkSize->setRange( 20, 100 );
+ myOrientationSize->setRange( 5, 100 );
+
+ button( OK )->setText( tr( "SMESH_BUT_OK" ) );
+
+ connect( this, SIGNAL( dlgHelp() ), this, SLOT( onHelp() ) );
+}
+
+/*
+ \brief Destructor: clean-up resources if necessary
+*/
+SMESHGUI_PropertiesDlg::~SMESHGUI_PropertiesDlg()
+{
+}
+
+/*!
+ \brief Set nodes color
+ \param color nodes color
+*/
+void SMESHGUI_PropertiesDlg::setNodeColor( const QColor& color )
+{
+ myNodeColor->setColor( color );
+}
+
+/*!
+ \brief Get nodes color
+ \return current nodes color
+*/
+QColor SMESHGUI_PropertiesDlg::nodeColor() const
+{
+ return myNodeColor->color();
+}
+
+/*!
+ \brief Set standard nodes marker
+ \param type standard nodes marker type
+ \param scale standard nodes marker scale
+*/
+void SMESHGUI_PropertiesDlg::setNodeMarker( VTK::MarkerType type, VTK::MarkerScale scale )
+{
+ myNodeMarker->setMarker( type, scale );
+}
+
+/*!
+ \brief Set custom nodes marker
+ \param id custom nodes marker id
+*/
+void SMESHGUI_PropertiesDlg::setNodeCustomMarker( int id )
+{
+ myNodeMarker->setCustomMarker( id );
+}
+
+/*!
+ \brief Get nodes marker type.
+ For custom marker, VTK::MT_USER is returned and markerId() function
+ then returns its identifier.
+ \return currently selected nodes marker type
+*/
+VTK::MarkerType SMESHGUI_PropertiesDlg::nodeMarkerType() const
+{
+ return myNodeMarker->markerType();
+}
+
+/*!
+ \brief Get nodes marker scale.
+ For custom marker return value is undefined.
+ \return currently selected nodes marker scale
+*/
+VTK::MarkerScale SMESHGUI_PropertiesDlg::nodeMarkerScale() const
+{
+ return myNodeMarker->markerScale();
+}
+
+/*!
+ \brief Get custom nodes marker.
+ For standard markers return value is VTK::MT_NONE.
+ \return custom nodes marker id
+*/
+int SMESHGUI_PropertiesDlg::nodeMarkerId() const
+{
+ return myNodeMarker->markerId();
+}
+
+/*!
+ \brief Set edges (wireframe) color
+ \param color edges color
+*/
+void SMESHGUI_PropertiesDlg::setEdgeColor( const QColor& color )
+{
+ myEdgeColor->setColor( color );
+}
+
+/*!
+ \brief Get edges (wireframe) color
+ \return current edges color
+*/
+QColor SMESHGUI_PropertiesDlg::edgeColor() const
+{
+ return myEdgeColor->color();
+}
+
+/*!
+ \brief Set edges width
+ \param width edges width
+*/
+void SMESHGUI_PropertiesDlg::setEdgeWidth( int width )
+{
+ myEdgeWidth->setValue( width );
+}
+
+/*!
+ \brief Get edges width
+ \return current edges width
+*/
+int SMESHGUI_PropertiesDlg::edgeWidth() const
+{
+ return myEdgeWidth->value();
+}
+
+/*!
+ \brief Set faces colors
+ \param color front faces color
+ \param delta back faces coloring delta
+*/
+void SMESHGUI_PropertiesDlg::setFaceColor( const QColor& color, int delta )
+{
+ myFaceColor->setMainColor( color );
+ myFaceColor->setDelta( delta );
+}
+
+/*!
+ \brief Get front faces color
+ \return current front faces color
+*/
+QColor SMESHGUI_PropertiesDlg::faceColor() const
+{
+ return myFaceColor->mainColor();
+}
+
+/*!
+ \brief Get back faces coloring delta
+ \return current back faces coloring delta
+*/
+int SMESHGUI_PropertiesDlg::faceColorDelta() const
+{
+ return myFaceColor->delta();
+}
+
+/*!
+ \brief Set volumes colors
+ \param color normal volumes color
+ \param delta reversed volumes coloring delta
+*/
+void SMESHGUI_PropertiesDlg::setVolumeColor( const QColor& color, int delta )
+{
+ myVolumeColor->setMainColor( color );
+ myVolumeColor->setDelta( delta );
+}
+
+/*!
+ \brief Get normal volumes color
+ \return current normal volumes color
+*/
+QColor SMESHGUI_PropertiesDlg::volumeColor() const
+{
+ return myVolumeColor->mainColor();
+}
+
+/*!
+ \brief Get reversed volumes coloring delta
+ \return current reversed volumes coloring delta
+*/
+int SMESHGUI_PropertiesDlg::volumeColorDelta() const
+{
+ return myVolumeColor->delta();
+}
+
+/*!
+ \brief Set outlines color
+ \param color outlines color
+*/
+void SMESHGUI_PropertiesDlg::setOutlineColor( const QColor& color )
+{
+ myOutlineColor->setColor( color );
+}
+
+/*!
+ \brief Get outlines color
+ \return current outlines color
+*/
+QColor SMESHGUI_PropertiesDlg::outlineColor() const
+{
+ return myOutlineColor->color();
+}
+
+/*!
+ \brief Set outlines width
+ \param width outlines width
+*/
+void SMESHGUI_PropertiesDlg::setOutlineWidth( int width )
+{
+ myOutlineWidth->setValue( width );
+}
+
+/*!
+ \brief Get outlines width
+ \return current outlines width
+*/
+int SMESHGUI_PropertiesDlg::outlineWidth() const
+{
+ return myOutlineWidth->value();
+}
+
+/*!
+ \brief Set 0D elements color
+ \param color 0D elements color
+*/
+void SMESHGUI_PropertiesDlg::setElem0dColor( const QColor& color )
+{
+ myElem0dColor->setColor( color );
+}
+
+/*!
+ \brief Get 0D elements color
+ \return current 0D elements color
+*/
+QColor SMESHGUI_PropertiesDlg::elem0dColor() const
+{
+ return myElem0dColor->color();
+}
+
+/*!
+ \brief Set 0D elements size
+ \param size 0D elements size
+*/
+void SMESHGUI_PropertiesDlg::setElem0dSize( int size )
+{
+ myElem0dSize->setValue( size );
+}
+
+/*!
+ \brief Get 0D elements size
+ \return current 0D elements size
+*/
+int SMESHGUI_PropertiesDlg::elem0dSize() const
+{
+ return myElem0dSize->value();
+}
+
+/*!
+ \brief Set discrete elements (balls) color
+ \param color discrete elements (balls) color
+*/
+void SMESHGUI_PropertiesDlg::setBallColor( const QColor& color )
+{
+ myBallColor->setColor( color );
+}
+
+/*!
+ \brief Get discrete elements (balls) color
+ \return current discrete elements (balls) color
+*/
+QColor SMESHGUI_PropertiesDlg::ballColor() const
+{
+ return myBallColor->color();
+}
+
+/*!
+ \brief Set discrete elements (balls) size
+ \param size discrete elements (balls) size
+*/
+void SMESHGUI_PropertiesDlg::setBallSize( int size )
+{
+ myBallSize->setValue( size );
+}
+
+/*!
+ \brief Get discrete elements (balls) size
+ \return current discrete elements (balls) size
+*/
+int SMESHGUI_PropertiesDlg::ballSize() const
+{
+ return myBallSize->value();
+}
+
+/*!
+ \brief Set orientation vectors color
+ \param color orientation vectors color
+*/
+void SMESHGUI_PropertiesDlg::setOrientationColor( const QColor& color )
+{
+ myOrientationColor->setColor( color );
+}
+
+/*!
+ \brief Get orientation vectors color
+ \return current orientation vectors color
+*/
+QColor SMESHGUI_PropertiesDlg::orientationColor() const
+{
+ return myOrientationColor->color();
+}
+
+/*!
+ \brief Set orientation vectors scale (percent)
+ \param scale orientation vectors scale
+*/
+void SMESHGUI_PropertiesDlg::setOrientationSize( int scale )
+{
+ myOrientationSize->setValue( scale );
+}
+
+/*!
+ \brief Get orientation vectors scale (percent)
+ \return current orientation vectors scale
+*/
+int SMESHGUI_PropertiesDlg::orientationSize() const
+{
+ return myOrientationSize->value();
+}
+
+/*!
+ \brief Set orientation vectors 3d flag
+ \param on orientation vectors 3d flag value
+*/
+void SMESHGUI_PropertiesDlg::setOrientation3d( bool on )
+{
+ myOrientation3d->setChecked( on );
+}
+
+/*!
+ \brief Get orientation vectors 3d flag
+ \return orientation vectors 3d flag value
+*/
+bool SMESHGUI_PropertiesDlg::orientation3d() const
+{
+ return myOrientation3d->isChecked();
+}
+
+/*!
+ \brief Set shrink coefficient (percent)
+ \param coef shrink coefficient
+*/
+void SMESHGUI_PropertiesDlg::setShrinkCoef( int coef )
+{
+ myShrinkSize->setValue( coef );
+}
+
+/*!
+ \brief Get shrink coefficient (percent)
+ \return current shrink coefficient
+*/
+int SMESHGUI_PropertiesDlg::shrinkCoef() const
+{
+ return myShrinkSize->value();
+}
+
+/*
+ \brief Get custom markers
+ \return custom markers map
+*/
+VTK::MarkerMap SMESHGUI_PropertiesDlg::customMarkers() const
+{
+ return myNodeMarker->customMarkers();
+}
+
+/*!
+ \brief Show / hide controls for specified entity type
+ \param elements mesh element types (an or-ed combination of flags)
+ \param nodes mesh nodes presence flag
+*/
+void SMESHGUI_PropertiesDlg::showControls( int elements, bool nodes )
+{
+ // node controls are supposed to be shown if at least any element type is present
+ // or if there are only nodes
+ myNodeGrp->setVisible( nodes || elements & SMESH_Actor::eAllEntity );
+ // edge controls are shown only if there are edges
+ myEdgeGrp->setVisible( elements & SMESH_Actor::eEdges );
+ // face controls are shown only if there are faces
+ myFaceGrp->setVisible( elements & SMESH_Actor::eFaces );
+ // volume controls are shown only if there are volumes
+ myVolumeGrp->setVisible( elements & SMESH_Actor::eVolumes );
+ // 0d elements controls are shown only if there are 0d elements
+ myElem0dGrp->setVisible( elements & SMESH_Actor::e0DElements );
+ // ball controls are shown only if there are balls
+ myBallGrp->setVisible( elements & SMESH_Actor::eBallElem );
+ // outline controls are needed for faces and volumes
+ myOutlineGrp->setVisible( elements & ( SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) );
+ // orientation controls are needed for faces and volumes
+ myOrientationGrp->setVisible( elements & ( SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) );
+ // shrink factor is shown if there are edges and/or faces and/or volumes
+ myExtraGrp->setVisible( elements & ( SMESH_Actor::eEdges | SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) );
+}
+
+/*!
+ \brief Show online help on dialog box
+*/
+void SMESHGUI_PropertiesDlg::onHelp()
+{
+ LightApp_Application* app = (LightApp_Application*)(SUIT_Session::session()->activeApplication());
+ app->onHelpContextModule( "SMESH", "colors_size_page.html" );
+}
--- /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 : SMESHGUI_PropertiesDlg.h
+// Author : Vadim SANDLER, Open CASCADE S.A.S. (vadim.sandler@opencascade.com)
+
+#ifndef SMESHGUI_PROPERTIESDLG_H
+#define SMESHGUI_PROPERTIESDLG_H
+
+#include "SMESH_SMESHGUI.hxx"
+#include "SMESHGUI_Dialog.h"
+
+#include <VTKViewer_MarkerDef.h>
+#include <SALOMEconfig.h>
+#include CORBA_CLIENT_HEADER(SMESH_Mesh)
+
+class QCheckBox;
+class QFrame;
+class QGroupBox;
+class QtxColorButton;
+class QtxBiColorTool;
+class QtxIntSpinBox;
+class VTKViewer_MarkerWidget;
+
+class SMESHGUI_EXPORT SMESHGUI_PropertiesDlg : public SMESHGUI_Dialog
+{
+ Q_OBJECT
+
+public:
+ SMESHGUI_PropertiesDlg( const VTK::MarkerMap&, QWidget* parent );
+ ~SMESHGUI_PropertiesDlg();
+
+ void setNodeColor( const QColor& );
+ QColor nodeColor() const;
+ void setNodeMarker( VTK::MarkerType, VTK::MarkerScale );
+ void setNodeCustomMarker( int );
+ VTK::MarkerType nodeMarkerType() const;
+ VTK::MarkerScale nodeMarkerScale() const;
+ int nodeMarkerId() const;
+
+ void setEdgeColor( const QColor& );
+ QColor edgeColor() const;
+ void setEdgeWidth( int );
+ int edgeWidth() const;
+
+ void setFaceColor( const QColor&, int );
+ QColor faceColor() const;
+ int faceColorDelta() const;
+
+ void setVolumeColor( const QColor&, int );
+ QColor volumeColor() const;
+ int volumeColorDelta() const;
+
+ void setOutlineColor( const QColor& );
+ QColor outlineColor() const;
+ void setOutlineWidth( int );
+ int outlineWidth() const;
+
+ void setElem0dColor( const QColor& );
+ QColor elem0dColor() const;
+ void setElem0dSize( int );
+ int elem0dSize() const;
+
+ void setBallColor( const QColor& );
+ QColor ballColor() const;
+ void setBallSize( int );
+ int ballSize() const;
+
+ void setOrientationColor( const QColor& );
+ QColor orientationColor() const;
+ void setOrientationSize( int );
+ int orientationSize() const;
+ void setOrientation3d( bool );
+ bool orientation3d() const;
+
+ void setShrinkCoef( int );
+ int shrinkCoef() const;
+
+ VTK::MarkerMap customMarkers() const;
+
+ void showControls( int, bool );
+
+private slots:
+ void onHelp();
+
+private:
+ // group boxes
+ QGroupBox* myNodeGrp;
+ QGroupBox* myEdgeGrp;
+ QGroupBox* myFaceGrp;
+ QGroupBox* myVolumeGrp;
+ QGroupBox* myOutlineGrp;
+ QGroupBox* myElem0dGrp;
+ QGroupBox* myBallGrp;
+ QGroupBox* myOrientationGrp;
+ QFrame* myExtraGrp;
+ // widgets
+ // - nodes
+ QtxColorButton* myNodeColor;
+ VTKViewer_MarkerWidget* myNodeMarker;
+ // - edges
+ QtxColorButton* myEdgeColor;
+ QtxIntSpinBox* myEdgeWidth;
+ // - faces
+ QtxBiColorTool* myFaceColor;
+ // - volumes
+ QtxBiColorTool* myVolumeColor;
+ // - outlines
+ QtxColorButton* myOutlineColor;
+ QtxIntSpinBox* myOutlineWidth;
+ // - 0d elements
+ QtxColorButton* myElem0dColor;
+ QtxIntSpinBox* myElem0dSize;
+ // - balls
+ QtxColorButton* myBallColor;
+ QtxIntSpinBox* myBallSize;
+ // - orientation vectors
+ QtxColorButton* myOrientationColor;
+ QtxIntSpinBox* myOrientationSize;
+ QCheckBox* myOrientation3d;
+ // - shrink coefficient
+ QtxIntSpinBox* myShrinkSize;
+};
+
+#endif // SMESHGUI_PROPERTIESDLG_H
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj ));
if(!CORBA::is_nil(aGroup) && anActor)
{
- QColor c;int delta;
- SMESH::GetColor( "SMESH", "fill_color", c, delta, "0,170,255|-100" );
+ QColor c;
+ int deltaF, deltaV;
+ SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100" );
+ SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" );
+ SMESH::GetColor( "SMESH", "default_grp_color", c );
SALOMEDS::Color aColor = aGroup->GetColor();
if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ))
{
- aColor.R = (float)c.red() / 255.0;
- aColor.G = (float)c.green() / 255.0;
- aColor.B = (float)c.blue() / 255.0;
+ aColor.R = c.redF();
+ aColor.G = c.greenF();
+ aColor.B = c.blueF();
aGroup->SetColor( aColor );
}
if( aGroup->GetType() == SMESH::NODE )
anActor->Set0DColor( aColor.R, aColor.G, aColor.B );
else if( aGroup->GetType() == SMESH::BALL )
anActor->SetBallColor( aColor.R, aColor.G, aColor.B );
+ else if( aGroup->GetType() == SMESH::VOLUME )
+ anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, deltaV );
else
- anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta );
+ anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, deltaF );
}
}
}
if( !anIsOk )
return false;
-
+
DistanceToPosition( theBounds, theNormal, theDist, theOrigin );
return true;
}
}
else if ( qName == "python-wrap" ||
qName == "algo" ||
- qName == "hypo" )
+ qName == "hypo" ||
+ qName == "accumulative-methods")
{
// elements used in SMESH_2smeshpy
return true;
<source>CGNS_FILES_FILTER</source>
<translation>CGNS files</translation>
</message>
+ <message>
+ <source>GMF_ASCII_FILES_FILTER</source>
+ <translation>GMF ASCII files</translation>
+ </message>
+ <message>
+ <source>GMF_BINARY_FILES_FILTER</source>
+ <translation>GMF binary files</translation>
+ </message>
<message>
<source>STL_BIN_FILES_FILTER</source>
<translation>STL binary files</translation>
<source>COMPERR_CANCELED</source>
<translation>Computation canceled</translation>
</message>
+ <message>
+ <source>COMPERR_NO_MESH_ON_SHAPE</source>
+ <translation>No mesh elements assigned to a Sub-shape</translation>
+ </message>
+ <message>
+ <source>EDITERR_NO_MEDIUM_ON_GEOM</source>
+ <translation>Some medium nodes not placed on geometry to avoid
+ distorting elements shown in magenta</translation>
+ </message>
<message>
<source>SMESH_GEOM</source>
<translation>Geometry</translation>
<source>MEN_EXPORT_CGNS</source>
<translation>Export to CGNS File</translation>
</message>
+ <message>
+ <source>MEN_EXPORT_GMF</source>
+ <translation>Export to GMF File</translation>
+ </message>
<message>
<source>MEN_EXPORT_SAUV</source>
<translation>Export to SAUV file</translation>
<source>MEN_CGNS</source>
<translation>CGNS file</translation>
</message>
+ <message>
+ <source>MEN_IMPORT_GMF</source>
+ <translation>GMF file</translation>
+ </message>
+ <message>
+ <source>MEN_GMF</source>
+ <translation>GMF file</translation>
+ </message>
<message>
<source>MEN_IMPORT_SAUV</source>
<translation>SAUV file</translation>
<source>STB_EXPORT_CGNS</source>
<translation>Export to CGNS file</translation>
</message>
+ <message>
+ <source>STB_EXPORT_GMF</source>
+ <translation>Export to GMF file</translation>
+ </message>
<message>
<source>STB_EXPORT_SAUV</source>
<translation>Export to SAUV file</translation>
<source>STB_CGNS</source>
<translation>Export CGNS file</translation>
</message>
+ <message>
+ <source>STB_IMPORT_GMF</source>
+ <translation>Import GMF file</translation>
+ </message>
+ <message>
+ <source>STB_GMF</source>
+ <translation>Export GMF file</translation>
+ </message>
<message>
<source>STB_IMPORT_SAUV</source>
<translation>Import SAUV file</translation>
<source>TOP_CGNS</source>
<translation>Export CGNS file</translation>
</message>
+ <message>
+ <source>TOP_IMPORT_GMF</source>
+ <translation>Import GMF file</translation>
+ </message>
+ <message>
+ <source>TOP_GMF</source>
+ <translation>Export GMF file</translation>
+ </message>
<message>
<source>TOP_IMPORT_SAUV</source>
<translation>Import SAUV file</translation>
<source>PREF_BACKFACE</source>
<translation>Back surface color</translation>
</message>
+ <message>
+ <source>PREF_VOLUME</source>
+ <translation>Volume color</translation>
+ </message>
+ <message>
+ <source>PREF_REVERSEDVOLUME</source>
+ <translation>Reversed volume color</translation>
+ </message>
<message>
<source>PREF_WIREFRAME</source>
<translation>Wireframe color</translation>
<source>PREF_GRP_NAMES</source>
<translation>Names color</translation>
</message>
+ <message>
+ <source>PREF_GRP_DEF_COLOR</source>
+ <translation>Default color</translation>
+ </message>
<message>
<source>PREF_GROUP_PRECISION</source>
<translation>Precision</translation>
</message>
<message>
<source>PREF_WIDTH</source>
- <translation>Width</translation>
+ <translation>Line width</translation>
+ </message>
+ <message>
+ <source>PREF_OUTLINE_WIDTH</source>
+ <translation>Outline width</translation>
</message>
<message>
<source>PREF_PREVIEW_CHUNK_SIZE</source>
</message>
</context>
<context>
- <name>SMESHGUI_Preferences_ColorDlg</name>
- <message>
- <source>DIALOG_TITLE</source>
- <translation>Properties (color, line width, shrink size, ...)</translation>
- </message>
- <message>
- <source>GRP_ELEMENTS</source>
- <translation>Elements</translation>
- </message>
- <message>
- <source>SURFACE_COLOR_LBL</source>
- <translation>Surface color</translation>
- </message>
+ <name>SMESHGUI_ReorientFacesDlg</name>
<message>
- <source>BACKSURFACE_COLOR_LBL</source>
- <translation>Back surface color</translation>
+ <source>CAPTION</source>
+ <translation>Reorient faces by vector</translation>
</message>
<message>
- <source>OUTLINE_COLOR_LBL</source>
- <translation>Outline color</translation>
+ <source>REORIENT_FACES</source>
+ <translation>Reorient</translation>
</message>
<message>
- <source>WIREFRAME_COLOR_LBL</source>
- <translation>Wireframe color</translation>
+ <source>DIRECTION</source>
+ <translation>Direction</translation>
</message>
<message>
- <source>0D_ELEMENTS_COLOR_LBL</source>
- <translation>0D elements</translation>
+ <source>OBJECT</source>
+ <translation>Object</translation>
</message>
<message>
- <source>0D_ELEMENTS_SIZE_LBL</source>
- <translation>Size of 0D elements</translation>
+ <source>POINT</source>
+ <translation>Point</translation>
</message>
<message>
- <source>BALL_ELEMENTS_COLOR_LBL</source>
- <translation>Ball elements</translation>
+ <source>FACE</source>
+ <translation>Face</translation>
</message>
<message>
- <source>BALL_ELEMENTS_SIZE_LBL</source>
- <translation>Size of balls</translation>
+ <source>FACES</source>
+ <translation>Faces source</translation>
</message>
<message>
- <source>LINE_WIDTH_LBL</source>
- <translation>Line width</translation>
+ <source>ORIENTATION</source>
+ <translation>Orientation</translation>
</message>
+</context>
+<context>
+ <name>SMESHGUI_ReorientFacesOp</name>
<message>
- <source>SHRINK_COEF_LBL</source>
- <translation>Shrink coef.</translation>
+ <source>NO_OBJECT_SELECTED</source>
+ <translation>No object selected</translation>
</message>
<message>
- <source>GRP_NODES</source>
- <translation>Nodes</translation>
+ <source>NO_FACES</source>
+ <translation>Object includes no faces</translation>
</message>
<message>
- <source>NODES_COLOR_LBL</source>
- <translation>Color</translation>
+ <source>ZERO_SIZE_VECTOR</source>
+ <translation>Zero size vector</translation>
</message>
<message>
- <source>NODES_MARKER_LBL</source>
- <translation>Marker</translation>
+ <source>INVALID_FACE</source>
+ <translation>Not valid face</translation>
</message>
<message>
- <source>GRP_ORIENTATION</source>
- <translation>Orientation of faces</translation>
+ <source>NB_REORIENTED</source>
+ <translation>%1 faces reversed</translation>
</message>
+</context>
+<context>
+ <name>SMESHGUI_PropertiesDlg</name>
<message>
- <source>ORIENTATION_COLOR_LBL</source>
- <translation>Color</translation>
+ <source>TITLE</source>
+ <translation>Properties</translation>
</message>
<message>
- <source>ORIENTATION_SCALE_LBL</source>
- <translation>Scale</translation>
+ <source>NODES</source>
+ <translation>Nodes</translation>
</message>
<message>
- <source>3D_VECTORS_LBL</source>
- <translation>3D vectors</translation>
+ <source>EDGES</source>
+ <translation>Edges / wireframe</translation>
</message>
<message>
- <source>GRP_SELECTION</source>
- <translation>Selection</translation>
+ <source>FACES</source>
+ <translation>Faces</translation>
</message>
<message>
- <source>SELECTION_COLOR_LBL</source>
- <translation>Selection color</translation>
+ <source>VOLUMES</source>
+ <translation>Volumes</translation>
</message>
<message>
- <source>PRESELECTION_COLOR_LBL</source>
- <translation>Pre-selection color</translation>
+ <source>OUTLINES</source>
+ <translation>Outlines</translation>
</message>
-</context>
-<context>
- <name>SMESHGUI_ReorientFacesDlg</name>
<message>
- <source>CAPTION</source>
- <translation>Reorient faces by vector</translation>
+ <source>0D_ELEMENTS</source>
+ <translation>0D elements</translation>
</message>
<message>
- <source>REORIENT_FACES</source>
- <translation>Reorient</translation>
+ <source>BALLS</source>
+ <translation>Balls</translation>
</message>
<message>
- <source>DIRECTION</source>
- <translation>Direction</translation>
+ <source>ORIENTATIONS</source>
+ <translation>Orientation vectors</translation>
</message>
<message>
- <source>OBJECT</source>
- <translation>Object</translation>
+ <source>COLOR</source>
+ <translation>Color:</translation>
</message>
<message>
- <source>POINT</source>
- <translation>Point</translation>
+ <source>WIDTH</source>
+ <translation>Width:</translation>
</message>
<message>
- <source>FACE</source>
- <translation>Face</translation>
+ <source>FACE_FRONT</source>
+ <translation>Front:</translation>
</message>
<message>
- <source>FACES</source>
- <translation>Faces source</translation>
+ <source>FACE_BACK</source>
+ <translation>Back:</translation>
</message>
<message>
- <source>ORIENTATION</source>
- <translation>Orientation</translation>
+ <source>VOLUME_NORMAL</source>
+ <translation>Normal:</translation>
</message>
-</context>
-<context>
- <name>SMESHGUI_ReorientFacesOp</name>
<message>
- <source>NO_OBJECT_SELECTED</source>
- <translation>No object selected</translation>
+ <source>VOLUME_REVERSED</source>
+ <translation>Reversed:</translation>
</message>
<message>
- <source>NO_FACES</source>
- <translation>Object includes no faces</translation>
+ <source>SIZE</source>
+ <translation>Size:</translation>
</message>
<message>
- <source>ZERO_SIZE_VECTOR</source>
- <translation>Zero size vector</translation>
+ <source>ORIENTATION_SCALE</source>
+ <translation>Scale:</translation>
</message>
<message>
- <source>INVALID_FACE</source>
- <translation>Not valid face</translation>
+ <source>ORIENTATION_3D</source>
+ <translation>3D vectors</translation>
</message>
<message>
- <source>NB_REORIENTED</source>
- <translation>%1 faces reversed</translation>
+ <source>SHRINK</source>
+ <translation>Shrink coef:</translation>
</message>
</context>
</TS>
<source>PREF_BACKFACE</source>
<translation>Face arrière</translation>
</message>
+ <message>
+ <source>PREF_VOLUME</source>
+ <translation type="unfinished">Volume color</translation>
+ </message>
+ <message>
+ <source>PREF_REVERSEDVOLUME</source>
+ <translation type="unfinished">Reversed volume color</translation>
+ </message>
<message>
<source>PREF_WIREFRAME</source>
<translation>Couleur de contour</translation>
<source>PREF_GRP_NAMES</source>
<translation>Couleur des noms</translation>
</message>
+ <message>
+ <source>PREF_GRP_DEF_COLOR</source>
+ <translation>Couleur par défaut</translation>
+ </message>
<message>
<source>PREF_GROUP_PRECISION</source>
<translation>Précision</translation>
</message>
<message>
<source>PREF_WIDTH</source>
- <translation>Epaisseur</translation>
+ <translation type="unfinished">Line width</translation>
+ </message>
+ <message>
+ <source>PREF_OUTLINE_WIDTH</source>
+ <translation type="unfinished">Outline width</translation>
</message>
<message>
<source>PREF_PREVIEW_CHUNK_SIZE</source>
</message>
</context>
<context>
- <name>SMESHGUI_Preferences_ColorDlg</name>
- <message>
- <source>DIALOG_TITLE</source>
- <translation>Propriétés (couleur, épaisseur des traits, taille des éléments réduits, ...)</translation>
- </message>
- <message>
- <source>GRP_ELEMENTS</source>
- <translation>Eléments</translation>
- </message>
- <message>
- <source>SURFACE_COLOR_LBL</source>
- <translation>Couleur de surface</translation>
- </message>
+ <name>SMESHGUI_ReorientFacesDlg</name>
<message>
- <source>BACKSURFACE_COLOR_LBL</source>
- <translation>Couleur arrière</translation>
+ <source>CAPTION</source>
+ <translation>Réorienter des faces selon un vector</translation>
</message>
<message>
- <source>OUTLINE_COLOR_LBL</source>
- <translation>Couleur de contour</translation>
+ <source>REORIENT_FACES</source>
+ <translation>Réorienter</translation>
</message>
<message>
- <source>WIREFRAME_COLOR_LBL</source>
- <translation>Couleur en mode fil de fer</translation>
+ <source>DIRECTION</source>
+ <translation>Direction</translation>
</message>
<message>
- <source>0D_ELEMENTS_COLOR_LBL</source>
- <translation>Eléments 0D</translation>
+ <source>OBJECT</source>
+ <translation>Objet</translation>
</message>
<message>
- <source>0D_ELEMENTS_SIZE_LBL</source>
- <translation>Taille des éléments 0D</translation>
+ <source>POINT</source>
+ <translation>Point</translation>
</message>
<message>
- <source>BALL_ELEMENTS_COLOR_LBL</source>
- <translation>Eléments particulaires</translation>
+ <source>FACE</source>
+ <translation>Face</translation>
</message>
<message>
- <source>BALL_ELEMENTS_SIZE_LBL</source>
- <translation>Taille des éléments particulaires</translation>
+ <source>FACES</source>
+ <translation>Source des faces</translation>
</message>
<message>
- <source>LINE_WIDTH_LBL</source>
- <translation>Epaisseur des traits</translation>
+ <source>ORIENTATION</source>
+ <translation>Orientation</translation>
</message>
+</context>
+<context>
+ <name>SMESHGUI_ReorientFacesOp</name>
<message>
- <source>SHRINK_COEF_LBL</source>
- <translation>Coef. de contraction</translation>
+ <source>NO_OBJECT_SELECTED</source>
+ <translation>Aucun objet sélectionné</translation>
</message>
<message>
- <source>GRP_NODES</source>
- <translation>Nœuds</translation>
+ <source>NO_FACES</source>
+ <translation>L'objet ne contient pas de faces</translation>
</message>
<message>
- <source>NODES_COLOR_LBL</source>
- <translation>Couleur</translation>
+ <source>ZERO_SIZE_VECTOR</source>
+ <translation>Vecteur de taille nulle</translation>
</message>
<message>
- <source>NODES_MARKER_LBL</source>
- <translation>Marqueur</translation>
+ <source>INVALID_FACE</source>
+ <translation>Face non valide</translation>
</message>
<message>
- <source>GRP_ORIENTATION</source>
- <translation>Orientation des faces</translation>
+ <source>NB_REORIENTED</source>
+ <translation>%1 face(s) inversée(s)</translation>
</message>
+</context>
+<context>
+ <name>SMESHGUI_PropertiesDlg</name>
<message>
- <source>ORIENTATION_COLOR_LBL</source>
- <translation>Couleur</translation>
+ <source>TITLE</source>
+ <translation type="unfinished">Properties</translation>
</message>
<message>
- <source>ORIENTATION_SCALE_LBL</source>
- <translation>Facteur d'échelle</translation>
+ <source>NODES</source>
+ <translation type="unfinished">Nodes</translation>
</message>
<message>
- <source>3D_VECTORS_LBL</source>
- <translation>Vecteurs 3D</translation>
+ <source>EDGES</source>
+ <translation type="unfinished">Edges / wireframe</translation>
</message>
<message>
- <source>GRP_SELECTION</source>
- <translation>Sélection</translation>
+ <source>FACES</source>
+ <translation type="unfinished">Faces</translation>
</message>
<message>
- <source>SELECTION_COLOR_LBL</source>
- <translation>Couleur de sélection</translation>
+ <source>VOLUMES</source>
+ <translation type="unfinished">Volumes</translation>
</message>
<message>
- <source>PRESELECTION_COLOR_LBL</source>
- <translation>Couleur de pré-sélection</translation>
+ <source>OUTLINES</source>
+ <translation type="unfinished">Outlines</translation>
</message>
-</context>
-<context>
- <name>SMESHGUI_ReorientFacesDlg</name>
<message>
- <source>CAPTION</source>
- <translation>Réorienter des faces selon un vector</translation>
+ <source>0D_ELEMENTS</source>
+ <translation type="unfinished">0D elements</translation>
</message>
<message>
- <source>REORIENT_FACES</source>
- <translation>Réorienter</translation>
+ <source>BALLS</source>
+ <translation type="unfinished">Balls</translation>
</message>
<message>
- <source>DIRECTION</source>
- <translation>Direction</translation>
+ <source>ORIENTATIONS</source>
+ <translation type="unfinished">Orientation vectors</translation>
</message>
<message>
- <source>OBJECT</source>
- <translation>Objet</translation>
+ <source>COLOR</source>
+ <translation type="unfinished">Color:</translation>
</message>
<message>
- <source>POINT</source>
- <translation>Point</translation>
+ <source>WIDTH</source>
+ <translation type="unfinished">Width:</translation>
</message>
<message>
- <source>FACE</source>
- <translation>Face</translation>
+ <source>FACE_FRONT</source>
+ <translation type="unfinished">Front:</translation>
</message>
<message>
- <source>FACES</source>
- <translation>Source des faces</translation>
+ <source>FACE_BACK</source>
+ <translation type="unfinished">Back:</translation>
</message>
<message>
- <source>ORIENTATION</source>
- <translation>Orientation</translation>
+ <source>VOLUME_NORMAL</source>
+ <translation type="unfinished">Normal:</translation>
</message>
-</context>
-<context>
- <name>SMESHGUI_ReorientFacesOp</name>
<message>
- <source>NO_OBJECT_SELECTED</source>
- <translation>Aucun objet sélectionné</translation>
+ <source>VOLUME_REVERSED</source>
+ <translation type="unfinished">Reversed:</translation>
</message>
<message>
- <source>NO_FACES</source>
- <translation>L'objet ne contient pas de faces</translation>
+ <source>SIZE</source>
+ <translation type="unfinished">Size:</translation>
</message>
<message>
- <source>ZERO_SIZE_VECTOR</source>
- <translation>Vecteur de taille nulle</translation>
+ <source>ORIENTATION_SCALE</source>
+ <translation type="unfinished">Scale:</translation>
</message>
<message>
- <source>INVALID_FACE</source>
- <translation>Face non valide</translation>
+ <source>ORIENTATION_3D</source>
+ <translation type="unfinished">3D vectors</translation>
</message>
<message>
- <source>NB_REORIENTED</source>
- <translation>%1 face(s) inversée(s)</translation>
+ <source>SHRINK</source>
+ <translation type="unfinished">Shrink coef:</translation>
</message>
</context>
</TS>
{
// If you modify it, pls update SMESH_ComputeError::CommonName() below.
// Positive values are for algo specific errors
- COMPERR_OK = -1,
- COMPERR_BAD_INPUT_MESH = -2, //!< wrong mesh on lower submesh
- COMPERR_STD_EXCEPTION = -3, //!< some std exception raised
- COMPERR_OCC_EXCEPTION = -4, //!< OCC exception raised
- COMPERR_SLM_EXCEPTION = -5, //!< SALOME exception raised
- COMPERR_EXCEPTION = -6, //!< other exception raised
- COMPERR_MEMORY_PB = -7, //!< std::bad_alloc exception
- COMPERR_ALGO_FAILED = -8, //!< algo failed for some reason
- COMPERR_BAD_SHAPE = -9, //!< bad geometry
- COMPERR_WARNING = -10, //!< algo reports error but sub-mesh is computed anyway
- COMPERR_CANCELED = -11 //!< compute canceled
+ COMPERR_OK = -1,
+ COMPERR_BAD_INPUT_MESH = -2, //!< wrong mesh on lower submesh
+ COMPERR_STD_EXCEPTION = -3, //!< some std exception raised
+ COMPERR_OCC_EXCEPTION = -4, //!< OCC exception raised
+ COMPERR_SLM_EXCEPTION = -5, //!< SALOME exception raised
+ COMPERR_EXCEPTION = -6, //!< other exception raised
+ COMPERR_MEMORY_PB = -7, //!< std::bad_alloc exception
+ COMPERR_ALGO_FAILED = -8, //!< algo failed for some reason
+ COMPERR_BAD_SHAPE = -9, //!< bad geometry
+ COMPERR_WARNING = -10, //!< algo reports error but sub-mesh is computed anyway
+ COMPERR_CANCELED = -11, //!< compute canceled
+ COMPERR_NO_MESH_ON_SHAPE = -12, //!< no mesh elements assigned to sub-shape
+ COMPERR_LAST_ALGO_ERROR = -100,//!< terminator of mesh computation errors
+ // Errors of SMESH_MeshEditor follow
+ EDITERR_NO_MEDIUM_ON_GEOM= -101 /* during conversion to quadratic,
+ some medium nodes not placed on geometry
+ to avoid distorting elements, which are
+ stored in SMESH_ComputeError::myBadElements */
};
// =============================================================
const SMESH_Algo* algo = 0)
:myName(error),myComment(comment),myAlgo(algo) {}
- bool IsOK() { return myName == COMPERR_OK; }
- bool IsKO() { return myName != COMPERR_OK && myName != COMPERR_WARNING; }
- bool IsCommon() { return myName < 0; }
+ bool IsOK() const { return myName == COMPERR_OK; }
+ bool IsKO() const { return myName != COMPERR_OK && myName != COMPERR_WARNING; }
+ bool IsCommon() const { return myName < 0 && myName > COMPERR_LAST_ALGO_ERROR; }
+ bool HasBadElems() const { return !myBadElements.empty(); }
inline std::string CommonName() const;
};
#define _case2char(err) case err: return #err;
+// Return myName as text, to be used to dump errors in terminal
std::string SMESH_ComputeError::CommonName() const
{
switch( myName ) {
- _case2char(COMPERR_OK );
- _case2char(COMPERR_BAD_INPUT_MESH);
- _case2char(COMPERR_STD_EXCEPTION );
- _case2char(COMPERR_OCC_EXCEPTION );
- _case2char(COMPERR_SLM_EXCEPTION );
- _case2char(COMPERR_EXCEPTION );
- _case2char(COMPERR_MEMORY_PB );
- _case2char(COMPERR_ALGO_FAILED );
- _case2char(COMPERR_BAD_SHAPE );
- _case2char(COMPERR_WARNING );
- _case2char(COMPERR_CANCELED );
+ _case2char(COMPERR_OK );
+ _case2char(COMPERR_BAD_INPUT_MESH );
+ _case2char(COMPERR_STD_EXCEPTION );
+ _case2char(COMPERR_OCC_EXCEPTION );
+ _case2char(COMPERR_SLM_EXCEPTION );
+ _case2char(COMPERR_EXCEPTION );
+ _case2char(COMPERR_MEMORY_PB );
+ _case2char(COMPERR_ALGO_FAILED );
+ _case2char(COMPERR_BAD_SHAPE );
+ _case2char(COMPERR_WARNING );
+ _case2char(COMPERR_CANCELED );
+ _case2char(COMPERR_NO_MESH_ON_SHAPE);
default:;
}
return "";
SMESH_NoteBook.hxx \
SMESH_Measurements_i.hxx \
SMESH_PreMeshInfo.hxx \
+ SMESH_MeshPartDS.hxx \
SMESH.hxx
# Scripts to be installed.
// ----------------------------------------------------------------------
else if ( method == "RemoveHypothesis" ) // (geom, hyp)
{
- _pyID hypID = theCommand->GetArg( 2 );
+ _pyID hypID = theCommand->GetArg( 2 );
+ _pyID geomID = theCommand->GetArg( 1 );
// check if this mesh still has corresponding addition command
bool hasAddCmd = false;
while ( cmd != myAddHypCmds.end() )
{
// AddHypothesis(geom, hyp)
- if ( hypID == (*cmd)->GetArg( 2 )) { // erase both (add and remove) commands
+ if ( hypID == (*cmd)->GetArg( 2 ) &&
+ geomID == (*cmd)->GetArg( 1 )) { // erase both (add and remove) commands
theCommand->Clear();
(*cmd)->Clear();
cmd = myAddHypCmds.erase( cmd );
myGeom = theOther->myGeom;
myMesh = theMesh;
myAlgoType2CreationMethod = theOther->myAlgoType2CreationMethod;
- //myArgCommands = theOther->myArgCommands;
+ myAccumulativeMethods = theOther->myAccumulativeMethods;
//myUnusedCommands = theOther->myUnusedCommands;
// init myCurCrMethod
GetCreationMethod( theOther->GetAlgoType() );
void _pyHypothesis::rememberCmdOfParameter( const Handle(_pyCommand) & theCommand )
{
// parameters are discriminated by method name
- TCollection_AsciiString method = theCommand->GetMethod();
+ _AString method = theCommand->GetMethod();
+ if ( myAccumulativeMethods.count( method ))
+ return; // this method adds values and not override the previus value
// discriminate commands setting different parameters via one method
// by passing parameter names like e.g. SetOption("size", "0.2")
}
}
// parameters are discriminated by method name
- list< Handle(_pyCommand)>& cmds = myMeth2Commands[ theCommand->GetMethod() ];
+ list< Handle(_pyCommand)>& cmds = myMeth2Commands[ method /*theCommand->GetMethod()*/ ];
if ( !cmds.empty() && !isCmdUsedForCompute( cmds.back() ))
{
cmds.back()->Clear(); // previous parameter value has not been used
*/
//================================================================================
-TCollection_AsciiString _pyCommand::GetWord( const TCollection_AsciiString & theString,
- int & theStartPos,
- const bool theForward,
- const bool dotIsWord )
+TCollection_AsciiString _pyCommand::GetWord( const _AString & theString,
+ int & theStartPos,
+ const bool theForward,
+ const bool dotIsWord )
{
int beg = theStartPos, end = theStartPos;
theStartPos = EMPTY;
_pyHypothesisReader::_pyHypothesisReader()
{
- // Get paths to xml files of plugins
- vector< string > xmlPaths;
- string sep;
- if ( const char* meshersList = getenv("SMESH_MeshersList") )
- {
- string meshers = meshersList, plugin;
- string::size_type from = 0, pos;
- while ( from < meshers.size() )
- {
- // cut off plugin name
- pos = meshers.find( ':', from );
- if ( pos != string::npos )
- plugin = meshers.substr( from, pos-from );
- else
- plugin = meshers.substr( from ), pos = meshers.size();
- from = pos + 1;
-
- // get PLUGIN_ROOT_DIR path
- string rootDirVar, pluginSubDir = plugin;
- if ( plugin == "StdMeshers" )
- rootDirVar = "SMESH", pluginSubDir = "smesh";
- else
- for ( pos = 0; pos < plugin.size(); ++pos )
- rootDirVar += toupper( plugin[pos] );
- rootDirVar += "_ROOT_DIR";
-
- const char* rootDir = getenv( rootDirVar.c_str() );
- if ( !rootDir || strlen(rootDir) == 0 )
- {
- rootDirVar = plugin + "_ROOT_DIR"; // HexoticPLUGIN_ROOT_DIR
- rootDir = getenv( rootDirVar.c_str() );
- if ( !rootDir || strlen(rootDir) == 0 ) continue;
- }
-
- // get a separator from rootDir
- for ( pos = strlen( rootDir )-1; pos >= 0 && sep.empty(); --pos )
- if ( rootDir[pos] == '/' || rootDir[pos] == '\\' )
- {
- sep = rootDir[pos];
- break;
- }
-#ifdef WNT
- if (sep.empty() ) sep = "\\";
-#else
- if (sep.empty() ) sep = "/";
-#endif
-
- // get a path to resource file
- string xmlPath = rootDir;
- if ( xmlPath[ xmlPath.size()-1 ] != sep[0] )
- xmlPath += sep;
- xmlPath += "share" + sep + "salome" + sep + "resources" + sep;
- for ( pos = 0; pos < pluginSubDir.size(); ++pos )
- xmlPath += tolower( pluginSubDir[pos] );
- xmlPath += sep + plugin + ".xml";
- bool fileOK;
-#ifdef WNT
- fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES);
-#else
- fileOK = (access(xmlPath.c_str(), F_OK) == 0);
-#endif
- if ( fileOK )
- xmlPaths.push_back( xmlPath );
- }
- }
-
// Read xml files
+ vector< string > xmlPaths = SMESH_Gen::GetPluginXMLPaths();
LDOMParser xmlParser;
for ( size_t i = 0; i < xmlPaths.size(); ++i )
{
LDOM_NodeList algoNodeList = xmlDoc.getElementsByTagName( "algorithm" );
for ( int i = 0; i < algoNodeList.getLength(); ++i )
{
- LDOM_Node algoNode = algoNodeList.item( i );
+ LDOM_Node algoNode = algoNodeList.item( i );
LDOM_Element& algoElem = (LDOM_Element&) algoNode;
LDOM_NodeList pyAlgoNodeList = algoElem.getElementsByTagName( "algo" );
if ( pyAlgoNodeList.getLength() < 1 ) continue;
}
}
}
- }
+ // <hypothesis type="BLSURF_Parameters"
+ // ...
+ // dim="2">
+ // <python-wrap>
+ // <accumulative-methods>
+ // SetEnforcedVertex,
+ // SetEnforcedVertexNamed
+ // </accumulative-methods>
+ // </python-wrap>
+ // </hypothesis>
+ //
+ LDOM_NodeList hypNodeList = xmlDoc.getElementsByTagName( "hypothesis" );
+ for ( int i = 0; i < hypNodeList.getLength(); ++i )
+ {
+ LDOM_Node hypNode = hypNodeList.item( i );
+ LDOM_Element& hypElem = (LDOM_Element&) hypNode;
+ _AString hypType = hypElem.getAttribute("type");
+ LDOM_NodeList methNodeList = hypElem.getElementsByTagName( "accumulative-methods" );
+ if ( methNodeList.getLength() != 1 || hypType.IsEmpty() ) continue;
+
+ map<_AString, Handle(_pyHypothesis)>::const_iterator type2hyp = myType2Hyp.find( hypType );
+ if ( type2hyp == myType2Hyp.end() ) continue;
+
+ LDOM_Node methNode = methNodeList.item( 0 );
+ LDOM_Node textNode = methNode.getFirstChild();
+ _AString text = textNode.getNodeValue();
+ _AString method;
+ int pos = 1;
+ do {
+ method = _pyCommand::GetWord( text, pos, /*forward= */true );
+ pos += method.Length();
+ type2hyp->second->AddAccumulativeMethod( method );
+ }
+ while ( !method.IsEmpty() );
+ }
+
+ } // loop on xmlPaths
}
//================================================================================
#include <list>
#include <map>
#include <vector>
+#include <set>
#include <SALOMEconfig.h>
#include CORBA_CLIENT_HEADER(SALOMEDS)
_pyID myGeom, myMesh;
struct CreationMethod {
_AString myMethod; // method of algo or mesh creating a hyp
- // myArgNb(i)-th arg of myArgMethods(i) of hyp becomes an i-th arg of myAlgoMethod
+ // myArgNb(i)-th arg of myArgMethods(i) of hyp becomes an i-th arg of myMethod
std::vector<_AString> myArgMethods;
std::vector<int> myArgNb; // arg nb countered from 1
std::vector<_AString> myArgs; // creation arguments
// a hypothesis can be created by different algos by different methods
typedef std::map<_AString, CreationMethod > TType2CrMethod;
TType2CrMethod myAlgoType2CreationMethod;
+ std::set< _AString > myAccumulativeMethods;
CreationMethod* myCurCrMethod; // used for adding to myAlgoType2CreationMethod
std::list<Handle(_pyCommand)> myArgCommands;
std::list<Handle(_pyCommand)> myUnusedCommands;
void AddArgMethod(const _AString& method, const int argNb = 1)
{ myCurCrMethod->myArgMethods.push_back( method );
myCurCrMethod->myArgNb.push_back( argNb ); }
+ void AddAccumulativeMethod( const _AString& method)
+ { myAccumulativeMethods.insert( method ); }
//const TColStd_SequenceOfAsciiString& GetArgs() const { return myArgs; }
const std::list<Handle(_pyCommand)>& GetArgCommands() const { return myArgCommands; }
void ClearAllCommands();
TPythonDump::
operator<<(const TVar& theVarValue)
{
- if ( theVarValue.myVals.empty() ) return *this;
-
const std::vector< std::string >& varNames = SMESH_Gen_i::GetSMESHGen()->GetLastParameters();
- if ( theVarValue.myVals.size() > 1 )
+ if ( theVarValue.myVals.size() != 1 )
{
myStream << "[ ";
for ( size_t i = 1; i <= theVarValue.myVals.size(); ++i )
#include <map>
#include <fstream>
#include <cstdio>
+#include <stdlib.h>
using namespace std;
using SMESH::TPythonDump;
aStudyBuilder->CommitCommand();
if ( !aSO->_is_nil() ) {
// Update Python script
- TPythonDump() << aSO << " = smeshgen.CreateMeshesFromUNV(r'" << theFileName << "')";
+ TPythonDump() << aSO << " = " << this << ".CreateMeshesFromUNV(r'" << theFileName << "')";
}
}
return aResult._retn();
}
+//================================================================================
+/*!
+ * \brief Create a mesh and import data from a GMF file
+ */
+//================================================================================
+
+SMESH::SMESH_Mesh_ptr
+SMESH_Gen_i::CreateMeshesFromGMF( const char* theFileName,
+ SMESH::ComputeError_out theError)
+ throw ( SALOME::SALOME_Exception )
+{
+ Unexpect aCatch(SALOME_SalomeException);
+
+ SMESH::SMESH_Mesh_var aMesh = createMesh();
+#ifdef WIN32
+ char bname[ _MAX_FNAME ];
+ _splitpath( theFileName, NULL, NULL, bname, NULL );
+ string aFileName = bname;
+#else
+ string aFileName = basename( theFileName );
+#endif
+ // publish mesh in the study
+ if ( CanPublishInStudy( aMesh ) ) {
+ SALOMEDS::StudyBuilder_var aStudyBuilder = myCurrentStudy->NewBuilder();
+ aStudyBuilder->NewCommand(); // There is a transaction
+ SALOMEDS::SObject_var aSO = PublishInStudy
+ ( myCurrentStudy, SALOMEDS::SObject::_nil(), aMesh.in(), aFileName.c_str() );
+ aStudyBuilder->CommitCommand();
+ if ( !aSO->_is_nil() ) {
+ // Update Python script
+ TPythonDump() << "("<< aSO << ", error) = " << this << ".CreateMeshesFromGMF(r'" << theFileName << "')";
+ }
+ }
+ SMESH_Mesh_i* aServant = dynamic_cast<SMESH_Mesh_i*>( GetServant( aMesh ).in() );
+ ASSERT( aServant );
+ theError = aServant->ImportGMFFile( theFileName );
+ aServant->GetImpl().GetMeshDS()->Modified();
+ return aMesh._retn();
+}
+
+
//=============================================================================
/*!
* SMESH_Gen_i::IsReadyToCompute
}
}
- // issue 0020693. Restore _isModified flag
- if( aTopGroup->ExistInternalObject( "_isModified" ) )
- {
- aDataset = new HDFdataset( "_isModified", aTopGroup );
- aDataset->OpenOnDisk();
- size = aDataset->GetSize();
- int* isModified = new int[ size ];
- aDataset->ReadFromDisk( isModified );
- aDataset->CloseOnDisk();
- myNewMeshImpl->GetImpl().SetIsModified( bool(*isModified));
- }
-
// issue 20918. Restore Persistent Id of SMESHDS_Mesh
if( aTopGroup->ExistInternalObject( "meshPersistentId" ) )
{
SMESH::SMESH_Mesh_ptr CreateEmptyMesh()
throw ( SALOME::SALOME_Exception );
- // Create mesh(es) and import data from UNV fileter
+ // Create a mesh and import data from an UNV file
SMESH::SMESH_Mesh_ptr CreateMeshesFromUNV( const char* theFileName )
throw ( SALOME::SALOME_Exception );
SMESH::DriverMED_ReadStatus& theStatus )
throw ( SALOME::SALOME_Exception );
- // Create mesh(es) and import data from STL file
+ // Create a mesh and import data from a STL file
SMESH::SMESH_Mesh_ptr CreateMeshesFromSTL( const char* theFileName )
throw ( SALOME::SALOME_Exception );
SMESH::DriverMED_ReadStatus& theStatus )
throw ( SALOME::SALOME_Exception );
+ // Create a mesh and import data from a GMF file
+ SMESH::SMESH_Mesh_ptr CreateMeshesFromGMF( const char* theFileName,
+ SMESH::ComputeError_out theError)
+ throw ( SALOME::SALOME_Exception );
+
// Copy a part of mesh
SMESH::SMESH_Mesh_ptr CopyMesh(SMESH::SMESH_IDSource_ptr meshPart,
const char* meshName,
*
*/
//=============================================================================
-void SMESH_Hypothesis_i::SetParameters(const char* theParameters)
-{
- SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
- //char * aParameters = CORBA::string_dup(theParameters);
- if(gen){
- gen->UpdateParameters(theParameters);
- // if(IsPublished()) {
- // SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Hypothesis::_narrow(_this()),aParameters);
- // }
- // else {
- // myBaseImpl->SetParameters(gen->ParseParameters(aParameters));
- // }
- }
-}
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::GetParameters()
- *
- */
-//=============================================================================
-char* SMESH_Hypothesis_i::GetParameters()
-{
- SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
- char* aResult;
- if(IsPublished()) {
- MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get Parameters from SObject");
- aResult = gen->GetParameters(SMESH::SMESH_Hypothesis::_narrow(_this()));
- }
- else {
- MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get local parameters");
- aResult = myBaseImpl->GetParameters();
- }
- return CORBA::string_dup(aResult);
-}
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::GetLastParameters()
- *
- */
-//=============================================================================
-SMESH::ListOfParameters* SMESH_Hypothesis_i::GetLastParameters()
-{
- SMESH::ListOfParameters_var aResult = new SMESH::ListOfParameters();
- SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
- if(gen) {
- char *aParameters;
- if(IsPublished())
- aParameters = GetParameters();
- else
- aParameters = myBaseImpl->GetLastParameters();
-
- SALOMEDS::Study_ptr aStudy = gen->GetCurrentStudy();
- if(!aStudy->_is_nil()) {
- SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters);
- if(aSections->length() > 0) {
- SALOMEDS::ListOfStrings aVars = aSections[aSections->length()-1];
- aResult->length(aVars.length());
- for(int i = 0;i < aVars.length();i++)
- aResult[i] = CORBA::string_dup( aVars[i]);
- }
- }
- }
- return aResult._retn();
-}
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::SetLastParameters()
- *
- */
-//=============================================================================
-void SMESH_Hypothesis_i::SetLastParameters(const char* theParameters)
-{
- if(!IsPublished()) {
- myBaseImpl->SetLastParameters(theParameters);
- }
-}
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::ClearParameters()
- *
- */
-//=============================================================================
-void SMESH_Hypothesis_i::ClearParameters()
-{
- myMethod2VarParams.clear();
- // if(!IsPublished()) {
- // myBaseImpl->ClearParameters();
- // }
-}
+// void SMESH_Hypothesis_i::SetParameters(const char* theParameters)
+// {
+// SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+// //char * aParameters = CORBA::string_dup(theParameters);
+// if(gen){
+// gen->UpdateParameters(theParameters);
+// // if(IsPublished()) {
+// // SMESH_Gen_i::GetSMESHGen()->UpdateParameters(SMESH::SMESH_Hypothesis::_narrow(_this()),aParameters);
+// // }
+// // else {
+// // myBaseImpl->SetParameters(gen->ParseParameters(aParameters));
+// // }
+// }
+// }
+
+// //=============================================================================
+// /*!
+// * SMESH_Hypothesis_i::GetParameters()
+// *
+// */
+// //=============================================================================
+// char* SMESH_Hypothesis_i::GetParameters()
+// {
+// SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+// char* aResult;
+// if(IsPublished()) {
+// MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get Parameters from SObject");
+// aResult = gen->GetParameters(SMESH::SMESH_Hypothesis::_narrow(_this()));
+// }
+// else {
+// MESSAGE("SMESH_Hypothesis_i::GetParameters() : Get local parameters");
+// aResult = myBaseImpl->GetParameters();
+// }
+// return CORBA::string_dup(aResult);
+// }
+
+// //=============================================================================
+// /*!
+// * SMESH_Hypothesis_i::GetLastParameters()
+// *
+// */
+// //=============================================================================
+// SMESH::ListOfParameters* SMESH_Hypothesis_i::GetLastParameters()
+// {
+// SMESH::ListOfParameters_var aResult = new SMESH::ListOfParameters();
+// SMESH_Gen_i *gen = SMESH_Gen_i::GetSMESHGen();
+// if(gen) {
+// char *aParameters;
+// if(IsPublished())
+// aParameters = GetParameters();
+// else
+// aParameters = myBaseImpl->GetLastParameters();
+
+// SALOMEDS::Study_ptr aStudy = gen->GetCurrentStudy();
+// if(!aStudy->_is_nil()) {
+// SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters);
+// if(aSections->length() > 0) {
+// SALOMEDS::ListOfStrings aVars = aSections[aSections->length()-1];
+// aResult->length(aVars.length());
+// for(int i = 0;i < aVars.length();i++)
+// aResult[i] = CORBA::string_dup( aVars[i]);
+// }
+// }
+// }
+// return aResult._retn();
+// }
+
+// //=============================================================================
+// /*!
+// * SMESH_Hypothesis_i::SetLastParameters()
+// *
+// */
+// //=============================================================================
+// void SMESH_Hypothesis_i::SetLastParameters(const char* theParameters)
+// {
+// if(!IsPublished()) {
+// myBaseImpl->SetLastParameters(theParameters);
+// }
+// }
+// //=============================================================================
+// /*!
+// * SMESH_Hypothesis_i::ClearParameters()
+// *
+// */
+// //=============================================================================
+// void SMESH_Hypothesis_i::ClearParameters()
+// {
+// myMethod2VarParams.clear();
+// // if(!IsPublished()) {
+// // myBaseImpl->ClearParameters();
+// // }
+// }
//=============================================================================
/*!
char* GetVarParameter (const char* methodName);
// Set list of parameters separated by ":" symbol, used for Hypothesis creation
- void SetParameters (const char* theParameters);
+ // void SetParameters (const char* theParameters);
- // Return list of notebook variables used for Hypothesis creation separated by ":" symbol
- char* GetParameters();
+ // // Return list of notebook variables used for Hypothesis creation separated by ":" symbol
+ // char* GetParameters();
- //Return list of last notebook variables used for Hypothesis creation.
- SMESH::ListOfParameters* GetLastParameters();
+ // //Return list of last notebook variables used for Hypothesis creation.
+ // SMESH::ListOfParameters* GetLastParameters();
- //Set last parameters for not published hypothesis
+ // //Set last parameters for not published hypothesis
- void SetLastParameters(const char* theParameters);
+ // void SetLastParameters(const char* theParameters);
- // Clear parameters list
- void ClearParameters();
+ // // Clear parameters list
+ // void ClearParameters();
//Return true if hypothesis was published in study
bool IsPublished();
#include "SMESH_MeshEditor_i.hxx"
+#include "DriverMED_R_SMESHDS_Mesh.h"
+#include "DriverMED_W_SMESHDS_Mesh.h"
+#include "SMDS_EdgePosition.hxx"
+#include "SMDS_ElemIterator.hxx"
+#include "SMDS_FacePosition.hxx"
+#include "SMDS_IteratorOnIterators.hxx"
#include "SMDS_LinearEdge.hxx"
#include "SMDS_Mesh0DElement.hxx"
#include "SMDS_MeshFace.hxx"
#include "SMDS_MeshVolume.hxx"
#include "SMDS_PolyhedralVolumeOfNodes.hxx"
#include "SMDS_SetIterator.hxx"
+#include "SMDS_SetIterator.hxx"
+#include "SMDS_VolumeTool.hxx"
+#include "SMESHDS_Command.hxx"
+#include "SMESHDS_CommandType.hxx"
#include "SMESHDS_Group.hxx"
+#include "SMESHDS_GroupOnGeom.hxx"
#include "SMESH_ControlsDef.hxx"
#include "SMESH_Filter_i.hxx"
+#include "SMESH_Filter_i.hxx"
+#include "SMESH_Gen_i.hxx"
#include "SMESH_Gen_i.hxx"
+#include "SMESH_Group.hxx"
#include "SMESH_Group_i.hxx"
+#include "SMESH_Group_i.hxx"
+#include "SMESH_MEDMesh_i.hxx"
+#include "SMESH_MeshEditor.hxx"
+#include "SMESH_MeshPartDS.hxx"
+#include "SMESH_MesherHelper.hxx"
+#include "SMESH_PreMeshInfo.hxx"
+#include "SMESH_PythonDump.hxx"
#include "SMESH_PythonDump.hxx"
#include "SMESH_subMeshEventListener.hxx"
#include "SMESH_subMesh_i.hxx"
+#include "SMESH_subMesh_i.hxx"
#include "utilities.h"
#include "Utils_ExceptHandlers.hxx"
if ( deleteSearchers )
TSearchersDeleter::Delete();
}
+ myEditor.GetError().reset();
}
//================================================================================
SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData()
{
- if ( myPreviewMode ) { // --- MeshPreviewStruct filling ---
+ const bool hasBadElems = ( myEditor.GetError() && myEditor.GetError()->HasBadElems() );
+
+ if ( myPreviewMode || hasBadElems ) { // --- MeshPreviewStruct filling ---
list<int> aNodesConnectivity;
typedef map<int, int> TNodesMap;
TNodesMap nodesMap;
- TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( myEditor.GetMesh() );
- SMDSAbs_ElementType previewType = aPreviewMesh->myPreviewType;
-
- SMESHDS_Mesh* aMeshDS = myEditor.GetMeshDS();
+ SMESHDS_Mesh* aMeshDS;
+ std::auto_ptr< SMESH_MeshPartDS > aMeshPartDS;
+ if ( hasBadElems ) {
+ aMeshPartDS.reset( new SMESH_MeshPartDS( myEditor.GetError()->myBadElements ));
+ aMeshDS = aMeshPartDS.get();
+ }
+ else {
+ aMeshDS = myEditor.GetMeshDS();
+ }
int nbEdges = aMeshDS->NbEdges();
int nbFaces = aMeshDS->NbFaces();
int nbVolum = aMeshDS->NbVolumes();
- switch ( previewType ) {
- case SMDSAbs_Edge : nbFaces = nbVolum = 0; break;
- case SMDSAbs_Face : nbEdges = nbVolum = 0; break;
- case SMDSAbs_Volume: nbEdges = nbFaces = 0; break;
- default:;
- }
myPreviewData = new SMESH::MeshPreviewStruct();
myPreviewData->nodesXYZ.length(aMeshDS->NbNodes());
+
+
+ SMDSAbs_ElementType previewType = SMDSAbs_All;
+ if ( !hasBadElems )
+ if (TPreviewMesh * aPreviewMesh = dynamic_cast< TPreviewMesh* >( myEditor.GetMesh() )) {
+ previewType = aPreviewMesh->myPreviewType;
+ switch ( previewType ) {
+ case SMDSAbs_Edge : nbFaces = nbVolum = 0; break;
+ case SMDSAbs_Face : nbEdges = nbVolum = 0; break;
+ case SMDSAbs_Volume: nbEdges = nbFaces = 0; break;
+ default:;
+ }
+ }
+
myPreviewData->elementTypes.length(nbEdges + nbFaces + nbVolum);
int i = 0, j = 0;
SMDS_ElemIteratorPtr itMeshElems = aMeshDS->elementsIterator();
return myLastCreatedElems._retn();
}
+//=======================================================================
+/*
+ * Returns description of an error/warning occured during the last operation
+ */
+//=======================================================================
+
+SMESH::ComputeError* SMESH_MeshEditor_i::GetLastError()
+{
+ SMESH::ComputeError* errOut = new SMESH::ComputeError;
+ SMESH_ComputeErrorPtr& errIn = myEditor.GetError();
+ if ( errIn && !errIn->IsOK() )
+ {
+ errOut->code = -( errIn->myName < 0 ? errIn->myName + 1: errIn->myName ); // -1 -> 0
+ errOut->comment = errIn->myComment.c_str();
+ errOut->subShapeID = -1;
+ errOut->hasBadMesh = !errIn->myBadElements.empty();
+ }
+ return errOut;
+}
+
//=======================================================================
//function : MakeIDSource
//purpose : Wrap a sequence of ids in a SMESH_IDSource
return aResult;
}
+//================================================================================
+/*!
+ \brief Identify the elements that will be affected by node duplication (actual duplication is not performed.
+ This method is the first step of DoubleNodeElemGroupsInRegion.
+ \param theElems - list of groups of elements (edges or faces) to be replicated
+ \param theNodesNot - list of groups of nodes not to replicated
+ \param theShape - shape to detect affected elements (element which geometric center
+ located on or inside shape).
+ The replicated nodes should be associated to affected elements.
+ \return groups of affected elements
+ \sa DoubleNodeElemGroupsInRegion()
+ */
+//================================================================================
+SMESH::ListOfGroups*
+SMESH_MeshEditor_i::AffectedElemGroupsInRegion( const SMESH::ListOfGroups& theElems,
+ const SMESH::ListOfGroups& theNodesNot,
+ GEOM::GEOM_Object_ptr theShape )
+{
+ MESSAGE("AffectedElemGroupsInRegion");
+ SMESH::ListOfGroups_var aListOfGroups = new SMESH::ListOfGroups();
+ bool isEdgeGroup = false;
+ bool isFaceGroup = false;
+ bool isVolumeGroup = false;
+ SMESH::SMESH_Group_var aNewEdgeGroup = myMesh_i->CreateGroup(SMESH::EDGE, "affectedEdges");
+ SMESH::SMESH_Group_var aNewFaceGroup = myMesh_i->CreateGroup(SMESH::FACE, "affectedFaces");
+ SMESH::SMESH_Group_var aNewVolumeGroup = myMesh_i->CreateGroup(SMESH::VOLUME, "affectedVolumes");
+
+ initData();
+
+ ::SMESH_MeshEditor aMeshEditor(myMesh);
+
+ SMESHDS_Mesh* aMeshDS = GetMeshDS();
+ TIDSortedElemSet anElems, aNodes;
+ listOfGroupToSet(theElems, aMeshDS, anElems, false);
+ listOfGroupToSet(theNodesNot, aMeshDS, aNodes, true);
+
+ TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape(theShape);
+ TIDSortedElemSet anAffected;
+ bool aResult = aMeshEditor.AffectedElemGroupsInRegion(anElems, aNodes, aShape, anAffected);
+
+ storeResult(aMeshEditor);
+
+ myMesh->GetMeshDS()->Modified();
+ TPythonDump pyDump;
+ if (aResult)
+ {
+ myMesh->SetIsModified(true);
+
+ int lg = anAffected.size();
+ MESSAGE("lg="<< lg);
+ SMESH::long_array_var volumeIds = new SMESH::long_array;
+ volumeIds->length(lg);
+ SMESH::long_array_var faceIds = new SMESH::long_array;
+ faceIds->length(lg);
+ SMESH::long_array_var edgeIds = new SMESH::long_array;
+ edgeIds->length(lg);
+ int ivol = 0;
+ int iface = 0;
+ int iedge = 0;
+
+ TIDSortedElemSet::const_iterator eIt = anAffected.begin();
+ for (; eIt != anAffected.end(); ++eIt)
+ {
+ const SMDS_MeshElement* anElem = *eIt;
+ if (!anElem)
+ continue;
+ int elemId = anElem->GetID();
+ if (myMesh->GetElementType(elemId, true) == SMDSAbs_Volume)
+ volumeIds[ivol++] = elemId;
+ else if (myMesh->GetElementType(elemId, true) == SMDSAbs_Face)
+ faceIds[iface++] = elemId;
+ else if (myMesh->GetElementType(elemId, true) == SMDSAbs_Edge)
+ edgeIds[iedge++] = elemId;
+ }
+ volumeIds->length(ivol);
+ faceIds->length(iface);
+ edgeIds->length(iedge);
+
+ aNewVolumeGroup->Add(volumeIds);
+ aNewFaceGroup->Add(faceIds);
+ aNewEdgeGroup->Add(edgeIds);
+ isVolumeGroup = (aNewVolumeGroup->Size() > 0);
+ isFaceGroup = (aNewFaceGroup->Size() > 0);
+ isEdgeGroup = (aNewEdgeGroup->Size() > 0);
+ }
+
+ int nbGroups = 0;
+ if (isEdgeGroup)
+ nbGroups++;
+ if (isFaceGroup)
+ nbGroups++;
+ if (isVolumeGroup)
+ nbGroups++;
+ aListOfGroups->length(nbGroups);
+
+ int i = 0;
+ if (isEdgeGroup)
+ aListOfGroups[i++] = aNewEdgeGroup._retn();
+ if (isFaceGroup)
+ aListOfGroups[i++] = aNewFaceGroup._retn();
+ if (isVolumeGroup)
+ aListOfGroups[i++] = aNewVolumeGroup._retn();
+
+ // Update Python script
+
+ pyDump << "[ ";
+ if (isEdgeGroup)
+ pyDump << aNewEdgeGroup << ", ";
+ if (isFaceGroup)
+ pyDump << aNewFaceGroup << ", ";
+ if (isVolumeGroup)
+ pyDump << aNewVolumeGroup << ", ";
+ pyDump << "] = ";
+ pyDump << this << ".AffectedElemGroupsInRegion( " << &theElems << ", " << &theNodesNot << ", " << theShape << " )";
+
+ return aListOfGroups._retn();
+}
+
//================================================================================
/*!
\brief Generated skin mesh (containing 2D cells) from 3D mesh
return aResult;
}
+/*!
+ * \brief identify all the elements around a geom shape, get the faces delimiting the hole
+ * Build groups of volume to remove, groups of faces to replace on the skin of the object,
+ * groups of faces to remove inside the object, (idem edges).
+ * Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+ */
+void SMESH_MeshEditor_i::CreateHoleSkin(CORBA::Double radius,
+ GEOM::GEOM_Object_ptr theShape,
+ const char* groupName,
+ const SMESH::double_array& theNodesCoords,
+ SMESH::array_of_long_array_out GroupsOfNodes)
+throw (SALOME::SALOME_Exception)
+{
+ initData();
+ std::vector<std::vector<int> > aListOfListOfNodes;
+ ::SMESH_MeshEditor aMeshEditor( myMesh );
+
+ theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other
+ if ( !theNodeSearcher )
+ theNodeSearcher = aMeshEditor.GetNodeSearcher();
+
+ vector<double> nodesCoords;
+ for (int i = 0; i < theNodesCoords.length(); i++)
+ {
+ nodesCoords.push_back( theNodesCoords[i] );
+ }
+
+ TopoDS_Shape aShape = SMESH_Gen_i::GetSMESHGen()->GeomObjectToShape( theShape );
+ aMeshEditor.CreateHoleSkin(radius, aShape, theNodeSearcher, groupName, nodesCoords, aListOfListOfNodes);
+
+ GroupsOfNodes = new SMESH::array_of_long_array;
+ GroupsOfNodes->length( aListOfListOfNodes.size() );
+ std::vector<std::vector<int> >::iterator llIt = aListOfListOfNodes.begin();
+ for ( CORBA::Long i = 0; llIt != aListOfListOfNodes.end(); llIt++, i++ )
+ {
+ vector<int>& aListOfNodes = *llIt;
+ vector<int>::iterator lIt = aListOfNodes.begin();;
+ SMESH::long_array& aGroup = (*GroupsOfNodes)[ i ];
+ aGroup.length( aListOfNodes.size() );
+ for ( int j = 0; lIt != aListOfNodes.end(); lIt++, j++ )
+ aGroup[ j ] = (*lIt);
+ }
+ TPythonDump() << "lists_nodes = " << this << ".CreateHoleSkin( "
+ << radius << ", " << theShape << ", " << ", " << groupName << ", " << theNodesCoords << " )";
+}
+
+
// issue 20749 ===================================================================
/*!
* \brief Creates missing boundary elements
#include "SMESH_MeshEditor.hxx"
#include <list>
-class SMESH_MeshEditor;
class SMESH_Mesh_i;
class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor
SMESH_MeshEditor_i(SMESH_Mesh_i * theMesh, bool isPreview);
virtual ~ SMESH_MeshEditor_i();
+ /*!
+ * \brief Return edited mesh ID
+ * \retval int - mesh ID
+ */
+ int GetMeshId() const { return myMesh->GetId(); }
// --- CORBA
+ /*!
+ * Return data of mesh edition preview
+ */
+ SMESH::MeshPreviewStruct* GetPreviewData();
+ /*!
+ * If during last operation of MeshEditor some nodes were
+ * created this method returns list of their IDs, if new nodes
+ * not created - returns an empty list
+ */
+ SMESH::long_array* GetLastCreatedNodes();
+ /*!
+ * If during last operation of MeshEditor some elements were
+ * created this method returns list of their IDs, if new elements
+ * not created - returns an empty list
+ */
+ SMESH::long_array* GetLastCreatedElems();
+ /*!
+ * \brief Returns description of an error/warning occured during the last operation
+ */
+ SMESH::ComputeError* GetLastError();
+
/*!
* \brief Wrap a sequence of ids in a SMESH_IDSource
*/
*/
CORBA::Boolean ChangeElemNodes(CORBA::Long ide, const SMESH::long_array& newIDs);
- /*!
- * Return data of mesh edition preview
- */
- SMESH::MeshPreviewStruct* GetPreviewData();
-
- /*!
- * If during last operation of MeshEditor some nodes were
- * created this method returns list of it's IDs, if new nodes
- * not creared - returns empty list
- */
- SMESH::long_array* GetLastCreatedNodes();
-
- /*!
- * If during last operation of MeshEditor some elements were
- * created this method returns list of it's IDs, if new elements
- * not creared - returns empty list
- */
- SMESH::long_array* GetLastCreatedElems();
-
- /*!
- * \brief Return edited mesh ID
- * \retval int - mesh ID
- */
- int GetMeshId() const { return myMesh->GetId(); }
-
CORBA::Boolean DoubleNodes( const SMESH::long_array& theNodes,
const SMESH::long_array& theModifiedElems );
CORBA::Boolean DoubleNodeElemGroupsInRegion( const SMESH::ListOfGroups& theElems,
const SMESH::ListOfGroups& theNodesNot,
GEOM::GEOM_Object_ptr theShape );
+
+ /*!
+ * \brief Identify the elements that will be affected by node duplication (actual duplication is not performed.
+ * This method is the first step of DoubleNodeElemGroupsInRegion.
+ * \param theElems - list of groups of elements (edges or faces) to be replicated
+ * \param theNodesNot - list of groups of nodes not to replicated
+ * \param theShape - shape to detect affected elements (element which geometric center
+ * located on or inside shape).
+ * The replicated nodes should be associated to affected elements.
+ * \return groups of affected elements
+ * \sa DoubleNodeElemGroupsInRegion()
+ */
+ SMESH::ListOfGroups* AffectedElemGroupsInRegion( const SMESH::ListOfGroups& theElems,
+ const SMESH::ListOfGroups& theNodesNot,
+ GEOM::GEOM_Object_ptr theShape );
+
/*!
* \brief Double nodes on shared faces between groups of volumes and create flat elements on demand.
* The list of groups must describe a partition of the mesh volumes.
*/
CORBA::Boolean CreateFlatElementsOnFacesGroups( const SMESH::ListOfGroups& theGroupsOfFaces );
+ /*!
+ * \brief identify all the elements around a geom shape, get the faces delimiting the hole
+ * Build groups of volume to remove, groups of faces to replace on the skin of the object,
+ * groups of faces to remove insidethe object, (idem edges).
+ * Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
+ */
+ void CreateHoleSkin(CORBA::Double radius,
+ GEOM::GEOM_Object_ptr theShape,
+ const char* groupName,
+ const SMESH::double_array& theNodesCoords,
+ SMESH::array_of_long_array_out GroupsOfNodes)
+ throw (SALOME::SALOME_Exception);
+
/*!
* \brief Generated skin mesh (containing 2D cells) from 3D mesh
* The created 2D mesh elements based on nodes of free faces of boundary volumes
--- /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_MeshPartDS.hxx
+// Created : Thu Sep 13 20:26:47 2012
+// Author : Edward AGAPOV (eap)
+
+#ifndef __SMESH_MeshPartDS_HXX__
+#define __SMESH_MeshPartDS_HXX__
+
+#include "SMESHDS_Mesh.hxx"
+
+#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Mesh)
+
+#include <list>
+
+//=============================================================================
+/*!
+ * \brief Class providing SMESHDS_Mesh API to SMESH_IDSource.
+ * It is used to export a part of mesh as a whole mesh.
+ */
+// Implementation is in SMESH_Mesh_i.cxx where this class was extracted from
+
+class SMESH_MeshPartDS : public SMESHDS_Mesh
+{
+public:
+ SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart);
+ SMESH_MeshPartDS(const std::list< const SMDS_MeshElement* > & badElems );
+
+ virtual SMDS_NodeIteratorPtr nodesIterator (bool idInceasingOrder=false) const;
+ virtual SMDS_EdgeIteratorPtr edgesIterator (bool idInceasingOrder=false) const;
+ virtual SMDS_FaceIteratorPtr facesIterator (bool idInceasingOrder=false) const;
+ virtual SMDS_VolumeIteratorPtr volumesIterator (bool idInceasingOrder=false) const;
+
+ virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
+ virtual SMDS_ElemIteratorPtr elementGeomIterator(SMDSAbs_GeometryType type) const;
+ virtual SMDS_ElemIteratorPtr elementEntityIterator(SMDSAbs_EntityType type) const;
+
+private:
+ TIDSortedElemSet _elements[ SMDSAbs_NbElementTypes ];
+ SMESHDS_Mesh* _meshDS;
+ /*!
+ * \brief Class used to access to protected data of SMDS_MeshInfo
+ */
+ struct TMeshInfo : public SMDS_MeshInfo
+ {
+ void Add(const SMDS_MeshElement* e) { SMDS_MeshInfo::addWithPoly( e ); }
+ };
+};
+
+#endif
#include "SMESH_MEDMesh_i.hxx"
#include "SMESH_MeshEditor.hxx"
#include "SMESH_MeshEditor_i.hxx"
+#include "SMESH_MeshPartDS.hxx"
#include "SMESH_MesherHelper.hxx"
#include "SMESH_PreMeshInfo.hxx"
#include "SMESH_PythonDump.hxx"
#include <OSD_File.hxx>
#include <OSD_Path.hxx>
#include <OSD_Protection.hxx>
+#include <Standard_OutOfMemory.hxx>
#include <TColStd_MapIteratorOfMapOfInteger.hxx>
#include <TColStd_MapOfInteger.hxx>
#include <TColStd_SequenceOfInteger.hxx>
#include <TCollection_AsciiString.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
-#include <TopoDS_Compound.hxx>
-#include <TopTools_MapOfShape.hxx>
#include <TopTools_MapIteratorOfMapOfShape.hxx>
+#include <TopTools_MapOfShape.hxx>
+#include <TopoDS_Compound.hxx>
// STL Includes
#include <algorithm>
//=============================================================================
/*!
- *
+ * Convert enum Driver_Mesh::Status to SMESH::DriverMED_ReadStatus
*/
//=============================================================================
return res;
}
+//=============================================================================
+/*!
+ * Convert ::SMESH_ComputeError to SMESH::ComputeError
+ */
+//=============================================================================
+
+static SMESH::ComputeError* ConvertComputeError( SMESH_ComputeErrorPtr errorPtr )
+{
+ SMESH::ComputeError_var errVar = new SMESH::ComputeError();
+ errVar->subShapeID = -1;
+ errVar->hasBadMesh = false;
+
+ if ( !errorPtr || errorPtr->IsOK() )
+ {
+ errVar->code = SMESH::COMPERR_OK;
+ }
+ else
+ {
+ errVar->code = ConvertDriverMEDReadStatus( errorPtr->myName );
+ errVar->comment = errorPtr->myComment.c_str();
+ }
+ return errVar._retn();
+}
+
//=============================================================================
/*!
* ImportMEDFile
return 1;
}
+//================================================================================
+/*!
+ * \brief Imports data from a GMF file and returns an error description
+ */
+//================================================================================
+
+SMESH::ComputeError* SMESH_Mesh_i::ImportGMFFile( const char* theFileName )
+ throw (SALOME::SALOME_Exception)
+{
+ SMESH_ComputeErrorPtr error;
+ try {
+ error = _impl->GMFToMesh( theFileName );
+ }
+ catch ( std::bad_alloc& exc ) {
+ error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, "std::bad_alloc raised" );
+ }
+ catch ( Standard_OutOfMemory& exc ) {
+ error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, "Standard_OutOfMemory raised" );
+ }
+ catch (Standard_Failure& ex) {
+ error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, ex.DynamicType()->Name() );
+ if ( ex.GetMessageString() && strlen( ex.GetMessageString() ))
+ error->myComment += string(": ") + ex.GetMessageString();
+ }
+ catch ( SALOME_Exception& S_ex ) {
+ error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, S_ex.what() );
+ }
+ catch ( std::exception& exc ) {
+ error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, exc.what() );
+ }
+ catch (...) {
+ error = SMESH_ComputeError::New( Driver_Mesh::DRS_FAIL, "Unknown exception" );
+ }
+
+ CreateGroupServants();
+
+ return ConvertComputeError( error );
+}
+
//=============================================================================
/*!
*
_impl->ExportSTL(file, isascii);
}
-//=============================================================================
-/*!
- * \brief Class providing SMESHDS_Mesh API to SMESH_IDSource.
- * It is used to export a part of mesh as a whole mesh.
- */
-class SMESH_MeshPartDS : public SMESHDS_Mesh
-{
-public:
- SMESH_MeshPartDS(SMESH::SMESH_IDSource_ptr meshPart);
-
- virtual SMDS_NodeIteratorPtr nodesIterator (bool idInceasingOrder=false) const;
- virtual SMDS_EdgeIteratorPtr edgesIterator (bool idInceasingOrder=false) const;
- virtual SMDS_FaceIteratorPtr facesIterator (bool idInceasingOrder=false) const;
- virtual SMDS_VolumeIteratorPtr volumesIterator (bool idInceasingOrder=false) const;
-
- virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
- virtual SMDS_ElemIteratorPtr elementGeomIterator(SMDSAbs_GeometryType type) const;
- virtual SMDS_ElemIteratorPtr elementEntityIterator(SMDSAbs_EntityType type) const;
-
-private:
- TIDSortedElemSet _elements[ SMDSAbs_NbElementTypes ];
- SMESHDS_Mesh* _meshDS;
- /*!
- * \brief Class used to access to protected data of SMDS_MeshInfo
- */
- struct TMeshInfo : public SMDS_MeshInfo
- {
- void Add(const SMDS_MeshElement* e) { SMDS_MeshInfo::addWithPoly( e ); }
- };
-};
-
//================================================================================
/*!
* \brief Export a part of mesh to a med file
SMESH_MeshPartDS partDS( meshPart );
_impl->ExportCGNS(file, &partDS);
- TPythonDump() << _this() << ".ExportCGNS( "
- << meshPart<< ", r'" << file << "', " << overwrite << ")";
+ TPythonDump() << _this() << ".ExportCGNS( r'"
+ << file << "', " << overwrite << ", "<< meshPart<< ")";
#else
THROW_SALOME_CORBA_EXCEPTION("CGNS library is unavailable", SALOME::INTERNAL_ERROR);
#endif
}
+//================================================================================
+/*!
+ * \brief Export a part of mesh to a GMF file
+ */
+//================================================================================
+
+void SMESH_Mesh_i::ExportGMF(::SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file)
+ throw (SALOME::SALOME_Exception)
+{
+ Unexpect aCatch(SALOME_SalomeException);
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
+
+ PrepareForWriting(file,/*overwrite=*/true);
+
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportGMF(file, &partDS);
+
+ TPythonDump() << _this() << ".ExportGMF( r'"
+ << file << "', "<< meshPart<< ")";
+}
+
//=============================================================================
/*!
* Return implementation of SALOME_MED::MESH interfaces
*/
//=============================================================================
-void SMESH_Mesh_i::CreateGroupServants()
+void SMESH_Mesh_i::CreateGroupServants()
{
SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy();
}
//=============================================================================
+namespace // Finding concurrent hypotheses
+//=============================================================================
+{
+
/*!
* \brief mapping of mesh dimension into shape type
*/
-//=============================================================================
-
-static TopAbs_ShapeEnum shapeTypeByDim(const int theDim)
+TopAbs_ShapeEnum shapeTypeByDim(const int theDim)
{
TopAbs_ShapeEnum aType = TopAbs_SOLID;
switch ( theDim ) {
return aType;
}
-//=============================================================================
+//-----------------------------------------------------------------------------
/*!
* \brief Internal structure used to find concurent submeshes
*
* with another submesh. In other words, it is dimension of a hypothesis assigned
* to submesh.
*/
-//=============================================================================
-
class SMESH_DimHyp
{
public:
int _ownDim; //!< dimension of shape of _subMesh (>=_dim)
TopTools_MapOfShape _shapeMap;
SMESH_subMesh* _subMesh;
- list<const SMESHDS_Hypothesis*> _hypothesises; //!< algo is first, then its parameters
+ list<const SMESHDS_Hypothesis*> _hypotheses; //!< algo is first, then its parameters
+
+ //-----------------------------------------------------------------------------
+ // Return the algorithm
+ const SMESH_Algo* GetAlgo() const
+ { return _hypotheses.empty() ? 0 : dynamic_cast<const SMESH_Algo*>( _hypotheses.front() ); }
+ //-----------------------------------------------------------------------------
//! Constructors
SMESH_DimHyp(const SMESH_subMesh* theSubMesh,
const int theDim,
SetShape( theDim, theShape );
}
+ //-----------------------------------------------------------------------------
//! set shape
void SetShape(const int theDim,
const TopoDS_Shape& theShape)
}
}
+ //-----------------------------------------------------------------------------
//! Check sharing of sub-shapes
static bool isShareSubShapes(const TopTools_MapOfShape& theToCheck,
const TopTools_MapOfShape& theToFind,
return isShared;
}
+ //-----------------------------------------------------------------------------
//! check algorithms
static bool checkAlgo(const SMESHDS_Hypothesis* theA1,
const SMESHDS_Hypothesis* theA2)
{
- if ( theA1->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ||
+ if ( !theA1 || !theA2 ||
+ theA1->GetType() == SMESHDS_Hypothesis::PARAM_ALGO ||
theA2->GetType() == SMESHDS_Hypothesis::PARAM_ALGO )
return false; // one of the hypothesis is not algorithm
// check algorithm names (should be equal)
}
+ //-----------------------------------------------------------------------------
//! Check if sub-shape hypotheses are concurrent
bool IsConcurrent(const SMESH_DimHyp* theOther) const
{
// if ( <own dim of either of submeshes> == <concurrent dim> &&
// any of the two submeshes is not on COMPOUND shape )
// -> no concurrency
- bool meIsCompound = (_subMesh->GetSubMeshDS() && _subMesh->GetSubMeshDS()->IsComplexSubmesh());
- bool otherIsCompound = (theOther->_subMesh->GetSubMeshDS() && theOther->_subMesh->GetSubMeshDS()->IsComplexSubmesh());
+ bool meIsCompound = (_subMesh->GetSubMeshDS() &&
+ _subMesh->GetSubMeshDS()->IsComplexSubmesh());
+ bool otherIsCompound = (theOther->_subMesh->GetSubMeshDS() &&
+ theOther->_subMesh->GetSubMeshDS()->IsComplexSubmesh());
if ( (_ownDim == _dim || theOther->_ownDim == _dim ) && (!meIsCompound || !otherIsCompound))
return false;
return false;
// check algorithms to be same
- if (!checkAlgo( _hypothesises.front(), theOther->_hypothesises.front() ))
- return true; // different algorithms
-
+ if ( !checkAlgo( this->GetAlgo(), theOther->GetAlgo() ))
+ return true; // different algorithms -> concurrency !
+
// check hypothesises for concurrence (skip first as algorithm)
int nbSame = 0;
- // pointers should be same, becase it is referenes from mesh hypothesis partition
- list <const SMESHDS_Hypothesis*>::const_iterator hypIt = _hypothesises.begin();
- list <const SMESHDS_Hypothesis*>::const_iterator otheEndIt = theOther->_hypothesises.end();
- for ( hypIt++ /*skip first as algo*/; hypIt != _hypothesises.end(); hypIt++ )
- if ( find( theOther->_hypothesises.begin(), otheEndIt, *hypIt ) != otheEndIt )
+ // pointers should be same, because it is referened from mesh hypothesis partition
+ list <const SMESHDS_Hypothesis*>::const_iterator hypIt = _hypotheses.begin();
+ list <const SMESHDS_Hypothesis*>::const_iterator otheEndIt = theOther->_hypotheses.end();
+ for ( hypIt++ /*skip first as algo*/; hypIt != _hypotheses.end(); hypIt++ )
+ if ( find( theOther->_hypotheses.begin(), otheEndIt, *hypIt ) != otheEndIt )
nbSame++;
// the submeshes are concurrent if their algorithms has different parameters
- return nbSame != theOther->_hypothesises.size() - 1;
+ return nbSame != theOther->_hypotheses.size() - 1;
+ }
+
+ // Return true if algorithm of this SMESH_DimHyp is used if no
+ // sub-mesh order is imposed by the user
+ bool IsHigherPriorityThan( const SMESH_DimHyp* theOther ) const
+ {
+ // NeedDiscreteBoundary() algo has a higher priority
+ if ( this ->GetAlgo()->NeedDiscreteBoundary() !=
+ theOther->GetAlgo()->NeedDiscreteBoundary() )
+ return !this->GetAlgo()->NeedDiscreteBoundary();
+
+ return ( this->_subMesh->GetId() < theOther->_subMesh->GetId() );
}
}; // end of SMESH_DimHyp
+//-----------------------------------------------------------------------------
+
+typedef list<const SMESH_DimHyp*> TDimHypList;
-typedef list<SMESH_DimHyp*> TDimHypList;
+//-----------------------------------------------------------------------------
-static void addDimHypInstance(const int theDim,
- const TopoDS_Shape& theShape,
- const SMESH_Algo* theAlgo,
- const SMESH_subMesh* theSubMesh,
- const list <const SMESHDS_Hypothesis*>& theHypList,
- TDimHypList* theDimHypListArr )
+void addDimHypInstance(const int theDim,
+ const TopoDS_Shape& theShape,
+ const SMESH_Algo* theAlgo,
+ const SMESH_subMesh* theSubMesh,
+ const list <const SMESHDS_Hypothesis*>& theHypList,
+ TDimHypList* theDimHypListArr )
{
TDimHypList& listOfdimHyp = theDimHypListArr[theDim];
if ( listOfdimHyp.empty() || listOfdimHyp.back()->_subMesh != theSubMesh ) {
SMESH_DimHyp* dimHyp = new SMESH_DimHyp( theSubMesh, theDim, theShape );
+ dimHyp->_hypotheses.push_front(theAlgo);
listOfdimHyp.push_back( dimHyp );
}
- SMESH_DimHyp* dimHyp = listOfdimHyp.back();
- dimHyp->_hypothesises.push_front(theAlgo);
- list <const SMESHDS_Hypothesis*>::const_iterator hypIt = theHypList.begin();
- for( ; hypIt != theHypList.end(); hypIt++ )
- dimHyp->_hypothesises.push_back( *hypIt );
+ SMESH_DimHyp* dimHyp = const_cast<SMESH_DimHyp*>( listOfdimHyp.back() );
+ dimHyp->_hypotheses.insert( dimHyp->_hypotheses.end(),
+ theHypList.begin(), theHypList.end() );
}
-static void findConcurrents(const SMESH_DimHyp* theDimHyp,
- const TDimHypList& theListOfDimHyp,
- TListOfInt& theListOfConcurr )
+//-----------------------------------------------------------------------------
+void addInOrderOfPriority( const SMESH_DimHyp* theDimHyp,
+ TDimHypList& theListOfConcurr)
+{
+ if ( theListOfConcurr.empty() )
+ {
+ theListOfConcurr.push_back( theDimHyp );
+ }
+ else
+ {
+ TDimHypList::iterator hypIt = theListOfConcurr.begin();
+ while ( hypIt != theListOfConcurr.end() &&
+ !theDimHyp->IsHigherPriorityThan( *hypIt ))
+ ++hypIt;
+ theListOfConcurr.insert( hypIt, theDimHyp );
+ }
+}
+
+//-----------------------------------------------------------------------------
+void findConcurrents(const SMESH_DimHyp* theDimHyp,
+ const TDimHypList& theListOfDimHyp,
+ TDimHypList& theListOfConcurrHyp,
+ set<int>& theSetOfConcurrId )
{
TDimHypList::const_reverse_iterator rIt = theListOfDimHyp.rbegin();
- for ( ; rIt != theListOfDimHyp.rend(); rIt++ ) {
+ for ( ; rIt != theListOfDimHyp.rend(); rIt++ )
+ {
const SMESH_DimHyp* curDimHyp = *rIt;
if ( curDimHyp == theDimHyp )
break; // meet own dimHyp pointer in same dimension
- else if ( theDimHyp->IsConcurrent( curDimHyp ) )
- if ( find( theListOfConcurr.begin(),
- theListOfConcurr.end(),
- curDimHyp->_subMesh->GetId() ) == theListOfConcurr.end() )
- theListOfConcurr.push_back( curDimHyp->_subMesh->GetId() );
+
+ if ( theDimHyp->IsConcurrent( curDimHyp ) &&
+ theSetOfConcurrId.insert( curDimHyp->_subMesh->GetId() ).second )
+ {
+ addInOrderOfPriority( curDimHyp, theListOfConcurrHyp );
+ }
}
}
-static void unionLists(TListOfInt& theListOfId,
- TListOfListOfInt& theListOfListOfId,
- const int theIndx )
+//-----------------------------------------------------------------------------
+void unionLists(TListOfInt& theListOfId,
+ TListOfListOfInt& theListOfListOfId,
+ const int theIndx )
{
TListOfListOfInt::iterator it = theListOfListOfId.begin();
for ( int i = 0; it != theListOfListOfId.end(); it++, i++ ) {
otherListOfId.clear();
}
}
+//-----------------------------------------------------------------------------
//! free memory allocated for dimension-hypothesis objects
-static void removeDimHyps( TDimHypList* theArrOfList )
+void removeDimHyps( TDimHypList* theArrOfList )
{
for (int i = 0; i < 4; i++ ) {
TDimHypList& listOfdimHyp = theArrOfList[i];
}
}
+//-----------------------------------------------------------------------------
+/*!
+ * \brief find common submeshes with given submesh
+ * \param theSubMeshList list of already collected submesh to check
+ * \param theSubMesh given submesh to intersect with other
+ * \param theCommonSubMeshes collected common submeshes
+ */
+void findCommonSubMesh (list<const SMESH_subMesh*>& theSubMeshList,
+ const SMESH_subMesh* theSubMesh,
+ set<const SMESH_subMesh*>& theCommon )
+{
+ if ( !theSubMesh )
+ return;
+ list<const SMESH_subMesh*>::const_iterator it = theSubMeshList.begin();
+ for ( ; it != theSubMeshList.end(); it++ )
+ theSubMesh->FindIntersection( *it, theCommon );
+ theSubMeshList.push_back( theSubMesh );
+ //theCommon.insert( theSubMesh );
+}
+
+} // namespace
+
//=============================================================================
/*!
* \brief Return submesh objects list in meshing order
TListOfListOfInt anOrder = mesh.GetMeshOrder(); // is there already defined order?
if ( !anOrder.size() ) {
- // collect submeshes detecting concurrent algorithms and hypothesises
+ // collect submeshes and detect concurrent algorithms and hypothesises
TDimHypList dimHypListArr[4]; // dimHyp list for each shape dimension
map<int, ::SMESH_subMesh*>::iterator i_sm = _mapSubMesh.begin();
::SMESH_subMesh* sm = (*i_sm).second;
// shape of submesh
const TopoDS_Shape& aSubMeshShape = sm->GetSubShape();
-
+
// list of assigned hypothesises
const list <const SMESHDS_Hypothesis*>& hypList = mesh.GetHypothesisList(aSubMeshShape);
// Find out dimensions where the submesh can be concurrent.
anAlgo = mesh.GetGen()->GetAlgo( mesh, anExp.Current() );
}
if (!anAlgo)
- continue; // no assigned algorithm to current submesh
+ continue; // no algorithm assigned to a current submesh
int dim = anAlgo->GetDim(); // top concurrent dimension (see comment to SMESH_DimHyp)
// the submesh can concurrent at <dim> (or lower dims if !anAlgo->NeedDiscreteBoundary())
// iterate on created dimension-hypotheses and check for concurrents
for ( int i = 0; i < 4; i++ ) {
- const list<SMESH_DimHyp*>& listOfDimHyp = dimHypListArr[i];
+ const TDimHypList& listOfDimHyp = dimHypListArr[i];
// check for concurrents in own and other dimensions (step-by-step)
TDimHypList::const_iterator dhIt = listOfDimHyp.begin();
for ( ; dhIt != listOfDimHyp.end(); dhIt++ ) {
const SMESH_DimHyp* dimHyp = *dhIt;
- TListOfInt listOfConcurr;
+ TDimHypList listOfConcurr;
+ set<int> setOfConcurrIds;
// looking for concurrents and collect into own list
for ( int j = i; j < 4; j++ )
- findConcurrents( dimHyp, dimHypListArr[j], listOfConcurr );
+ findConcurrents( dimHyp, dimHypListArr[j], listOfConcurr, setOfConcurrIds );
// check if any concurrents found
if ( listOfConcurr.size() > 0 ) {
// add own submesh to list of concurrent
- listOfConcurr.push_front( dimHyp->_subMesh->GetId() );
- anOrder.push_back( listOfConcurr );
+ addInOrderOfPriority( dimHyp, listOfConcurr );
+ list<int> listOfConcurrIds;
+ TDimHypList::iterator hypIt = listOfConcurr.begin();
+ for ( ; hypIt != listOfConcurr.end(); ++hypIt )
+ listOfConcurrIds.push_back( (*hypIt)->_subMesh->GetId() );
+ anOrder.push_back( listOfConcurrIds );
}
}
}
return aResult._retn();
}
-//=============================================================================
-/*!
- * \brief find common submeshes with given submesh
- * \param theSubMeshList list of already collected submesh to check
- * \param theSubMesh given submesh to intersect with other
- * \param theCommonSubMeshes collected common submeshes
- */
-//=============================================================================
-
-static void findCommonSubMesh (list<const SMESH_subMesh*>& theSubMeshList,
- const SMESH_subMesh* theSubMesh,
- set<const SMESH_subMesh*>& theCommon )
-{
- if ( !theSubMesh )
- return;
- list<const SMESH_subMesh*>::const_iterator it = theSubMeshList.begin();
- for ( ; it != theSubMeshList.end(); it++ )
- theSubMesh->FindIntersection( *it, theCommon );
- theSubMeshList.push_back( theSubMesh );
- //theCommon.insert( theSubMesh );
-}
-
//=============================================================================
/*!
* \brief Set submesh object order
}
}
// -------------------------------------------------------------------------------------
+SMESH_MeshPartDS::SMESH_MeshPartDS(const std::list< const SMDS_MeshElement* > & meshPart):
+ SMESHDS_Mesh( /*meshID=*/-1, /*isEmbeddedMode=*/true), _meshDS(0)
+{
+ TMeshInfo tmpInfo;
+ list< const SMDS_MeshElement* >::const_iterator partIt = meshPart.begin();
+ for ( ; partIt != meshPart.end(); ++partIt )
+ if ( const SMDS_MeshElement * e = *partIt )
+ if ( _elements[ e->GetType() ].insert( e ).second )
+ {
+ tmpInfo.Add( e );
+ SMDS_ElemIteratorPtr nIt = e->nodesIterator();
+ while ( nIt->more() )
+ {
+ const SMDS_MeshNode * n = (const SMDS_MeshNode*) nIt->next();
+ if ( _elements[ SMDSAbs_Node ].insert( n ).second )
+ tmpInfo.Add( n );
+ }
+ }
+ myInfo = tmpInfo;
+}
+// -------------------------------------------------------------------------------------
SMDS_ElemIteratorPtr SMESH_MeshPartDS::elementGeomIterator(SMDSAbs_GeometryType geomType) const
{
if ( _meshDS ) return _meshDS->elementGeomIterator( geomType );
#include "SMESH.hxx"
#include <SALOMEconfig.h>
+#include CORBA_SERVER_HEADER(SMESH_Gen)
#include CORBA_SERVER_HEADER(SMESH_Mesh)
#include CORBA_SERVER_HEADER(SMESH_Group)
#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
#include "SMESH_Hypothesis.hxx"
#include "SMESH_Mesh.hxx"
-//#include "SMESH_subMesh_i.hxx"
#include "SMESH_subMesh.hxx"
#include "SALOME_GenericObj_i.hh"
int ImportSTLFile( const char* theFileName )
throw (SALOME::SALOME_Exception);
+ SMESH::ComputeError* ImportGMFFile( const char* theFileName )
+ throw (SALOME::SALOME_Exception);
+
/*!
* consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value
*/
void ExportCGNS(SMESH::SMESH_IDSource_ptr meshPart,
const char* file,
CORBA::Boolean overwrite) throw (SALOME::SALOME_Exception);
+ void ExportGMF(SMESH::SMESH_IDSource_ptr meshPart,
+ const char* file) throw (SALOME::SALOME_Exception);
void ExportPartToMED(SMESH::SMESH_IDSource_ptr meshPart,
const char* file,
SMESH_PreMeshInfo* meshInfo = _mesh->changePreMeshInfo();
_mesh->changePreMeshInfo() = NULL; // to allow GUI accessing to real info
- ::SMESH_Mesh& mesh = _mesh->GetImpl();
+ ::SMESH_Mesh& mesh = _mesh->GetImpl();
SMESHDS_Mesh* meshDS = mesh.GetMeshDS();
PreMeshInfo_TRY;
SMESHDS_Mesh* meshDS = _mesh->GetImpl().GetMeshDS();
+ // issue 0020693. Restore _isModified flag
+ if ( aTopGroup->ExistInternalObject( "_isModified" ))
+ {
+ HDFdataset* aDataset = new HDFdataset( "_isModified", aTopGroup );
+ aDataset->OpenOnDisk();
+ hdf_size size = aDataset->GetSize();
+ int* isModified = new int[ size ];
+ aDataset->ReadFromDisk( isModified );
+ aDataset->CloseOnDisk();
+ _mesh->GetImpl().SetIsModified( bool(*isModified));
+ }
+
bool submeshesInFamilies = ( ! aTopGroup->ExistInternalObject( "Submeshes" ));
if ( submeshesInFamilies ) // from MED
{
# Scripts to be installed.
-dist_salomescript_DATA= \
+dist_salomescript_PYTHON = \
smesh.py \
smeshDC.py \
+ smesh_algorithm.py \
StdMeshersDC.py \
batchmode_smesh.py \
batchmode_mefisto.py \
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
-from smesh import Mesh_Algorithm, AssureGeomPublished, IsEqual, ParseParameters
+##
+# @package StdMeshersDC
+# Python API for the standard meshing plug-in module.
+
+from smesh_algorithm import Mesh_Algorithm
+from smesh import AssureGeomPublished, IsEqual, ParseParameters
from smesh import GetName, TreatHypoStatus
from smeshDC import Mesh
import StdMeshers
-# Types of algorithms
+#----------------------------
+# Mesh algo type identifiers
+#----------------------------
+
+## Algorithm type: Regular 1D algorithm, see StdMeshersDC_Segment
REGULAR = "Regular_1D"
+## Algorithm type: Python 1D algorithm, see StdMeshersDC_Segment_Python
PYTHON = "Python_1D"
+## Algorithm type: Composite segment 1D algorithm, see StdMeshersDC_CompositeSegment
COMPOSITE = "CompositeSegment_1D"
+## Algorithm type: Triangle MEFISTO 2D algorithm, see StdMeshersDC_Triangle_MEFISTO
MEFISTO = "MEFISTO_2D"
+## Algorithm type: Hexahedron 3D (i-j-k) algorithm, see StdMeshersDC_Hexahedron
Hexa = "Hexa_3D"
+## Algorithm type: Quadrangle 2D algorithm, see StdMeshersDC_Quadrangle
QUADRANGLE = "Quadrangle_2D"
+## Algorithm type: Radial Quadrangle 1D-2D algorithm, see StdMeshersDC_RadialQuadrangle1D2D
RADIAL_QUAD = "RadialQuadrangle_1D2D"
-
# import items of enum QuadType
for e in StdMeshers.QuadType._items: exec('%s = StdMeshers.%s'%(e,e))
+#----------------------
+# Algorithms
+#----------------------
-# Public class: Mesh_Segment
-# --------------------------
-
-## Class to define a REGULAR 1D algorithm for discretization. It is created by
-# calling Mesh.Segment(geom=0)
+## Defines segment 1D algorithm for edges discretization.
+#
+# It can be created by calling smesh.Mesh.Segment(geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_Segment(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Segment"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = REGULAR
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates segment 1D algorithm for edges"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
+ pass
## Defines "LocalLength" hypothesis to cut an edge in several segments with the same length
# @param l for the length of segments that cut an edge
return hyp
## Private method
- ## Checks if the given "NumberOfSegments" hypothesis has the same parameters as the given arguments
+ #
+ # Checks if the given "NumberOfSegments" hypothesis has the same parameters as the given arguments
def _compareNumberOfSegments(self, hyp, args):
if hyp.GetNumberOfSegments() == args[0]:
if len(args) == 3:
else:
self.geom = vertex
pass
- ### 0D algorithm
+ # 0D algorithm
if self.geom is None:
raise RuntimeError, "Attemp to create SegmentAroundVertex_0D algoritm on None shape"
AssureGeomPublished( self.mesh, self.geom )
pass
status = self.mesh.mesh.AddHypothesis(self.geom, algo)
TreatHypoStatus(status, "SegmentAroundVertex_0D", name, True)
- ###
+ #
comFun = lambda hyp, args: IsEqual(hyp.GetLength(), args[0])
hyp = self.Hypothesis("SegmentLengthAroundVertex", [length], UseExisting=UseExisting,
CompareMethod=comFun)
hyp = self.Hypothesis("QuadraticMesh", UseExisting=1, CompareMethod=self.CompareEqualHyp)
return hyp
-# Public class: Mesh_CompositeSegment
-# --------------------------
+ pass # end of StdMeshersDC_Segment class
-## A regular 1D algorithm for discretization of a set of adjacent edges as one.
-# It is created by calling Mesh.Segment(COMPOSITE,geom=0)
+## Segment 1D algorithm for discretization of a set of adjacent edges as one edge.
+#
+# It is created by calling smesh.Mesh.Segment(smesh.COMPOSITE,geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_CompositeSegment(StdMeshersDC_Segment):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Segment"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = COMPOSITE
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = False
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates segment 1D algorithm for edges"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
self.Create(mesh, geom, self.algoType)
+ pass
+ pass # end of StdMeshersDC_CompositeSegment class
-# Public class: Mesh_Segment_Python
-# ---------------------------------
-
-## Defines a segment 1D algorithm for discretization with python function
-# It is created by calling Mesh.Segment(PYTHON,geom=0)
+## Defines a segment 1D algorithm for discretization of edges with Python function
+#
+# It is created by calling smesh.Mesh.Segment(smesh.PYTHON,geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_Segment_Python(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Segment"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = PYTHON
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates tetrahedron 3D algorithm for solids"
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates segment 1D algorithm for edges"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
import Python1dPlugin
self.Create(mesh, geom, self.algoType, "libPython1dEngine.so")
+ pass
## Defines "PythonSplit1D" hypothesis
# @param n for the number of segments that cut an edge
hyp.SetPythonLog10RatioFunction(func)
return hyp
-# Public class: Mesh_Triangle_MEFISTO
-# -----------------------------------
+ pass # end of StdMeshersDC_Segment_Python class
## Triangle MEFISTO 2D algorithm
-# It is created by calling Mesh.Triangle(MEFISTO,geom=0)
+#
+# It is created by calling smesh.Mesh.Triangle(smesh.MEFISTO,geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_Triangle_MEFISTO(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Triangle"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = MEFISTO
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates triangle 2D algorithm for faces"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
+ pass
## Defines "MaxElementArea" hypothesis basing on the definition of the maximum area of each triangle
# @param area for the maximum area of each triangle
hyp = self.Hypothesis("LengthFromEdges", UseExisting=1, CompareMethod=self.CompareEqualHyp)
return hyp
-# Public class: Mesh_Quadrangle
-# -----------------------------
+ pass # end of StdMeshersDC_Triangle_MEFISTO class
## Defines a quadrangle 2D algorithm
-# It is created by calling Mesh.Quadrangle(geom=0)
+#
+# It is created by calling smesh.Mesh.Quadrangle(geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_Quadrangle(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Quadrangle"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = QUADRANGLE
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
-
- params=0
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates quadrangle 2D algorithm for faces"
+ ## hypothesis associated with algorithm
+ # @internal
+ params = 0
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
- return
+ pass
## Defines "QuadrangleParameters" hypothesis
# @param quadType defines the algorithm of transition between differently descretized
def TriangleVertex(self, vertex, UseExisting=0):
return self.QuadrangleParameters(QUAD_STANDARD,vertex,UseExisting)
-
-# Public class: Mesh_Hexahedron
-# ------------------------------
+ pass # end of StdMeshersDC_Quadrangle class
## Defines a hexahedron 3D algorithm
-# It is created by calling Mesh.Hexahedron(geom=0)
+#
+# It is created by calling smesh.Mesh.Hexahedron(geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_Hexahedron(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Hexahedron"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = Hexa
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates hexahedron 3D algorithm for volumes"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, Hexa)
pass
-# Public class: Mesh_Projection1D
-# -------------------------------
+ pass # end of StdMeshersDC_Hexahedron class
## Defines a projection 1D algorithm
-# It is created by calling Mesh.Projection1D(geom=0)
-# @ingroup l3_algos_proj
+#
+# It is created by calling smesh.Mesh.Projection1D(geom=0)
#
+# @ingroup l3_algos_proj
class StdMeshersDC_Projection1D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Projection1D"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Projection_1D"
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates projection 1D algorithm for edges"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
+ pass
## Defines "Source Edge" hypothesis, specifying a meshed edge, from where
# a mesh pattern is taken, and, optionally, the association of vertices
hyp.SetVertexAssociation( srcV, tgtV )
return hyp
-
-# Public class: Mesh_Projection2D
-# ------------------------------
+ pass # end of StdMeshersDC_Projection1D class
## Defines a projection 2D algorithm
-# It is created by calling Mesh.Projection2D(geom=0)
-# @ingroup l3_algos_proj
+#
+# It is created by calling smesh.Mesh.Projection2D(geom=0)
#
+# @ingroup l3_algos_proj
class StdMeshersDC_Projection2D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Projection2D"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Projection_2D"
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates projection 2D algorithm for faces"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
+ pass
## Defines "Source Face" hypothesis, specifying a meshed face, from where
# a mesh pattern is taken, and, optionally, the association of vertices
hyp.SetVertexAssociation( srcV1, srcV2, tgtV1, tgtV2 )
return hyp
-# Public class: Mesh_Projection1D2D
-# ---------------------------------
+ pass # end of StdMeshersDC_Projection2D class
## Defines a projection 1D-2D algorithm
-# It is created by calling Mesh.Projection1D2D(geom=0)
+#
+# It is created by calling smesh.Mesh.Projection1D2D(geom=0)
#
# @ingroup l3_algos_proj
-
class StdMeshersDC_Projection1D2D(StdMeshersDC_Projection2D):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Projection1D2D"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Projection_1D2D"
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates projection 1D-2D algorithm for edges and faces"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
StdMeshersDC_Projection2D.__init__(self, mesh, geom)
+ pass
-# Public class: Mesh_Projection3D
-# ------------------------------
+ pass # end of StdMeshersDC_Projection1D2D class
## Defines a projection 3D algorithm
-# It is created by calling Mesh.Projection3D(COMPOSITE)
+#
+# It is created by calling smesh.Mesh.Projection3D(geom=0)
#
# @ingroup l3_algos_proj
-#
class StdMeshersDC_Projection3D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Projection3D"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Projection_3D"
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates projection 3D algorithm for volumes"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
+ pass
## Defines the "Source Shape 3D" hypothesis, specifying a meshed solid, from where
# the mesh pattern is taken, and, optionally, the association of vertices
#elif srcV1 or srcV2 or tgtV1 or tgtV2:
return hyp
-# Public class: Mesh_Prism
-# ------------------------
+ pass # end of StdMeshersDC_Projection3D class
## Defines a Prism 3D algorithm, which is either "Extrusion 3D" or "Radial Prism"
# depending on geometry
-# It is created by calling Mesh.Prism(geom=0)
+#
+# It is created by calling smesh.Mesh.Prism(geom=0)
#
# @ingroup l3_algos_3dextr
-#
class StdMeshersDC_Prism3D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Prism"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Prism_3D"
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates prism 3D algorithm for volumes"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
nbShells = len( SubShapeAll( shape, ShapeType["SHELL"] ))
if nbSolids == 0 or nbSolids == nbShells:
self.Create(mesh, geom, "Prism_3D")
+ pass
else:
self.algoType = "RadialPrism_3D"
self.Create(mesh, geom, "RadialPrism_3D")
self.distribHyp = self.Hypothesis("LayerDistribution", UseExisting=0)
self.nbLayers = None
+ pass
+ pass
## Return 3D hypothesis holding the 1D one
def Get3DHypothesis(self):
hyp.SetFineness( fineness )
return hyp
+ pass # end of StdMeshersDC_Prism3D class
-# Public class: Mesh_RadialQuadrangle1D2D
-# -------------------------------
-
-## Defines a Radial Quadrangle 1D2D algorithm
-# It is created by calling Mesh.Quadrangle(RADIAL_QUAD,geom=0)
+## Defines a Radial Quadrangle 1D-2D algorithm
+#
+# It is created by calling smesh.Mesh.Quadrangle(smesh.RADIAL_QUAD,geom=0)
#
# @ingroup l2_algos_radialq
class StdMeshersDC_RadialQuadrangle1D2D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "Quadrangle"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = RADIAL_QUAD
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates quadrangle 1D-2D algorithm for triangular faces"
## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
self.distribHyp = None #self.Hypothesis("LayerDistribution2D", UseExisting=0)
self.nbLayers = None
+ pass
## Return 2D hypothesis holding the 1D one
def Get2DHypothesis(self):
hyp.SetFineness( fineness )
return hyp
+ pass # end of StdMeshersDC_RadialQuadrangle1D2D class
-# Public class: Mesh_UseExistingElements
-# --------------------------------------
-## Defines a Radial Quadrangle 1D2D algorithm
-# It is created by calling Mesh.UseExisting1DElements(geom=0)
+## Defines a Use Existing Elements 1D algorithm
+#
+# It is created by calling smesh.Mesh.UseExisting1DElements(geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_UseExistingElements_1D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "UseExisting1DElements"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Import_1D"
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates 1D algorithm for edges with reusing of existing mesh elements"
+ ## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
- return
+ pass
## Defines "Source edges" hypothesis, specifying groups of edges to import
# @param groups list of groups of edges
hyp.SetCopySourceMesh(toCopyMesh, toCopyGroups)
return hyp
-# Public class: Mesh_UseExistingElements
-# --------------------------------------
-## Defines a Radial Quadrangle 1D2D algorithm
-# It is created by calling Mesh.UseExisting2DElements(geom=0)
+ pass # end of StdMeshersDC_UseExistingElements_1D class
+
+## Defines a Use Existing Elements 1D-2D algorithm
+#
+# It is created by calling smesh.Mesh.UseExisting2DElements(geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_UseExistingElements_1D2D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "UseExisting2DElements"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Import_1D2D"
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates 1D-2D algorithm for edges/faces with reusing of existing mesh elements"
+ ## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
Mesh_Algorithm.__init__(self)
self.Create(mesh, geom, self.algoType)
- return
+ pass
## Defines "Source faces" hypothesis, specifying groups of faces to import
# @param groups list of groups of faces
hyp.SetCopySourceMesh(toCopyMesh, toCopyGroups)
return hyp
+ pass # end of StdMeshersDC_UseExistingElements_1D2D class
-# Public class: Mesh_Cartesian_3D
-# --------------------------------------
## Defines a Body Fitting 3D algorithm
-# It is created by calling Mesh.BodyFitted(geom=0)
+#
+# It is created by calling smesh.Mesh.BodyFitted(geom=0)
#
# @ingroup l3_algos_basic
class StdMeshersDC_Cartesian_3D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "BodyFitted"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "Cartesian_3D"
+ ## flag pointing either this algorithm should be used by default in dynamic method
+ # of smesh.Mesh class
+ # @internal
isDefault = True
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates body fitting 3D algorithm for volumes"
+ ## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
self.Create(mesh, geom, self.algoType)
self.hyp = None
- return
+ pass
## Defines "Body Fitting parameters" hypothesis
# @param xGridDef is definition of the grid along the X asix.
self.hyp.SetSizeThreshold( sizeThreshold )
return self.hyp
-# Public class: Mesh_UseExisting_1D
-# ---------------------------------
+ pass # end of StdMeshersDC_Cartesian_3D class
+
## Defines a stub 1D algorithm, which enables "manual" creation of nodes and
# segments usable by 2D algoritms
-# It is created by calling Mesh.UseExistingSegments(geom=0)
+#
+# It is created by calling smesh.Mesh.UseExistingSegments(geom=0)
#
# @ingroup l3_algos_basic
-
class StdMeshersDC_UseExisting_1D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "UseExistingSegments"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "UseExisting_1D"
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates 1D algorithm for edges with reusing of existing mesh elements"
+ ## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
self.Create(mesh, geom, self.algoType)
+ pass
+ pass # end of StdMeshersDC_UseExisting_1D class
-# Public class: Mesh_UseExisting
-# -------------------------------
## Defines a stub 2D algorithm, which enables "manual" creation of nodes and
# faces usable by 3D algoritms
-# It is created by calling Mesh.UseExistingFaces(geom=0)
+#
+# It is created by calling smesh.Mesh.UseExistingFaces(geom=0)
#
# @ingroup l3_algos_basic
-
class StdMeshersDC_UseExisting_2D(Mesh_Algorithm):
- ## Name of method of class Mesh creating an instance of this class
+ ## name of the dynamic method in smesh.Mesh class
+ # @internal
meshMethod = "UseExistingFaces"
- ## Name of algorithm type
+ ## type of algorithm used with helper function in smesh.Mesh class
+ # @internal
algoType = "UseExisting_2D"
+ ## doc string of the method
+ # @internal
+ docHelper = "Creates 2D algorithm for faces with reusing of existing mesh elements"
+ ## Private constructor.
+ # @param mesh parent mesh object algorithm is assigned to
+ # @param geom geometry (shape/sub-shape) algorithm is assigned to;
+ # if it is @c 0 (default), the algorithm is assigned to the main shape
def __init__(self, mesh, geom=0):
self.Create(mesh, geom, self.algoType)
+ pass
+
+ pass # end of StdMeshersDC_UseExisting_2D class
import smeshDC
from smeshDC import *
-# get instance of class smeshDC
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.init_smesh(salome.myStudy,geompy.geom)
+# retrieve SMESH engine in try/except block
+# to avoid problems in some cases, e.g. when generating documentation
+try:
+ # get instance of class smeshDC
+ smesh = salome.lcc.FindOrLoadComponent( "FactoryServer", "SMESH" )
+ smesh.init_smesh( salome.myStudy, geompy.geom )
+except:
+ smesh = None
+ pass
-# load plugins
+# load plugins and add dynamically generated methods to Mesh class,
+# the same for for global variables declared by plug-ins
from smeshDC import Mesh, algoCreator
-for pluginName in os.environ["SMESH_MeshersList"].split(":"):
+for pluginName in os.environ[ "SMESH_MeshersList" ].split( ":" ):
+ #
+ pluginName += "DC"
+ try:
+ exec( "from %s import *" % pluginName )
+ except Exception, e:
+ print "Exception while loading %s: %s" % ( pluginName, e )
+ continue
+ exec( "import %s" % pluginName )
+ plugin = eval( pluginName )
- pluginName += "DC"
- try:
- exec("from %s import *" % pluginName )
- except Exception, e:
- print "Exception while loading %s: %s" % ( pluginName, e )
- continue
- exec("import %s" % pluginName )
- plugin = eval(pluginName)
+ # add methods creating algorithms to Mesh
+ for k in dir( plugin ):
+ if k[0] == '_': continue
+ algo = getattr( plugin, k )
+ if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod" ):
+ if not hasattr( Mesh, algo.meshMethod ):
+ setattr( Mesh, algo.meshMethod, algoCreator() )
+ pass
+ getattr( Mesh, algo.meshMethod ).add( algo )
+ pass
+ pass
+ pass
+del pluginName
- # add methods creating algorithms to Mesh
- for k in dir(plugin):
- if k[0] == '_':continue
- algo = getattr(plugin,k)
- if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod"):
- if not hasattr( Mesh, algo.meshMethod ):
- setattr( Mesh, algo.meshMethod, algoCreator())
- getattr( Mesh, algo.meshMethod ).add( algo )
-
-# Export the methods of smeshDC
-for k in dir(smesh):
- if k[0] == '_':continue
- globals()[k]=getattr(smesh,k)
-del k
+# export the methods of smeshDC
+if smesh:
+ for k in dir( smesh ):
+ if k[0] == '_': continue
+ globals()[k] = getattr( smesh, k )
+ del k
+ pass
# Author : Francis KLOSS, OCC
# Module : SMESH
-"""
- \namespace smesh
- \brief Module smesh
-"""
+## @package smesh
+# Python API for SALOME %Mesh module
## @defgroup l1_auxiliary Auxiliary methods and structures
## @defgroup l1_creating Creating meshes
import SMESH # This is necessary for back compatibility
from SMESH import *
+from smesh_algorithm import Mesh_Algorithm
import SALOME
import SALOMEDS
aMeshes.append(aMesh)
return aMeshes, aStatus
+ ## Creates a Mesh object importing data from the given GMF file
+ # @return [ an instance of Mesh class, SMESH::ComputeError ]
+ # @ingroup l2_impexp
+ def CreateMeshesFromGMF( self, theFileName ):
+ aSmeshMesh, error = SMESH._objref_SMESH_Gen.CreateMeshesFromGMF(self,theFileName)
+ if error.comment: print "*** CreateMeshesFromGMF() errors:\n", error.comment
+ return Mesh(self, self.geompyD, aSmeshMesh), error
+
## Concatenate the given meshes into one mesh.
# @return an instance of Mesh class
# @param meshes the meshes to combine into one mesh
if studyID != geompyD.myStudyId:
geompyD.init_geom( smeshpyD.GetCurrentStudy())
pass
- geo_name = "%s_%s_for_meshing"%(self.geom.GetShapeType(), id(self.geom)%100)
+ if name:
+ geo_name = name
+ else:
+ geo_name = "%s_%s_for_meshing"%(self.geom.GetShapeType(), id(self.geom)%100)
geompyD.addToStudy( self.geom, geo_name )
self.mesh = self.smeshpyD.CreateMesh(self.geom)
except:
shapeText = " on subshape #%s" % (err.subShapeID)
errText = ""
- stdErrors = ["OK", #COMPERR_OK
- "Invalid input mesh", #COMPERR_BAD_INPUT_MESH
- "std::exception", #COMPERR_STD_EXCEPTION
- "OCC exception", #COMPERR_OCC_EXCEPTION
- "SALOME exception", #COMPERR_SLM_EXCEPTION
- "Unknown exception", #COMPERR_EXCEPTION
+ stdErrors = ["OK", #COMPERR_OK
+ "Invalid input mesh", #COMPERR_BAD_INPUT_MESH
+ "std::exception", #COMPERR_STD_EXCEPTION
+ "OCC exception", #COMPERR_OCC_EXCEPTION
+ "SALOME exception", #COMPERR_SLM_EXCEPTION
+ "Unknown exception", #COMPERR_EXCEPTION
"Memory allocation problem", #COMPERR_MEMORY_PB
- "Algorithm failed", #COMPERR_ALGO_FAILED
- "Unexpected geometry"]#COMPERR_BAD_SHAPE
+ "Algorithm failed", #COMPERR_ALGO_FAILED
+ "Unexpected geometry", #COMPERR_BAD_SHAPE
+ "Warning", #COMPERR_WARNING
+ "Computation cancelled",#COMPERR_CANCELED
+ "No mesh on sub-shape"] #COMPERR_NO_MESH_ON_SHAPE
if err.code > 0:
if err.code < len(stdErrors): errText = stdErrors[err.code]
else:
meshPart = self.mesh
self.mesh.ExportCGNS(meshPart, f, overwrite)
+ ## Exports the mesh in a file in GMF format
+ # @param f is the file name
+ # @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh
+ # @ingroup l2_impexp
+ def ExportGMF(self, f, meshPart=None):
+ if isinstance( meshPart, list ):
+ meshPart = self.GetIDSource( meshPart, SMESH.ALL )
+ if isinstance( meshPart, Mesh ):
+ meshPart = meshPart.mesh
+ elif not meshPart:
+ meshPart = self.mesh
+ self.mesh.ExportGMF(meshPart, f)
+
## Deprecated, used only for compatibility! Please, use ExportToMEDX() method instead.
# Exports the mesh in a file in MED format and chooses the \a version of MED format
## allowing to overwrite the file if it exists or add the exported data to its contents
# @return an instance of SMESH_MeshEditor
# @ingroup l1_modifying
def GetMeshEditor(self):
- return self.mesh.GetMeshEditor()
+ return self.editor
## Wrap a list of IDs of elements or nodes into SMESH_IDSource which
# can be passed as argument to a method accepting mesh, group or sub-mesh
# @return an instance of SMESH_IDSource
# @ingroup l1_auxiliary
def GetIDSource(self, ids, elemType):
- return self.GetMeshEditor().MakeIDSource(ids, elemType)
+ return self.editor.MakeIDSource(ids, elemType)
## Gets MED Mesh
# @return an instance of SALOME_MED::MESH
def DoubleNodeElemGroupsInRegion(self, theElems, theNodesNot, theShape):
return self.editor.DoubleNodeElemGroupsInRegion(theElems, theNodesNot, theShape)
+ ## Identify the elements that will be affected by node duplication (actual duplication is not performed.
+ # This method is the first step of DoubleNodeElemGroupsInRegion.
+ # @param theElems - list of groups of elements (edges or faces) to be replicated
+ # @param theNodesNot - list of groups of nodes not to replicated
+ # @param theShape - shape to detect affected elements (element which geometric center
+ # located on or inside shape).
+ # The replicated nodes should be associated to affected elements.
+ # @return groups of affected elements
+ # @ingroup l2_modif_edit
+ def AffectedElemGroupsInRegion(self, theElems, theNodesNot, theShape):
+ return self.editor.AffectedElemGroupsInRegion(theElems, theNodesNot, theShape)
+
## Double nodes on shared faces between groups of volumes and create flat elements on demand.
# The list of groups must describe a partition of the mesh volumes.
# The nodes of the internal faces at the boundaries of the groups are doubled.
# @return TRUE if operation has been completed successfully, FALSE otherwise
def CreateFlatElementsOnFacesGroups(self, theGroupsOfFaces ):
return self.editor.CreateFlatElementsOnFacesGroups( theGroupsOfFaces )
+
+ ## identify all the elements around a geom shape, get the faces delimiting the hole
+ #
+ def CreateHoleSkin(self, radius, theShape, groupName, theNodesCoords):
+ return self.editor.CreateHoleSkin( radius, theShape, groupName, theNodesCoords )
def _valueFromFunctor(self, funcType, elemId):
fn = self.smeshpyD.GetFunctor(funcType)
def GetSkew(self, elemId):
return self._valueFromFunctor(SMESH.FT_Skew, elemId)
-## The mother class to define algorithm, it is not recommended to use it directly.
+ pass # end of Mesh class
+
+## Helper class for wrapping of SMESH.SMESH_Pattern CORBA class
#
-# For each meshing algorithm, a python class inheriting from class Mesh_Algorithm
-# should be defined. This descendant class sould have two attributes defining the way
-# it is created by class Mesh (see e.g. class StdMeshersDC_Segment in StdMeshersDC.py).
-# - meshMethod attribute defines name of method of class Mesh by calling which the
-# python class of algorithm is created. E.g. if in class MyPlugin_Algorithm
-# meshMethod = "MyAlgorithm", then an instance of MyPlugin_Algorithm is created
-# by the following code: my_algo = mesh.MyAlgorithm()
-# - algoType defines name of algorithm type and is used mostly to discriminate
-# algorithms that are created by the same method of class Mesh. E.g. if
-# MyPlugin_Algorithm.algoType = "MyPLUGIN" then it's creation code can be:
-# my_algo = mesh.MyAlgorithm(algo="MyPLUGIN")
-# @ingroup l2_algorithms
-class Mesh_Algorithm:
- # @class Mesh_Algorithm
- # @brief Class Mesh_Algorithm
-
- #def __init__(self,smesh):
- # self.smesh=smesh
- def __init__(self):
- self.mesh = None
- self.geom = None
- self.subm = None
- self.algo = None
-
- ## Finds a hypothesis in the study by its type name and parameters.
- # Finds only the hypotheses created in smeshpyD engine.
- # @return SMESH.SMESH_Hypothesis
- def FindHypothesis (self, hypname, args, CompareMethod, smeshpyD):
- study = smeshpyD.GetCurrentStudy()
- #to do: find component by smeshpyD object, not by its data type
- scomp = study.FindComponent(smeshpyD.ComponentDataType())
- if scomp is not None:
- res,hypRoot = scomp.FindSubObject(SMESH.Tag_HypothesisRoot)
- # Check if the root label of the hypotheses exists
- if res and hypRoot is not None:
- iter = study.NewChildIterator(hypRoot)
- # Check all published hypotheses
- while iter.More():
- hypo_so_i = iter.Value()
- attr = hypo_so_i.FindAttribute("AttributeIOR")[1]
- if attr is not None:
- anIOR = attr.Value()
- hypo_o_i = salome.orb.string_to_object(anIOR)
- if hypo_o_i is not None:
- # Check if this is a hypothesis
- hypo_i = hypo_o_i._narrow(SMESH.SMESH_Hypothesis)
- if hypo_i is not None:
- # Check if the hypothesis belongs to current engine
- if smeshpyD.GetObjectId(hypo_i) > 0:
- # Check if this is the required hypothesis
- if hypo_i.GetName() == hypname:
- # Check arguments
- if CompareMethod(hypo_i, args):
- # found!!!
- return hypo_i
- pass
- pass
- pass
- pass
- pass
- iter.Next()
- pass
- pass
- pass
- return None
-
- ## Finds the algorithm in the study by its type name.
- # Finds only the algorithms, which have been created in smeshpyD engine.
- # @return SMESH.SMESH_Algo
- def FindAlgorithm (self, algoname, smeshpyD):
- study = smeshpyD.GetCurrentStudy()
- if not study: return None
- #to do: find component by smeshpyD object, not by its data type
- scomp = study.FindComponent(smeshpyD.ComponentDataType())
- if scomp is not None:
- res,hypRoot = scomp.FindSubObject(SMESH.Tag_AlgorithmsRoot)
- # Check if the root label of the algorithms exists
- if res and hypRoot is not None:
- iter = study.NewChildIterator(hypRoot)
- # Check all published algorithms
- while iter.More():
- algo_so_i = iter.Value()
- attr = algo_so_i.FindAttribute("AttributeIOR")[1]
- if attr is not None:
- anIOR = attr.Value()
- algo_o_i = salome.orb.string_to_object(anIOR)
- if algo_o_i is not None:
- # Check if this is an algorithm
- algo_i = algo_o_i._narrow(SMESH.SMESH_Algo)
- if algo_i is not None:
- # Checks if the algorithm belongs to the current engine
- if smeshpyD.GetObjectId(algo_i) > 0:
- # Check if this is the required algorithm
- if algo_i.GetName() == algoname:
- # found!!!
- return algo_i
- pass
- pass
- pass
- pass
- iter.Next()
- pass
- pass
- pass
- return None
-
- ## If the algorithm is global, returns 0; \n
- # else returns the submesh associated to this algorithm.
- def GetSubMesh(self):
- return self.subm
-
- ## Returns the wrapped mesher.
- def GetAlgorithm(self):
- return self.algo
-
- ## Gets the list of hypothesis that can be used with this algorithm
- def GetCompatibleHypothesis(self):
- mylist = []
- if self.algo:
- mylist = self.algo.GetCompatibleHypothesis()
- return mylist
-
- ## Gets the name of the algorithm
- def GetName(self):
- GetName(self.algo)
-
- ## Sets the name to the algorithm
- def SetName(self, name):
- self.mesh.smeshpyD.SetName(self.algo, name)
-
- ## Gets the id of the algorithm
- def GetId(self):
- return self.algo.GetId()
-
- ## Private method.
- def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"):
- if geom is None:
- raise RuntimeError, "Attemp to create " + hypo + " algoritm on None shape"
- algo = self.FindAlgorithm(hypo, mesh.smeshpyD)
- if algo is None:
- algo = mesh.smeshpyD.CreateHypothesis(hypo, so)
- pass
- self.Assign(algo, mesh, geom)
- return self.algo
-
- ## Private method
- def Assign(self, algo, mesh, geom):
- if geom is None:
- raise RuntimeError, "Attemp to create " + algo + " algoritm on None shape"
- self.mesh = mesh
- name = ""
- if not geom:
- self.geom = mesh.geom
- else:
- self.geom = geom
- AssureGeomPublished( mesh, geom )
- try:
- name = GetName(geom)
- pass
- except:
- pass
- self.subm = mesh.mesh.GetSubMesh(geom, algo.GetName())
- self.algo = algo
- status = mesh.mesh.AddHypothesis(self.geom, self.algo)
- TreatHypoStatus( status, algo.GetName(), name, True )
- return
-
- def CompareHyp (self, hyp, args):
- print "CompareHyp is not implemented for ", self.__class__.__name__, ":", hyp.GetName()
- return False
-
- def CompareEqualHyp (self, hyp, args):
- return True
-
- ## Private method
- def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so",
- UseExisting=0, CompareMethod=""):
- hypo = None
- if UseExisting:
- if CompareMethod == "": CompareMethod = self.CompareHyp
- hypo = self.FindHypothesis(hyp, args, CompareMethod, self.mesh.smeshpyD)
- pass
- if hypo is None:
- hypo = self.mesh.smeshpyD.CreateHypothesis(hyp, so)
- a = ""
- s = "="
- for arg in args:
- argStr = str(arg)
- if isinstance( arg, geompyDC.GEOM._objref_GEOM_Object ):
- argStr = arg.GetStudyEntry()
- if not argStr: argStr = "GEOM_Obj_%s", arg.GetEntry()
- if len( argStr ) > 10:
- argStr = argStr[:7]+"..."
- if argStr[0] == '[': argStr += ']'
- a = a + s + argStr
- s = ","
- pass
- if len(a) > 50:
- a = a[:47]+"..."
- self.mesh.smeshpyD.SetName(hypo, hyp + a)
- pass
- geomName=""
- if self.geom:
- geomName = GetName(self.geom)
- status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
- TreatHypoStatus( status, GetName(hypo), geomName, 0 )
- return hypo
-
- ## Returns entry of the shape to mesh in the study
- def MainShapeEntry(self):
- if not self.mesh or not self.mesh.GetMesh(): return ""
- if not self.mesh.GetMesh().HasShapeToMesh(): return ""
- shape = self.mesh.GetShape()
- return shape.GetStudyEntry()
-
- ## Defines "ViscousLayers" hypothesis to give parameters of layers of prisms to build
- # near mesh boundary. This hypothesis can be used by several 3D algorithms:
- # NETGEN 3D, GHS3D, Hexahedron(i,j,k)
- # @param thickness total thickness of layers of prisms
- # @param numberOfLayers number of layers of prisms
- # @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
- # @param ignoreFaces list of geometrical faces (or their ids) not to generate layers on
- # @ingroup l3_hypos_additi
- def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, ignoreFaces=[]):
- if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo):
- raise TypeError, "ViscousLayers are supported by 3D algorithms only"
- if not "ViscousLayers" in self.GetCompatibleHypothesis():
- raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
- if ignoreFaces and isinstance( ignoreFaces[0], geompyDC.GEOM._objref_GEOM_Object ):
- ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ]
- hyp = self.Hypothesis("ViscousLayers",
- [thickness, numberOfLayers, stretchFactor, ignoreFaces])
- hyp.SetTotalThickness(thickness)
- hyp.SetNumberLayers(numberOfLayers)
- hyp.SetStretchFactor(stretchFactor)
- hyp.SetIgnoreFaces(ignoreFaces)
- return hyp
-
- ## Transform a list of ether edges or tuples (edge, 1st_vertex_of_edge)
- # into a list acceptable to SetReversedEdges() of some 1D hypotheses
- # @ingroup l3_hypos_1dhyps
- def ReversedEdgeIndices(self, reverseList):
- resList = []
- geompy = self.mesh.geompyD
- for i in reverseList:
- if isinstance( i, int ):
- s = geompy.SubShapes(self.mesh.geom, [i])[0]
- if s.GetShapeType() != geompyDC.GEOM.EDGE:
- raise TypeError, "Not EDGE index given"
- resList.append( i )
- elif isinstance( i, geompyDC.GEOM._objref_GEOM_Object ):
- if i.GetShapeType() != geompyDC.GEOM.EDGE:
- raise TypeError, "Not an EDGE given"
- resList.append( geompy.GetSubShapeID(self.mesh.geom, i ))
- elif len( i ) > 1:
- e = i[0]
- v = i[1]
- if not isinstance( e, geompyDC.GEOM._objref_GEOM_Object ) or \
- not isinstance( v, geompyDC.GEOM._objref_GEOM_Object ):
- raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
- if v.GetShapeType() == geompyDC.GEOM.EDGE and \
- e.GetShapeType() == geompyDC.GEOM.VERTEX:
- v,e = e,v
- if e.GetShapeType() != geompyDC.GEOM.EDGE or \
- v.GetShapeType() != geompyDC.GEOM.VERTEX:
- raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
- vFirst = FirstVertexOnCurve( e )
- tol = geompy.Tolerance( vFirst )[-1]
- if geompy.MinDistance( v, vFirst ) > 1.5*tol:
- resList.append( geompy.GetSubShapeID(self.mesh.geom, e ))
- else:
- raise TypeError, "Item must be either an edge or tuple (edge, 1st_vertex_of_edge)"
- return resList
-
-
class Pattern(SMESH._objref_SMESH_Pattern):
def ApplyToMeshFaces(self, theMesh, theFacesIDs, theNodeIndexOnKeyPoint1, theReverse):
theMesh.SetParameters(Parameters)
return SMESH._objref_SMESH_Pattern.ApplyToHexahedrons( self, theMesh, theVolumesIDs, theNode000Index, theNode001Index )
-#Registering the new proxy for Pattern
+# Registering the new proxy for Pattern
omniORB.registerObjref(SMESH._objref_SMESH_Pattern._NP_RepositoryId, Pattern)
-
-
-
-
## Private class used to bind methods creating algorithms to the class Mesh
#
class algoCreator:
return None
# Private class used to substitute and store variable parameters of hypotheses.
+#
class hypMethodWrapper:
def __init__(self, hyp, method):
self.hyp = hyp
--- /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
+#
+
+## @package smesh_algorithm
+# Python API for base Mesh_Algorithm class.
+# This package is a part of SALOME %Mesh module Python API
+
+import salome
+import geompyDC
+import SMESH
+
+## The base class to define meshing algorithms
+#
+# @note This class should not be used directly, it is supposed to be sub-classed
+# for implementing Python API for specific meshing algorithms
+#
+# For each meshing algorithm, a python class inheriting from class %Mesh_Algorithm
+# should be defined. This descendant class should have two attributes defining the way
+# it is created by class Mesh (see e.g. class @ref StdMeshersDC.StdMeshersDC_Segment "StdMeshersDC_Segment"
+# in StdMeshersDC package):
+# - @c meshMethod attribute defines name of method of class smesh.Mesh by calling which the
+# python class of algorithm is created; this method is dynamically added to the smesh.Mesh class
+# in runtime. For example, if in @c class MyPlugin_Algorithm this attribute is defined as
+# @code
+# meshMethod = "MyAlgorithm"
+# @endcode
+# then an instance of @c MyPlugin_Algorithm can be created by the direct invokation of the function
+# of smesh.Mesh class:
+# @code
+# my_algo = mesh.MyAlgorithm()
+# @endcode
+# - @c algoType defines type of algorithm and is used mostly to discriminate
+# algorithms that are created by the same method of class smesh.Mesh. For example, if this attribute
+# is specified in @c MyPlugin_Algorithm class as
+# @code
+# algoType = "MyPLUGIN"
+# @endcode
+# then it's creation code can be:
+# @code
+# my_algo = mesh.MyAlgorithm(algo="MyPLUGIN")
+# @endcode
+# @ingroup l2_algorithms
+class Mesh_Algorithm:
+
+ ## Private constuctor
+ def __init__(self):
+ self.mesh = None
+ self.geom = None
+ self.subm = None
+ self.algo = None
+ pass
+
+ ## Finds a hypothesis in the study by its type name and parameters.
+ # Finds only the hypotheses created in smeshpyD engine.
+ # @return SMESH.SMESH_Hypothesis
+ def FindHypothesis (self, hypname, args, CompareMethod, smeshpyD):
+ study = smeshpyD.GetCurrentStudy()
+ #to do: find component by smeshpyD object, not by its data type
+ scomp = study.FindComponent(smeshpyD.ComponentDataType())
+ if scomp is not None:
+ res,hypRoot = scomp.FindSubObject(SMESH.Tag_HypothesisRoot)
+ # Check if the root label of the hypotheses exists
+ if res and hypRoot is not None:
+ iter = study.NewChildIterator(hypRoot)
+ # Check all published hypotheses
+ while iter.More():
+ hypo_so_i = iter.Value()
+ attr = hypo_so_i.FindAttribute("AttributeIOR")[1]
+ if attr is not None:
+ anIOR = attr.Value()
+ hypo_o_i = salome.orb.string_to_object(anIOR)
+ if hypo_o_i is not None:
+ # Check if this is a hypothesis
+ hypo_i = hypo_o_i._narrow(SMESH.SMESH_Hypothesis)
+ if hypo_i is not None:
+ # Check if the hypothesis belongs to current engine
+ if smeshpyD.GetObjectId(hypo_i) > 0:
+ # Check if this is the required hypothesis
+ if hypo_i.GetName() == hypname:
+ # Check arguments
+ if CompareMethod(hypo_i, args):
+ # found!!!
+ return hypo_i
+ pass
+ pass
+ pass
+ pass
+ pass
+ iter.Next()
+ pass
+ pass
+ pass
+ return None
+
+ ## Finds the algorithm in the study by its type name.
+ # Finds only the algorithms, which have been created in smeshpyD engine.
+ # @return SMESH.SMESH_Algo
+ def FindAlgorithm (self, algoname, smeshpyD):
+ study = smeshpyD.GetCurrentStudy()
+ if not study: return None
+ #to do: find component by smeshpyD object, not by its data type
+ scomp = study.FindComponent(smeshpyD.ComponentDataType())
+ if scomp is not None:
+ res,hypRoot = scomp.FindSubObject(SMESH.Tag_AlgorithmsRoot)
+ # Check if the root label of the algorithms exists
+ if res and hypRoot is not None:
+ iter = study.NewChildIterator(hypRoot)
+ # Check all published algorithms
+ while iter.More():
+ algo_so_i = iter.Value()
+ attr = algo_so_i.FindAttribute("AttributeIOR")[1]
+ if attr is not None:
+ anIOR = attr.Value()
+ algo_o_i = salome.orb.string_to_object(anIOR)
+ if algo_o_i is not None:
+ # Check if this is an algorithm
+ algo_i = algo_o_i._narrow(SMESH.SMESH_Algo)
+ if algo_i is not None:
+ # Checks if the algorithm belongs to the current engine
+ if smeshpyD.GetObjectId(algo_i) > 0:
+ # Check if this is the required algorithm
+ if algo_i.GetName() == algoname:
+ # found!!!
+ return algo_i
+ pass
+ pass
+ pass
+ pass
+ iter.Next()
+ pass
+ pass
+ pass
+ return None
+
+ ## If the algorithm is global, returns 0; \n
+ # else returns the submesh associated to this algorithm.
+ def GetSubMesh(self):
+ return self.subm
+
+ ## Returns the wrapped mesher.
+ def GetAlgorithm(self):
+ return self.algo
+
+ ## Gets the list of hypothesis that can be used with this algorithm
+ def GetCompatibleHypothesis(self):
+ mylist = []
+ if self.algo:
+ mylist = self.algo.GetCompatibleHypothesis()
+ return mylist
+
+ ## Gets the name of the algorithm
+ def GetName(self):
+ from smesh import GetName
+ return GetName(self.algo)
+
+ ## Sets the name to the algorithm
+ def SetName(self, name):
+ self.mesh.smeshpyD.SetName(self.algo, name)
+
+ ## Gets the id of the algorithm
+ def GetId(self):
+ return self.algo.GetId()
+
+ ## Private method.
+ def Create(self, mesh, geom, hypo, so="libStdMeshersEngine.so"):
+ if geom is None:
+ raise RuntimeError, "Attemp to create " + hypo + " algoritm on None shape"
+ algo = self.FindAlgorithm(hypo, mesh.smeshpyD)
+ if algo is None:
+ algo = mesh.smeshpyD.CreateHypothesis(hypo, so)
+ pass
+ self.Assign(algo, mesh, geom)
+ return self.algo
+
+ ## Private method
+ def Assign(self, algo, mesh, geom):
+ from smesh import AssureGeomPublished, TreatHypoStatus, GetName
+ if geom is None:
+ raise RuntimeError, "Attemp to create " + algo + " algoritm on None shape"
+ self.mesh = mesh
+ name = ""
+ if not geom:
+ self.geom = mesh.geom
+ else:
+ self.geom = geom
+ AssureGeomPublished( mesh, geom )
+ try:
+ name = GetName(geom)
+ pass
+ except:
+ pass
+ self.subm = mesh.mesh.GetSubMesh(geom, algo.GetName())
+ self.algo = algo
+ status = mesh.mesh.AddHypothesis(self.geom, self.algo)
+ TreatHypoStatus( status, algo.GetName(), name, True )
+ return
+
+ def CompareHyp (self, hyp, args):
+ print "CompareHyp is not implemented for ", self.__class__.__name__, ":", hyp.GetName()
+ return False
+
+ def CompareEqualHyp (self, hyp, args):
+ return True
+
+ ## Private method
+ def Hypothesis (self, hyp, args=[], so="libStdMeshersEngine.so",
+ UseExisting=0, CompareMethod=""):
+ from smesh import TreatHypoStatus, GetName
+ hypo = None
+ if UseExisting:
+ if CompareMethod == "": CompareMethod = self.CompareHyp
+ hypo = self.FindHypothesis(hyp, args, CompareMethod, self.mesh.smeshpyD)
+ pass
+ if hypo is None:
+ hypo = self.mesh.smeshpyD.CreateHypothesis(hyp, so)
+ a = ""
+ s = "="
+ for arg in args:
+ argStr = str(arg)
+ if isinstance( arg, geompyDC.GEOM._objref_GEOM_Object ):
+ argStr = arg.GetStudyEntry()
+ if not argStr: argStr = "GEOM_Obj_%s", arg.GetEntry()
+ if len( argStr ) > 10:
+ argStr = argStr[:7]+"..."
+ if argStr[0] == '[': argStr += ']'
+ a = a + s + argStr
+ s = ","
+ pass
+ if len(a) > 50:
+ a = a[:47]+"..."
+ self.mesh.smeshpyD.SetName(hypo, hyp + a)
+ pass
+ geomName=""
+ if self.geom:
+ geomName = GetName(self.geom)
+ status = self.mesh.mesh.AddHypothesis(self.geom, hypo)
+ TreatHypoStatus( status, GetName(hypo), geomName, 0 )
+ return hypo
+
+ ## Returns entry of the shape to mesh in the study
+ def MainShapeEntry(self):
+ if not self.mesh or not self.mesh.GetMesh(): return ""
+ if not self.mesh.GetMesh().HasShapeToMesh(): return ""
+ shape = self.mesh.GetShape()
+ return shape.GetStudyEntry()
+
+ ## Defines "ViscousLayers" hypothesis to give parameters of layers of prisms to build
+ # near mesh boundary. This hypothesis can be used by several 3D algorithms:
+ # NETGEN 3D, GHS3D, Hexahedron(i,j,k)
+ # @param thickness total thickness of layers of prisms
+ # @param numberOfLayers number of layers of prisms
+ # @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
+ # @param ignoreFaces list of geometrical faces (or their ids) not to generate layers on
+ # @ingroup l3_hypos_additi
+ def ViscousLayers(self, thickness, numberOfLayers, stretchFactor, ignoreFaces=[]):
+ if not isinstance(self.algo, SMESH._objref_SMESH_3D_Algo):
+ raise TypeError, "ViscousLayers are supported by 3D algorithms only"
+ if not "ViscousLayers" in self.GetCompatibleHypothesis():
+ raise TypeError, "ViscousLayers are not supported by %s"%self.algo.GetName()
+ if ignoreFaces and isinstance( ignoreFaces[0], geompyDC.GEOM._objref_GEOM_Object ):
+ ignoreFaces = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreFaces ]
+ hyp = self.Hypothesis("ViscousLayers",
+ [thickness, numberOfLayers, stretchFactor, ignoreFaces])
+ hyp.SetTotalThickness(thickness)
+ hyp.SetNumberLayers(numberOfLayers)
+ hyp.SetStretchFactor(stretchFactor)
+ hyp.SetIgnoreFaces(ignoreFaces)
+ return hyp
+
+ ## Transform a list of ether edges or tuples (edge, 1st_vertex_of_edge)
+ # into a list acceptable to SetReversedEdges() of some 1D hypotheses
+ # @ingroup l3_hypos_1dhyps
+ def ReversedEdgeIndices(self, reverseList):
+ from smesh import FirstVertexOnCurve
+ resList = []
+ geompy = self.mesh.geompyD
+ for i in reverseList:
+ if isinstance( i, int ):
+ s = geompy.SubShapes(self.mesh.geom, [i])[0]
+ if s.GetShapeType() != geompyDC.GEOM.EDGE:
+ raise TypeError, "Not EDGE index given"
+ resList.append( i )
+ elif isinstance( i, geompyDC.GEOM._objref_GEOM_Object ):
+ if i.GetShapeType() != geompyDC.GEOM.EDGE:
+ raise TypeError, "Not an EDGE given"
+ resList.append( geompy.GetSubShapeID(self.mesh.geom, i ))
+ elif len( i ) > 1:
+ e = i[0]
+ v = i[1]
+ if not isinstance( e, geompyDC.GEOM._objref_GEOM_Object ) or \
+ not isinstance( v, geompyDC.GEOM._objref_GEOM_Object ):
+ raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
+ if v.GetShapeType() == geompyDC.GEOM.EDGE and \
+ e.GetShapeType() == geompyDC.GEOM.VERTEX:
+ v,e = e,v
+ if e.GetShapeType() != geompyDC.GEOM.EDGE or \
+ v.GetShapeType() != geompyDC.GEOM.VERTEX:
+ raise TypeError, "A list item must be a tuple (edge, 1st_vertex_of_edge)"
+ vFirst = FirstVertexOnCurve( e )
+ tol = geompy.Tolerance( vFirst )[-1]
+ if geompy.MinDistance( v, vFirst ) > 1.5*tol:
+ resList.append( geompy.GetSubShapeID(self.mesh.geom, e ))
+ else:
+ raise TypeError, "Item must be either an edge or tuple (edge, 1st_vertex_of_edge)"
+ return resList
+
// SALOME GUI includes
#include <SUIT_Session.h>
+#include <SUIT_ViewManager.h>
+#include <SALOME_Prs.h>
+#include <SUIT_ViewWindow.h>
#include <VTKViewer_ViewModel.h>
#include <SALOME_Event.h>
#include <SalomeApp_Application.h>
ProcessVoidEvent(new TEvent(Mesh_Entry));
}
+void SMESH_Swig::EraseActor( const char* Mesh_Entry, const bool allViewers )
+{
+ class TEvent: public SALOME_Event
+ {
+ private:
+ const char* _entry;
+ bool _allViewers;
+ public:
+ TEvent(const char* Mesh_Entry, const bool allViewers ) {
+ _entry = Mesh_Entry;
+ _allViewers = allViewers;
+ }
+ virtual void Execute() {
+ SUIT_Session* aSession = SUIT_Session::session();
+ SUIT_Application* anApplication = aSession->activeApplication();
+ SalomeApp_Application* anApp = dynamic_cast<SalomeApp_Application*>(anApplication);
+ SMESHGUI_Displayer* aDisp = new SMESHGUI_Displayer(anApp);
+ ViewManagerList aManagers;
+ if ( !_allViewers ) {
+ aManagers << anApp->activeViewManager();
+ }
+ else {
+ aManagers = anApp->viewManagers();
+ }
+ foreach( SUIT_ViewManager* aMgr, aManagers ) {
+ if ( aMgr && aMgr->getType() == VTKViewer_Viewer::Type() ) {
+ SALOME_View* aSalomeView = dynamic_cast<SALOME_View*>(aMgr->getViewModel());
+ if (aSalomeView) {
+ aDisp->Erase(_entry,true, true, aSalomeView);
+ }
+ }
+ }
+ }
+ };
+
+ ProcessVoidEvent(new TEvent(Mesh_Entry, allViewers));
+}
+
void SMESH_Swig::SetName(const char* theEntry,
const char* theName)
{
void SetName( const char*, const char* );
+ void EraseActor( const char*, const bool allViewers = false );
+
/*!
* \brief Set mesh icon according to compute status
* \param Mesh_Entry - entry of a mesh
void SetMeshIcon(const char* Mesh_Entry, const bool isComputed, const bool isEmpty);
void CreateAndDisplayActor( const char* Mesh_Entry );
+ void EraseActor( const char* Mesh_Entry, const bool allViewers = false );
};
#include "utilities.h"
#include "Utils_ExceptHandlers.hxx"
+#include <Basics_OCCTVersion.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepBndLib.hxx>
//#define _MY_DEBUG_
-#define ELLIPSOLID_WORKAROUND // remove it as soon as http://tracker.dev.opencascade.org/view.php?id=22809 is solved
+#if OCC_VERSION_LARGE <= 0x06050300
+// workaround it required only for OCCT6.5.3 and older (see OCC22809)
+#define ELLIPSOLID_WORKAROUND
+#endif
#ifdef ELLIPSOLID_WORKAROUND
#include <BRepIntCurveSurface_Inter.hxx>
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
/*!
* \brief A 3D algorithm generating 3D structured Cartesian mesh in the
#define _SMESH_CompositeSegment_1D_HXX_
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
class SMESH_Mesh;
class StdMeshers_FaceSide;
#define __StdMeshers_HexaFromSkin_3D_HXX__
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
/*!
* \brief Alorithm generating hexahedral mesh from 2D skin of block
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
class StdMeshers_ViscousLayers;
_ListenerData(const StdMeshers_ImportSource1D* h, _ListenerDataType type=SRC_HYP):
SMESH_subMeshEventListenerData(/*isDeletable=*/true), _srcHyp(h)
{
- myType = type;
+ myType = type;
}
};
//================================================================================
//=============================================================================
/*!
- * Import elements from the other mesh
+ * Import elements from the other mesh
*/
//=============================================================================
subShapeIDs.insert( shapeID );
// get nodes on vertices
- list < SMESH_TNodeXYZ > vertexNodes;
- list < SMESH_TNodeXYZ >::iterator vNIt;
+ list < SMESH_TNodeXYZ > vertexNodes;
+ list < SMESH_TNodeXYZ >::iterator vNIt;
TopExp_Explorer vExp( theShape, TopAbs_VERTEX );
for ( ; vExp.More(); vExp.Next() )
{
SMDS_ElemIteratorPtr srcElems = srcGroup->GetElements();
vector<const SMDS_MeshNode*> newNodes;
SMDS_MeshNode *tmpNode = helper.AddNode(0,0,0);
- double u;
+ double u = 0;
while ( srcElems->more() ) // loop on group contents
{
const SMDS_MeshElement* edge = srcElems->next();
newNodes.resize( edge->NbNodes() );
newNodes.back() = 0;
SMDS_MeshElement::iterator node = edge->begin_nodes();
+ SMESH_TNodeXYZ a(edge->GetNode(0));
+ // --- define a tolerance relative to the length of an edge
+ double mytol = a.Distance(edge->GetNode(edge->NbNodes()-1))/25;
+ //MESSAGE("mytol = " << mytol);
for ( unsigned i = 0; i < newNodes.size(); ++i, ++node )
{
TNodeNodeMap::iterator n2nIt = n2n->insert( make_pair( *node, (SMDS_MeshNode*)0 )).first;
{
// find out if node lies on theShape
tmpNode->setXYZ( (*node)->X(), (*node)->Y(), (*node)->Z());
- if ( helper.CheckNodeU( geomEdge, tmpNode, u, 10 * edgeTol, /*force=*/true ))
+ if ( helper.CheckNodeU( geomEdge, tmpNode, u, mytol, /*force=*/true ))
{
SMDS_MeshNode* newNode = tgtMesh->AddNode( (*node)->X(), (*node)->Y(), (*node)->Z());
n2nIt->second = newNode;
*/
//=============================================================================
-void StdMeshers_Import_1D::setEventListener(SMESH_subMesh* subMesh,
+void StdMeshers_Import_1D::setEventListener(SMESH_subMesh* subMesh,
StdMeshers_ImportSource1D* sourceHyp)
{
if ( sourceHyp )
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_1D_Algo.hxx"
+#include "SMESH_Algo.hxx"
#include "SMDS_MeshElement.hxx"
class StdMeshers_ImportSource1D;
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
#include "SMDS_MeshElement.hxx"
class StdMeshers_ImportSource1D;
#include <BRepTools.hxx>
#include <BRep_Tool.hxx>
-#include <Geom_Curve.hxx>
#include <Geom2d_Curve.hxx>
+#include <Geom_Curve.hxx>
#include <Geom_Surface.hxx>
#include <Precision.hxx>
#include <TopExp.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Iterator.hxx>
+#include <TopoDS_Wire.hxx>
#include <gp_Pnt2d.hxx>
#include <BRep_Tool.hxx>
// Moved here from SMESH_MEFISTO_2D.hxx
// Author : Paul RASCLE, EDF
// Module : SMESH
-// $Header$
//
#ifndef _StdMeshers_MEFISTO_2D_HXX_
#define _StdMeshers_MEFISTO_2D_HXX_
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
class TopoDS_Face;
class StdMeshers_MaxElementArea;
// class StdMeshers_SMESHBlock
//
////////////////////////////////////////////////////////////////////////
+#include <TColStd_MapOfInteger.hxx>
+#include <TopTools_IndexedMapOfOrientedShape.hxx>
+#include <TopoDS_Shell.hxx>
+#include <TopoDS_Vertex.hxx>
#include <gp_Pnt.hxx>
#include <gp_XYZ.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopTools_IndexedMapOfOrientedShape.hxx>
-#include <TColStd_MapOfInteger.hxx>
+#include "SMESH_Algo.hxx"
#include "SMESH_Block.hxx"
#include "SMESH_ComputeError.hxx"
#include "SMESH_MesherHelper.hxx"
-#include "SMESH_3D_Algo.hxx"
typedef std::map< double, std::vector<const SMDS_MeshNode*> > StdMeshers_IJNodeMap;
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
-#include "SMDS_TypeOfPosition.hxx"
#include "SMDS_MeshNode.hxx"
+#include "SMDS_TypeOfPosition.hxx"
+#include "SMESHDS_Mesh.hxx"
+#include "SMESH_Algo.hxx"
#include "SMESH_Block.hxx"
+#include "SMESH_Comment.hxx"
#include "SMESH_Mesh.hxx"
-#include "SMESHDS_Mesh.hxx"
-#include "SMESH_subMesh.hxx"
#include "SMESH_MesherHelper.hxx"
-#include "SMESH_Comment.hxx"
+#include "SMESH_subMesh.hxx"
#include <vector>
+#include <Adaptor2d_Curve2d.hxx>
#include <Adaptor3d_Curve.hxx>
#include <Adaptor3d_Surface.hxx>
-#include <Adaptor2d_Curve2d.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <TopTools_IndexedMapOfOrientedShape.hxx>
-#include <gp_XYZ.hxx>
#include <gp_Trsf.hxx>
+#include <gp_XYZ.hxx>
class SMESHDS_SubMesh;
class TopoDS_Faces;
struct TNode;
-//typedef std::map<const SMDS_MeshNode*, const SMDS_MeshNode*> TNodeNodeMap;
typedef std::vector<const SMDS_MeshNode* > TNodeColumn;
// map of bottom nodes to the column of nodes above them
if ( !srcMesh )
srcMesh = mesh;
- if ( MakeComputed( srcMesh->GetSubMesh( srcShape ), iterationNb + 1 ))
- return gen->Compute( *mesh, sm->GetSubShape() );
+ if ( MakeComputed( srcMesh->GetSubMesh( srcShape ), iterationNb + 1 ) &&
+ gen->Compute( *mesh, sm->GetSubShape() ))
+ return sm->IsMeshComputed();
return false;
}
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_1D_Algo.hxx"
+#include "SMESH_Algo.hxx"
class StdMeshers_ProjectionSource1D;
#include "SMESH_Gen.hxx"
#include "SMESH_MesherHelper.hxx"
+#include "SMESH_subMesh.hxx"
#include "SMESH_subMeshEventListener.hxx"
#include "StdMeshers_FaceSide.hxx"
#include "StdMeshers_ProjectionSource2D.hxx"
:SMESH_2D_Algo(hypId, studyId, gen)
{
_name = "Projection_2D";
- _shapeType = (1 << TopAbs_FACE); // 1 bit per shape type
-
_compatibleHypothesis.push_back("ProjectionSource2D");
_sourceHypo = 0;
}
SMESH_subMesh* tgtSubMesh = tgtMesh->GetSubMesh( tgtFace );
if ( tgtMesh == srcMesh ) {
- if ( !TAssocTool::MakeComputed( srcSubMesh ))
+ if ( !TAssocTool::MakeComputed( srcSubMesh ) || !srcSubMesh->IsMeshComputed() )
return error(COMPERR_BAD_INPUT_MESH,"Source mesh not computed");
}
else {
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
class StdMeshers_ProjectionSource2D;
SMESH_Block::GetFaceEdgesIDs( fId, edgeIdVec );
for ( int i = 0; i < edgeIdVec.size(); ++i ) {
int eID = edgeIdVec[ i ];
- shape2ShapeMap.Bind( tgtShapes( eID ), scrShapes( eID ));
+ shape2ShapeMap.Bind( scrShapes( eID ), tgtShapes( eID ));
if ( i < 2 ) {
vector< int > vertexIdVec;
SMESH_Block::GetEdgeVertexIDs( eID, vertexIdVec );
- shape2ShapeMap.Bind( tgtShapes( vertexIdVec[0] ), scrShapes( vertexIdVec[0] ));
- shape2ShapeMap.Bind( tgtShapes( vertexIdVec[1] ), scrShapes( vertexIdVec[1] ));
+ shape2ShapeMap.Bind( scrShapes( vertexIdVec[0]), tgtShapes( vertexIdVec[0]) );
+ shape2ShapeMap.Bind( scrShapes( vertexIdVec[1]), tgtShapes( vertexIdVec[1]) );
}
}
}
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
class StdMeshers_ProjectionSource3D;
#include "SMESH_Algo.hxx"
#include "SMESH_MesherHelper.hxx"
+#include "SMESH_Group.hxx"
+#include "SMESHDS_GroupBase.hxx"
#include <IntAna_IntConicQuad.hxx>
#include <IntAna_Quadric.hxx>
#include <TopoDS.hxx>
#include <gp_Lin.hxx>
#include <gp_Pln.hxx>
+#include "utilities.h"
+#include <string>
#include <numeric>
#include <limits>
}
}
- // Within pyramids, replace nodes to remove by nodes to keep
+ // Within pyramids, replace nodes to remove by nodes to keep
for ( unsigned i = 0; i < pyrams.size(); ++i )
{
// find and remove coincided faces of merged pyramids
vector< const SMDS_MeshElement* > inverseElems
- // copy inverse elements to avoid iteration on changing container
+ // copy inverse elements to avoid iteration on changing container
( TStdElemIterator( CommonNode->GetInverseElementIterator(SMDSAbs_Face)), itEnd);
for ( unsigned i = 0; i < inverseElems.size(); ++i )
{
gp_Ax1 line( P, gp_Vec(P,PC));
vector< const SMDS_MeshElement* > suspectElems;
searcher->GetElementsNearLine( line, SMDSAbs_Face, suspectElems);
-
+
for ( int i = 0; i < suspectElems.size(); ++i )
{
const SMDS_MeshElement* face = suspectElems[i];
if ( face == NotCheckedFace ) continue;
Handle(TColgp_HSequenceOfPnt) aContour = new TColgp_HSequenceOfPnt;
- for ( int i = 0; i < face->NbCornerNodes(); ++i )
+ for ( int i = 0; i < face->NbCornerNodes(); ++i )
aContour->Append( SMESH_TNodeXYZ( face->GetNode(i) ));
if( HasIntersection(P, PC, Pres, aContour) ) {
res = true;
//=======================================================================
//function : Compute
-//purpose :
+//purpose :
//=======================================================================
bool StdMeshers_QuadToTriaAdaptor::Compute(SMESH_Mesh& aMesh,
if ( aMesh.NbQuadrangles() < 1 )
return false;
+ // find if there is a group of faces identified as skin faces, with normal going outside the volume
+ std::string groupName = "skinFaces";
+ SMESHDS_GroupBase* groupDS = 0;
+ SMESH_Mesh::GroupIteratorPtr groupIt = aMesh.GetGroups();
+ while ( groupIt->more() )
+ {
+ groupDS = 0;
+ SMESH_Group * group = groupIt->next();
+ if ( !group ) continue;
+ groupDS = group->GetGroupDS();
+ if ( !groupDS || groupDS->IsEmpty() )
+ {
+ groupDS = 0;
+ continue;
+ }
+ if (groupDS->GetType() != SMDSAbs_Face)
+ {
+ groupDS = 0;
+ continue;
+ }
+ std::string grpName = group->GetName();
+ if (grpName == groupName)
+ {
+ MESSAGE("group skinFaces provided");
+ break;
+ }
+ else
+ groupDS = 0;
+ }
+
vector<const SMDS_MeshElement*> myPyramids;
SMESH_MesherHelper helper(aMesh);
helper.IsQuadraticSubMesh(aMesh.GetShapeToMesh());
SMESH_ProxyMesh::SubMesh* prxSubMesh = getProxySubMesh();
SMDS_FaceIteratorPtr fIt = meshDS->facesIterator(/*idInceasingOrder=*/true);
- while( fIt->more())
+ while( fIt->more())
{
const SMDS_MeshElement* face = fIt->next();
if ( !face ) continue;
continue;
}
- // Case of non-degenerated quadrangle
+ // Case of non-degenerated quadrangle
// Find pyramid peak
}
}
+ // if the face belong to the group of skinFaces, do not build a pyramid outside
+ if (groupDS && groupDS->Contains(face))
+ intersected[0] = false;
+
// Create one or two pyramids
for ( int isRev = 0; isRev < 2; ++isRev )
for(k=0; k<4 && !hasInt; k++) {
gp_Vec Vtmp(PsI[k],PsI[4]);
gp_Pnt Pshift = PsI[k].XYZ() + Vtmp.XYZ() * 0.01; // base node moved a bit to apex
- hasInt =
+ hasInt =
( HasIntersection3( Pshift, PsI[4], Pint, PsJ[0], PsJ[1], PsJ[4]) ||
HasIntersection3( Pshift, PsI[4], Pint, PsJ[1], PsJ[2], PsJ[4]) ||
HasIntersection3( Pshift, PsI[4], Pint, PsJ[2], PsJ[3], PsJ[4]) ||
for(k=0; k<4 && !hasInt; k++) {
gp_Vec Vtmp(PsJ[k],PsJ[4]);
gp_Pnt Pshift = PsJ[k].XYZ() + Vtmp.XYZ() * 0.01;
- hasInt =
+ hasInt =
( HasIntersection3( Pshift, PsJ[4], Pint, PsI[0], PsI[1], PsI[4]) ||
HasIntersection3( Pshift, PsJ[4], Pint, PsI[1], PsI[2], PsI[4]) ||
HasIntersection3( Pshift, PsJ[4], Pint, PsI[2], PsI[3], PsI[4]) ||
PCi += PsI[k].XYZ();
PCj += PsJ[k].XYZ();
}
- PCi /= 4; PCj /= 4;
+ PCi /= 4; PCj /= 4;
gp_Vec VN1(PCi,PsI[4]);
gp_Vec VN2(PCj,PsJ[4]);
gp_Vec VI1(PCi,Pint);
#include "StdMeshers_QuadrangleParams.hxx"
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
#include "Utils_SALOME_Exception.hxx"
#include <TopoDS_Face.hxx>
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_3D_Algo.hxx"
+#include "SMESH_Algo.hxx"
#include "SMDS_MeshNode.hxx"
#include <vector>
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : StdMeshers_RadialQuadrangle_1D2D.cxx
// Module : SMESH
-// Created : Fri Oct 20 11:37:07 2006
-// Author : Edward AGAPOV (eap)
#include "StdMeshers_RadialQuadrangle_1D2D.hxx"
// orientation
bool IsForward = ( CircEdge.Orientation()==TopAbs_FORWARD );
+ const double angleSign = ( F.Orientation() == TopAbs_REVERSED ? -1.0 : 1.0 );
// create nodes and mesh elements on face
// find axis of rotation
gp_Ax1 theAxis(P0,gp_Dir(Axis));
aTrsf.SetRotation( theAxis, Angles.Value(i) );
gp_Trsf2d aTrsf2d;
- aTrsf2d.SetRotation( PC, Angles.Value(i) );
+ aTrsf2d.SetRotation( PC, Angles.Value(i) * angleSign );
// create nodes
int j = 1;
for(; j<=Points.Length(); j++) {
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
#include <TopoDS_Edge.hxx>
bool adjustNeighbors2an = false)
{
int i, nPar = theParams.size();
- if ( a1 + an < length && nPar > 1 )
+ if ( a1 + an <= length && nPar > 1 )
{
bool reverse = ( U1 > Un );
GCPnts_AbscissaPoint Discret(C3d, reverse ? an : -an, Un);
dUn = Utgt - theParams.back();
}
- double q = dUn / ( nPar - 1 );
if ( !adjustNeighbors2an )
{
- q = dUn / ( Utgt - Un ); // (signed) factor of segment length change
+ double q = dUn / ( Utgt - Un ); // (signed) factor of segment length change
for ( itU = theParams.rbegin(), i = 1; i < nPar; i++ ) {
double prevU = *itU;
(*itU) += dUn;
dUn = q * (*itU - prevU) * (prevU-U1)/(Un-U1);
}
}
- else {
+ else if ( nPar == 1 )
+ {
+ theParams.back() += dUn;
+ }
+ else
+ {
+ double q = dUn / ( nPar - 1 );
theParams.back() += dUn;
double sign = reverse ? -1 : 1;
double prevU = theParams.back();
case NB_SEGMENTS: {
double eltSize = 1;
+ int nbSegments;
if ( _hypType == MAX_LENGTH )
{
double nbseg = ceil(theLength / _value[ BEG_LENGTH_IND ]); // integer sup
if (nbseg <= 0)
nbseg = 1; // degenerated edge
eltSize = theLength / nbseg;
+ nbSegments = (int) nbseg;
}
else if ( _hypType == LOCAL_LENGTH )
{
if (nbseg <= 0)
nbseg = 1; // degenerated edge
eltSize = theLength / nbseg;
+ nbSegments = (int) nbseg;
}
else
{
// Number Of Segments hypothesis
- int NbSegm = _ivalue[ NB_SEGMENTS_IND ];
- if ( NbSegm < 1 ) return false;
- if ( NbSegm == 1 ) return true;
+ nbSegments = _ivalue[ NB_SEGMENTS_IND ];
+ if ( nbSegments < 1 ) return false;
+ if ( nbSegments == 1 ) return true;
switch (_ivalue[ DISTR_TYPE_IND ])
{
if (fabs(scale - 1.0) < Precision::Confusion()) {
// special case to avoid division by zero
- for (int i = 1; i < NbSegm; i++) {
- double param = f + (l - f) * i / NbSegm;
+ for (int i = 1; i < nbSegments; i++) {
+ double param = f + (l - f) * i / nbSegments;
theParams.push_back( param );
}
} else {
if ( theReverse )
scale = 1.0 / scale;
- double alpha = pow(scale, 1.0 / (NbSegm - 1));
- double factor = (l - f) / (1.0 - pow(alpha, NbSegm));
+ double alpha = pow(scale, 1.0 / (nbSegments - 1));
+ double factor = (l - f) / (1.0 - pow(alpha, nbSegments));
- for (int i = 1; i < NbSegm; i++) {
+ for (int i = 1; i < nbSegments; i++) {
double param = f + factor * (1.0 - pow(alpha, i));
theParams.push_back( param );
}
}
break;
case StdMeshers_NumberOfSegments::DT_Regular:
- eltSize = theLength / _ivalue[ NB_SEGMENTS_IND ];
+ eltSize = theLength / nbSegments;
break;
default:
return false;
if ( !Discret.IsDone() )
return error( "GCPnts_UniformAbscissa failed");
- int NbPoints = Discret.NbPoints();
- for ( int i = 2; i < NbPoints; i++ )
+ int NbPoints = Min( Discret.NbPoints(), nbSegments + 1 );
+ for ( int i = 2; i < NbPoints; i++ ) // skip 1st and last points
{
double param = Discret.Parameter(i);
theParams.push_back( param );
}
- compensateError( eltSize, eltSize, f, l, theLength, theC3d, theParams ); // for PAL9899
+ compensateError( eltSize, eltSize, f, l, theLength, theC3d, theParams, true ); // for PAL9899
return true;
}
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_1D_Algo.hxx"
+#include "SMESH_Algo.hxx"
#include "StdMeshers_FixedPoints1D.hxx"
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_0D_Algo.hxx"
+#include "SMESH_Algo.hxx"
/*!
* \brief Algorithm existing in order just to enable assignation of
#include "SMESH_StdMeshers.hxx"
-#include "SMESH_1D_Algo.hxx"
-#include "SMESH_2D_Algo.hxx"
+#include "SMESH_Algo.hxx"
/*!
* \brief 1D and 2D algorithms doing nothing to allow mesh generation
{
if ( ! makeLayer(_sdVec[i]) )
return _error;
+
+ if ( _sdVec[i]._edges.size() == 0 )
+ continue;
if ( ! inflate(_sdVec[i]) )
return _error;
else // 2D
{
const gp_XY center( center3D.X(), center3D.Y() );
-
+
gp_XY uv0 = helper.GetNodeUV( F, data._edges[iFrom]->_2neibors->_nodes[0]);
gp_XY uvM = helper.GetNodeUV( F, data._edges[iFrom]->_nodes.back());
gp_XY uv1 = helper.GetNodeUV( F, data._edges[iTo-1]->_2neibors->_nodes[1]);
gp_Vec2d vec0( center, uv0 );
- gp_Vec2d vecM( center, uvM);
+ gp_Vec2d vecM( center, uvM );
gp_Vec2d vec1( center, uv1 );
double uLast = vec0.Angle( vec1 ); // -PI - +PI
double uMidl = vec0.Angle( vecM );
- if ( uLast < 0 ) uLast += 2.*M_PI; // 0.0 - 2*PI
- if ( uMidl < 0 ) uMidl += 2.*M_PI;
- const bool sense = ( uMidl < uLast );
+ if ( uLast * uMidl < 0. )
+ uLast += ( uMidl > 0 ? +2. : -2. ) * M_PI;
const double radius = 0.5 * ( vec0.Magnitude() + vec1.Magnitude() );
- gp_Ax2d axis( center, vec0 );
- gp_Circ2d circ ( axis, radius, sense );
+ gp_Ax2d axis( center, vec0 );
+ gp_Circ2d circ( axis, radius );
for ( int i = iFrom; i < iTo; ++i )
{
double newU = uLast * len[i-iFrom] / len.back();
}
}
+ if ( !getMeshDS()->IsEmbeddedMode() )
+ // Log node movement
+ for ( unsigned i = 0; i < data._edges.size(); ++i )
+ {
+ _LayerEdge& edge = *data._edges[i];
+ SMESH_TNodeXYZ p ( edge._nodes.back() );
+ getMeshDS()->MoveNode( p._node, p.X(), p.Y(), p.Z() );
+ }
+
// TODO: make quadratic prisms and polyhedrons(?)
helper.SetElementsOnShape(true);
helper.ToFixNodeParameters( true );
// EDGE's to shrink
- map< int, _Shrinker1D > e2shrMap;
+ map< TGeomID, _Shrinker1D > e2shrMap;
// loop on FACES to srink mesh on
map< TGeomID, _SolidData* >::iterator f2sd = f2sdMap.begin();
for ( unsigned i = 0; i < nodesToSmooth.size(); ++i )
{
moved |= nodesToSmooth[i].Smooth( badNb,surface,helper,refSign,
- /*isCentroidal=*/isConcaveFace,/*set3D=*/false );
+ /*isCentroidal=*/isConcaveFace,
+ /*set3D=*/isConcaveFace);
}
if ( badNb < oldBadNb )
nbNoImpSteps = 0;
bool highQuality;
{
const bool hasTria = _mesh->NbTriangles(), hasQuad = _mesh->NbQuadrangles();
- if ( hasTria != hasQuad )
- {
+ if ( hasTria != hasQuad ) {
highQuality = hasQuad;
}
- else
- {
+ else {
set<int> nbNodesSet;
SMDS_ElemIteratorPtr fIt = smDS->GetElements();
while ( fIt->more() && nbNodesSet.size() < 2 )
// Set an event listener to clear FACE sub-mesh together with SOLID sub-mesh
_SrinkShapeListener::ToClearSubMeshWithSolid( sm, data._solid );
+ if ( !getMeshDS()->IsEmbeddedMode() )
+ // Log node movement
+ for ( unsigned i = 0; i < nodesToSmooth.size(); ++i )
+ {
+ SMESH_TNodeXYZ p ( nodesToSmooth[i]._node );
+ getMeshDS()->MoveNode( nodesToSmooth[i]._node, p.X(), p.Y(), p.Z() );
+ }
+
} // loop on FACES to srink mesh on
GeomAdaptor_Curve aCurve(C, f,l);
const double totLen = GCPnts_AbscissaPoint::Length(aCurve, f, l);
- int nbExpectNodes = eSubMesh->NbNodes() - e->_nodes.size();
+ int nbExpectNodes = eSubMesh->NbNodes();
_initU .reserve( nbExpectNodes );
_normPar.reserve( nbExpectNodes );
_nodes .reserve( nbExpectNodes );
F = e2f->second.Oriented( TopAbs_FORWARD );
reverse = ( helper.GetSubShapeOri( F, E ) == TopAbs_REVERSED );
if ( helper.GetSubShapeOri( data._solid, F ) == TopAbs_REVERSED )
+ reverse = !reverse, F.Reverse();
+ if ( SMESH_Algo::IsReversedSubMesh( TopoDS::Face(F), getMeshDS() ))
reverse = !reverse;
}
else
vector< const SMDS_MeshNode*>& nn1 = ledges[j-dj1]->_nodes;
vector< const SMDS_MeshNode*>& nn2 = ledges[j-dj2]->_nodes;
if ( isOnFace )
- for ( unsigned z = 1; z < nn1.size(); ++z )
+ for ( size_t z = 1; z < nn1.size(); ++z )
sm->AddElement( getMeshDS()->AddFace( nn1[z-1], nn2[z-1], nn2[z], nn1[z] ));
else
- for ( unsigned z = 1; z < nn1.size(); ++z )
+ for ( size_t z = 1; z < nn1.size(); ++z )
sm->AddElement( new SMDS_FaceOfNodes( nn1[z-1], nn2[z-1], nn2[z], nn1[z]));
}
+
+ // Make edges
+ for ( int isFirst = 0; isFirst < 2; ++isFirst )
+ {
+ _LayerEdge* edge = isFirst ? ledges.front() : ledges.back();
+ if ( !edge->_sWOL.IsNull() && edge->_sWOL.ShapeType() == TopAbs_EDGE )
+ {
+ vector< const SMDS_MeshNode*>& nn = edge->_nodes;
+ if ( nn[1]->GetInverseElementIterator( SMDSAbs_Edge )->more() )
+ continue;
+ helper.SetSubShape( edge->_sWOL );
+ helper.SetElementsOnShape( true );
+ for ( size_t z = 1; z < nn.size(); ++z )
+ helper.AddEdge( nn[z-1], nn[z] );
+ }
+ }
}
}
argGroupLayout->addWidget( new QLabel( tr( "THRESHOLD" ), GroupC1 ), row, 0 );
myThreshold = new SMESHGUI_SpinBox( GroupC1 );
myThreshold->setAcceptNames( false ); // No Notebook variables allowed
- myThreshold->RangeStepAndValidator( 1.1, 1e+10, 1., "length_precision" );
+ myThreshold->RangeStepAndValidator( 1.00001, 1e+10, 1., "length_precision" );
argGroupLayout->addWidget( myThreshold, row, 1 );
row++;
}
SMESH::SMESH_Hypothesis_var hyp = initParamsHypothesis();
- SMESH::ListOfParameters_var aParameters = hyp->GetLastParameters();
+ //SMESH::ListOfParameters_var aParameters = hyp->GetLastParameters();
if( hypType()=="LocalLength" )
{
for ( ; anIt.More(); anIt.Next()) { // Loop on selected objects
Handle(SALOME_InteractiveObject) IO = anIt.Value();
- GEOM::GEOM_Object_var aGeomObj = GetGeomObjectByEntry( IO->getEntry() );
+ GEOM::GEOM_Object_var aGeomObj = GetGeomObjectByEntry( IO->getEntry() );
if ( !CORBA::is_nil( aGeomObj ) ) { // Selected Object From Study
GEOM::GEOM_Object_ptr aGeomFatherObj = aGeomObj->GetMainShape();
QString aFatherEntry = "";
}
}
// update add button
- myAddButton->setEnabled( ( myListWidget->count() < myMaxSize || myMaxSize == -1 ) && mySelectedIDs.size() > 0 && ( mySelectedIDs.size() <= myMaxSize || myMaxSize == -1 ) );
+ myAddButton->setEnabled( ( myListWidget->count() < myMaxSize || myMaxSize == -1 ) &&
+ mySelectedIDs.size() > 0 &&
+ ( mySelectedIDs.size() <= myMaxSize || myMaxSize == -1 ) );
//Connect Selected Ids in viewer and dialog's Ids list
bool signalsBlocked = myListWidget->blockSignals( true );