Merge from V6_main (04/10/2012)

This commit is contained in:
vsr 2012-10-08 11:56:59 +00:00
parent e4f02cdb38
commit f5016d85b7
173 changed files with 8676 additions and 3172 deletions

View File

@ -553,6 +553,7 @@ AC_OUTPUT([ \
src/DriverMED/Makefile \
src/DriverSTL/Makefile \
src/DriverUNV/Makefile \
src/DriverGMF/Makefile \
src/DriverCGNS/Makefile \
src/MEFISTO2/Makefile \
src/OBJECT/Makefile \

View File

@ -26,25 +26,26 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am
EXTRA_DIST += images input static/footer.html static/doxygen.css
dist_salomescript_PYTHON = collect_mesh_methods.py
guidocdir = $(docdir)/gui/SMESH
guidoc_DATA = images/head.png
DOC_PYTHONPATH=$(prefix)/bin/salome:$(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(MED_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(GEOM_ROOT_DIR)/bin/salome:$(GEOM_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(KERNEL_ROOT_DIR)/bin/salome:$(KERNEL_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(OMNIORB_ROOT)/lib/python$(PYTHON_VERSION)/site-packages:$(OMNIORB_ROOT)/lib64/python$(PYTHON_VERSION)/site-packages
DOC_SMESH_MeshersList=StdMeshers
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
# 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 smesh.py tmp/smesh.py
@$(DOXYGEN) doxyfile_py ; \
$(DOXYGEN) doxyfile
docs: usr_docs

View File

@ -0,0 +1,118 @@
#!/usr/bin/env python
#################################################################################
#
# File: collect_mesh_methods.py
# Author: Vadim SANDLER, Open CASCADE S.A.S (vadim.sandler@opencascade.com)
#
#################################################################################
#
# Extraction of the meshing algorithm classes
# dynamically added by the plug-in to the Mesh
# class.
#
# This script is intended for internal usage - only
# for generatation of the extra developer documentation for
# the meshing plug-in(s).
#
# Usage:
# collect_mesh_methods.py <plugin_name>
# where
# <plugin_name> is a name of the plug-in module
#
# Notes:
# - the script is supposed to be run in correct environment
# i.e. PYTHONPATH, SMESH_MeshersList and other important
# variables are set properly; otherwise the script will fail.
#
################################################################################
import sys
def main(plugin, dummymeshhelp = True, output_file = "smesh.py"):
plugin_module = plugin + "DC"
try:
mod = __import__(plugin_module)
methods = {}
for attr in dir( mod ):
if attr.startswith( '_' ): continue
algo = getattr( mod, attr )
if type( algo ).__name__ == 'classobj' and hasattr( algo, "meshMethod" ):
method = getattr( algo, "meshMethod" )
if method not in methods: methods[ method ] = []
methods[ method ].append( algo )
pass
pass
if methods:
output = []
if dummymeshhelp:
output.append( "## @package smesh" )
output.append( "# Documentation of the methods dynamically added by the " + plugin + " meshing plug-in to the Mesh class." )
output.append( "" )
pass
output.append( "## This class allows defining and managing a mesh." )
output.append( "#" )
if dummymeshhelp:
# Add dummy Mesh help
# This is supposed to be done when generating documentation for meshing plug-ins
output.append( "# @note The documentation below does not provide complete description of class @b %Mesh" )
output.append( "# from @b %smesh.py package. This documentation provides only information about" )
output.append( "# the methods dynamically added to the %Mesh class by the " + plugin + " plugin" )
output.append( "# For more details on the %Mesh class, please refer to the SALOME %Mesh module" )
output.append( "# documentation." )
pass
else:
# Extend documentation for Mesh class with information about dynamically added methods.
# This is supposed to be done only when building documentation for SMESH module
output.append( "# @note Some methods are dynamically added to the @b %Mesh class in runtime by meshing " )
output.append( "# plug-in modules. If you fail to find help on some methods in the documentation of SMESH module, " )
output.append( "# try to look into the documentation for the meshing plug-ins." )
pass
output.append( "class Mesh:" )
for method in methods:
docHelper = ""
for algo in methods[ method ]:
if hasattr( algo, "docHelper" ): docHelper = getattr( algo, "docHelper" )
if docHelper: break
pass
if not docHelper: docHelper = "Creates new algorithm."
output.append( " ## %s" % docHelper )
output.append( " #" )
output.append( " # This method is dynamically added to %Mesh class by the meshing plug-in(s). " )
output.append( " #" )
output.append( " # If the optional @a geom_shape parameter is not set, this algorithm is global (applied to whole mesh)." )
output.append( " # Otherwise, this algorithm defines a submesh based on @a geom_shape subshape." )
output.append( " # @param algo_type type of algorithm to be created; allowed values are specified by classes implemented by plug-in (see below)" )
output.append( " # @param geom_shape if defined, the subshape to be meshed (GEOM_Object)" )
output.append( " # @return An instance of Mesh_Algorithm sub-class according to the specified @a algo_type, see " )
output.append( " # %s" % ", ".join( [ "%s.%s" % ( plugin_module, algo.__name__ ) for algo in methods[ method ] ] ) )
output.append( " def %s(algo_type, geom_shape=0):" % method )
output.append( " pass" )
pass
f = open(output_file, "w")
for line in output: f.write( line + "\n" )
f.close()
pass
pass
except Exception, e:
print e
pass
pass
if __name__ == "__main__":
import optparse
parser = optparse.OptionParser(usage="%prog [options] plugin")
h = "Output file (smesh.py by default)"
parser.add_option("-o", "--output", dest="output",
action="store", default=None, metavar="file",
help=h)
h = "If this option is True, dummy help for Mesh class is added. "
h += "This option should be False (default) when building documentation for SMESH module "
h += "and True when building documentation for meshing plug-ins."
parser.add_option("-d", "--dummy-mesh-help", dest="dummymeshhelp",
action="store_true", default=False,
help=h)
(options, args) = parser.parse_args()
if len( args ) < 1: sys.exit("Plugin name is not specified")
main( args[0], options.dummymeshhelp, options.output )
pass

View File

@ -99,7 +99,10 @@ EXAMPLE_RECURSIVE = NO
#---------------------------------------------------------------------------
#Input related options
#---------------------------------------------------------------------------
INPUT = smesh.py @top_srcdir@/src/SMESH_SWIG/StdMeshersDC.py
INPUT = smesh.py \
@top_srcdir@/src/SMESH_SWIG/smesh_algorithm.py \
@top_srcdir@/src/SMESH_SWIG/StdMeshersDC.py \
tmp/smesh.py
FILE_PATTERNS =
IMAGE_PATH = @srcdir@/images
RECURSIVE = NO
@ -132,24 +135,24 @@ GENERATE_RTF = NO
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO
HIDE_UNDOC_RELATIONS = NO
HAVE_DOT = NO
CLASS_GRAPH = NO
HAVE_DOT = YES
CLASS_GRAPH = YES
COLLABORATION_GRAPH = NO
GROUP_GRAPHS = NO
UML_LOOK = NO
TEMPLATE_RELATIONS = NO
INCLUDE_GRAPH = NO
INCLUDED_BY_GRAPH = NO
TEMPLATE_RELATIONS = YES
INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = YES
CALL_GRAPH = NO
GRAPHICAL_HIERARCHY = NO
DIRECTORY_GRAPH = NO
DOT_IMAGE_FORMAT = jpg
GRAPHICAL_HIERARCHY = YES
DIRECTORY_GRAPH = YES
DOT_IMAGE_FORMAT = png
DOT_FONTNAME = Arial
DOT_PATH =
DOTFILE_DIRS =
MAX_DOT_GRAPH_WIDTH = 1024
MAX_DOT_GRAPH_HEIGHT = 1200
MAX_DOT_GRAPH_DEPTH = 0
MAX_DOT_GRAPH_HEIGHT = 1024
MAX_DOT_GRAPH_DEPTH = 1000
DOT_TRANSPARENT = NO
DOT_MULTI_TARGETS = NO
GENERATE_LEGEND = NO

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -5,14 +5,16 @@
\n \b MESH represents a discretization of a geometrical CAD model into
a set of entities with a simple topology.
Meshes are stored in DAT, MED, UNV, STL, CGNS and SAUVE formats and can be
Meshes are stored in DAT, MED, UNV, STL, CGNS, GMF and SAUVE formats and can be
\subpage importing_exporting_meshes_page "imported from and exported to"
the file in these formats.
It is possible to \subpage constructing_meshes_page "construct meshes"
on the basis of geometrical shapes produced in the GEOM module.
It is also possible to \subpage constructing_submeshes_page "mesh on a part of the geometrical object",
for example, a face, with different meshing parameters than the whole mesh.
It is also possible to \subpage constructing_submeshes_page "construct
mesh on a part of the geometrical object", for example, a face, with
different meshing parameters than the whole mesh.
Several created meshes can be \subpage building_compounds_page "combined into another mesh".

View File

@ -4,34 +4,48 @@
\image html colors_size.png
Using this dialog you can define the following set of mesh visualization
parameters:
<ul>
<li><b>Elements</b></li>
<ul>
<li><b>Surface color</b> - surface color of elements (seen in Shading mode).</li>
<li><b>Back surface color</b> - interior surface color of elements. Use slider to select this color
generated on base of the <b>Surface color</b> by changing its brightness and saturation.</li>
<li><b>Outline color</b> - color of element borders.</li>
<li><b>Wireframe color</b> - color of element borders in wireframe mode.</li>
<li><b>0D slements</b> - color of 0D elements.</li>
<li><b>Size of 0D slements</b> - size of 0D elements.</li>
<li><b>Line width</b> - width of lines (edges and borders of elements).</li>
<li><b>Shrink coef.</b> - relative space of elements compared to gaps between
them in shrink mode.</li>
</ul>
<li><b>Nodes</b></li>
<ul>
<li><b>Color</b> - color of nodes.</li>
<li><b>Marker</b> - group of options allowing to change the representation of
points (see \subpage point_marker_page "Point Marker" page).</li>
</ul>
<li><b>Orientation of faces</b></li>
<ul>
<li><b>Color</b> - color of orientation vertors.</li>
<li><b>Scale</b> - size of orientation vectors.</li>
<li><b>3D vectors</b> - allows to choose between 2D planar and 3D vectors.</li>
</ul>
</ul>
Using this dialog you can customize different properties of the mesh visualization
parameters.
The GUI elements in the "Properties" dialog box are grouped according
to the entity types of mesh data. If some data entities are not
present in the mesh object, the corresponding GUI elements are not
shown.
- \b Nodes:
- \b Color - color of nodes.
- \b Type and \b Scale - these options allow changing of the nodes
representation (see \subpage point_marker_page "Point Marker" page
for more details).
- <b>Edges / wireframe</b>:
- \b Color - color of element borders in wireframe mode.
- \b Width - width of lines (edges and borders of elements
in wireframe mode).
- \b Faces:
- \b Front - surface color of face elements (seen in shading mode).
- \b Back - backside surface color of face elements. Use slider to
select this color generated on base of the \b Face color by
changing its brightness and saturation.
- \b Volumes:
- \b Normal - surface color of normal volume elements (seen in shading mode).
- \b Reversed - surface color of volume elements. Use slider to
select this color generated on base of the \b Normal color by
changing its brightness and saturation.
- \b Outlines:
- \b Color - color of element borders in shading mode.
- \b Width - width of outlines (borders of elements
in shading mode).
- <b>0D elements</b>:
- \b Color - color of 0D elements.
- \b Size - size of 0D elements.
- \b Balls:
- \b Color - color of discrete ball elements.
- \b Size - size of discrete ball elements.
- <b>Orientation vectors</b>:
- \b Color - color of orientation vectors.
- \b Scale - size of orientation vectors.
- <b>3D vectors</b> - allows to choose between 2D planar and 3D vectors.
- <b>Shrink coef.</b> - relative space of elements compared to gaps between
them in shrink mode.
*/

View File

@ -34,6 +34,27 @@ written in Python.
\subpage about_hypo_page "hypotheses" which will be used at computation of
this mesh.
"Create mesh" dialog box contains several tab pages titled \b 3D,
\b 2D, \b 1D and \b 0D. The title of each page reflects the
dimension of the CAD model (geometry) the algorithms listed on
this page affect to. For example, \b 3D page lists algorithms
that affect 3D geometrical objects (solids).
\note
- Some page(s) can be disabled - if the source geometrical
object does not include shapes (sub-shapes) of the corresponding
dimension(s). For example, if input object is a geometrical face,
\b 3D page is disabled.
- Some algorithms affect on geometry of several dimensions,
i.e. "1D-2D" or "1D-2D-3D". If such algorithm is selected by the
user, dialog box pages related to the corresponding lower level
dimensions are disabled.
- \b 0D page does not refer to the 0D elements, but to 0D
geometry (vertices). Mesh module does not provide algorithms that
produce 0D elements. Currently \b 0D page provides only one
algorithm "Segments around vertex" that allows specyfing required
size of mesh edges about some selected vertex(vertices).
For example, you need to mesh a 3D object.
First, type the name for your mesh in the \b Name box, by default,
@ -284,6 +305,11 @@ or/and hidden by other mesh elements, to see them it can be helpful to
switch the mesh to Wireframe visualization mode or to switch off
visualization of faces and volumes (if any).
\image html show_bad_mesh.png
<em>Too close nodes causing meshing failure are shown in magenta using <b>Show
bad Mesh</b> button</em>
<br><br>
\anchor use_existing_anchor
<h2>"Use existing edges" and "Use existing faces" algorithms</h2>

View File

@ -36,12 +36,15 @@ at computation of this sub-mesh</li>
From the \b Mesh menu select <b>Create Sub-mesh</b> or click <em>"Create
Sum-mesh"</em> button in the toolbar.
\image html image33.gif
<center><em>"Create Sub-mesh" button</em></center>
<center>
\image html image33.gif
<em>"Create Sub-mesh" button</em>
</center>
\par
The following dialog box will appear:
\par
\image html createmesh-inv2.png
\par
@ -50,6 +53,33 @@ Geometry (e.g. a face if the parent mesh has been built on box) of the
sub-mesh. You can define algorithms and hypotheses in the same way as
in \ref constructing_meshes_page "Create mesh" menu.
\par
If the parent mesh is already computed, then you can define
\b Geometry by picking mesh elements computed on a sub-shape of interest
in the 3D Viewer, i.e. you don't have to extract this sub-shape
previously in Geometry module. To start element selection, press \a
Selection button to the right of \b Geometry label. If this button is
already down, then click it to release and then click it again. The
following pop-up menu to choose a way of geometry definition will
appear.
\par
\image html choose_geom_selection_way.png
\par
There the first item enables selecting the sub-shape in the Object
Browser, the second one makes appear the following dialog.
\par
\image html find_geom_by_mesh_elem.png
\par
In this dialog, <b> Element Type </b> defines kind of element to pick in the
Viewer. Instead of picking an element in the Viewer, you can type its
ID in <b> Element ID</b> field. <b> Geometry name </b> allow you
define a name of the sub-shape with which it will be published in the Study.
\par
In the Object Browser the structure of the new sub-mesh will be
displayed as follows:

View File

@ -8,7 +8,7 @@ corners.
<em>To cut quadrangles:</em>
<ol>
<li>Display a mesh or a submesh in the 3D viewer.</li>
<li>Display a mesh or a sub-mesh in the 3D viewer.</li>
<li>In the \b Modification menu select the <b>Cutting of quadrangles</b> item or
click <em>"Cutting of quadrangles"</em> button in the toolbar.
@ -29,7 +29,7 @@ selected element or elements from the list click \b Remove button. <b>Sort
list</b> button allows to sort the list of IDs. \b Filter button allows to
apply a definite filter to the selection of quadrangles.</li>
<li><b>Apply to all</b> radio button allows to modify the orientation of all
quadrangles of the currently displayed mesh or submesh.</li>
quadrangles of the currently displayed mesh or sub-mesh.</li>
<li>\b Preview - provides a preview of cutting in the viewer.</li>
</ul>
@ -39,12 +39,11 @@ quadrangles of the currently displayed mesh or submesh.</li>
<li><b>Use diagonal 1-3</b> and <b>Use diagonal 2-4</b> allows to
specify the opposite corners which will be connected by the cutting
edge.</li>
<li><b>Use numeric factor</b> - allows to apply the operation only to
those objects which meet the chosen criterion (from the list of
Quality Controls, i.e. Skew, Warping, Minimum Angle, etc.)</li>
<li><b>Use numeric factor</b> - allows to chose a quality criterion
optimization of which will be used to select the cutting edge.</li>
</ul>
</li>
<li><b>Select from</b> - allows to choose a submesh or an existing
<li><b>Select from</b> - allows to choose a sub-mesh or an existing
group whose quadrangle elements will be automatically added to the
list.</li>
</ul>

View File

@ -3,15 +3,15 @@
\page importing_exporting_meshes_page Importing and exporting meshes
\n In MESH there is a functionality allowing importation/exportation
of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (Nastran), \b STL
and \b CGNS format files. You can also export a group as a whole mesh.
of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (simple ascii format), \b STL,
\b GMF and \b CGNS format files. You can also export a group as a whole mesh.
<em>To import a mesh:</em>
<ol>
<li>From the \b File menu choose the \b Import item, from its sub-menu
select the corresponding format (MED, UNV, DAT, STL and CGNS) of the file containing
select the corresponding format (MED, UNV, STL, GMF and CGNS) of the file containing
your mesh.</li>
<li>In the standard <b>Search File</b> dialog box find the file for
importation. It is possible to select multiple files to be imported all at once. </li>
@ -26,7 +26,7 @@ importation. It is possible to select multiple files to be imported all at once.
<ol>
<li>Select the object you wish to export.</li>
<li>From the \b File menu choose the \b Export item, from its sub-menu
select the format (MED, UNV, DAT, STL and CGNS) of the file which will
select the format (MED, UNV, DAT, STL, GMF and CGNS) of the file which will
contain your exported mesh.</li>
<li>In the standard <b>Search File</b> select a location for the
exported file and enter its name.</li>

View File

@ -33,14 +33,14 @@ lines in the file. Note that missing symbols are replaced by "0".
Here is a texture file sample:
<pre>
00111100
00111100
11111111
10000001
10011001
10111101
10111101
10011001
10000001
11111111
11111111
11111111
00111100
00111100
</pre>
\image html point_marker_widget2.png

View File

@ -2,44 +2,37 @@
\page smeshpy_interface_page Python interface
Python package smesh defines several classes, destined for easy and
clear mesh creation and edition.
Python API for SALOME %Mesh module defines several classes that can
be used for easy mesh creation and edition.
Documentation for smesh package is available in two forms:
The <a href="smeshpy_doc/modules.html"> structured
documentation for smesh package</a>, where all methods and
Documentation for SALOME %Mesh module Python API is available in two forms:
- <a href="smeshpy_doc/modules.html">Structured documentation</a>, where all methods and
classes are grouped by their functionality, like it is done in the GUI documentation
and the \ref smeshDC "linear documentation for smesh package"
grouped only by classes, declared in the smesh.py file.
- <a href="smeshpy_doc/namespaces.html">Linear documentation</a> grouped only by classes, declared
in the \ref smesh and StdMeshersDC Python packages.
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.
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.
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.
As soon as mesh is created, it is possible to manage it via its own
methods, described in \ref smesh.Mesh "class Mesh" documentation.
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).
Class \b Mesh allows assigning algorithms to a mesh.
Please note, that some algorithms, included in the standard SALOME
distribution are always available:
Class \ref smesh.Mesh "Mesh" allows assigning algorithms to a mesh.
Please note that some algorithms, included in the standard SALOME
distribution are always available. Python package \ref StdMeshersDC
provides an interface for standard meshing algorithms included into
the SALOME %Mesh module distribution, like:
- REGULAR (1D)
- COMPOSITE (1D)
- MEFISTO (2D)
- Quadrangle (2D)
- Hexa(3D)
- etc...
- etc ...
To add hypotheses, use the interfaces, provided by the assigned
algorithms.
To add meshing hypotheses, it is possible to use the functions provided by the
algorithms interfaces.
Below you can see an example of usage of the package smesh for 3d mesh generation.
An example below demonstrates usage of the Python API for 3d mesh generation.
\anchor example_3d_mesh
<h2>Example of 3d mesh generation:</h2>
@ -118,7 +111,7 @@ tetra.Group(group)
\endcode
Examples of Python scripts for all Mesh operations are available by
Examples of Python scripts for Mesh operations are available by
the following links:
- \subpage tui_creating_meshes_page

View File

@ -25,7 +25,7 @@ print "nb tetrahedra",mesh.NbTetras()
print "nb polyhedra",mesh.NbPolyhedrons()
print
# define the grid by sitting constant spacing
# define the grid by setting constant spacing
cartHyp = cartAlgo.SetGrid( "10","10","10", 1000000)
mesh.Compute()
@ -34,9 +34,9 @@ print "nb tetrahedra",mesh.NbTetras()
print "nb polyhedra",mesh.NbPolyhedrons()
# define the grid by sitting different spacing in 2 sub-ranges of geometry
# define the grid by setting different spacing in 2 sub-ranges of geometry
spaceFuns = ["5","10+10*t"]
cartAlgo.SetGrid( [spaceFuns, [0.5]], [spaceFuns, [0.5]], [spaceFuns, [0.25]], 2 )
cartAlgo.SetGrid( [spaceFuns, [0.5]], [spaceFuns, [0.5]], [spaceFuns, [0.25]], 10 )
mesh.Compute()
print "nb hexahedra",mesh.NbHexas()

View File

@ -2,11 +2,48 @@
\page tui_defining_hypotheses_page Defining Hypotheses and Algorithms
This page provides example codes of \ref tui_defining_meshing_algos
"defining algorithms" and hypotheses.
<ul>
<li>Wire discretisation 1D algorithm
<ul>
<li>\ref tui_1d_arithmetic "Arithmetic 1D" hypothesis</li>
<li>\ref tui_deflection_1d "Deflection 1D and Number of Segments" hypotheses</li>
<li>\ref tui_start_and_end_length "Start and End Length" hypotheses</li>
<li>\ref tui_average_length "Local Length"</li>
<li>\ref tui_propagation "Propagation" additional hypothesis </li>
<li>\ref tui_fixed_points "Fixed Points 1D" hypothesis</li>
</ul>
</li>
<li>Triangle (Mefisto) 2D algorithm
<ul>
<li>\ref tui_max_element_area "Max Element Area" hypothesis </li>
<li>\ref tui_length_from_edges "Length from Edges"
hypothesis </li>
</ul>
</li>
<li>Tetrahedron (Netgen) 3D algorithm
<ul>
<li> \ref tui_max_element_volume "Max. Element Volume"hypothesis </li>
<li> \ref tui_viscous_layers "Viscous layers"</li>
</ul>
</li>
<li>\ref tui_projection "Projection Algorithms"</li>
<li>\ref tui_radial_quadrangle "Radial Quadrangle 1D2D" algorithm</li>
<li>Quadrangle (Mapping) 2D algorithm
<ul>
<li> \ref tui_quadrangle_parameters "Quadrangle Parameters" hypothesis </li>
</ul>
</li>
<li>\ref tui_import "Use Existing Elements" algorithm</li>
</ul>
<br>
<h2>Defining 1D Hypotheses</h2>
<br>
\anchor tui_1d_arithmetic
<h3>1D Arithmetic</h3>
<h3>Arithmetic 1D</h3>
\code
import geompy
@ -457,6 +494,40 @@ src_mesh.TranslateObject( src_mesh, MakeDirStruct( 210, 0, 0 ), Copy=False)
\endcode
<h3>Projection 1D2D</h3>
\code
# Project triangles from one meshed face to another mesh on the same box
from smesh import *
# Prepare geometry
# Create a box
box = geompy.MakeBoxDXDYDZ(100, 100, 100)
# Get geom faces to mesh with triangles in the 1ts and 2nd meshes
faces = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
# 2 adjacent faces of the box
Face_1 = faces[2]
Face_2 = faces[0]
geompy.addToStudy( box, 'box' )
geompy.addToStudyInFather( box, Face_1, 'Face_1' )
geompy.addToStudyInFather( box, Face_2, 'Face_2' )
# Make the source mesh with Netgem2D
src_mesh = Mesh(Face_1, "Source mesh")
src_mesh.Segment().NumberOfSegments(15)
src_mesh.Triangle()
src_mesh.Compute()
# Mesh the target mesh using the algoritm Projection1D2D
tgt_mesh = smesh.Mesh(Face_2, "Target mesh")
tgt_mesh.Projection1D2D().SourceFace(Face_1,src_mesh)
tgt_mesh.Compute()
\endcode
<br>
\anchor tui_fixed_points

View File

@ -98,23 +98,23 @@ critaria = [ \
]
filt = GetFilterFromCriteria( critaria )
filtGroup = mesh.GroupOnFilter( FACE, "group on filter", filt )
print "Group on filter conatains %s elemens" % filtGroup.Size()
print "Group on filter contains %s elemens" % filtGroup.Size()
# group on filter is updated if the mesh is modified
hyp1D.SetStartLength( 2.5 )
hyp1D.SetEndLength( 2.5 )
mesh.Compute()
print "After mesh change, group on filter conatains %s elemens" % filtGroup.Size()
print "After mesh change, group on filter contains %s elemens" % filtGroup.Size()
# set a new filter defining the group
filt2 = GetFilter( FACE, FT_RangeOfIds, "1-50" )
filtGroup.SetFilter( filt2 )
print "With a new filter, group on filter conatains %s elemens" % filtGroup.Size()
print "With a new filter, group on filter contains %s elemens" % filtGroup.Size()
# group is updated at modification of the filter
filt2.SetCriteria( [ GetCriterion( FACE, FT_RangeOfIds, "1-70" )])
filtIDs3 = filtGroup.GetIDs()
print "After filter modification, group on filter conatains %s elemens" % filtGroup.Size()
print "After filter modification, group on filter contains %s elemens" % filtGroup.Size()
salome.sg.updateObjBrowser(1)
\endcode

View File

@ -164,8 +164,8 @@ mesh.RemoveElements(anIds)
aBorders = mesh.GetFreeBorders()
# create groups
aGroupF = mesh.CreateGroup(SMESH.FACE, "Faces with free edges")
aGroupN = mesh.CreateGroup(SMESH.NODE, "Nodes on free edges")
aGroupF = mesh.CreateEmptyGroup(smesh.FACE, "Faces with free edges")
aGroupN = mesh.CreateEmptyGroup(smesh.NODE, "Nodes on free edges")
# fill groups with elements, corresponding to the criterion
print ""

View File

@ -7,7 +7,7 @@ once many triangles if they have adjacent edges.
<em>To union several triangles:</em>
<ol>
<li>Display a mesh or a submesh in the 3D viewer.</li>
<li>Display a mesh or a sub-mesh in the 3D viewer.</li>
<li>In the \b Modification menu select the <b>Union of triangles</b>
item or click <em>"Union of triangles"</em> button in the toolbar.
@ -27,11 +27,10 @@ elements from the list click the \b Remove button. The \b Sort button allows
to sort the list of IDs. The <b>Set filter</b> button allows to apply a
definite filter to selection of triangles.</li>
<li><b>Apply to all</b> radio button allows to modify connectivity and
type of all triangles of the currently displayed mesh or submesh.</li>
<li>\b Criterion menu allows to apply the operation only to those
object which meet the chosen criterion (from the list of Quality
Controls, i.e. Skew, Warping, Minimum Angle, etc.)</li>
<li><b>Select from</b> set of fields allows to choose a submesh or an
type of all triangles of the currently displayed mesh or sub-mesh.</li>
<li>\b Criterion menu allows to chose a quality criterion
optimization of which will be used to select triangles to unite.</li>
<li><b>Select from</b> set of fields allows to choose a sub-mesh or an
existing group whose triangle elements will be automatically added to
the list.</li>
</ul>

View File

@ -101,7 +101,8 @@ module SMESH
COMPERR_ALGO_FAILED , // computation failed
COMPERR_BAD_SHAPE , // bad geometry
COMPERR_WARNING , // algo reports error but sub-mesh is computed anyway
COMPERR_CANCELED // compute canceled
COMPERR_CANCELED , // compute canceled
COMPERR_NO_MESH_ON_SHAPE // no mesh elements assigned to sub-mesh
};
struct ComputeError
{
@ -237,6 +238,13 @@ module SMESH
out SMESH::DriverMED_ReadStatus theStatus )
raises ( SALOME::SALOME_Exception );
/*!
* Create Mesh object importing data from given GMF file
*/
SMESH_Mesh CreateMeshesFromGMF( in string theFileName,
out SMESH::ComputeError theError)
raises ( SALOME::SALOME_Exception );
/*!
* Create a mesh by copying a part of another mesh
* \param meshPart - a part of mesh to copy

View File

@ -80,29 +80,29 @@ module SMESH
* \param theParameters is a string containing the notebook variables separated by ":" symbol,
* used for Hypothesis creation
*/
void SetParameters (in string theParameters);
// void SetParameters (in string theParameters);
/*!
* Return list of notebook variables used for Hypothesis creation separated by ":" symbol
*/
string GetParameters();
// /*!
// * 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();
// /*!
// * 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);
// /*!
// * 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

View File

@ -652,7 +652,7 @@ module SMESH
string GetVersionString(in MED_VERSION version, in short nbDigits);
/*!
* Export Mesh to DAT, UNV and STL Formats
* Export Mesh to different Formats
* (UNV supported version is I-DEAS 10)
*/
void ExportDAT( in string file ) raises (SALOME::SALOME_Exception);
@ -662,6 +662,8 @@ module SMESH
void ExportCGNS( in SMESH_IDSource meshPart,
in string file,
in boolean overwrite ) raises (SALOME::SALOME_Exception);
void ExportGMF( in SMESH_IDSource meshPart,
in string file ) raises (SALOME::SALOME_Exception);
void ExportPartToDAT( in SMESH_IDSource meshPart,
in string file ) raises (SALOME::SALOME_Exception);
void ExportPartToUNV( in SMESH_IDSource meshPart,

View File

@ -25,6 +25,7 @@
#define _SMESH_MESHEDITOR_IDL_
#include "SMESH_Mesh.idl"
#include "SMESH_Gen.idl"
module SMESH
{
@ -34,8 +35,34 @@ module SMESH
* This interface makes modifications on the Mesh - removing elements and nodes etc.
*/
interface NumericalFunctor;
interface SMESH_MeshEditor
{
/*!
* Return data of mesh edition preview which is computed provided
* that the editor was obtained trough SMESH_Mesh::GetMeshEditPreviewer()
*/
MeshPreviewStruct GetPreviewData();
/*!
* If during last operation of MeshEditor some nodes were
* created this method returns list of their IDs, if new nodes
* not created - returns empty list
*/
long_array GetLastCreatedNodes();
/*!
* If during last operation of MeshEditor some elements were
* created this method returns list of their IDs, if new elements
* not created - returns empty list
*/
long_array GetLastCreatedElems();
/*!
* \brief Returns description of an error/warning occured during the last operation
*/
ComputeError GetLastError();
/*!
* \brief Wrap a sequence of ids in a SMESH_IDSource
* \param IDsOfElements list of mesh elements identifiers
@ -802,26 +829,6 @@ module SMESH
*/
boolean ChangeElemNodes(in long ide, in long_array newIDs);
/*!
* Return data of mesh edition preview which is computed provided
* that the editor was obtained trough SMESH_Mesh::GetMeshEditPreviewer()
*/
MeshPreviewStruct GetPreviewData();
/*!
* If during last operation of MeshEditor some nodes were
* created this method returns list of it's IDs, if new nodes
* not creared - returns empty list
*/
long_array GetLastCreatedNodes();
/*!
* If during last operation of MeshEditor some elements were
* created this method returns list of it's IDs, if new elements
* not creared - returns empty list
*/
long_array GetLastCreatedElems();
/*!
* \brief Creates a hole in a mesh by doubling the nodes of some particular elements
* \param theNodes - identifiers of nodes to be doubled
@ -1038,6 +1045,21 @@ module SMESH
in ListOfGroups theNodesNot,
in GEOM::GEOM_Object theShape );
/*!
* \brief Identify the elements that will be affected by node duplication (actual duplication is not performed).
* This method is the first step of DoubleNodeElemGroupsInRegion.
* \param theElems - list of groups of elements (edges or faces) to be replicated
* \param theNodesNot - list of groups of nodes not to replicated
* \param theShape - shape to detect affected elements (element which geometric center
* located on or inside shape).
* The replicated nodes should be associated to affected elements.
* \return groups of affected elements
* \sa DoubleNodeElemGroupsInRegion()
*/
ListOfGroups AffectedElemGroupsInRegion( in ListOfGroups theElems,
in ListOfGroups theNodesNot,
in GEOM::GEOM_Object theShape );
/*!
* \brief Generates skin mesh (containing 2D cells) from 3D mesh
* The created 2D mesh elements based on nodes of free faces of boundary volumes
@ -1117,6 +1139,18 @@ module SMESH
* \return TRUE if operation has been completed successfully, FALSE otherwise
*/
boolean CreateFlatElementsOnFacesGroups( in ListOfGroups theGroupsOfFaces );
/*!
* \brief identify all the elements around a geom shape, get the faces delimiting the hole
* Build groups of volume to remove, groups of faces to replace on the skin of the object,
* groups of faces to remove insidethe object, (idem edges).
* Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
*/
void CreateHoleSkin(in double radius,
in GEOM::GEOM_Object theShape,
in string groupName,
in double_array theNodesCoords,
out array_of_long_array GroupsOfNodes) raises (SALOME::SALOME_Exception);
};
};

View File

@ -28,12 +28,14 @@
<parameter name="icon" value="ModuleMesh.png"/>
<parameter name="version" value="@VERSION@"/>
<!-- Other module preferences -->
<parameter name="default_grp_color" value="255, 170, 0"/>
<parameter name="node_color" value="255, 0, 0"/>
<parameter name="fill_color" value="0, 170, 255|-100"/>
<parameter name="volume_color" value="255, 0, 170|-100"/>
<parameter name="wireframe_color" value="0, 170, 255"/>
<parameter name="outline_color" value="0, 70, 0"/>
<parameter name="elem0d_color" value="0, 255, 0"/>
<parameter name="ball_elem_color" value="100, 255, 0"/>
<parameter name="ball_elem_color" value="0, 85, 255"/>
<parameter name="highlight_color" value="0, 255, 255"/>
<parameter name="group_name_color" value="255, 255, 255"/>
<parameter name="type_of_marker" value="1" />
@ -41,6 +43,7 @@
<parameter name="elem0d_size" value="5" />
<parameter name="ball_elem_size" value="10" />
<parameter name="element_width" value="1" />
<parameter name="outline_width" value="1" />
<parameter name="shrink_coeff" value="75"/>
<parameter name="orientation_color" value="255, 255, 255"/>
<parameter name="orientation_scale" value="0.1"/>

View File

@ -55,7 +55,7 @@
dim="1"/>
<hypothesis type="FixedPoints1D"
label-id="Fixed points 1D"
label-id="Fixed Points 1D"
icon-id="mesh_hypo_length.png"
dim="1"/>
@ -75,18 +75,18 @@
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"/>
@ -184,14 +184,14 @@
<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"
@ -213,7 +213,7 @@
</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"
@ -304,7 +304,7 @@
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>
@ -329,12 +329,12 @@
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"
@ -346,7 +346,7 @@
</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"
@ -359,7 +359,7 @@
</algorithm>
<algorithm type="Prism_3D"
label-id="3D extrusion"
label-id="3D Extrusion"
icon-id="mesh_algo_hexa.png"
input="QUAD,TRIA"
dim="3">
@ -381,7 +381,7 @@
</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"
@ -392,7 +392,7 @@
</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"
@ -403,7 +403,7 @@
</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"

View File

@ -2737,30 +2737,37 @@ void CoplanarFaces::SetMesh( const SMDS_Mesh* theMesh )
return;
const double radianTol = myToler * M_PI / 180.;
typedef SMDS_StdIterator< const SMDS_MeshElement*, SMDS_ElemIteratorPtr > TFaceIt;
std::set<const SMDS_MeshElement*> checkedFaces, checkedNodes;
std::list<const SMDS_MeshElement*> faceQueue( 1, face );
std::set< SMESH_TLink > checkedLinks;
std::list< pair< const SMDS_MeshElement*, gp_Vec > > faceQueue;
faceQueue.push_back( make_pair( face, myNorm ));
while ( !faceQueue.empty() )
{
face = faceQueue.front();
if ( checkedFaces.insert( face ).second )
face = faceQueue.front().first;
myNorm = faceQueue.front().second;
faceQueue.pop_front();
for ( int i = 0, nbN = face->NbCornerNodes(); i < nbN; ++i )
{
gp_Vec norm = getNormale( static_cast<const SMDS_MeshFace*>(face), &normOK );
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() )
{
const SMDS_MeshElement* f = fIt->next();
if ( f->GetNodeIndex( n2 ) > -1 )
{
gp_Vec norm = getNormale( static_cast<const SMDS_MeshFace*>(f), &normOK );
if (!normOK || myNorm.Angle( norm ) <= radianTol)
{
myCoplanarIDs.insert( face->GetID() );
std::set<const SMDS_MeshElement*> neighborFaces;
for ( int i = 0; i < face->NbCornerNodes(); ++i )
{
const SMDS_MeshNode* n = face->GetNode( i );
if ( checkedNodes.insert( n ).second )
neighborFaces.insert( TFaceIt( n->GetInverseElementIterator(SMDSAbs_Face)),
TFaceIt());
}
faceQueue.insert( faceQueue.end(), neighborFaces.begin(), neighborFaces.end() );
myCoplanarIDs.insert( f->GetID() );
faceQueue.push_back( make_pair( f, norm ));
}
}
}
}
faceQueue.pop_front();
}
}
}

View File

@ -26,13 +26,16 @@
//
#include "Driver_Mesh.h"
#include "SMESH_Comment.hxx"
#include <utilities.h>
using namespace std;
Driver_Mesh::Driver_Mesh():
myFile(""),
myMeshId(-1)
myMeshId(-1),
myStatus( DRS_OK )
{}
@ -78,5 +81,23 @@ Driver_Mesh::Status Driver_Mesh::addMessage(const std::string& msg,
#ifdef _DEBUG_
cout << msg << endl;
#endif
return isFatal ? DRS_FAIL : DRS_WARN_SKIP_ELEM;
return ( myStatus = isFatal ? DRS_FAIL : DRS_WARN_SKIP_ELEM );
}
//================================================================================
/*!
* \brief Return a structure containing description of errors
*/
//================================================================================
SMESH_ComputeErrorPtr Driver_Mesh::GetError()
{
SMESH_Comment msg;
for ( size_t i = 0; i < myErrorMessages.size(); ++i )
{
msg << myErrorMessages[i];
if ( i+1 < myErrorMessages.size() )
msg << "\n";
}
return SMESH_ComputeError::New( myStatus == DRS_OK ? int(COMPERR_OK) : int(myStatus), msg );
}

View File

@ -27,6 +27,8 @@
#ifndef _INCLUDE_DRIVER_MESH
#define _INCLUDE_DRIVER_MESH
#include "SMESH_ComputeError.hxx"
#include <string>
#include <vector>
@ -55,12 +57,18 @@ class MESHDRIVER_EXPORT Driver_Mesh
DRS_FAIL // general failure (exception etc.)
};
virtual Status Perform() = 0;
void SetMeshId(int theMeshId);
void SetFile(const std::string& theFileName);
virtual void SetMeshName(const std::string& theMeshName);
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;
@ -68,6 +76,7 @@ class MESHDRIVER_EXPORT Driver_Mesh
Status addMessage(const std::string& msg, const bool isFatal=false);
std::vector< std::string > myErrorMessages;
Status myStatus;
};
#endif

View File

@ -44,8 +44,10 @@ dist_libMeshDriver_la_SOURCES = \
# additionnal information to compil and link file
libMeshDriver_la_CPPFLAGS = \
$(BOOST_CPPFLAGS) \
$(CAS_CPPFLAGS) \
$(KERNEL_CXXFLAGS) \
-I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMESHDS
libMeshDriver_la_LDFLAGS = \

View File

@ -139,7 +139,7 @@ namespace
}
{
static int ids[] = { 0,3,2,1,4,7,6,5,11,10,9,8,12,15,14,13,19,18,17,16,
20, 24,23,22,21, 25};
20, 24,23,22,21, 25, 26};
interlaces[SMDSEntity_TriQuad_Hexa] = ids;
cgTypes [SMDSEntity_TriQuad_Hexa] = CGNS_ENUMV( HEXA_27 );
}

View File

@ -52,6 +52,7 @@ libMeshDriverDAT_la_CPPFLAGS = \
$(BOOST_CPPFLAGS) \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMESHDS
libMeshDriverDAT_la_LDFLAGS = \

View File

@ -0,0 +1,357 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, Read to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : DriverGMF_Read.cxx
// Created : Mon Sep 17 17:03:02 2012
// Author : Edward AGAPOV (eap)
#include "DriverGMF_Read.hxx"
#include "DriverGMF_Write.hxx"
#include "SMESHDS_Group.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESH_Comment.hxx"
extern "C"
{
#include "libmesh5.h"
}
#include <stdarg.h>
// --------------------------------------------------------------------------------
// Closing GMF mesh at destruction
DriverGMF_MeshCloser::~DriverGMF_MeshCloser()
{
if ( _gmfMeshID )
GmfCloseMesh( _gmfMeshID );
}
// --------------------------------------------------------------------------------
DriverGMF_Read::DriverGMF_Read():
Driver_SMESHDS_Mesh()
{
}
// --------------------------------------------------------------------------------
DriverGMF_Read::~DriverGMF_Read()
{
}
//================================================================================
/*!
* \brief Read a GMF file
*/
//================================================================================
Driver_Mesh::Status DriverGMF_Read::Perform()
{
Status status = DRS_OK;
int dim, version;
// open the file
int meshID = GmfOpenMesh( myFile.c_str(), GmfRead, &version, &dim );
if ( !meshID )
return addMessage( SMESH_Comment("Can't open for reading ") << myFile, /*fatal=*/true );
DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
// Read nodes
int nbNodes = GmfStatKwd(meshID, GmfVertices);
if ( nbNodes < 1 )
return addMessage( "No nodes in the mesh", /*fatal=*/true );
GmfGotoKwd(meshID, GmfVertices);
int ref;
const int nodeIDShift = myMesh->GetMeshInfo().NbNodes();
if ( version != GmfFloat )
{
double x, y, z;
for ( int i = 1; i <= nbNodes; ++i )
{
GmfGetLin(meshID, GmfVertices, &x, &y, &z, &ref);
myMesh->AddNodeWithID( x,y,z, nodeIDShift + i);
}
}
else
{
float x, y, z;
for ( int i = 1; i <= nbNodes; ++i )
{
GmfGetLin(meshID, GmfVertices, &x, &y, &z, &ref);
myMesh->AddNodeWithID( x,y,z, nodeIDShift + i);
}
}
// Read elements
int iN[28];
/* Read edges */
const int edgeIDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbEdges = GmfStatKwd(meshID, GmfEdges))
{
GmfGotoKwd(meshID, GmfEdges);
for ( int i = 1; i <= nbEdges; ++i )
{
GmfGetLin(meshID, GmfEdges, &iN[0], &iN[1], &ref);
if ( !myMesh->AddEdgeWithID( iN[0], iN[1], edgeIDShift + i ))
status = storeBadNodeIds( "GmfEdges",i, 2, iN[0], iN[1] );
}
}
/* Read quadratic edges */
const int edge2IDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbEdges = GmfStatKwd(meshID, GmfEdgesP2))
{
GmfGotoKwd(meshID, GmfEdgesP2);
for ( int i = 1; i <= nbEdges; ++i )
{
GmfGetLin(meshID, GmfEdgesP2, &iN[0], &iN[1], &iN[2], &ref);
if ( !myMesh->AddEdgeWithID( iN[0], iN[1], iN[2], edge2IDShift + i ))
status = storeBadNodeIds( "GmfEdgesP2",i, 3, iN[0], iN[1], iN[2] );
}
}
/* Read triangles */
const int triaIDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbTria = GmfStatKwd(meshID, GmfTriangles))
{
GmfGotoKwd(meshID, GmfTriangles);
for ( int i = 1; i <= nbTria; ++i )
{
GmfGetLin(meshID, GmfTriangles, &iN[0], &iN[1], &iN[2], &ref);
if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], triaIDShift + i ))
status = storeBadNodeIds( "GmfTriangles",i, 3, iN[0], iN[1], iN[2] );
}
}
/* Read quadratic triangles */
const int tria2IDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbTria = GmfStatKwd(meshID, GmfTrianglesP2))
{
GmfGotoKwd(meshID, GmfTrianglesP2);
for ( int i = 1; i <= nbTria; ++i )
{
GmfGetLin(meshID, GmfTrianglesP2,
&iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref);
if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],
tria2IDShift + i ))
status = storeBadNodeIds( "GmfTrianglesP2",i, 6, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5] );
}
}
/* Read quadrangles */
const int quadIDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilaterals))
{
GmfGotoKwd(meshID, GmfQuadrilaterals);
for ( int i = 1; i <= nbQuad; ++i )
{
GmfGetLin(meshID, GmfQuadrilaterals, &iN[0], &iN[1], &iN[2], &iN[3], &ref);
if ( !myMesh->AddFaceWithID( iN[0], iN[1], iN[2], iN[3], quadIDShift + i ))
status = storeBadNodeIds( "GmfQuadrilaterals",i, 4, iN[0], iN[1],iN[2], iN[3] );
}
}
/* Read bi-quadratic quadrangles */
const int quad2IDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbQuad = GmfStatKwd(meshID, GmfQuadrilateralsQ2))
{
GmfGotoKwd(meshID, GmfQuadrilateralsQ2);
for ( int i = 1; i <= nbQuad; ++i )
{
GmfGetLin(meshID, GmfQuadrilateralsQ2,
&iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &ref);
if ( !myMesh->AddFaceWithID( iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8],
quad2IDShift + i ))
status = storeBadNodeIds( "GmfQuadrilateralsQ2",i,
9, iN[0],iN[1],iN[2],iN[3],iN[4],iN[5],iN[6],iN[7],iN[8] );
}
}
/* Read terahedra */
const int tetIDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedra))
{
GmfGotoKwd(meshID, GmfTetrahedra);
for ( int i = 1; i <= nbTet; ++i )
{
GmfGetLin(meshID, GmfTetrahedra, &iN[0], &iN[1], &iN[2], &iN[3], &ref);
if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], tetIDShift + i ))
status = storeBadNodeIds( "GmfTetrahedra",i, 4, iN[0], iN[1],iN[2], iN[3] );
}
}
/* Read quadratic terahedra */
const int tet2IDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbTet = GmfStatKwd(meshID, GmfTetrahedraP2))
{
GmfGotoKwd(meshID, GmfTetrahedraP2);
for ( int i = 1; i <= nbTet; ++i )
{
GmfGetLin(meshID, GmfTetrahedraP2, &iN[0], &iN[1], &iN[2],
&iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &iN[8], &iN[9], &ref);
if ( !myMesh->AddVolumeWithID( iN[0],iN[2],iN[1],iN[3],
iN[6],iN[5],iN[4],
iN[7],iN[9],iN[8], tet2IDShift + i ))
status = storeBadNodeIds( "GmfTetrahedraP2",i, 10, iN[0],iN[1],iN[2],iN[3],
iN[4],iN[5],iN[6],iN[7],iN[8],iN[9] );
}
}
/* Read pyramids */
const int pyrIDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbPyr = GmfStatKwd(meshID, GmfPyramids))
{
GmfGotoKwd(meshID, GmfPyramids);
for ( int i = 1; i <= nbPyr; ++i )
{
GmfGetLin(meshID, GmfPyramids, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &ref);
if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[4], pyrIDShift + i ))
status = storeBadNodeIds( "GmfPyramids",i, 5, iN[0], iN[1],iN[2], iN[3], iN[4] );
}
}
/* Read hexahedra */
const int hexIDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbHex = GmfStatKwd(meshID, GmfHexahedra))
{
GmfGotoKwd(meshID, GmfHexahedra);
for ( int i = 1; i <= nbHex; ++i )
{
GmfGetLin(meshID, GmfHexahedra,
&iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &iN[6], &iN[7], &ref);
if ( !myMesh->AddVolumeWithID( iN[0], iN[3], iN[2], iN[1], iN[4], iN[7], iN[6], iN[5],
hexIDShift + i))
status = storeBadNodeIds( "GmfHexahedra",i,
8, iN[0], iN[1],iN[2], iN[3], iN[4], iN[7], iN[6], iN[5] );
}
}
/* Read tri-quadratic hexahedra */
const int hex2IDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbHex = GmfStatKwd(meshID, GmfHexahedraQ2))
{
GmfGotoKwd(meshID, GmfHexahedraQ2);
for ( int i = 1; i <= nbHex; ++i )
{
GmfGetLin(meshID, GmfHexahedraQ2, &iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5],
&iN[6], &iN[7], &iN[8],&iN[9],&iN[10],&iN[11],&iN[12],&iN[13],&iN[14],
&iN[15],&iN[16],&iN[17],&iN[18],&iN[19],&iN[20],&iN[21],&iN[22],&iN[23],
&iN[24],&iN[25],&iN[26], &ref);
if ( !myMesh->AddVolumeWithID( iN[0],iN[3],iN[2],iN[1],iN[4],iN[7],iN[6],iN[5],iN[11],iN[10],
iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17],
iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26],
hex2IDShift + i ))
status = storeBadNodeIds( "GmfHexahedraQ2",i, 27,
iN[0],iN[3],iN[2],iN[1],iN[4], iN[7],iN[6],iN[5],iN[11],iN[10],
iN[9],iN[8],iN[12],iN[15],iN[14], iN[13],iN[19],iN[18],iN[17],
iN[16],iN[20],iN[24],iN[23],iN[22],iN[21], iN[25],iN[26]);
}
}
/* Read prism */
const int prismIDShift = myMesh->GetMeshInfo().NbElements();
if ( int nbPrism = GmfStatKwd(meshID, GmfPrisms))
{
GmfGotoKwd(meshID, GmfPrisms);
for ( int i = 1; i <= nbPrism; ++i )
{
GmfGetLin(meshID, GmfPrisms,
&iN[0], &iN[1], &iN[2], &iN[3], &iN[4], &iN[5], &ref);
if ( !myMesh->AddVolumeWithID( iN[0], iN[2], iN[1], iN[3], iN[5], iN[4], prismIDShift + i))
status = storeBadNodeIds( "GmfPrisms",i,
6, iN[0], iN[1],iN[2], iN[3], iN[4], iN[5] );
}
}
// Read required entities into groups
// get ids of existing groups
std::set< int > groupIDs;
const std::set<SMESHDS_GroupBase*>& groups = myMesh->GetGroups();
std::set<SMESHDS_GroupBase*>::const_iterator grIter = groups.begin();
for ( ; grIter != groups.end(); ++grIter )
groupIDs.insert( (*grIter)->GetID() );
if ( groupIDs.empty() ) groupIDs.insert( 0 );
const int kes[4][3] = { { GmfRequiredVertices, SMDSAbs_Node, nodeIDShift },
{ GmfRequiredEdges, SMDSAbs_Edge, edgeIDShift },
{ GmfRequiredTriangles, SMDSAbs_Face, triaIDShift },
{ GmfRequiredQuadrilaterals,SMDSAbs_Face, quadIDShift }};
const char* names[4] = { "_required_Vertices" ,
"_required_Edges" ,
"_required_Triangles" ,
"_required_Quadrilaterals" };
for ( int i = 0; i < 4; ++i )
{
int gmfKwd = kes[i][0];
SMDSAbs_ElementType entity = (SMDSAbs_ElementType) kes[i][1];
int shift = kes[i][2];
if ( int nb = GmfStatKwd(meshID, gmfKwd))
{
const int newID = *groupIDs.rbegin() + 1;
groupIDs.insert( newID );
SMESHDS_Group* group = new SMESHDS_Group( newID, myMesh, entity );
group->SetStoreName( names[i] );
myMesh->AddGroup( group );
GmfGotoKwd(meshID, gmfKwd);
for ( int i = 0; i < nb; ++i )
{
GmfGetLin(meshID, gmfKwd, &iN[0] );
group->Add( shift + iN[0] );
}
}
}
return status;
}
//================================================================================
/*!
* \brief Store a message about invalid IDs of nodes
*/
//================================================================================
Driver_Mesh::Status DriverGMF_Read::storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...)
{
if ( myStatus != DRS_OK )
return myStatus;
SMESH_Comment msg;
va_list VarArg;
va_start(VarArg, nb);
for ( int i = 0; i < nb; ++i )
{
int id = va_arg(VarArg, int );
if ( !myMesh->FindNode( id ))
msg << " " << id;
}
va_end(VarArg);
if ( !msg.empty() )
{
std::string nbStr;
const char* nbNames[] = { "1-st ", "2-nd ", "3-d " };
if ( elemNb < 3 ) nbStr = nbNames[ elemNb-1 ];
else nbStr = SMESH_Comment(elemNb) << "-th ";
return addMessage
( SMESH_Comment("Wrong node IDs of ")<< nbStr << gmfKwd << ":" << msg,
/*fatal=*/false );
}
return DRS_OK;
}

View File

@ -14,32 +14,44 @@
// 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
// 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)
// 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"
#ifndef __DriverGMF_Read_HXX__
#define __DriverGMF_Read_HXX__
#include "SMESH_Algo.hxx"
#include "SMESH_DriverGMF.hxx"
class SMESH_EXPORT SMESH_3D_Algo:
public SMESH_Algo
#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:
SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
virtual ~SMESH_3D_Algo();
DriverGMF_Read();
~DriverGMF_Read();
virtual Status Perform();
private:
Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...);
};
#endif

View File

@ -0,0 +1,317 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// File : DriverGMF_Write.cxx
// Created : Mon Sep 17 17:03:02 2012
// Author : Edward AGAPOV (eap)
#include "DriverGMF_Write.hxx"
#include "SMESHDS_GroupBase.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESH_Comment.hxx"
extern "C"
{
#include "libmesh5.h"
}
#include <vector>
#define BEGIN_ELEM_WRITE( SMDSEntity, GmfKwd, elem ) \
elemIt = myMesh->elementEntityIterator( SMDSEntity ); \
if ( elemIt->more() ) \
{ \
GmfSetKwd(meshID, GmfKwd, myMesh->GetMeshInfo().NbEntities( SMDSEntity )); \
for ( int gmfID = 1; elemIt->more(); ++gmfID ) \
{ \
const SMDS_MeshElement* elem = elemIt->next(); \
GmfSetLin(meshID, GmfKwd,
#define END_ELEM_WRITE( elem ) \
elem->getshapeId() ); \
}} \
#define END_ELEM_WRITE_ADD_TO_MAP( elem, e2id ) \
elem->getshapeId() ); \
e2id.insert( e2id.end(), make_pair( elem, gmfID )); \
}} \
DriverGMF_Write::DriverGMF_Write():
Driver_SMESHDS_Mesh()
{
}
DriverGMF_Write::~DriverGMF_Write()
{
}
Driver_Mesh::Status DriverGMF_Write::Perform()
{
const int dim = 3, version = 3;
int meshID = GmfOpenMesh( myFile.c_str(), GmfWrite, version, dim );
if ( !meshID )
return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true );
DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
// nodes
std::map< const SMDS_MeshNode* , int > node2IdMap;
int iN = 0, nbNodes = myMesh->NbNodes();
GmfSetKwd( meshID, GmfVertices, nbNodes );
double xyz[3];
SMDS_NodeIteratorPtr nodeIt = myMesh->nodesIterator();
while ( nodeIt->more() )
{
const SMDS_MeshNode* n = nodeIt->next();
n->GetXYZ( xyz );
GmfSetLin( meshID, GmfVertices, xyz[0], xyz[1], xyz[2], n->getshapeId() );
node2IdMap.insert( node2IdMap.end(), make_pair( n, ++iN ));
}
if ( iN != nbNodes )
return addMessage("Wrong nb of nodes returned by nodesIterator", /*fatal=*/true);
SMDS_ElemIteratorPtr elemIt;
typedef std::map< const SMDS_MeshElement*, size_t, TIDCompare > TElem2IDMap;
// edges
TElem2IDMap edge2IDMap;
BEGIN_ELEM_WRITE( SMDSEntity_Edge, GmfEdges, edge )
node2IdMap[ edge->GetNode( 0 )],
node2IdMap[ edge->GetNode( 1 )],
END_ELEM_WRITE_ADD_TO_MAP( edge, edge2IDMap );
// quadratic edges
BEGIN_ELEM_WRITE( SMDSEntity_Quad_Edge, GmfEdgesP2, edge )
node2IdMap[ edge->GetNode( 0 )],
node2IdMap[ edge->GetNode( 1 )],
node2IdMap[ edge->GetNode( 2 )],
END_ELEM_WRITE( edge );
// triangles
TElem2IDMap tria2IDMap;
BEGIN_ELEM_WRITE( SMDSEntity_Triangle, GmfTriangles, tria )
node2IdMap[ tria->GetNode( 0 )],
node2IdMap[ tria->GetNode( 1 )],
node2IdMap[ tria->GetNode( 2 )],
END_ELEM_WRITE_ADD_TO_MAP( tria, tria2IDMap );
// quadratic triangles
BEGIN_ELEM_WRITE( SMDSEntity_Quad_Triangle, GmfTrianglesP2, tria )
node2IdMap[ tria->GetNode( 0 )],
node2IdMap[ tria->GetNode( 1 )],
node2IdMap[ tria->GetNode( 2 )],
node2IdMap[ tria->GetNode( 3 )],
node2IdMap[ tria->GetNode( 4 )],
node2IdMap[ tria->GetNode( 5 )],
END_ELEM_WRITE( tria );
// quadrangles
TElem2IDMap quad2IDMap;
BEGIN_ELEM_WRITE( SMDSEntity_Quadrangle, GmfQuadrilaterals, quad )
node2IdMap[ quad->GetNode( 0 )],
node2IdMap[ quad->GetNode( 1 )],
node2IdMap[ quad->GetNode( 2 )],
node2IdMap[ quad->GetNode( 3 )],
END_ELEM_WRITE_ADD_TO_MAP( quad, quad2IDMap );
// bi-quadratic quadrangles
BEGIN_ELEM_WRITE( SMDSEntity_BiQuad_Quadrangle, GmfQuadrilateralsQ2, quad )
node2IdMap[ quad->GetNode( 0 )],
node2IdMap[ quad->GetNode( 3 )],
node2IdMap[ quad->GetNode( 2 )],
node2IdMap[ quad->GetNode( 1 )],
node2IdMap[ quad->GetNode( 7 )],
node2IdMap[ quad->GetNode( 6 )],
node2IdMap[ quad->GetNode( 5 )],
node2IdMap[ quad->GetNode( 4 )],
node2IdMap[ quad->GetNode( 8 )],
END_ELEM_WRITE( quad );
// terahedra
BEGIN_ELEM_WRITE( SMDSEntity_Tetra, GmfTetrahedra, tetra )
node2IdMap[ tetra->GetNode( 0 )],
node2IdMap[ tetra->GetNode( 2 )],
node2IdMap[ tetra->GetNode( 1 )],
node2IdMap[ tetra->GetNode( 3 )],
END_ELEM_WRITE( tetra );
// quadratic terahedra
BEGIN_ELEM_WRITE( SMDSEntity_Quad_Tetra, GmfTetrahedraP2, tetra )
node2IdMap[ tetra->GetNode( 0 )],
node2IdMap[ tetra->GetNode( 2 )],
node2IdMap[ tetra->GetNode( 1 )],
node2IdMap[ tetra->GetNode( 3 )],
node2IdMap[ tetra->GetNode( 6 )],
node2IdMap[ tetra->GetNode( 5 )],
node2IdMap[ tetra->GetNode( 4 )],
node2IdMap[ tetra->GetNode( 7 )],
node2IdMap[ tetra->GetNode( 9 )],
node2IdMap[ tetra->GetNode( 8 )],
END_ELEM_WRITE( tetra );
// pyramids
BEGIN_ELEM_WRITE( SMDSEntity_Pyramid, GmfPyramids, pyra )
node2IdMap[ pyra->GetNode( 0 )],
node2IdMap[ pyra->GetNode( 2 )],
node2IdMap[ pyra->GetNode( 1 )],
node2IdMap[ pyra->GetNode( 3 )],
node2IdMap[ pyra->GetNode( 4 )],
END_ELEM_WRITE( pyra );
// hexahedra
BEGIN_ELEM_WRITE( SMDSEntity_Hexa, GmfHexahedra, hexa )
node2IdMap[ hexa->GetNode( 0 )],
node2IdMap[ hexa->GetNode( 3 )],
node2IdMap[ hexa->GetNode( 2 )],
node2IdMap[ hexa->GetNode( 1 )],
node2IdMap[ hexa->GetNode( 4 )],
node2IdMap[ hexa->GetNode( 7 )],
node2IdMap[ hexa->GetNode( 6 )],
node2IdMap[ hexa->GetNode( 5 )],
END_ELEM_WRITE( hexa );
// tri-quadratic hexahedra
BEGIN_ELEM_WRITE( SMDSEntity_TriQuad_Hexa, GmfHexahedraQ2, hexa )
node2IdMap[ hexa->GetNode( 0 )],
node2IdMap[ hexa->GetNode( 3 )],
node2IdMap[ hexa->GetNode( 2 )],
node2IdMap[ hexa->GetNode( 1 )],
node2IdMap[ hexa->GetNode( 4 )],
node2IdMap[ hexa->GetNode( 7 )],
node2IdMap[ hexa->GetNode( 6 )],
node2IdMap[ hexa->GetNode( 5 )],
node2IdMap[ hexa->GetNode( 11 )],
node2IdMap[ hexa->GetNode( 10 )],
node2IdMap[ hexa->GetNode( 9 )],
node2IdMap[ hexa->GetNode( 8 )],
node2IdMap[ hexa->GetNode( 12 )],
node2IdMap[ hexa->GetNode( 15 )],
node2IdMap[ hexa->GetNode( 14 )],
node2IdMap[ hexa->GetNode( 13 )],
node2IdMap[ hexa->GetNode( 19 )],
node2IdMap[ hexa->GetNode( 18 )],
node2IdMap[ hexa->GetNode( 17 )],
node2IdMap[ hexa->GetNode( 16 )],
node2IdMap[ hexa->GetNode( 20 )],
node2IdMap[ hexa->GetNode( 24 )],
node2IdMap[ hexa->GetNode( 23 )],
node2IdMap[ hexa->GetNode( 22 )],
node2IdMap[ hexa->GetNode( 21 )],
node2IdMap[ hexa->GetNode( 25 )],
node2IdMap[ hexa->GetNode( 26 )],
END_ELEM_WRITE( hexa );
// prism
BEGIN_ELEM_WRITE( SMDSEntity_Penta, GmfPrisms, prism )
node2IdMap[ prism->GetNode( 0 )],
node2IdMap[ prism->GetNode( 2 )],
node2IdMap[ prism->GetNode( 1 )],
node2IdMap[ prism->GetNode( 3 )],
node2IdMap[ prism->GetNode( 5 )],
node2IdMap[ prism->GetNode( 4 )],
END_ELEM_WRITE( prism );
// required entities
SMESH_Comment badGroups;
const std::set<SMESHDS_GroupBase*>& groupSet = myMesh->GetGroups();
std::set<SMESHDS_GroupBase*>::const_iterator grIt = groupSet.begin();
for ( ; grIt != groupSet.end(); ++grIt )
{
const SMESHDS_GroupBase* group = *grIt;
std::string groupName = group->GetStoreName();
std::string::size_type pos = groupName.find( "_required_" );
if ( pos == std::string::npos ) continue;
int gmfKwd;
SMDSAbs_EntityType smdsEntity;
std::string entity = groupName.substr( pos + strlen("_required_"));
if ( entity == "Vertices" ) {
gmfKwd = GmfRequiredVertices;
smdsEntity = SMDSEntity_Node;
}
else if ( entity == "Edges" ) {
gmfKwd = GmfRequiredEdges;
smdsEntity = SMDSEntity_Edge;
}
else if ( entity == "Triangles" ) {
gmfKwd = GmfRequiredTriangles;
smdsEntity = SMDSEntity_Triangle;
}
else if ( entity == "Quadrilaterals" ) {
gmfKwd = GmfRequiredQuadrilaterals;
smdsEntity = SMDSEntity_Quadrangle;
}
else {
addMessage( SMESH_Comment("Invalig gmf entity name: ") << entity, /*fatal=*/false );
continue;
}
// check elem type in the group
int nbOkElems = 0;
SMDS_ElemIteratorPtr elemIt = group->GetElements();
while ( elemIt->more() )
nbOkElems += ( elemIt->next()->GetEntityType() == smdsEntity );
if ( nbOkElems != group->Extent() && nbOkElems == 0 )
{
badGroups << " " << groupName;
continue;
}
// choose a TElem2IDMap
TElem2IDMap* elem2IDMap = 0;
if ( smdsEntity == SMDSEntity_Quadrangle && nbOkElems != myMesh->NbFaces() )
elem2IDMap = & quad2IDMap;
else if ( smdsEntity == SMDSEntity_Triangle && nbOkElems != myMesh->NbFaces() )
elem2IDMap = & tria2IDMap;
else if ( smdsEntity == SMDSEntity_Edge && nbOkElems != myMesh->NbEdges() )
elem2IDMap = & edge2IDMap;
// write the group
GmfSetKwd( meshID, gmfKwd, nbOkElems );
elemIt = group->GetElements();
if ( elem2IDMap )
for ( ; elemIt->more(); )
{
const SMDS_MeshElement* elem = elemIt->next();
if ( elem->GetEntityType() == smdsEntity )
GmfSetLin( meshID, gmfKwd, (*elem2IDMap)[ elem ] );
}
else
for ( int gmfID = 1; elemIt->more(); ++gmfID)
{
const SMDS_MeshElement* elem = elemIt->next();
if ( elem->GetEntityType() == smdsEntity )
GmfSetLin( meshID, gmfKwd, gmfID );
}
} // loop on groups
if ( !badGroups.empty() )
addMessage( SMESH_Comment("Groups of elements of inappropriate geometry:")
<< badGroups, /*fatal=*/false );
return DRS_OK;
}

View File

@ -19,32 +19,41 @@
//
// 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)
// 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"
#ifndef __DriverGMF_Write_HXX__
#define __DriverGMF_Write_HXX__
#include "SMESH_Algo.hxx"
#include "SMESH_subMesh.hxx"
#include "TopoDS_Wire.hxx"
#include "SMESH_DriverGMF.hxx"
class SMESH_EXPORT SMESH_2D_Algo:
public SMESH_Algo
#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:
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);
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

50
src/DriverGMF/Makefile.am Normal file
View File

@ -0,0 +1,50 @@
# Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
include $(top_srcdir)/adm_local/unix/make_common_starter.am
# header files
salomeinclude_HEADERS = \
DriverGMF_Read.hxx \
DriverGMF_Write.hxx \
SMESH_DriverGMF.hxx \
libmesh5.h
# Libraries targets
lib_LTLIBRARIES = libMeshDriverGMF.la
dist_libMeshDriverGMF_la_SOURCES = \
DriverGMF_Read.cxx \
DriverGMF_Write.cxx \
libmesh5.c
# additionnal information to compil and link file
libMeshDriverGMF_la_CPPFLAGS = \
$(KERNEL_CXXFLAGS) \
$(CAS_CPPFLAGS) \
$(VTK_INCLUDES) \
$(BOOST_CPPFLAGS) \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHDS
libMeshDriverGMF_la_LDFLAGS = \
$(BOOST_LIBS) \
../Driver/libMeshDriver.la \
../SMESHUtils/libSMESHUtils.la

View File

@ -20,23 +20,21 @@
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : SMESH_0D_Algo.hxx
// File : SMESH_DriverGMF.hxx
// Author : Alexander A. BORODIN
// Module : SMESH
// $Header$
//
#ifndef _SMESH_0D_ALGO_HXX_
#define _SMESH_0D_ALGO_HXX_
#ifndef _SMESH_DriverGMF_HXX_
#define _SMESH_DriverGMF_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();
};
#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

1346
src/DriverGMF/libmesh5.c Normal file

File diff suppressed because it is too large Load Diff

155
src/DriverGMF/libmesh5.h Normal file
View File

@ -0,0 +1,155 @@
/*----------------------------------------------------------*/
/* */
/* LIBMESH V 5.46 */
/* */
/*----------------------------------------------------------*/
/* */
/* Description: handle .meshb file format I/O */
/* Author: Loic MARECHAL */
/* Creation date: feb 16 2007 */
/* Last modification: dec 09 2011 */
/* */
/*----------------------------------------------------------*/
/*----------------------------------------------------------*/
/* Defines */
/*----------------------------------------------------------*/
#include "SMESH_DriverGMF.hxx"
#define GmfStrSiz 1024
#define GmfMaxTyp 1000
#define GmfMaxKwd 80
#define GmfMshVer 1
#define GmfRead 1
#define GmfWrite 2
#define GmfSca 1
#define GmfVec 2
#define GmfSymMat 3
#define GmfMat 4
#define GmfFloat 1
#define GmfDouble 2
enum GmfKwdCod
{
GmfReserved1, \
GmfVersionFormatted, \
GmfReserved2, \
GmfDimension, \
GmfVertices, \
GmfEdges, \
GmfTriangles, \
GmfQuadrilaterals, \
GmfTetrahedra, \
GmfPrisms, \
GmfHexahedra, \
GmfIterationsAll, \
GmfTimesAll, \
GmfCorners, \
GmfRidges, \
GmfRequiredVertices, \
GmfRequiredEdges, \
GmfRequiredTriangles, \
GmfRequiredQuadrilaterals, \
GmfTangentAtEdgeVertices, \
GmfNormalAtVertices, \
GmfNormalAtTriangleVertices, \
GmfNormalAtQuadrilateralVertices, \
GmfAngleOfCornerBound, \
GmfTrianglesP2, \
GmfEdgesP2, \
GmfSolAtPyramids, \
GmfQuadrilateralsQ2, \
GmfISolAtPyramids, \
GmfSubDomainFromGeom, \
GmfTetrahedraP2, \
GmfFault_NearTri, \
GmfFault_Inter, \
GmfHexahedraQ2, \
GmfExtraVerticesAtEdges, \
GmfExtraVerticesAtTriangles, \
GmfExtraVerticesAtQuadrilaterals, \
GmfExtraVerticesAtTetrahedra, \
GmfExtraVerticesAtPrisms, \
GmfExtraVerticesAtHexahedra, \
GmfVerticesOnGeometricVertices, \
GmfVerticesOnGeometricEdges, \
GmfVerticesOnGeometricTriangles, \
GmfVerticesOnGeometricQuadrilaterals, \
GmfEdgesOnGeometricEdges, \
GmfFault_FreeEdge, \
GmfPolyhedra, \
GmfPolygons, \
GmfFault_Overlap, \
GmfPyramids, \
GmfBoundingBox, \
GmfBody, \
GmfPrivateTable, \
GmfFault_BadShape, \
GmfEnd, \
GmfTrianglesOnGeometricTriangles, \
GmfTrianglesOnGeometricQuadrilaterals, \
GmfQuadrilateralsOnGeometricTriangles, \
GmfQuadrilateralsOnGeometricQuadrilaterals, \
GmfTangents, \
GmfNormals, \
GmfTangentAtVertices, \
GmfSolAtVertices, \
GmfSolAtEdges, \
GmfSolAtTriangles, \
GmfSolAtQuadrilaterals, \
GmfSolAtTetrahedra, \
GmfSolAtPrisms, \
GmfSolAtHexahedra, \
GmfDSolAtVertices, \
GmfISolAtVertices, \
GmfISolAtEdges, \
GmfISolAtTriangles, \
GmfISolAtQuadrilaterals, \
GmfISolAtTetrahedra, \
GmfISolAtPrisms, \
GmfISolAtHexahedra, \
GmfIterations, \
GmfTime, \
GmfFault_SmallTri, \
GmfCoarseHexahedra
};
/*----------------------------------------------------------*/
/* External procedures */
/*----------------------------------------------------------*/
MESHDriverGMF_EXPORT extern int GmfOpenMesh(const char *, int, ...);
MESHDriverGMF_EXPORT extern int GmfCloseMesh(int);
MESHDriverGMF_EXPORT extern int GmfStatKwd(int, int, ...);
MESHDriverGMF_EXPORT extern int GmfGotoKwd(int, int);
MESHDriverGMF_EXPORT extern int GmfSetKwd(int, int, ...);
MESHDriverGMF_EXPORT extern void GmfGetLin(int, int, ...);
MESHDriverGMF_EXPORT extern void GmfSetLin(int, int, ...);
/*----------------------------------------------------------*/
/* Fortran 77 API */
/*----------------------------------------------------------*/
#if defined(F77_NO_UNDER_SCORE)
#define call(x) x
#else
#define call(x) x ## _
#endif
/*----------------------------------------------------------*/
/* Transmesh private API */
/*----------------------------------------------------------*/
#ifdef TRANSMESH
MESHDriverGMF_EXPORT extern char *GmfKwdFmt[ GmfMaxKwd + 1 ][4];
MESHDriverGMF_EXPORT extern int GmfCpyLin(int, int, int);
#endif

View File

@ -205,7 +205,7 @@ DriverMED_R_SMESHDS_Mesh
aNodeIds.resize( aNbBalls );
for(TInt iBall = 0; iBall < aNbBalls && anIsNodeNum; iBall++)
{
aNodeIds[iBall] = aNodeInfo->GetElemNum(iBall);
aNodeIds[iBall] = aNodeInfo->GetElemNum( (*aBallInfo->myConn)[ iBall ]-1 );
anIsNodeNum = myMesh->FindNode( aNodeIds[iBall] ) ? eVRAI : eFAUX;
}
}

View File

@ -411,7 +411,7 @@ Driver_Mesh::Status DriverMED_W_SMESHDS_Mesh::Perform()
if (myDoGroupOfFaces && nbFaces) myFacesDefaultFamilyId = REST_FACES_FAMILY;
if (myDoGroupOfVolumes && nbVolumes) myVolumesDefaultFamilyId = REST_VOLUMES_FAMILY;
if (myDoGroupOf0DElems && nb0DElements) my0DElementsDefaultFamilyId = REST_0DELEM_FAMILY;
if (myDoGroupOfVolumes && nbVolumes) myBallsDefaultFamilyId = REST_BALL_FAMILY;
if (myDoGroupOfBalls && nbBalls) myBallsDefaultFamilyId = REST_BALL_FAMILY;
MESSAGE("Perform - aFamilyInfo");
//cout << " DriverMED_Family::MakeFamilies() " << endl;

View File

@ -55,6 +55,7 @@ libMeshDriverMED_la_CPPFLAGS = \
$(BOOST_CPPFLAGS) \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMESHDS
libMeshDriverMED_la_LDFLAGS = \

View File

@ -67,6 +67,7 @@ libMeshDriverUNV_la_CPPFLAGS = \
$(BOOST_CPPFLAGS) \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMESHDS
libMeshDriverUNV_la_LDFLAGS = \

View File

@ -21,7 +21,6 @@
# Author : Patrick GOLDBRONN (CEA)
# Modified by : Alexander BORODIN (OCN) - autotools usage
# Module : SMESH
# $Header$
#
include $(top_srcdir)/adm_local/unix/make_common_starter.am
@ -39,6 +38,7 @@ SUBDIRS = \
DriverDAT \
DriverUNV \
DriverSTL \
DriverGMF \
$(DriverCGNS_SUDIR) \
SMESH \
SMESH_I \
@ -61,5 +61,6 @@ if SMESH_ENABLE_GUI
endif
DIST_SUBDIRS = SMDS SMESHDS Controls Driver DriverMED DriverDAT DriverUNV DriverSTL DriverCGNS \
DriverGMF \
SMESHUtils SMESH SMESH_I SMESHClient SMESH_SWIG MEFISTO2 StdMeshers StdMeshers_I OBJECT \
SMESHFiltersSelection SMESHGUI PluginUtils SMESH_SWIG_WITHIHM StdMeshersGUI SMESH_PY Tools

View File

@ -37,7 +37,9 @@ salomeinclude_HEADERS = \
SMESH_FaceOrientationFilter.h \
SMESH_ScalarBarActor.h \
SMESH_NodeLabelActor.h \
SMESH_CellLabelActor.h
SMESH_CellLabelActor.h \
SMESH_SVTKActor.h
# Libraries targets
@ -52,7 +54,8 @@ dist_libSMESHObject_la_SOURCES = \
SMESH_FaceOrientationFilter.cxx \
SMESH_ScalarBarActor.cxx \
SMESH_NodeLabelActor.cxx \
SMESH_CellLabelActor.cxx
SMESH_CellLabelActor.cxx \
SMESH_SVTKActor.cxx
libSMESHObject_la_CPPFLAGS = \
$(QT_INCLUDES) \

View File

@ -37,6 +37,7 @@
#include "VTKViewer_ExtractUnstructuredGrid.h"
#include "VTKViewer_FramedTextActor.h"
#include "SALOME_InteractiveObject.hxx"
#include "SMESH_SVTKActor.h"
#include "SUIT_Session.h"
#include "SUIT_ResourceMgr.h"
@ -127,6 +128,12 @@ SMESH_ActorDef::SMESH_ActorDef()
myIsPointsVisible = false;
myIsEntityModeCache = false;
myHighlightActor = SMESH_SVTKActor::New();
myHighlightActor->Initialize();
myPreHighlightActor = SMESH_SVTKActor::New();
myPreHighlightActor->Initialize();
myIsShrinkable = false;
myIsShrunk = false;
@ -141,6 +148,7 @@ SMESH_ActorDef::SMESH_ActorDef()
vtkFloatingPointType aElem0DSize = SMESH::GetFloat("SMESH:elem0d_size",5);
vtkFloatingPointType aBallElemSize = SMESH::GetFloat("SMESH:ball_elem_size",10);
vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
vtkFloatingPointType aOutlineWidth = SMESH::GetFloat("SMESH:outline_width",1);
vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New();
VTKViewer_ExtractUnstructuredGrid* aFilter = NULL;
@ -159,6 +167,15 @@ SMESH_ActorDef::SMESH_ActorDef()
bfc = Qtx::mainColorToSecondary(ffc, delta);
myBackSurfaceProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
myNormalVProp = vtkProperty::New();
SMESH::GetColor( "SMESH", "volume_color", ffc, delta, "255,0,170|-100" );
myNormalVProp->SetColor( ffc.redF(), ffc.greenF(), ffc.blueF() );
myDeltaVBrightness = delta;
myReversedVProp = vtkProperty::New();
bfc = Qtx::mainColorToSecondary(ffc, delta);
myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
my2DActor = SMESH_CellLabelActor::New();
my2DActor->SetStoreGemetryMapping(true);
my2DActor->SetUserMatrix(aMatrix);
@ -201,8 +218,8 @@ SMESH_ActorDef::SMESH_ActorDef()
my3DActor->SetStoreGemetryMapping(true);
my3DActor->SetUserMatrix(aMatrix);
my3DActor->PickableOff();
my3DActor->SetProperty(mySurfaceProp);
my3DActor->SetBackfaceProperty(myBackSurfaceProp);
my3DActor->SetProperty(myNormalVProp);
my3DActor->SetBackfaceProperty(myReversedVProp);
my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
my3DActor->SetCoincident3DAllowed(true);
aFilter = my3DActor->GetExtractUnstructuredGrid();
@ -224,11 +241,19 @@ SMESH_ActorDef::SMESH_ActorDef()
aFilter->RegisterCellsWithType(VTK_POLYHEDRON);
//#endif
my3DExtProp = vtkProperty::New();
my3DExtProp->DeepCopy(myNormalVProp);
SMESH::GetColor( "SMESH", "volume_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 170 ) );
anRGB[0] = 1 - anRGB[0];
anRGB[1] = 1 - anRGB[1];
anRGB[2] = 1 - anRGB[2];
my3DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
my3DExtActor = SMESH_DeviceActor::New();
my3DExtActor->SetUserMatrix(aMatrix);
my3DExtActor->PickableOff();
my3DExtActor->SetProperty(my2DExtProp);
my3DExtActor->SetBackfaceProperty(my2DExtProp);
my3DExtActor->SetProperty(my3DExtProp);
my3DExtActor->SetBackfaceProperty(my3DExtProp);
my3DExtActor->SetRepresentation(SMESH_DeviceActor::eSurface);
my3DExtActor->SetCoincident3DAllowed(true);
aFilter = my3DExtActor->GetExtractUnstructuredGrid();
@ -318,7 +343,7 @@ SMESH_ActorDef::SMESH_ActorDef()
//Definition 0D device of the actor (ball elements)
//-----------------------------------------------
myBallProp = vtkProperty::New();
SMESH::GetColor( "SMESH", "ball_elem_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 0 ) );
SMESH::GetColor( "SMESH", "ball_elem_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 85, 255 ) );
myBallProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
myBallProp->SetPointSize(aBallElemSize);
@ -330,9 +355,7 @@ SMESH_ActorDef::SMESH_ActorDef()
myBallActor->SetProperty(myBallProp);
myBallActor->SetRepresentation(SMESH_DeviceActor::eSurface);
aFilter = myBallActor->GetExtractUnstructuredGrid();
//aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
aFilter->RegisterCellsWithType(VTK_VERTEX);
aFilter->RegisterCellsWithType(VTK_POLY_VERTEX);
//my0DExtProp = vtkProperty::New();
@ -410,14 +433,18 @@ SMESH_ActorDef::SMESH_ActorDef()
myHighlightProp->SetLineWidth(aLineWidth);
myHighlightProp->SetRepresentation(1);
myBallHighlightProp = vtkProperty::New();
myBallHighlightProp->DeepCopy(myHighlightProp);
myBallHighlightProp->SetPointSize(aBallElemSize);
myOutLineProp = vtkProperty::New();
myOutLineProp->SetAmbient(1.0);
myOutLineProp->SetDiffuse(0.0);
myOutLineProp->SetSpecular(0.0);
SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 70, 0 ) );
myOutLineProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
myOutLineProp->SetPointSize(aElem0DSize); // ??
myOutLineProp->SetLineWidth(aLineWidth);
myOutLineProp->SetLineWidth(aOutlineWidth);
myOutLineProp->SetRepresentation(1);
myPreselectProp = vtkProperty::New();
@ -430,6 +457,10 @@ SMESH_ActorDef::SMESH_ActorDef()
myPreselectProp->SetLineWidth(aLineWidth);
myPreselectProp->SetRepresentation(1);
myBallPreselectProp = vtkProperty::New();
myBallPreselectProp->DeepCopy(myPreselectProp);
myBallPreselectProp->SetPointSize(aBallElemSize);
myHighlitableActor = SMESH_DeviceActor::New();
myHighlitableActor->SetUserMatrix(aMatrix);
myHighlitableActor->PickableOff();
@ -490,7 +521,7 @@ SMESH_ActorDef::SMESH_ActorDef()
my2DActor->SetQuadraticArcAngle(aQuadraticAngle);
// Set colors of the name actor
SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
SMESH::GetColor( "SMESH", "default_grp_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
myNameActor->SetBackgroundColor(anRGB[0], anRGB[1], anRGB[2]);
SMESH::GetColor( "SMESH", "group_name_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) );
myNameActor->SetForegroundColor(anRGB[0], anRGB[1], anRGB[2]);
@ -499,6 +530,8 @@ SMESH_ActorDef::SMESH_ActorDef()
my2dHistogram = 0;
#endif
SetBallSize(aBallElemSize);
Set0DSize(aElem0DSize);
}
@ -518,6 +551,8 @@ SMESH_ActorDef::~SMESH_ActorDef()
mySurfaceProp->Delete();
myBackSurfaceProp->Delete();
myNormalVProp->Delete();
myReversedVProp->Delete();
myOutLineProp->Delete();
myEdgeProp->Delete();
@ -544,6 +579,7 @@ SMESH_ActorDef::~SMESH_ActorDef()
my2DExtProp->Delete();
my2DExtActor->Delete();
my3DActor->Delete();
my3DExtProp->Delete();
my3DExtActor->Delete();
myNodeActor->Delete();
@ -555,6 +591,9 @@ SMESH_ActorDef::~SMESH_ActorDef()
myImplicitBoolean->Delete();
myTimeStamp->Delete();
myBallHighlightProp->Delete();
myBallPreselectProp->Delete();
}
void SMESH_ActorDef::Delete()
@ -639,15 +678,15 @@ bool SMESH_ActorDef::GetFacesOriented()
return myIsFacesOriented;
}
void SMESH_ActorDef::SetFacesOrientationColor(vtkFloatingPointType theColor[3])
void SMESH_ActorDef::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b)
{
my2DActor->SetFacesOrientationColor( theColor );
my3DActor->SetFacesOrientationColor( theColor );
my2DActor->SetFacesOrientationColor( r, g, b );
my3DActor->SetFacesOrientationColor( r, g, b );
}
void SMESH_ActorDef::GetFacesOrientationColor(vtkFloatingPointType theColor[3])
void SMESH_ActorDef::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b)
{
my3DActor->GetFacesOrientationColor( theColor );
my3DActor->GetFacesOrientationColor( r, g, b );
}
void SMESH_ActorDef::SetFacesOrientationScale(vtkFloatingPointType theScale)
@ -957,6 +996,9 @@ SetControlMode(eControl theMode,
void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
//myHighlightActor->AddToRender(theRenderer);
theRenderer->AddActor(myBaseActor);
theRenderer->AddActor(myNodeExtActor);
theRenderer->AddActor(my1DExtActor);
@ -1053,6 +1095,7 @@ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj,
my2DActor->GetPolygonOffsetParameters(aFactor,aUnits);
my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75);
my2DExtActor->SetPolygonOffsetParameters(aFactor,aUnits*0.5);
my3DActor->SetPolygonOffsetParameters(2*aFactor,aUnits);
SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
if( !mgr )
@ -1307,10 +1350,10 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
myNodeActor->VisibilityOn();
}
if(myEntityMode & e0DElements){
if(myEntityMode & e0DElements && GetRepresentation() != ePoint ){
my0DActor->VisibilityOn();
}
if(myEntityMode & eBallElem){
if(myEntityMode & eBallElem && GetRepresentation() != ePoint ){
myBallActor->VisibilityOn();
}
@ -1492,6 +1535,8 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge);
int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face);
int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume);
int aNb0Ds = myVisualObj->GetNbEntities(SMDSAbs_0DElement);
int aNbBalls = myVisualObj->GetNbEntities(SMDSAbs_Ball);
if (theMode < 0) {
myRepresentation = eSurface;
@ -1503,10 +1548,10 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
} else {
switch (theMode) {
case eEdge:
if (!aNbFaces && !aNbVolumes && !aNbEdges) return;
if (!aNbFaces && !aNbVolumes && !aNbEdges && !aNb0Ds && !aNbBalls) return;
break;
case eSurface:
if (!aNbFaces && !aNbVolumes) return;
if (!aNbFaces && !aNbVolumes && !aNb0Ds && !aNbBalls) return;
break;
}
myRepresentation = theMode;
@ -1528,6 +1573,7 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
myNodeActor->SetVisibility(false);
myNodeExtActor->SetVisibility(false);
vtkProperty *aProp = NULL, *aBackProp = NULL;
vtkProperty *aPropVN = NULL, *aPropVR = NULL;
SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1);
SMESH_Actor::EQuadratic2DRepresentation aQuadraticMode = GetQuadratic2DRepresentation();
switch (myRepresentation) {
@ -1535,16 +1581,18 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
myPickableActor = myNodeActor;
myNodeActor->SetVisibility(true);
aQuadraticMode = SMESH_Actor::eLines;
aProp = aBackProp = myNodeProp;
aProp = aBackProp = aPropVN = aPropVR = myNodeProp;
aReperesent = SMESH_DeviceActor::ePoint;
break;
case eEdge:
aProp = aBackProp = myEdgeProp;
aProp = aBackProp = aPropVN = aPropVR = myEdgeProp;
aReperesent = SMESH_DeviceActor::eInsideframe;
break;
case eSurface:
aProp = mySurfaceProp;
aBackProp = myBackSurfaceProp;
aPropVN = myNormalVProp;
aPropVR = myReversedVProp;
aReperesent = SMESH_DeviceActor::eSurface;
break;
}
@ -1560,8 +1608,8 @@ void SMESH_ActorDef::SetRepresentation (int theMode)
my2DExtActor->SetRepresentation(aReperesent);
my3DActor->SetProperty(aProp);
my3DActor->SetBackfaceProperty(aBackProp);
my3DActor->SetProperty(aPropVN);
my3DActor->SetBackfaceProperty(aPropVR);
my3DActor->SetRepresentation(aReperesent);
//my0DExtActor->SetVisibility(false);
@ -1633,9 +1681,12 @@ void SMESH_ActorDef::UpdateHighlight(){
{
if(myIsHighlighted) {
myHighlitableActor->SetProperty(myHighlightProp);
myBallActor->SetProperty(myBallHighlightProp);
}else if(myIsPreselected){
myHighlitableActor->SetProperty(myPreselectProp);
myBallActor->SetProperty(myBallPreselectProp);
} else if(anIsVisible){
myBallActor->SetProperty(myBallProp);
(myRepresentation == eSurface) ?
myHighlitableActor->SetProperty(myOutLineProp) : myHighlitableActor->SetProperty(myEdgeProp);
}
@ -1777,10 +1828,15 @@ static void GetColor(vtkProperty *theProperty, vtkFloatingPointType& r,vtkFloati
void SMESH_ActorDef::SetOpacity(vtkFloatingPointType theValue){
mySurfaceProp->SetOpacity(theValue);
myBackSurfaceProp->SetOpacity(theValue);
myNormalVProp->SetOpacity(theValue);
myReversedVProp->SetOpacity(theValue);
myEdgeProp->SetOpacity(theValue);
myOutLineProp->SetOpacity(theValue);
myNodeProp->SetOpacity(theValue);
my1DProp->SetOpacity(theValue);
my0DProp->SetOpacity(theValue);
myBallProp->SetOpacity(theValue);
}
@ -1791,9 +1847,9 @@ vtkFloatingPointType SMESH_ActorDef::GetOpacity(){
void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){
mySurfaceProp->SetColor(r,g,b);
my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
if( SMESH_GroupObj* aGroupObj = dynamic_cast<SMESH_GroupObj*>( myVisualObj.get() ) )
if( aGroupObj->GetElementType() == SMDSAbs_Face ||
aGroupObj->GetElementType() == SMDSAbs_Volume )
if( aGroupObj->GetElementType() == SMDSAbs_Face )
myNameActor->SetBackgroundColor(r,g,b);
myDeltaBrightness = delta;
@ -1804,10 +1860,27 @@ void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType
void SMESH_ActorDef::GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){
::GetColor(mySurfaceProp,r,g,b);
my2DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
delta = myDeltaBrightness;
}
void SMESH_ActorDef::SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta){
myNormalVProp->SetColor(r,g,b);
my3DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
if( SMESH_GroupObj* aGroupObj = dynamic_cast<SMESH_GroupObj*>( myVisualObj.get() ) )
if( aGroupObj->GetElementType() == SMDSAbs_Volume )
myNameActor->SetBackgroundColor(r,g,b);
myDeltaVBrightness = delta;
QColor bfc = Qtx::mainColorToSecondary(QColor(int(r*255),int(g*255),int(b*255)), delta);
myReversedVProp->SetColor( bfc.red() / 255. , bfc.green() / 255. , bfc.blue() / 255. );
Modified();
}
void SMESH_ActorDef::GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta){
::GetColor(myNormalVProp,r,g,b);
delta = myDeltaVBrightness;
}
void SMESH_ActorDef::SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){
myEdgeProp->SetColor(r,g,b);
my1DProp->SetColor(r,g,b);
@ -1871,6 +1944,7 @@ void SMESH_ActorDef::GetBallColor(vtkFloatingPointType& r,vtkFloatingPointType&
void SMESH_ActorDef::SetHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){
myHighlightProp->SetColor(r,g,b);
myBallHighlightProp->SetColor(r,g,b);
Modified();
}
@ -1880,6 +1954,7 @@ void SMESH_ActorDef::GetHighlightColor(vtkFloatingPointType& r,vtkFloatingPointT
void SMESH_ActorDef::SetPreHighlightColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b){
myPreselectProp->SetColor(r,g,b);
myBallPreselectProp->SetColor(r,g,b);
Modified();
}
@ -1899,15 +1974,36 @@ void SMESH_ActorDef::SetLineWidth(vtkFloatingPointType theVal){
my1DProp->SetLineWidth(theVal + aLineWidthInc);
my1DExtProp->SetLineWidth(theVal + aLineWidthInc);
my2DExtProp->SetLineWidth(theVal + aLineWidthInc);
my3DExtProp->SetLineWidth(theVal + aLineWidthInc);
myOutLineProp->SetLineWidth(theVal);
myHighlightProp->SetLineWidth(theVal);
myPreselectProp->SetLineWidth(theVal);
Modified();
}
vtkFloatingPointType SMESH_ActorDef::GetOutlineWidth()
{
return myOutLineProp->GetLineWidth();
}
void SMESH_ActorDef::SetOutlineWidth(vtkFloatingPointType theVal)
{
myOutLineProp->SetLineWidth(theVal);
Modified();
}
void SMESH_ActorDef::Set0DSize(vtkFloatingPointType theVal){
my0DProp->SetPointSize(theVal);
myHighlightProp->SetPointSize(theVal);
myPreselectProp->SetPointSize(theVal);
if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) {
aCustom->Set0DSize(theVal);
}
if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) {
aCustom->Set0DSize(theVal);
}
Modified();
}
@ -1917,6 +2013,15 @@ vtkFloatingPointType SMESH_ActorDef::Get0DSize(){
void SMESH_ActorDef::SetBallSize(vtkFloatingPointType theVal){
myBallProp->SetPointSize(theVal);
myBallHighlightProp->SetPointSize(theVal);
myBallPreselectProp->SetPointSize(theVal);
if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myHighlightActor )) {
aCustom->SetBallSize(theVal);
}
if(SMESH_SVTKActor* aCustom = SMESH_SVTKActor::SafeDownCast( myPreHighlightActor )) {
aCustom->SetBallSize(theVal);
}
Modified();
}

View File

@ -64,6 +64,9 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
virtual void SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta ) = 0;
virtual void GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta ) = 0;
virtual void SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta ) = 0;
virtual void GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta) = 0;
virtual void SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) = 0;
virtual void GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) = 0;
@ -88,6 +91,9 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
virtual vtkFloatingPointType GetLineWidth() = 0;
virtual void SetLineWidth(vtkFloatingPointType theVal) = 0;
virtual vtkFloatingPointType GetOutlineWidth() = 0;
virtual void SetOutlineWidth(vtkFloatingPointType theVal) = 0;
virtual void Set0DSize(vtkFloatingPointType size) = 0;
virtual vtkFloatingPointType Get0DSize() = 0;
@ -122,8 +128,8 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor
virtual void SetFacesOriented(bool theIsFacesOriented) = 0;
virtual bool GetFacesOriented() = 0;
virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]) = 0;
virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]) = 0;
virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) = 0;
virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) = 0;
virtual void SetFacesOrientationScale(vtkFloatingPointType theScale) = 0;
virtual vtkFloatingPointType GetFacesOrientationScale() = 0;

View File

@ -106,6 +106,9 @@ class SMESH_ActorDef : public SMESH_Actor
virtual void SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta );
virtual void GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta);
virtual void SetVolumeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b, int delta );
virtual void GetVolumeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b, int& delta);
virtual void SetEdgeColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
virtual void GetEdgeColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
@ -131,6 +134,9 @@ class SMESH_ActorDef : public SMESH_Actor
virtual vtkFloatingPointType GetLineWidth();
virtual void SetLineWidth(vtkFloatingPointType theVal);
virtual vtkFloatingPointType GetOutlineWidth();
virtual void SetOutlineWidth(vtkFloatingPointType theVal);
virtual void Set0DSize(vtkFloatingPointType size);
virtual vtkFloatingPointType Get0DSize();
@ -180,8 +186,8 @@ class SMESH_ActorDef : public SMESH_Actor
virtual void SetFacesOriented(bool theIsFacesOriented);
virtual bool GetFacesOriented();
virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]);
virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]);
virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
virtual void SetFacesOrientationScale(vtkFloatingPointType theScale);
virtual vtkFloatingPointType GetFacesOrientationScale();
@ -233,6 +239,8 @@ class SMESH_ActorDef : public SMESH_Actor
vtkProperty* mySurfaceProp;
vtkProperty* myBackSurfaceProp;
vtkProperty* myNormalVProp;
vtkProperty* myReversedVProp;
vtkProperty* myEdgeProp;
vtkProperty* myNodeProp;
@ -244,11 +252,15 @@ class SMESH_ActorDef : public SMESH_Actor
vtkProperty* myOutLineProp;
vtkProperty* myPreselectProp;
vtkProperty* myBallHighlightProp;
vtkProperty* myBallPreselectProp;
SMESH_DeviceActor* myHighlitableActor;
eControl myControlMode;
SMESH::Controls::FunctorPtr myFunctor;
vtkProperty* my2DExtProp;
vtkProperty* my3DExtProp;
SMESH_CellLabelActor* my2DActor;
SMESH_DeviceActor* my2DExtActor;
SMESH_CellLabelActor* my3DActor;
@ -292,6 +304,7 @@ class SMESH_ActorDef : public SMESH_Actor
bool myIsFacesOriented;
int myDeltaBrightness;
int myDeltaVBrightness;
VTK::MarkerTexture myMarkerTexture;

View File

@ -642,16 +642,16 @@ SMESH_DeviceActor
void
SMESH_DeviceActor
::SetFacesOrientationColor(vtkFloatingPointType theColor[3])
::SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b)
{
myFaceOrientation->GetProperty()->SetColor( theColor );
myFaceOrientation->GetProperty()->SetColor( r, g, b );
}
void
SMESH_DeviceActor
::GetFacesOrientationColor(vtkFloatingPointType theColor[3])
::GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b)
{
myFaceOrientation->GetProperty()->GetColor( theColor );
myFaceOrientation->GetProperty()->GetColor( r, g, b );
}
void

View File

@ -79,8 +79,8 @@ class SMESHOBJECT_EXPORT SMESH_DeviceActor: public vtkLODActor{
virtual void SetFacesOriented(bool theIsFacesOriented);
virtual bool GetFacesOriented() { return myIsFacesOriented; }
virtual void SetFacesOrientationColor(vtkFloatingPointType theColor[3]);
virtual void GetFacesOrientationColor(vtkFloatingPointType theColor[3]);
virtual void SetFacesOrientationColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b);
virtual void GetFacesOrientationColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b);
virtual void SetFacesOrientationScale(vtkFloatingPointType theScale);
virtual vtkFloatingPointType GetFacesOrientationScale();

View File

@ -345,16 +345,21 @@ void SMESH_VisualObjDef::buildElemPrs()
// Calculate cells size
static SMDSAbs_ElementType aTypes[ 5 ] =
{ SMDSAbs_Ball, SMDSAbs_0DElement, SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume };
const int nbTypes = 5;
static SMDSAbs_ElementType aTypes[ nbTypes ] =
{ SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume, SMDSAbs_Ball, SMDSAbs_0DElement };
// get entity data
map<SMDSAbs_ElementType,int> nbEnts;
map<SMDSAbs_ElementType,TEntityList> anEnts;
for ( int i = 0; i <= 3; i++ )
nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
vtkIdType aNbCells = 0;
for ( int i = 0; i < nbTypes; i++ )
{
nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
aNbCells += nbEnts[ aTypes [ i ]];
}
// PAL16631: without swap, bad_alloc is not thrown but hung up and crash instead,
// so check remaining memory size for safety
SMDS_Mesh::CheckMemory(); // PAL16631
@ -362,7 +367,7 @@ void SMESH_VisualObjDef::buildElemPrs()
vtkIdType aCellsSize = 2 * nbEnts[ SMDSAbs_0DElement ] + 3 * nbEnts[ SMDSAbs_Edge ];
aCellsSize += 2 * nbEnts[ SMDSAbs_Ball ];
for ( int i = 2; i <= 3; i++ ) // iterate through faces and volumes
for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes
{
if ( nbEnts[ aTypes[ i ] ] )
{
@ -388,11 +393,6 @@ void SMESH_VisualObjDef::buildElemPrs()
}
}
}
vtkIdType aNbCells =
nbEnts[ SMDSAbs_0DElement ] + nbEnts[ SMDSAbs_Ball ] + nbEnts[ SMDSAbs_Edge ] +
nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ];
if ( MYDEBUG )
MESSAGE( "Update - aNbCells = "<<aNbCells<<"; aCellsSize = "<<aCellsSize );
@ -417,7 +417,7 @@ void SMESH_VisualObjDef::buildElemPrs()
SMDS_Mesh::CheckMemory(); // PAL16631
for ( int i = 0; i <= 3; i++ ) // iterate through 0d elements, edges, faces and volumes
for ( int i = 0; i < nbTypes; i++ ) // iterate through all types of elements
{
if ( nbEnts[ aTypes[ i ] ] > 0 ) {

View File

@ -0,0 +1,184 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH OBJECT : interactive object for SMESH visualization
// File : SMESH_SVTKActor.cxx
// Author : Roman NIKOLAEV
// Module : SMESH
//
#include "SMESH_SVTKActor.h"
#include <SVTK_Utils.h>
#include <SALOME_Actor.h>
#include <SVTK_DeviceActor.h>
#include <vtkPoints.h>
#include <vtkRenderer.h>
#include <vtkObjectFactory.h>
#include <vtkUnstructuredGrid.h>
#include <vtkCell.h>
#include <vtkDataSetMapper.h>
vtkStandardNewMacro(SMESH_SVTKActor);
/*!
Constructor
*/
SMESH_SVTKActor::SMESH_SVTKActor():
my0DGrid(vtkUnstructuredGrid::New()),
myBallGrid(vtkUnstructuredGrid::New())
{
my0DActor = SVTK_DeviceActor::New();
myBallActor = SVTK_DeviceActor::New();
myBallActor->SetResolveCoincidentTopology(false);
myBallActor->SetCoincident3DAllowed(true);
myBallActor->PickableOff();
my0DActor->SetResolveCoincidentTopology(false);
my0DActor->SetCoincident3DAllowed(true);
my0DActor->PickableOff();
my0DGrid->Allocate();
myBallGrid->Allocate();
}
/*!
Constructor
*/
SMESH_SVTKActor::~SMESH_SVTKActor() {
my0DActor->Delete();
myBallActor->Delete();
my0DGrid->Delete();
myBallGrid->Delete();
}
/*!
Publishes the actor in all its internal devices
*/
void SMESH_SVTKActor::AddToRender(vtkRenderer* theRenderer) {
Superclass::AddToRender(theRenderer);
float a0D = my0DActor->GetProperty()->GetPointSize();
float aBall = myBallActor->GetProperty()->GetPointSize();
my0DActor->GetProperty()->DeepCopy(GetProperty());
myBallActor->GetProperty()->DeepCopy(GetProperty());
my0DActor->GetProperty()->SetPointSize(a0D);
myBallActor->GetProperty()->SetPointSize(aBall);
theRenderer->AddActor(my0DActor);
theRenderer->AddActor(myBallActor);
}
/*!
Removes the actor from all its internal devices
*/
void
SMESH_SVTKActor
::RemoveFromRender(vtkRenderer* theRenderer)
{
Superclass::RemoveFromRender(theRenderer);
theRenderer->RemoveActor( myBallActor );
theRenderer->RemoveActor( my0DActor );
}
void
SMESH_SVTKActor
::MapCells(SALOME_Actor* theMapActor,
const TColStd_IndexedMapOfInteger& theMapIndex)
{
myUnstructuredGrid->Initialize();
myUnstructuredGrid->Allocate();
my0DGrid->Initialize();
my0DGrid->Allocate();
myBallGrid->Initialize();
myBallGrid->Allocate();
vtkDataSet *aSourceDataSet = theMapActor->GetInput();
SVTK::CopyPoints( GetSource(), aSourceDataSet );
SVTK::CopyPoints( myBallGrid, aSourceDataSet );
SVTK::CopyPoints( my0DGrid, aSourceDataSet );
int aNbOfParts = theMapIndex.Extent();
for(int ind = 1; ind <= aNbOfParts; ind++){
int aPartId = theMapIndex( ind );
if(vtkCell* aCell = theMapActor->GetElemCell(aPartId))
{
#if VTK_XVERSION > 50700
if (aCell->GetCellType() != VTK_POLYHEDRON)
#endif
if(aCell->GetCellType() == VTK_VERTEX ) {
my0DGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
} else if(aCell->GetCellType() == VTK_POLY_VERTEX ) {
myBallGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
} else {
myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),aCell->GetPointIds());
}
#if VTK_XVERSION > 50700
else
{
vtkPolyhedron *polyhedron = dynamic_cast<vtkPolyhedron*>(aCell);
if (!polyhedron)
throw SALOME_Exception(LOCALIZED ("not a polyhedron"));
vtkIdType *pts = polyhedron->GetFaces();
myUnstructuredGrid->InsertNextCell(aCell->GetCellType(),pts[0], pts+1);
}
#endif
}
UnShrink();
if(theMapActor->IsShrunk()){
SetShrinkFactor(theMapActor->GetShrinkFactor());
SetShrink();
}
myMapIndex = theMapIndex;
}
}
void
SMESH_SVTKActor
::Initialize()
{
Superclass::Initialize();
my0DActor->SetInput(my0DGrid);
myBallActor->SetInput(myBallGrid);
}
void SMESH_SVTKActor::SetVisibility( int theVisibility ) {
Superclass::SetVisibility( theVisibility );
my0DActor->SetVisibility( theVisibility );
myBallActor->SetVisibility( theVisibility );
}
void SMESH_SVTKActor::Set0DSize(float theSize) {
my0DActor->GetProperty()->SetPointSize(theSize);
}
void SMESH_SVTKActor::SetBallSize(float theSize) {
myBallActor->GetProperty()->SetPointSize(theSize);
}

View File

@ -0,0 +1,82 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH OBJECT : interactive object for SMESH visualization
// File : SMESH_SVTKActor.h
// Author : Roman NIKOLAEV
// Module : SMESH
//
#ifndef SMESH_SVTKACTOR_H
#define SMESH_SVTKACTOR_H
#include "SMESH_Object.h"
#include <SVTK_Actor.h>
class SVTK_Actor;
class vtkUnstructureGrid;
class vtkDataSetMapper;
class SMESHOBJECT_EXPORT SMESH_SVTKActor : public SVTK_Actor {
public:
static SMESH_SVTKActor* New();
vtkTypeMacro(SMESH_SVTKActor, SVTK_Actor);
void SetBallSize(float theSize);
void Set0DSize(float theSize);
//! To publish the actor an all its internal devices
virtual
void
AddToRender(vtkRenderer* theRendere);
virtual void SetVisibility( int theVisibility );
//! Initialiaze the instance completely
virtual void
Initialize();
//! Allow to recostruct selected cells from source SALOME_Actor and map of subindexes
virtual void
MapCells(SALOME_Actor* theMapActor,
const TColStd_IndexedMapOfInteger& theMapIndex);
//! To remove the actor an all its internal devices
virtual
void
RemoveFromRender(vtkRenderer* theRendere);
protected:
SVTK_DeviceActor* my0DActor;
SVTK_DeviceActor* myBallActor;
vtkUnstructuredGrid* my0DGrid;
vtkUnstructuredGrid* myBallGrid;
SMESH_SVTKActor();
virtual ~SMESH_SVTKActor();
};
#endif

View File

@ -42,7 +42,7 @@ typedef struct
int nbElems;
} ListElemByNodesType; // TODO resize for polyhedrons
class DownIdType
class SMDS_EXPORT DownIdType
{
public:
DownIdType(int a, unsigned char b) :
@ -64,7 +64,7 @@ struct DownIdCompare
}
};
class SMDS_Downward
class SMDS_EXPORT SMDS_Downward
{
friend class SMDS_UnstructuredGrid;
friend class SMDS_Down2D;
@ -109,7 +109,7 @@ protected:
static std::vector<int> _cellDimension; //!< conversion table: type --> dimension
};
class SMDS_Down1D: public SMDS_Downward
class SMDS_EXPORT SMDS_Down1D: public SMDS_Downward
{
friend class SMDS_UnstructuredGrid;
public:
@ -140,7 +140,7 @@ protected:
std::vector<int> _upCellIndex; //!< compacted storage after connectivity calculation
};
class SMDS_Down2D: public SMDS_Downward
class SMDS_EXPORT SMDS_Down2D: public SMDS_Downward
{
friend class SMDS_UnstructuredGrid;
friend class SMDS_Down1D;
@ -171,7 +171,7 @@ protected:
int _nbNodes; //!< number of nodes in a face
};
class SMDS_Down3D: public SMDS_Downward
class SMDS_EXPORT SMDS_Down3D: public SMDS_Downward
{
friend class SMDS_UnstructuredGrid;
public:
@ -188,7 +188,7 @@ protected:
int FindFaceByNodes(int cellId, ElemByNodesType& faceByNodes);
};
class SMDS_DownEdge: public SMDS_Down1D
class SMDS_EXPORT SMDS_DownEdge: public SMDS_Down1D
{
friend class SMDS_UnstructuredGrid;
public:
@ -197,7 +197,7 @@ protected:
~SMDS_DownEdge();
};
class SMDS_DownQuadEdge: public SMDS_Down1D
class SMDS_EXPORT SMDS_DownQuadEdge: public SMDS_Down1D
{
friend class SMDS_UnstructuredGrid;
public:
@ -206,7 +206,7 @@ protected:
~SMDS_DownQuadEdge();
};
class SMDS_DownTriangle: public SMDS_Down2D
class SMDS_EXPORT SMDS_DownTriangle: public SMDS_Down2D
{
friend class SMDS_UnstructuredGrid;
public:
@ -217,7 +217,7 @@ protected:
virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
};
class SMDS_DownQuadTriangle: public SMDS_Down2D
class SMDS_EXPORT SMDS_DownQuadTriangle: public SMDS_Down2D
{
friend class SMDS_UnstructuredGrid;
public:
@ -228,7 +228,7 @@ protected:
virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
};
class SMDS_DownQuadrangle: public SMDS_Down2D
class SMDS_EXPORT SMDS_DownQuadrangle: public SMDS_Down2D
{
friend class SMDS_UnstructuredGrid;
public:
@ -239,7 +239,7 @@ protected:
virtual void addDownCell(int cellId, int lowCellId, unsigned char aType); //!< Id's are downward connectivity id's
};
class SMDS_DownQuadQuadrangle: public SMDS_Down2D
class SMDS_EXPORT SMDS_DownQuadQuadrangle: public SMDS_Down2D
{
friend class SMDS_UnstructuredGrid;
public:
@ -266,7 +266,7 @@ protected:
//protected:
//};
class SMDS_DownTetra: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownTetra: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
@ -278,7 +278,7 @@ protected:
virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
};
class SMDS_DownQuadTetra: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownQuadTetra: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
@ -290,7 +290,7 @@ protected:
virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
};
class SMDS_DownPyramid: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownPyramid: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
@ -302,7 +302,7 @@ protected:
virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
};
class SMDS_DownQuadPyramid: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownQuadPyramid: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
@ -314,7 +314,7 @@ protected:
virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
};
class SMDS_DownPenta: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownPenta: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
@ -326,7 +326,7 @@ protected:
virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
};
class SMDS_DownQuadPenta: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownQuadPenta: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
@ -338,7 +338,7 @@ protected:
virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
};
class SMDS_DownHexa: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownHexa: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:
@ -350,7 +350,7 @@ protected:
virtual void computeFacesWithNodes(int cellId, ListElemByNodesType& facesWithNodes);
};
class SMDS_DownQuadHexa: public SMDS_Down3D
class SMDS_EXPORT SMDS_DownQuadHexa: public SMDS_Down3D
{
friend class SMDS_UnstructuredGrid;
public:

View File

@ -45,7 +45,7 @@ public:
double X() const; // ! NOT thread safe methods !
double Y() const;
double Z() const;
void GetXYZ(double xyx[3]) const; // thread safe getting coords
void GetXYZ(double xyz[3]) const; // thread safe getting coords
SMDS_ElemIteratorPtr GetInverseElementIterator(SMDSAbs_ElementType type=SMDSAbs_All) const;
int NbInverseElements(SMDSAbs_ElementType type=SMDSAbs_All) const;
const SMDS_PositionPtr& GetPosition() const;

View File

@ -763,7 +763,7 @@ void SMDS_UnstructuredGrid::BuildDownwardConnectivity(bool withEdges)
* @param vtkId the vtk id of the cell
* @return number of neighbors
*/
int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId)
int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId, bool getSkin)
{
int vtkType = this->GetCellType(vtkId);
int cellDim = SMDS_Downward::getCellDimension(vtkType);
@ -798,9 +798,27 @@ int SMDS_UnstructuredGrid::GetNeighbors(int* neighborsVtkIds, int* downIds, unsi
downIds[nb] = downId;
downTypes[nb] = cellType;
nb++;
}
if (nb >= NBMAXNEIGHBORS)
assert(0);
{
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;
}
}
}
}
return nb;
}

View File

@ -83,7 +83,7 @@ public:
void setCellIdToDownId(int vtkCellId, int downId);
void CleanDownwardConnectivity();
void BuildDownwardConnectivity(bool withEdges);
int GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId);
int GetNeighbors(int* neighborsVtkIds, int* downIds, unsigned char* downTypes, int vtkId, bool getSkin=false);
int GetParentVolumes(int* volVtkIds, int vtkId);
int GetParentVolumes(int* volVtkIds, int downId, unsigned char downType);
void GetNodeIds(std::set<int>& nodeSet, int downId, unsigned char downType);

View File

@ -1452,6 +1452,45 @@ double SMDS_VolumeTool::MinLinearSize2() const
return minSize;
}
//================================================================================
/*!
* \brief Return maximal square distance between connected corner nodes
*/
//================================================================================
double SMDS_VolumeTool::MaxLinearSize2() const
{
double maxSize = -1e+100;
int iQ = myVolume->IsQuadratic() ? 2 : 1;
// store current face data
int curFace = myCurFace, nbN = myFaceNbNodes;
int* ind = myFaceNodeIndices;
myFaceNodeIndices = NULL;
const SMDS_MeshNode** nodes = myFaceNodes;
myFaceNodes = NULL;
// it seems that compute distance twice is faster than organization of a sole computing
myCurFace = -1;
for ( int iF = 0; iF < myNbFaces; ++iF )
{
setFace( iF );
for ( int iN = 0; iN < myFaceNbNodes; iN += iQ )
{
XYZ n1( myFaceNodes[ iN ]);
XYZ n2( myFaceNodes[(iN + iQ) % myFaceNbNodes]);
maxSize = std::max( maxSize, (n1 - n2).SquareMagnitude());
}
}
// restore current face data
myCurFace = curFace;
myFaceNbNodes = nbN;
myFaceNodeIndices = ind;
delete [] myFaceNodes; myFaceNodes = nodes;
return maxSize;
}
//================================================================================
/*!
* \brief check that only one volume is build on the face nodes

View File

@ -128,6 +128,9 @@ class SMDS_EXPORT SMDS_VolumeTool
double MinLinearSize2() const;
// Return minimal square distance between connected corner nodes
double MaxLinearSize2() const;
// Return maximal square distance between connected corner nodes
// -------------
// info on faces
// -------------

View File

@ -34,10 +34,6 @@ salomeinclude_HEADERS = \
SMESH_Hypothesis.hxx \
SMESH_HypoFilter.hxx \
SMESH_Algo.hxx \
SMESH_0D_Algo.hxx \
SMESH_1D_Algo.hxx \
SMESH_2D_Algo.hxx \
SMESH_3D_Algo.hxx \
SMESH_Group.hxx \
SMESH_MeshEditor.hxx \
SMESH_Pattern.hxx \
@ -56,10 +52,6 @@ dist_libSMESHimpl_la_SOURCES = \
SMESH_subMesh.cxx \
SMESH_Hypothesis.cxx \
SMESH_Algo.cxx \
SMESH_0D_Algo.cxx \
SMESH_1D_Algo.cxx \
SMESH_2D_Algo.cxx \
SMESH_3D_Algo.cxx \
SMESH_Group.cxx \
SMESH_MeshEditor.cxx \
SMESH_Pattern.cxx \
@ -83,6 +75,7 @@ libSMESHimpl_la_CPPFLAGS = \
-I$(srcdir)/../DriverUNV \
-I$(srcdir)/../DriverSTL \
-I$(srcdir)/../DriverCGNS \
-I$(srcdir)/../DriverGMF \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHDS \
-I$(srcdir)/../SMESHUtils
@ -98,8 +91,9 @@ libSMESHimpl_la_LDFLAGS = \
../DriverSTL/libMeshDriverSTL.la \
../DriverMED/libMeshDriverMED.la \
../DriverUNV/libMeshDriverUNV.la \
../DriverGMF/libMeshDriverGMF.la \
$(DriverCGNS_LIB) \
../SMESHUtils/libSMESHUtils.la \
$(BOOST_LIB_THREAD) \
$(GEOM_LDFLAGS) -lNMTTools \
$(CAS_LDPATH) -lTKShHealing -lTKPrim -lTKG2d
$(CAS_LDPATH) -lTKShHealing -lTKPrim -lTKG2d -lTKCDF

View File

@ -1,53 +0,0 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : SMESH_0D_Algo.cxx
// Module : SMESH
// $Header$
//
#include "SMESH_0D_Algo.hxx"
#include "SMESH_Gen.hxx"
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_0D_Algo::SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_type = ALGO_0D;
gen->_map0D_Algo[hypId] = this;
}
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_0D_Algo::~SMESH_0D_Algo()
{
}

View File

@ -1,58 +0,0 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : SMESH_1D_Algo.cxx
// Author : Paul RASCLE, EDF
// Module : SMESH
// $Header$
//
#include "SMESH_1D_Algo.hxx"
#include "SMESH_Gen.hxx"
#include "SMESH_subMesh.hxx"
using namespace std;
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
// _compatibleHypothesis.push_back("hypothese_1D_bidon");
_type = ALGO_1D;
gen->_map1D_Algo[hypId] = this;
}
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_1D_Algo::~SMESH_1D_Algo()
{
}

View File

@ -1,44 +0,0 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : SMESH_1D_Algo.hxx
// Author : Paul RASCLE, EDF
// Module : SMESH
// $Header$
//
#ifndef _SMESH_1D_ALGO_HXX_
#define _SMESH_1D_ALGO_HXX_
#include "SMESH_SMESH.hxx"
#include "SMESH_Algo.hxx"
class SMESH_EXPORT SMESH_1D_Algo:
public SMESH_Algo
{
public:
SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen);
virtual ~SMESH_1D_Algo();
};
#endif

View File

@ -1,97 +0,0 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : SMESH_2D_Algo.cxx
// Author : Paul RASCLE, EDF
// Module : SMESH
// $Header$
//
#include "SMESH_2D_Algo.hxx"
#include "SMESH_Gen.hxx"
#include "utilities.h"
#include <TopExp_Explorer.hxx>
#include <TopExp.hxx>
#include <TopoDS.hxx>
using namespace std;
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
// _compatibleHypothesis.push_back("hypothese_2D_bidon");
_type = ALGO_2D;
gen->_map2D_Algo[hypId] = this;
}
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_2D_Algo::~SMESH_2D_Algo()
{
}
//=============================================================================
/*!
*
*/
//=============================================================================
int SMESH_2D_Algo::NumberOfWires(const TopoDS_Shape& S)
{
int i = 0;
for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
i++;
return i;
}
//=============================================================================
/*!
*
*/
//=============================================================================
int SMESH_2D_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
{
int nbPoints = 0;
for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) {
const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
if(_quadraticMesh)
nb = nb/2;
nbPoints += nb + 1; // internal points plus 1 vertex of 2 (last point ?)
}
return nbPoints;
}

View File

@ -1,60 +0,0 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESH : implementaion of SMESH idl descriptions
// File : SMESH_3D_Algo.cxx
// Author : Paul RASCLE, EDF
// Module : SMESH
// $Header$
//
#include "SMESH_3D_Algo.hxx"
#include "SMESH_Gen.hxx"
#include "utilities.h"
using namespace std;
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
// _compatibleHypothesis.push_back("hypothese_3D_bidon");
_type = ALGO_3D;
gen->_map3D_Algo[hypId] = this;
}
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_3D_Algo::~SMESH_3D_Algo()
{
}

View File

@ -39,6 +39,7 @@
#include "SMESH_HypoFilter.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_TypeDefs.hxx"
#include "SMESH_subMesh.hxx"
#include <Basics_OCCTVersion.hxx>
@ -49,6 +50,7 @@
#include <GeomAdaptor_Curve.hxx>
#include <Geom_Surface.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopLoc_Location.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
#include <TopTools_ListOfShape.hxx>
@ -56,6 +58,7 @@
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Wire.hxx>
#include <gp_Pnt.hxx>
#include <gp_Pnt2d.hxx>
#include <gp_Vec.hxx>
@ -96,6 +99,41 @@ SMESH_Algo::~SMESH_Algo()
{
}
//=============================================================================
/*!
*
*/
//=============================================================================
SMESH_0D_Algo::SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_shapeType = (1 << TopAbs_VERTEX);
_type = ALGO_0D;
gen->_map0D_Algo[hypId] = this;
}
SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_shapeType = (1 << TopAbs_EDGE);
_type = ALGO_1D;
gen->_map1D_Algo[hypId] = this;
}
SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_shapeType = (1 << TopAbs_FACE);
_type = ALGO_2D;
gen->_map2D_Algo[hypId] = this;
}
SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_shapeType = (1 << TopAbs_SOLID);
_type = ALGO_3D;
gen->_map3D_Algo[hypId] = this;
}
//=============================================================================
/*!
* Usually an algoritm has nothing to save
@ -309,7 +347,14 @@ bool SMESH_Algo::IsReversedSubMesh (const TopoDS_Face& theFace,
// face normal at node position
TopLoc_Location loc;
Handle(Geom_Surface) surf = BRep_Tool::Surface( theFace, loc );
if ( surf.IsNull() || surf->Continuity() < GeomAbs_C1 ) return isReversed;
// if ( surf.IsNull() || surf->Continuity() < GeomAbs_C1 )
// some surfaces not detected as GeomAbs_C1 are nevertheless correct for meshing
if ( surf.IsNull() || surf->Continuity() < GeomAbs_C0 )
{
if (!surf.IsNull())
MESSAGE("surf->Continuity() < GeomAbs_C1 " << (surf->Continuity() < GeomAbs_C1));
return isReversed;
}
gp_Vec d1u, d1v;
surf->D1( u, v, nPnt[0], d1u, d1v );
gp_Vec Nf = (d1u ^ d1v).Transformed( loc );
@ -777,3 +822,38 @@ void SMESH_Algo::addBadInputElement(const SMDS_MeshElement* elem)
if ( elem )
_badInputElements.push_back( elem );
}
//=============================================================================
/*!
*
*/
//=============================================================================
int SMESH_Algo::NumberOfWires(const TopoDS_Shape& S)
{
int i = 0;
for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
i++;
return i;
}
//=============================================================================
/*!
*
*/
//=============================================================================
int SMESH_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
{
int nbPoints = 0;
for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next()) {
const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
if(_quadraticMesh)
nb = nb/2;
nbPoints += nb + 1; // internal points plus 1 vertex of 2 (last point ?)
}
return nbPoints;
}

View File

@ -47,6 +47,7 @@ class SMESH_Gen;
class SMESH_Mesh;
class SMESH_HypoFilter;
class TopoDS_Vertex;
class TopoDS_Wire;
class TopoDS_Face;
class TopoDS_Shape;
class SMESHDS_Mesh;
@ -301,6 +302,9 @@ public:
*/
static bool FaceNormal(const SMDS_MeshElement* F, gp_XYZ& normal, bool normalized=true);
static int NumberOfWires(const TopoDS_Shape& S);
int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
/*!
* \brief Return continuity of two edges
* \param E1 - the 1st edge
@ -373,8 +377,8 @@ protected:
bool _requireShape; // work with GetDim()-1 mesh bound to geom only. Default TRUE
bool _supportSubmeshes; // if !_requireDiscreteBoundary. Default FALSE
// quadratic mesh creation required,
// is usually set trough SMESH_MesherHelper::IsQuadraticSubMesh()
// indicates if quadratic mesh creation is required,
// is usually set like this: _quadraticMesh = SMESH_MesherHelper::IsQuadraticSubMesh(shape)
bool _quadraticMesh;
int _error; //!< SMESH_ComputeErrorName or anything algo specific
@ -384,4 +388,28 @@ protected:
volatile bool _computeCanceled; //!< is set to True while computing to stop it
};
class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
{
public:
SMESH_0D_Algo(int hypId, int studyId, SMESH_Gen* gen);
};
class SMESH_EXPORT SMESH_1D_Algo: public SMESH_Algo
{
public:
SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen);
};
class SMESH_EXPORT SMESH_2D_Algo: public SMESH_Algo
{
public:
SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
};
class SMESH_EXPORT SMESH_3D_Algo: public SMESH_Algo
{
public:
SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
};
#endif

View File

@ -43,9 +43,14 @@
#include "Utils_ExceptHandlers.hxx"
#include <TopoDS_Iterator.hxx>
#include <LDOMParser.hxx>
#include "memoire.h"
#ifdef WNT
#include <windows.h>
#endif
using namespace std;
//=============================================================================
@ -374,7 +379,9 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
{
SMESH_MesherHelper aHelper( aMesh );
if ( aHelper.IsQuadraticMesh() != SMESH_MesherHelper::LINEAR )
aHelper.FixQuadraticElements();
{
aHelper.FixQuadraticElements( sm->GetComputeError() );
}
}
return ret;
}
@ -645,7 +652,8 @@ static bool checkMissing(SMESH_Gen* aGen,
set<SMESH_subMesh*>& aCheckedMap,
list< SMESH_Gen::TAlgoStateError > & theErrors)
{
if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX)
if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX ||
aCheckedMap.count( aSubMesh ))
return true;
//MESSAGE("=====checkMissing");
@ -701,8 +709,15 @@ static bool checkMissing(SMESH_Gen* aGen,
break;
}
case SMESH_subMesh::HYP_OK:
algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() );
algo = aSubMesh->GetAlgo();
ret = true;
if (!algo->NeedDiscreteBoundary())
{
SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false,
/*complexShapeFirst=*/false);
while ( itsub->more() )
aCheckedMap.insert( itsub->next() );
}
break;
default: ASSERT(0);
}
@ -721,7 +736,6 @@ static bool checkMissing(SMESH_Gen* aGen,
{
// sub-meshes should not be checked further more
SMESH_subMesh* sm = itsub->next();
aCheckedMap.insert( sm );
if (isTopLocalAlgo)
{
@ -735,6 +749,7 @@ static bool checkMissing(SMESH_Gen* aGen,
checkNoAlgo2 = false;
}
}
aCheckedMap.insert( sm );
}
}
return ret;
@ -896,6 +911,177 @@ bool SMESH_Gen::IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& a
return aMesh.GetHypothesis( aMesh.GetMeshDS()->ShapeToMesh(), filter, false );
}
//================================================================================
/*!
* \brief Return paths to xml files of plugins
*/
//================================================================================
std::vector< std::string > SMESH_Gen::GetPluginXMLPaths()
{
// Get paths to xml files of plugins
vector< string > xmlPaths;
string sep;
if ( const char* meshersList = getenv("SMESH_MeshersList") )
{
string meshers = meshersList, plugin;
string::size_type from = 0, pos;
while ( from < meshers.size() )
{
// cut off plugin name
pos = meshers.find( ':', from );
if ( pos != string::npos )
plugin = meshers.substr( from, pos-from );
else
plugin = meshers.substr( from ), pos = meshers.size();
from = pos + 1;
// get PLUGIN_ROOT_DIR path
string rootDirVar, pluginSubDir = plugin;
if ( plugin == "StdMeshers" )
rootDirVar = "SMESH", pluginSubDir = "smesh";
else
for ( pos = 0; pos < plugin.size(); ++pos )
rootDirVar += toupper( plugin[pos] );
rootDirVar += "_ROOT_DIR";
const char* rootDir = getenv( rootDirVar.c_str() );
if ( !rootDir || strlen(rootDir) == 0 )
{
rootDirVar = plugin + "_ROOT_DIR"; // HexoticPLUGIN_ROOT_DIR
rootDir = getenv( rootDirVar.c_str() );
if ( !rootDir || strlen(rootDir) == 0 ) continue;
}
// get a separator from rootDir
for ( pos = strlen( rootDir )-1; pos >= 0 && sep.empty(); --pos )
if ( rootDir[pos] == '/' || rootDir[pos] == '\\' )
{
sep = rootDir[pos];
break;
}
#ifdef WNT
if (sep.empty() ) sep = "\\";
#else
if (sep.empty() ) sep = "/";
#endif
// get a path to resource file
string xmlPath = rootDir;
if ( xmlPath[ xmlPath.size()-1 ] != sep[0] )
xmlPath += sep;
xmlPath += "share" + sep + "salome" + sep + "resources" + sep;
for ( pos = 0; pos < pluginSubDir.size(); ++pos )
xmlPath += tolower( pluginSubDir[pos] );
xmlPath += sep + plugin + ".xml";
bool fileOK;
#ifdef WNT
fileOK = (GetFileAttributes(xmlPath.c_str()) != INVALID_FILE_ATTRIBUTES);
#else
fileOK = (access(xmlPath.c_str(), F_OK) == 0);
#endif
if ( fileOK )
xmlPaths.push_back( xmlPath );
}
}
return xmlPaths;
}
//=======================================================================
namespace // Access to type of input and output of an algorithm
//=======================================================================
{
struct AlgoData
{
int _dim;
set<SMDSAbs_GeometryType> _inElemTypes; // acceptable types of input mesh element
set<SMDSAbs_GeometryType> _outElemTypes; // produced types of mesh elements
bool IsCompatible( const AlgoData& algo2 ) const
{
if ( _dim > algo2._dim ) return algo2.IsCompatible( *this );
// algo2 is of highter dimension
if ( _outElemTypes.empty() || algo2._inElemTypes.empty() )
return false;
bool compatible = true;
set<SMDSAbs_GeometryType>::const_iterator myOutType = _outElemTypes.begin();
for ( ; myOutType != _outElemTypes.end() && compatible; ++myOutType )
compatible = algo2._inElemTypes.count( *myOutType );
return compatible;
}
};
//================================================================================
/*!
* \brief Return AlgoData of the algorithm
*/
//================================================================================
const AlgoData& getAlgoData( const SMESH_Algo* algo )
{
static map< string, AlgoData > theDataByName;
if ( theDataByName.empty() )
{
// Read Plugin.xml files
vector< string > xmlPaths = SMESH_Gen::GetPluginXMLPaths();
LDOMParser xmlParser;
for ( size_t iXML = 0; iXML < xmlPaths.size(); ++iXML )
{
bool error = xmlParser.parse( xmlPaths[iXML].c_str() );
if ( error )
{
TCollection_AsciiString data;
INFOS( xmlParser.GetError(data) );
continue;
}
// <algorithm type="Regular_1D"
// ...
// input="EDGE"
// output="QUAD,TRIA">
//
LDOM_Document xmlDoc = xmlParser.getDocument();
LDOM_NodeList algoNodeList = xmlDoc.getElementsByTagName( "algorithm" );
for ( int i = 0; i < algoNodeList.getLength(); ++i )
{
LDOM_Node algoNode = algoNodeList.item( i );
LDOM_Element& algoElem = (LDOM_Element&) algoNode;
TCollection_AsciiString algoType = algoElem.getAttribute("type");
TCollection_AsciiString input = algoElem.getAttribute("input");
TCollection_AsciiString output = algoElem.getAttribute("output");
TCollection_AsciiString dim = algoElem.getAttribute("dim");
if ( algoType.IsEmpty() ) continue;
AlgoData & data = theDataByName[ algoType.ToCString() ];
data._dim = dim.IntegerValue();
for ( int isInput = 0; isInput < 2; ++isInput )
{
TCollection_AsciiString& typeStr = isInput ? input : output;
set<SMDSAbs_GeometryType>& typeSet = isInput ? data._inElemTypes : data._outElemTypes;
int beg = 1, end;
while ( beg <= typeStr.Length() )
{
while ( beg < typeStr.Length() && !isalpha( typeStr.Value( beg ) ))
++beg;
end = beg;
while ( end < typeStr.Length() && isalpha( typeStr.Value( end + 1 ) ))
++end;
if ( end > beg )
{
TCollection_AsciiString typeName = typeStr.SubString( beg, end );
if ( typeName == "EDGE" ) typeSet.insert( SMDSGeom_EDGE );
else if ( typeName == "TRIA" ) typeSet.insert( SMDSGeom_TRIANGLE );
else if ( typeName == "QUAD" ) typeSet.insert( SMDSGeom_QUADRANGLE );
}
beg = end + 1;
}
}
}
}
}
return theDataByName[ algo->GetName() ];
}
}
//=============================================================================
/*!
* Finds algo to mesh a shape. Optionally returns a shape the found algo is bound to
@ -909,7 +1095,63 @@ SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_Mesh & aMesh,
SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() );
filter.And( filter.IsApplicableTo( aShape ));
return (SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, assignedTo );
TopoDS_Shape assignedToShape;
SMESH_Algo* algo =
(SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, &assignedToShape );
if ( algo &&
aShape.ShapeType() == TopAbs_FACE &&
!aShape.IsSame( assignedToShape ) &&
SMESH_MesherHelper::NbAncestors( aShape, aMesh, TopAbs_SOLID ) > 1 )
{
// Issue 0021559. If there is another 2D algo with different types of output
// elements that can be used to mesh aShape, and 3D algos on adjacent SOLIDs
// have different types of input elements, we choose a most appropriate 2D algo.
// try to find a concurrent 2D algo
filter.AndNot( filter.Is( algo ));
TopoDS_Shape assignedToShape2;
SMESH_Algo* algo2 =
(SMESH_Algo*) aMesh.GetHypothesis( aShape, filter, true, &assignedToShape2 );
if ( algo2 && // algo found
!assignedToShape2.IsSame( aMesh.GetShapeToMesh() ) && // algo is local
( SMESH_MesherHelper::GetGroupType( assignedToShape2 ) == // algo of the same level
SMESH_MesherHelper::GetGroupType( assignedToShape )) &&
aMesh.IsOrderOK( aMesh.GetSubMesh( assignedToShape2 ), // no forced order
aMesh.GetSubMesh( assignedToShape )))
{
// get algos on the adjacent SOLIDs
filter.Init( filter.IsAlgo() ).And( filter.HasDim( 3 ));
vector< SMESH_Algo* > algos3D;
PShapeIteratorPtr solidIt = SMESH_MesherHelper::GetAncestors( aShape, aMesh,
TopAbs_SOLID );
while ( const TopoDS_Shape* solid = solidIt->next() )
if ( SMESH_Algo* algo3D = (SMESH_Algo*) aMesh.GetHypothesis( *solid, filter, true ))
{
algos3D.push_back( algo3D );
filter.AndNot( filter.HasName( algo3D->GetName() ));
}
// check compatibility of algos
if ( algos3D.size() > 1 )
{
const AlgoData& algoData = getAlgoData( algo );
const AlgoData& algoData2 = getAlgoData( algo2 );
const AlgoData& algoData3d0 = getAlgoData( algos3D[0] );
const AlgoData& algoData3d1 = getAlgoData( algos3D[1] );
if (( algoData2.IsCompatible( algoData3d0 ) &&
algoData2.IsCompatible( algoData3d1 ))
&&
!(algoData.IsCompatible( algoData3d0 ) &&
algoData.IsCompatible( algoData3d1 )))
algo = algo2;
}
}
}
if ( assignedTo && algo )
* assignedTo = assignedToShape;
return algo;
}
//=============================================================================

View File

@ -35,10 +35,6 @@
#include "SMESH_Hypothesis.hxx"
#include "SMESH_ComputeError.hxx"
#include "SMESH_Algo.hxx"
#include "SMESH_0D_Algo.hxx"
#include "SMESH_1D_Algo.hxx"
#include "SMESH_2D_Algo.hxx"
#include "SMESH_3D_Algo.hxx"
#include "SMESH_Mesh.hxx"
#include "chrono.hxx"
@ -47,6 +43,8 @@
#include <map>
#include <list>
#include <vector>
#include <string>
class SMESHDS_Document;
@ -144,9 +142,13 @@ public:
static int GetShapeDim(const TopAbs_ShapeEnum & aShapeType);
static int GetShapeDim(const TopoDS_Shape & aShape)
{ return GetShapeDim( aShape.ShapeType() ); }
SMESH_Algo* GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, TopoDS_Shape* assignedTo=0);
static bool IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& aMesh);
static std::vector< std::string > GetPluginXMLPaths();
int GetANewId();
std::map < int, SMESH_Algo * >_mapAlgo;

View File

@ -24,7 +24,6 @@
// File : SMESH_Group.cxx
// Author : Michael Sazonov (OCC)
// Module : SMESH
// $Header$
//
#include "SMESH_Group.hxx"
#include "SMESH_Mesh.hxx"
@ -60,6 +59,7 @@ SMESH_Group::SMESH_Group (int theID,
myGroupDS = new SMESHDS_Group (theID,
const_cast<SMESH_Mesh*>(theMesh)->GetMeshDS(),
theType);
myGroupDS->SetStoreName( theName );
}
//================================================================================
@ -76,7 +76,7 @@ SMESH_Group::SMESH_Group (SMESHDS_GroupBase* groupDS): myGroupDS( groupDS )
//=============================================================================
/*!
*
* Destructor deletes myGroupDS
*/
//=============================================================================
@ -84,3 +84,15 @@ SMESH_Group::~SMESH_Group ()
{
delete myGroupDS; myGroupDS=0;
}
//================================================================================
/*!
* \brief Sets a new name
*/
//================================================================================
void SMESH_Group::SetName (const char* theName)
{
myName = theName;
myGroupDS->SetStoreName( theName );
}

View File

@ -52,7 +52,7 @@ class SMESH_EXPORT SMESH_Group
SMESH_Group (SMESHDS_GroupBase* groupDS);
~SMESH_Group ();
void SetName (const char* theName) { myName = theName; }
void SetName (const char* theName);
const char* GetName () const { return myName.c_str(); }

View File

@ -43,7 +43,6 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
int studyId,
SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId)
{
//MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis");
_gen = gen;
_studyId = studyId;
StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
@ -51,9 +50,8 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
_type = PARAM_ALGO;
_shapeType = 0; // to be set by algo with TopAbs_Enum
_param_algo_dim = -1; // to be set by algo parameter
_parameters = string();
_lastParameters = string();
_libName = string();
//_parameters = string();
//_lastParameters = string();
}
//=============================================================================
@ -65,6 +63,8 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
SMESH_Hypothesis::~SMESH_Hypothesis()
{
MESSAGE("SMESH_Hypothesis::~SMESH_Hypothesis");
StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
myStudyContext->mapHypothesis[_hypId] = 0;
}
//=============================================================================
@ -177,53 +177,53 @@ SMESH_Mesh* SMESH_Hypothesis::GetMeshByPersistentID(int id)
*
*/
//=============================================================================
void SMESH_Hypothesis::SetParameters(const char *theParameters)
{
string aNewParameters(theParameters);
if(aNewParameters.size()==0 && _parameters.size()==0)
aNewParameters = " ";
if(_parameters.size()>0)
_parameters +="|";
_parameters +=aNewParameters;
SetLastParameters(theParameters);
}
// void SMESH_Hypothesis::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();
}
// //=============================================================================
// /*!
// *
// */
// //=============================================================================
// void SMESH_Hypothesis::ClearParameters()
// {
// _parameters = string();
// }
//=============================================================================
/*!
*
*/
//=============================================================================
char* SMESH_Hypothesis::GetParameters() const
{
return (char*)_parameters.c_str();
}
// //=============================================================================
// /*!
// *
// */
// //=============================================================================
// char* SMESH_Hypothesis::GetParameters() const
// {
// return (char*)_parameters.c_str();
// }
//=============================================================================
/*!
*
*/
//=============================================================================
char* SMESH_Hypothesis::GetLastParameters() const
{
return (char*)_lastParameters.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::SetLastParameters(const char* theParameters)
// {
// _lastParameters = string(theParameters);
// }

View File

@ -51,7 +51,7 @@ public:
{
HYP_OK = 0,
HYP_MISSING, // algo misses a hypothesis
HYP_CONCURENT, // several applicable hypotheses
HYP_CONCURENT, // several applicable hypotheses assigned to father shapes
HYP_BAD_PARAMETER,// hypothesis has a bad parameter value
HYP_HIDDEN_ALGO, // an algo is hidden by an upper dim algo generating all-dim elements
HYP_HIDING_ALGO, // an algo hides lower dim algos by generating all-dim elements
@ -59,7 +59,7 @@ public:
// for Add/RemoveHypothesis operations
HYP_INCOMPATIBLE, // hypothesis does not fit algo
HYP_NOTCONFORM, // not conform mesh is produced appling a hypothesis
HYP_ALREADY_EXIST,// such hypothesis already exist
HYP_ALREADY_EXIST,// several applicable hypothesis of same priority assigned
HYP_BAD_DIM, // bad dimension
HYP_BAD_SUBSHAPE, // shape is neither the main one, nor its sub-shape, nor a group
HYP_BAD_GEOMETRY, // shape geometry mismatches algorithm's expectation
@ -77,12 +77,12 @@ public:
virtual const char* GetLibName() const;
void SetLibName(const char* theLibName);
void SetParameters(const char *theParameters);
char* GetParameters() const;
//void SetParameters(const char *theParameters);
//char* GetParameters() const;
void SetLastParameters(const char* theParameters);
char* GetLastParameters() const;
void ClearParameters();
// void SetLastParameters(const char* theParameters);
// char* GetLastParameters() const;
// void ClearParameters();
/*!
* \brief Initialize my parameter values by the mesh built on the geometry
@ -127,9 +127,9 @@ protected:
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

View File

@ -40,14 +40,15 @@
#include "utilities.h"
#include "DriverMED_W_SMESHDS_Mesh.h"
#include "DriverDAT_W_SMDS_Mesh.h"
#include "DriverUNV_W_SMDS_Mesh.h"
#include "DriverSTL_W_SMDS_Mesh.h"
#include "DriverGMF_Read.hxx"
#include "DriverGMF_Write.hxx"
#include "DriverMED_R_SMESHDS_Mesh.h"
#include "DriverUNV_R_SMDS_Mesh.h"
#include "DriverMED_W_SMESHDS_Mesh.h"
#include "DriverSTL_R_SMDS_Mesh.h"
#include "DriverSTL_W_SMDS_Mesh.h"
#include "DriverUNV_R_SMDS_Mesh.h"
#include "DriverUNV_W_SMDS_Mesh.h"
#ifdef WITH_CGNS
#include "DriverCGNS_Read.hxx"
#include "DriverCGNS_Write.hxx"
@ -538,6 +539,26 @@ int SMESH_Mesh::CGNSToMesh(const char* theFileName,
return res;
}
//================================================================================
/*!
* \brief Fill its data by reading a GMF file
*/
//================================================================================
SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName)
{
DriverGMF_Read myReader;
myReader.SetMesh(_myMeshDS);
myReader.SetFile(theFileName);
myReader.Perform();
//theMeshName = myReader.GetMeshName();
// create groups
SynchronizeGroups();
return myReader.GetError();
}
//=============================================================================
/*!
*
@ -1391,6 +1412,21 @@ void SMESH_Mesh::ExportCGNS(const char * file,
throw SALOME_Exception("Export failed");
}
//================================================================================
/*!
* \brief Export the mesh to a GMF file
*/
//================================================================================
void SMESH_Mesh::ExportGMF(const char * file,
const SMESHDS_Mesh* meshDS)
{
DriverGMF_Write myWriter;
myWriter.SetFile( file );
myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS ));
myWriter.Perform();
}
//================================================================================
/*!
* \brief Return number of nodes in the mesh
@ -1651,6 +1687,35 @@ SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType,
return aGroup;
}
//================================================================================
/*!
* \brief Creates a group based on an existing SMESHDS group. Group ID should be unique
*/
//================================================================================
SMESH_Group* SMESH_Mesh::AddGroup (SMESHDS_GroupBase* groupDS) throw(SALOME_Exception)
{
if ( !groupDS )
throw SALOME_Exception(LOCALIZED ("SMESH_Mesh::AddGroup(): NULL SMESHDS_GroupBase"));
map <int, SMESH_Group*>::iterator i_g = _mapGroup.find( groupDS->GetID() );
if ( i_g != _mapGroup.end() && i_g->second )
{
if ( i_g->second->GetGroupDS() == groupDS )
return i_g->second;
else
throw SALOME_Exception(LOCALIZED ("SMESH_Mesh::AddGroup() wrong ID of SMESHDS_GroupBase"));
}
SMESH_Group* aGroup = new SMESH_Group (groupDS);
_mapGroup[ groupDS->GetID() ] = aGroup;
GetMeshDS()->AddGroup( aGroup->GetGroupDS() );
_groupId = 1 + _mapGroup.rbegin()->first;
return aGroup;
}
//================================================================================
/*!
* \brief Creates SMESH_Groups for not wrapped SMESHDS_Groups
@ -1955,6 +2020,13 @@ void SMESH_Mesh::fillAncestorsMap(const TopoDS_Shape& theShape)
(TopAbs_ShapeEnum) ancType,
_mapAncestors );
}
// visit COMPOUNDs inside a COMPOUND that are not reachable by TopExp_Explorer
if ( theShape.ShapeType() == TopAbs_COMPOUND )
{
for ( TopoDS_Iterator sIt(theShape); sIt.More(); sIt.Next() )
if ( sIt.Value().ShapeType() == TopAbs_COMPOUND )
fillAncestorsMap( sIt.Value() );
}
}
//=============================================================================
@ -1977,9 +2049,9 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
typedef list<SMESH_subMesh*>::iterator TPosInList;
map< int, TPosInList > sortedPos;
TPosInList smBeg = theListToSort.begin(), smEnd = theListToSort.end();
TListOfListOfInt::const_iterator listIddIt = _mySubMeshOrder.begin();
for( ; listIddIt != _mySubMeshOrder.end(); listIddIt++) {
const TListOfInt& listOfId = *listIddIt;
TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin();
for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++) {
const TListOfInt& listOfId = *listIdsIt;
TListOfInt::const_iterator idIt = listOfId.begin();
for ( ; idIt != listOfId.end(); idIt++ ) {
if ( SMESH_subMesh * sm = GetSubMeshContaining( *idIt )) {
@ -2006,6 +2078,30 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
return res;
}
//================================================================================
/*!
* \brief Return true if given order of sub-meshes is OK
*/
//================================================================================
bool SMESH_Mesh::IsOrderOK( const SMESH_subMesh* smBefore,
const SMESH_subMesh* smAfter ) const
{
TListOfListOfInt::const_iterator listIdsIt = _mySubMeshOrder.begin();
TListOfInt::const_iterator idBef, idAft;
for( ; listIdsIt != _mySubMeshOrder.end(); listIdsIt++)
{
const TListOfInt& listOfId = *listIdsIt;
idBef = std::find( listOfId.begin(), listOfId.end(), smBefore->GetId() );
if ( idBef != listOfId.end() )
idAft = std::find( listOfId.begin(), listOfId.end(), smAfter->GetId() );
if ( idAft != listOfId.end () )
return ( std::distance( listOfId.begin(), idBef ) <
std::distance( listOfId.begin(), idAft ) );
}
return true; // no order imposed to given submeshes
}
//=============================================================================
/*!
* \brief sort submeshes according to stored mesh order
@ -2014,8 +2110,8 @@ bool SMESH_Mesh::SortByMeshOrder(list<SMESH_subMesh*>& theListToSort) const
*/
//=============================================================================
list<SMESH_subMesh*> SMESH_Mesh::getAncestorsSubMeshes
(const TopoDS_Shape& theSubShape) const
list<SMESH_subMesh*>
SMESH_Mesh::getAncestorsSubMeshes (const TopoDS_Shape& theSubShape) const
{
list<SMESH_subMesh*> listOfSubMesh;
TopTools_ListIteratorOfListOfShape it( GetAncestors( theSubShape ));

View File

@ -29,12 +29,12 @@
#include "SMESH_SMESH.hxx"
#include "SMESH_Hypothesis.hxx"
#include "SMESH_Controls.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESHDS_Command.hxx"
#include "SMDSAbs_ElementType.hxx"
#include "SMESHDS_Command.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESH_ComputeError.hxx"
#include "SMESH_Controls.hxx"
#include "SMESH_Hypothesis.hxx"
#include "Utils_SALOME_Exception.hxx"
@ -44,6 +44,7 @@
#include <map>
#include <list>
#ifdef WNT
#pragma warning(disable:4251) // Warning DLL Interface ...
#pragma warning(disable:4290) // Warning Exception ...
@ -121,6 +122,8 @@ public:
int CGNSToMesh(const char* theFileName, const int theMeshIndex, std::string& theMeshName);
SMESH_ComputeErrorPtr GMFToMesh(const char* theFileName);
SMESH_Hypothesis::Hypothesis_Status
AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
throw(SALOME_Exception);
@ -240,6 +243,8 @@ public:
const SMESHDS_Mesh* meshPart = 0) throw(SALOME_Exception);
void ExportCGNS(const char * file,
const SMESHDS_Mesh* mesh);
void ExportGMF(const char * file,
const SMESHDS_Mesh* mesh);
void ExportSAUV(const char *file,
const char* theMeshName = NULL,
bool theAutoGroups = true) throw(SALOME_Exception);
@ -288,6 +293,8 @@ public:
const TopoDS_Shape& theShape=TopoDS_Shape(),
const SMESH_PredicatePtr& thePredicate=SMESH_PredicatePtr());
SMESH_Group* AddGroup (SMESHDS_GroupBase* groupDS) throw(SALOME_Exception);
typedef boost::shared_ptr< SMDS_Iterator<SMESH_Group*> > GroupIteratorPtr;
GroupIteratorPtr GetGroups() const;
@ -317,14 +324,12 @@ public:
void SetMeshOrder(const TListOfListOfInt& theOrder );
const TListOfListOfInt& GetMeshOrder() const;
/*!
* \brief sort submeshes according to stored mesh order
* \param theListToSort in out list to be sorted
* \return FALSE if nothing sorted
*/
// sort submeshes according to stored mesh order
bool SortByMeshOrder(std::list<SMESH_subMesh*>& theListToSort) const;
//
// return true if given order of sub-meshes is OK
bool IsOrderOK( const SMESH_subMesh* smBefore,
const SMESH_subMesh* smAfter ) const;
ostream& Dump(ostream & save);

View File

@ -4031,6 +4031,8 @@ void SMESH_MeshEditor::makeWalls (TNodeOfNodeListMap & mapNewNodes,
{
const SMDS_MeshNode* node =
static_cast<const SMDS_MeshNode*>( nList->first );
if ( newElemsMap.count( node ))
continue; // node was extruded into edge
SMDS_ElemIteratorPtr eIt = node->GetInverseElementIterator();
int nbInitElems = 0;
const SMDS_MeshElement* el = 0;
@ -5707,7 +5709,7 @@ SMESH_MeshEditor::Transform (TIDSortedElemSet & theElems,
SMDSAbs_GeometryType geomType = elem->GetGeomType();
int nbNodes = elem->NbNodes();
if ( geomType == SMDSGeom_POINT ) continue; // node
if ( geomType == SMDSGeom_NONE ) continue; // node
switch ( geomType ) {
@ -5884,26 +5886,32 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
// Sort existing groups by types and collect their names
// to store an old group and a generated new one
typedef pair< SMESHDS_GroupBase*, SMDS_MeshGroup* > TOldNewGroup;
typedef pair< SMESHDS_GroupBase*, SMESHDS_Group* > TOldNewGroup;
vector< list< TOldNewGroup > > groupsByType( SMDSAbs_NbElementTypes );
vector< TOldNewGroup* > orderedOldNewGroups; // in order of old groups
// group names
set< string > groupNames;
//
SMDS_MeshGroup* nullNewGroup = (SMDS_MeshGroup*) 0;
SMESH_Mesh::GroupIteratorPtr groupIt = GetMesh()->GetGroups();
while ( groupIt->more() ) {
if ( !groupIt->more() ) return newGroupIDs;
int newGroupID = mesh->GetGroupIds().back()+1;
while ( groupIt->more() )
{
SMESH_Group * group = groupIt->next();
if ( !group ) continue;
SMESHDS_GroupBase* groupDS = group->GetGroupDS();
if ( !groupDS || groupDS->IsEmpty() ) continue;
groupNames.insert( group->GetName() );
groupDS->SetStoreName( group->GetName() );
groupsByType[ groupDS->GetType() ].push_back( make_pair( groupDS, nullNewGroup ));
SMESHDS_Group* newGroup = new SMESHDS_Group( newGroupID++, mesh->GetMeshDS(),
groupDS->GetType() );
groupsByType[ groupDS->GetType() ].push_back( make_pair( groupDS, newGroup ));
orderedOldNewGroups.push_back( & groupsByType[ groupDS->GetType() ].back() );
}
// Groups creation
// Loop on nodes and elements to add them in new groups
// loop on nodes and elements
for ( int isNodes = 0; isNodes < 2; ++isNodes )
{
const SMESH_SequenceOfElemPtr& gens = isNodes ? nodeGens : elemGens;
@ -5920,7 +5928,7 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
continue;
}
list< TOldNewGroup > & groupsOldNew = groupsByType[ sourceElem->GetType() ];
if ( groupsOldNew.empty() ) {
if ( groupsOldNew.empty() ) { // no groups of this type at all
while ( iElem < gens.Length() && gens( iElem+1 ) == sourceElem )
++iElem; // skip all elements made by sourceElem
continue;
@ -5934,58 +5942,56 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
if ( const SMDS_MeshElement* resElem = elems( ++iElem ))
if ( resElem != sourceElem )
resultElems.push_back( resElem );
// do not generate element groups from node ones
// if ( sourceElem->GetType() == SMDSAbs_Node &&
// elems( iElem )->GetType() != SMDSAbs_Node )
// continue;
// add resultElems to groups made by ones the sourceElem belongs to
list< TOldNewGroup >::iterator gOldNew, gLast = groupsOldNew.end();
for ( gOldNew = groupsOldNew.begin(); gOldNew != gLast; ++gOldNew )
{
SMESHDS_GroupBase* oldGroup = gOldNew->first;
if ( oldGroup->Contains( sourceElem )) // sourceElem in oldGroup
if ( oldGroup->Contains( sourceElem )) // sourceElem is in oldGroup
{
SMDS_MeshGroup* & newGroup = gOldNew->second;
if ( !newGroup )// create a new group
{
// make a name
string name = oldGroup->GetStoreName();
if ( !targetMesh ) {
name += "_";
name += postfix;
int nb = 0;
while ( !groupNames.insert( name ).second ) // name exists
{
if ( nb == 0 ) {
name += "_1";
}
else {
TCollection_AsciiString nbStr(nb+1);
name.resize( name.rfind('_')+1 );
name += nbStr.ToCString();
}
++nb;
}
}
// make a group
int id;
SMESH_Group* group = mesh->AddGroup( resultElems.back()->GetType(),
name.c_str(), id );
SMESHDS_Group* groupDS = static_cast<SMESHDS_Group*>(group->GetGroupDS());
newGroup = & groupDS->SMDSGroup();
newGroupIDs->push_back( id );
}
// fill in a new group
SMDS_MeshGroup & newGroup = gOldNew->second->SMDSGroup();
list< const SMDS_MeshElement* >::iterator resLast = resultElems.end(), resElemIt;
for ( resElemIt = resultElems.begin(); resElemIt != resLast; ++resElemIt )
newGroup->Add( *resElemIt );
newGroup.Add( *resElemIt );
}
}
} // loop on created elements
}// loop on nodes and elements
// Create new SMESH_Groups from SMESHDS_Groups and remove empty SMESHDS_Groups
for ( size_t i = 0; i < orderedOldNewGroups.size(); ++i )
{
SMESHDS_GroupBase* oldGroupDS = orderedOldNewGroups[i]->first;
SMESHDS_Group* newGroupDS = orderedOldNewGroups[i]->second;
if ( newGroupDS->IsEmpty() )
{
mesh->GetMeshDS()->RemoveGroup( newGroupDS );
}
else
{
// make a name
string name = oldGroupDS->GetStoreName();
if ( !targetMesh ) {
name += "_";
name += postfix;
int nb = 1;
while ( !groupNames.insert( name ).second ) // name exists
name = SMESH_Comment( oldGroupDS->GetStoreName() ) << "_" << postfix << "_" << nb++;
}
newGroupDS->SetStoreName( name.c_str() );
// make a SMESH_Groups
mesh->AddGroup( newGroupDS );
newGroupIDs->push_back( newGroupDS->GetID() );
// set group type
newGroupDS->SetType( newGroupDS->GetElements()->next()->GetType() );
}
}
return newGroupIDs;
}
@ -9629,7 +9635,7 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d)
if ( !theForce3d )
{ // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
aHelper.SetSubShape(0); // apply FixQuadraticElements() to the whole mesh
aHelper.FixQuadraticElements();
aHelper.FixQuadraticElements(myError);
}
}
@ -9769,7 +9775,7 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d,
if ( !theForce3d && !getenv("NO_FixQuadraticElements"))
{ // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
helper.SetSubShape(0); // apply FixQuadraticElements() to the whole mesh
helper.FixQuadraticElements();
helper.FixQuadraticElements( myError );
}
}
@ -10888,6 +10894,70 @@ namespace {
};
}
//================================================================================
/*!
\brief Identify the elements that will be affected by node duplication (actual duplication is not performed.
This method is the first step of DoubleNodeElemGroupsInRegion.
\param theElems - list of groups of elements (edges or faces) to be replicated
\param theNodesNot - list of groups of nodes not to replicated
\param theShape - shape to detect affected elements (element which geometric center
located on or inside shape).
The replicated nodes should be associated to affected elements.
\return groups of affected elements
\sa DoubleNodeElemGroupsInRegion()
*/
//================================================================================
bool SMESH_MeshEditor::AffectedElemGroupsInRegion( const TIDSortedElemSet& theElems,
const TIDSortedElemSet& theNodesNot,
const TopoDS_Shape& theShape,
TIDSortedElemSet& theAffectedElems)
{
if ( theShape.IsNull() )
return false;
const double aTol = Precision::Confusion();
auto_ptr< BRepClass3d_SolidClassifier> bsc3d;
auto_ptr<_FaceClassifier> aFaceClassifier;
if ( theShape.ShapeType() == TopAbs_SOLID )
{
bsc3d.reset( new BRepClass3d_SolidClassifier(theShape));;
bsc3d->PerformInfinitePoint(aTol);
}
else if (theShape.ShapeType() == TopAbs_FACE )
{
aFaceClassifier.reset( new _FaceClassifier(TopoDS::Face(theShape)));
}
// iterates on indicated elements and get elements by back references from their nodes
TIDSortedElemSet::const_iterator elemItr = theElems.begin();
for ( ; elemItr != theElems.end(); ++elemItr )
{
SMDS_MeshElement* anElem = (SMDS_MeshElement*)*elemItr;
if (!anElem)
continue;
SMDS_ElemIteratorPtr nodeItr = anElem->nodesIterator();
while ( nodeItr->more() )
{
const SMDS_MeshNode* aNode = cast2Node(nodeItr->next());
if ( !aNode || theNodesNot.find(aNode) != theNodesNot.end() )
continue;
SMDS_ElemIteratorPtr backElemItr = aNode->GetInverseElementIterator();
while ( backElemItr->more() )
{
const SMDS_MeshElement* curElem = backElemItr->next();
if ( curElem && theElems.find(curElem) == theElems.end() &&
( bsc3d.get() ?
isInside( curElem, *bsc3d, aTol ) :
isInside( curElem, *aFaceClassifier, aTol )))
theAffectedElems.insert( curElem );
}
}
}
return true;
}
//================================================================================
/*!
\brief Creates a hole in a mesh by doubling the nodes of some particular elements
@ -11018,7 +11088,7 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
// --- build a map (face to duplicate --> volume to modify)
// with all the faces shared by 2 domains (group of elements)
// and corresponding volume of this domain, for each shared face.
// a volume has a face shared by 2 domains if it has a neighbor which is not in is domain.
// a volume has a face shared by 2 domains if it has a neighbor which is not in his domain.
//MESSAGE("Domain " << idom);
const TIDSortedElemSet& domain = theElems[idom];
@ -11081,8 +11151,6 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
{
int oldId = *itn;
//MESSAGE(" node " << oldId);
std::set<int> cells;
cells.clear();
vtkCellLinks::Link l = grid->GetCellLinks()->GetLink(oldId);
for (int i=0; i<l.ncells; i++)
{
@ -11099,8 +11167,8 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
//no cells created after BuildDownWardConnectivity
}
DownIdType aCell(downId, vtkType);
if (celldom.count(vtkId))
continue;
if (!cellDomains.count(aCell))
cellDomains[aCell] = emptyMap; // create an empty entry for cell
cellDomains[aCell][idomain] = vtkId;
celldom[vtkId] = idomain;
//MESSAGE(" cell " << vtkId << " domain " << idomain);
@ -11134,16 +11202,18 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
std::set<int> oldNodes;
oldNodes.clear();
grid->GetNodeIds(oldNodes, face.cellId, face.cellType);
bool isMultipleDetected = false;
std::set<int>::iterator itn = oldNodes.begin();
for (; itn != oldNodes.end(); ++itn)
{
int oldId = *itn;
//MESSAGE(" node " << oldId);
//MESSAGE("-+-+-a node " << oldId);
if (!nodeDomains.count(oldId))
nodeDomains[oldId] = emptyMap; // create an empty entry for node
if (nodeDomains[oldId].empty())
{
nodeDomains[oldId][idomain] = oldId; // keep the old node in the first domain
//MESSAGE("-+-+-b oldNode " << oldId << " domain " << idomain);
}
std::map<int, int>::iterator itdom = domvol.begin();
for (; itdom != domvol.end(); ++itdom)
{
@ -11155,7 +11225,6 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
{
vector<int> orderedDoms;
//MESSAGE("multiple node " << oldId);
isMultipleDetected =true;
if (mutipleNodes.count(oldId))
orderedDoms = mutipleNodes[oldId];
else
@ -11175,16 +11244,35 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
SMDS_MeshNode *newNode = meshDS->AddNode(coords[0], coords[1], coords[2]);
int newId = newNode->getVtkId();
nodeDomains[oldId][idom] = newId; // cloned node for other domains
//MESSAGE(" newNode " << newId << " oldNode " << oldId << " size=" <<nodeDomains[oldId].size());
//MESSAGE("-+-+-c oldNode " << oldId << " domain " << idomain << " newNode " << newId << " domain " << idom << " size=" <<nodeDomains[oldId].size());
}
if (nodeDomains[oldId].size() >= 3)
}
}
}
}
for (int idomain = 0; idomain < theElems.size(); idomain++)
{
//MESSAGE("confirm multiple node " << oldId);
isMultipleDetected =true;
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 (isMultipleDetected) // check if an edge of the face is shared between 3 or more domains
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;
@ -11212,9 +11300,12 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
{
vector<int> vn0 = mutipleNodes[nodes[0]];
vector<int> vn1 = mutipleNodes[nodes[nbNodes - 1]];
sort( vn0.begin(), vn0.end() );
sort( vn1.begin(), vn1.end() );
if (vn0 == vn1)
vector<int> doms;
for (int i0 = 0; i0 < vn0.size(); i0++)
for (int i1 = 0; i1 < vn1.size(); i1++)
if (vn0[i0] == vn1[i1])
doms.push_back(vn0[i0]);
if (doms.size() >2)
{
//MESSAGE(" detect edgesMultiDomains " << nodes[0] << " " << nodes[nbNodes - 1]);
double *coords = grid->GetPoint(nodes[0]);
@ -11226,9 +11317,9 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
map<int, SMDS_VtkVolume*> domvol; // domain --> a volume with the edge
map<int, double> angleDom; // oriented angles between planes defined by edge and volume centers
int nbvol = grid->GetParentVolumes(vtkVolIds, downEdgeIds[ie], edgeType[ie]);
for (int id=0; id < vn0.size(); id++)
for (int id=0; id < doms.size(); id++)
{
int idom = vn0[id];
int idom = doms[id];
for (int ivol=0; ivol<nbvol; ivol++)
{
int smdsId = meshDS->fromVtkToSmds(vtkVolIds[ivol]);
@ -11291,6 +11382,14 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
if (createJointElems)
{
int idg;
string joints2DName = "joints2D";
mapOfJunctionGroups[joints2DName] = this->myMesh->AddGroup(SMDSAbs_Face, joints2DName.c_str(), idg);
SMESHDS_Group *joints2DGrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[joints2DName]->GetGroupDS());
string joints3DName = "joints3D";
mapOfJunctionGroups[joints3DName] = this->myMesh->AddGroup(SMDSAbs_Volume, joints3DName.c_str(), idg);
SMESHDS_Group *joints3DGrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[joints3DName]->GetGroupDS());
itface = faceDomains.begin();
for (; itface != faceDomains.end(); ++itface)
{
@ -11314,13 +11413,16 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
grpname << dom1 << "_" << dom2;
else
grpname << dom2 << "_" << dom1;
int idg;
string namegrp = grpname.str();
if (!mapOfJunctionGroups.count(namegrp))
mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(vol->GetType(), namegrp.c_str(), idg);
SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[namegrp]->GetGroupDS());
if (sgrp)
sgrp->Add(vol->GetID());
if (vol->GetType() == SMDSAbs_Volume)
joints3DGrp->Add(vol->GetID());
else if (vol->GetType() == SMDSAbs_Face)
joints2DGrp->Add(vol->GetID());
}
}
@ -11374,11 +11476,8 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
orderedNodes.push_back( nodeDomains[nodes[ino]][orderDom[idom]] );
SMDS_MeshVolume* vol = this->GetMeshDS()->AddVolumeFromVtkIds(orderedNodes);
stringstream grpname;
grpname << "mj_";
grpname << 0 << "_" << 0;
int idg;
string namegrp = grpname.str();
string namegrp = "jointsMultiples";
if (!mapOfJunctionGroups.count(namegrp))
mapOfJunctionGroups[namegrp] = this->myMesh->AddGroup(SMDSAbs_Volume, namegrp.c_str(), idg);
SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(mapOfJunctionGroups[namegrp]->GetGroupDS());
@ -11387,7 +11486,7 @@ bool SMESH_MeshEditor::DoubleNodesOnGroupBoundaries( const std::vector<TIDSorted
}
else
{
MESSAGE("Quadratic multiple joints not implemented");
INFOS("Quadratic multiple joints not implemented");
// TODO quadratic nodes
}
}
@ -11645,6 +11744,532 @@ bool SMESH_MeshEditor::CreateFlatElementsOnFacesGroups(const std::vector<TIDSort
return true;
}
/*!
* \brief identify all the elements around a geom shape, get the faces delimiting the hole
* Build groups of volume to remove, groups of faces to replace on the skin of the object,
* groups of faces to remove inside the object, (idem edges).
* Build ordered list of nodes at the border of each group of faces to replace (to be used to build a geom subshape)
*/
void SMESH_MeshEditor::CreateHoleSkin(double radius,
const TopoDS_Shape& theShape,
SMESH_NodeSearcher* theNodeSearcher,
const char* groupName,
std::vector<double>& nodesCoords,
std::vector<std::vector<int> >& listOfListOfNodes)
{
MESSAGE("--------------------------------");
MESSAGE("SMESH_MeshEditor::CreateHoleSkin");
MESSAGE("--------------------------------");
// --- zone of volumes to remove is given :
// 1 either by a geom shape (one or more vertices) and a radius,
// 2 either by a group of nodes (representative of the shape)to use with the radius,
// 3 either by a group of nodes where all the elements build on one of this nodes are to remove,
// In the case 2, the group of nodes is an external group of nodes from another mesh,
// In the case 3, the group of nodes is an internal group of the mesh (obtained for instance by a filter),
// defined by it's name.
SMESHDS_GroupBase* groupDS = 0;
SMESH_Mesh::GroupIteratorPtr groupIt = this->myMesh->GetGroups();
while ( groupIt->more() )
{
groupDS = 0;
SMESH_Group * group = groupIt->next();
if ( !group ) continue;
groupDS = group->GetGroupDS();
if ( !groupDS || groupDS->IsEmpty() ) continue;
std::string grpName = group->GetName();
if (grpName == groupName)
break;
}
bool isNodeGroup = false;
bool isNodeCoords = false;
if (groupDS)
{
if (groupDS->GetType() != SMDSAbs_Node)
return;
isNodeGroup = true; // a group of nodes exists and it is in this mesh
}
if (nodesCoords.size() > 0)
isNodeCoords = true; // a list o nodes given by their coordinates
// --- define groups to build
int idg; // --- group of SMDS volumes
string grpvName = groupName;
grpvName += "_vol";
SMESH_Group *grp = this->myMesh->AddGroup(SMDSAbs_Volume, grpvName.c_str(), idg);
if (!grp)
{
MESSAGE("group not created " << grpvName);
return;
}
SMESHDS_Group *sgrp = dynamic_cast<SMESHDS_Group*>(grp->GetGroupDS());
int idgs; // --- group of SMDS faces on the skin
string grpsName = groupName;
grpsName += "_skin";
SMESH_Group *grps = this->myMesh->AddGroup(SMDSAbs_Face, grpsName.c_str(), idgs);
if (!grps)
{
MESSAGE("group not created " << grpsName);
return;
}
SMESHDS_Group *sgrps = dynamic_cast<SMESHDS_Group*>(grps->GetGroupDS());
int idgi; // --- group of SMDS faces internal (several shapes)
string grpiName = groupName;
grpiName += "_internalFaces";
SMESH_Group *grpi = this->myMesh->AddGroup(SMDSAbs_Face, grpiName.c_str(), idgi);
if (!grpi)
{
MESSAGE("group not created " << grpiName);
return;
}
SMESHDS_Group *sgrpi = dynamic_cast<SMESHDS_Group*>(grpi->GetGroupDS());
int idgei; // --- group of SMDS faces internal (several shapes)
string grpeiName = groupName;
grpeiName += "_internalEdges";
SMESH_Group *grpei = this->myMesh->AddGroup(SMDSAbs_Edge, grpeiName.c_str(), idgei);
if (!grpei)
{
MESSAGE("group not created " << grpeiName);
return;
}
SMESHDS_Group *sgrpei = dynamic_cast<SMESHDS_Group*>(grpei->GetGroupDS());
// --- build downward connectivity
SMESHDS_Mesh *meshDS = this->myMesh->GetMeshDS();
meshDS->BuildDownWardConnectivity(true);
SMDS_UnstructuredGrid* grid = meshDS->getGrid();
// --- set of volumes detected inside
std::set<int> setOfInsideVol;
std::set<int> setOfVolToCheck;
std::vector<gp_Pnt> gpnts;
gpnts.clear();
if (isNodeGroup) // --- a group of nodes is provided : find all the volumes using one or more of this nodes
{
MESSAGE("group of nodes provided");
SMDS_ElemIteratorPtr elemIt = groupDS->GetElements();
while ( elemIt->more() )
{
const SMDS_MeshElement* elem = elemIt->next();
if (!elem)
continue;
const SMDS_MeshNode* node = dynamic_cast<const SMDS_MeshNode*>(elem);
if (!node)
continue;
SMDS_MeshElement* vol = 0;
SMDS_ElemIteratorPtr volItr = node->GetInverseElementIterator(SMDSAbs_Volume);
while (volItr->more())
{
vol = (SMDS_MeshElement*)volItr->next();
setOfInsideVol.insert(vol->getVtkId());
sgrp->Add(vol->GetID());
}
}
}
else if (isNodeCoords)
{
MESSAGE("list of nodes coordinates provided");
int i = 0;
int k = 0;
while (i < nodesCoords.size()-2)
{
double x = nodesCoords[i++];
double y = nodesCoords[i++];
double z = nodesCoords[i++];
gp_Pnt p = gp_Pnt(x, y ,z);
gpnts.push_back(p);
MESSAGE("TopoDS_Vertex " << k++ << " " << p.X() << " " << p.Y() << " " << p.Z());
}
}
else // --- no group, no coordinates : use the vertices of the geom shape provided, and radius
{
MESSAGE("no group of nodes provided, using vertices from geom shape, and radius");
TopTools_IndexedMapOfShape vertexMap;
TopExp::MapShapes( theShape, TopAbs_VERTEX, vertexMap );
gp_Pnt p = gp_Pnt(0,0,0);
if (vertexMap.Extent() < 1)
return;
for ( int i = 1; i <= vertexMap.Extent(); ++i )
{
const TopoDS_Vertex& vertex = TopoDS::Vertex( vertexMap( i ));
p = BRep_Tool::Pnt(vertex);
gpnts.push_back(p);
MESSAGE("TopoDS_Vertex " << i << " " << p.X() << " " << p.Y() << " " << p.Z());
}
}
if (gpnts.size() > 0)
{
int nodeId = 0;
const SMDS_MeshNode* startNode = theNodeSearcher->FindClosestTo(gpnts[0]);
if (startNode)
nodeId = startNode->GetID();
MESSAGE("nodeId " << nodeId);
double radius2 = radius*radius;
MESSAGE("radius2 " << radius2);
// --- volumes on start node
setOfVolToCheck.clear();
SMDS_MeshElement* startVol = 0;
SMDS_ElemIteratorPtr volItr = startNode->GetInverseElementIterator(SMDSAbs_Volume);
while (volItr->more())
{
startVol = (SMDS_MeshElement*)volItr->next();
setOfVolToCheck.insert(startVol->getVtkId());
}
if (setOfVolToCheck.empty())
{
MESSAGE("No volumes found");
return;
}
// --- starting with central volumes then their neighbors, check if they are inside
// or outside the domain, until no more new neighbor volume is inside.
// Fill the group of inside volumes
std::map<int, double> mapOfNodeDistance2;
mapOfNodeDistance2.clear();
std::set<int> setOfOutsideVol;
while (!setOfVolToCheck.empty())
{
std::set<int>::iterator it = setOfVolToCheck.begin();
int vtkId = *it;
MESSAGE("volume to check, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
bool volInside = false;
vtkIdType npts = 0;
vtkIdType* pts = 0;
grid->GetCellPoints(vtkId, npts, pts);
for (int i=0; i<npts; i++)
{
double distance2 = 0;
if (mapOfNodeDistance2.count(pts[i]))
{
distance2 = mapOfNodeDistance2[pts[i]];
MESSAGE("point " << pts[i] << " distance2 " << distance2);
}
else
{
double *coords = grid->GetPoint(pts[i]);
gp_Pnt aPoint = gp_Pnt(coords[0], coords[1], coords[2]);
distance2 = 1.E40;
for (int j=0; j<gpnts.size(); j++)
{
double d2 = aPoint.SquareDistance(gpnts[j]);
if (d2 < distance2)
{
distance2 = d2;
if (distance2 < radius2)
break;
}
}
mapOfNodeDistance2[pts[i]] = distance2;
MESSAGE(" point " << pts[i] << " distance2 " << distance2 << " coords " << coords[0] << " " << coords[1] << " " << coords[2]);
}
if (distance2 < radius2)
{
volInside = true; // one or more nodes inside the domain
sgrp->Add(meshDS->fromVtkToSmds(vtkId));
break;
}
}
if (volInside)
{
setOfInsideVol.insert(vtkId);
MESSAGE(" volume inside, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
int neighborsVtkIds[NBMAXNEIGHBORS];
int downIds[NBMAXNEIGHBORS];
unsigned char downTypes[NBMAXNEIGHBORS];
int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
for (int n = 0; n < nbNeighbors; n++)
if (!setOfInsideVol.count(neighborsVtkIds[n]) ||setOfOutsideVol.count(neighborsVtkIds[n]))
setOfVolToCheck.insert(neighborsVtkIds[n]);
}
else
{
setOfOutsideVol.insert(vtkId);
MESSAGE(" volume outside, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
}
setOfVolToCheck.erase(vtkId);
}
}
// --- for outside hexahedrons, check if they have more than one neighbor volume inside
// If yes, add the volume to the inside set
bool addedInside = true;
std::set<int> setOfVolToReCheck;
while (addedInside)
{
MESSAGE(" --------------------------- re check");
addedInside = false;
std::set<int>::iterator itv = setOfInsideVol.begin();
for (; itv != setOfInsideVol.end(); ++itv)
{
int vtkId = *itv;
int neighborsVtkIds[NBMAXNEIGHBORS];
int downIds[NBMAXNEIGHBORS];
unsigned char downTypes[NBMAXNEIGHBORS];
int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
for (int n = 0; n < nbNeighbors; n++)
if (!setOfInsideVol.count(neighborsVtkIds[n]))
setOfVolToReCheck.insert(neighborsVtkIds[n]);
}
setOfVolToCheck = setOfVolToReCheck;
setOfVolToReCheck.clear();
while (!setOfVolToCheck.empty())
{
std::set<int>::iterator it = setOfVolToCheck.begin();
int vtkId = *it;
if (grid->GetCellType(vtkId) == VTK_HEXAHEDRON)
{
MESSAGE("volume to recheck, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
int countInside = 0;
int neighborsVtkIds[NBMAXNEIGHBORS];
int downIds[NBMAXNEIGHBORS];
unsigned char downTypes[NBMAXNEIGHBORS];
int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
for (int n = 0; n < nbNeighbors; n++)
if (setOfInsideVol.count(neighborsVtkIds[n]))
countInside++;
MESSAGE("countInside " << countInside);
if (countInside > 1)
{
MESSAGE(" volume inside, vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
setOfInsideVol.insert(vtkId);
sgrp->Add(meshDS->fromVtkToSmds(vtkId));
addedInside = true;
}
else
setOfVolToReCheck.insert(vtkId);
}
setOfVolToCheck.erase(vtkId);
}
}
// --- map of Downward faces at the boundary, inside the global volume
// map of Downward faces on the skin of the global volume (equivalent to SMDS faces on the skin)
// fill group of SMDS faces inside the volume (when several volume shapes)
// fill group of SMDS faces on the skin of the global volume (if skin)
std::map<DownIdType, int, DownIdCompare> boundaryFaces; // boundary faces inside the volume --> corresponding cell
std::map<DownIdType, int, DownIdCompare> skinFaces; // faces on the skin of the global volume --> corresponding cell
std::set<int>::iterator it = setOfInsideVol.begin();
for (; it != setOfInsideVol.end(); ++it)
{
int vtkId = *it;
//MESSAGE(" vtkId " << vtkId << " smdsId " << meshDS->fromVtkToSmds(vtkId));
int neighborsVtkIds[NBMAXNEIGHBORS];
int downIds[NBMAXNEIGHBORS];
unsigned char downTypes[NBMAXNEIGHBORS];
int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId, true);
for (int n = 0; n < nbNeighbors; n++)
{
int neighborDim = SMDS_Downward::getCellDimension(grid->GetCellType(neighborsVtkIds[n]));
if (neighborDim == 3)
{
if (! setOfInsideVol.count(neighborsVtkIds[n])) // neighbor volume is not inside : face is boundary
{
DownIdType face(downIds[n], downTypes[n]);
boundaryFaces[face] = vtkId;
}
// if the face between to volumes is in the mesh, get it (internal face between shapes)
int vtkFaceId = grid->getDownArray(downTypes[n])->getVtkCellId(downIds[n]);
if (vtkFaceId >= 0)
{
sgrpi->Add(meshDS->fromVtkToSmds(vtkFaceId));
// find also the smds edges on this face
int nbEdges = grid->getDownArray(downTypes[n])->getNumberOfDownCells(downIds[n]);
const int* dEdges = grid->getDownArray(downTypes[n])->getDownCells(downIds[n]);
const unsigned char* dTypes = grid->getDownArray(downTypes[n])->getDownTypes(downIds[n]);
for (int i = 0; i < nbEdges; i++)
{
int vtkEdgeId = grid->getDownArray(dTypes[i])->getVtkCellId(dEdges[i]);
if (vtkEdgeId >= 0)
sgrpei->Add(meshDS->fromVtkToSmds(vtkEdgeId));
}
}
}
else if (neighborDim == 2) // skin of the volume
{
DownIdType face(downIds[n], downTypes[n]);
skinFaces[face] = vtkId;
int vtkFaceId = grid->getDownArray(downTypes[n])->getVtkCellId(downIds[n]);
if (vtkFaceId >= 0)
sgrps->Add(meshDS->fromVtkToSmds(vtkFaceId));
}
}
}
// --- identify the edges constituting the wire of each subshape on the skin
// define polylines with the nodes of edges, equivalent to wires
// project polylines on subshapes, and partition, to get geom faces
std::map<int, std::set<int> > shapeIdToVtkIdSet; // shapeId --> set of vtkId on skin
std::set<int> emptySet;
emptySet.clear();
std::set<int> shapeIds;
SMDS_ElemIteratorPtr itelem = sgrps->GetElements();
while (itelem->more())
{
const SMDS_MeshElement *elem = itelem->next();
int shapeId = elem->getshapeId();
int vtkId = elem->getVtkId();
if (!shapeIdToVtkIdSet.count(shapeId))
{
shapeIdToVtkIdSet[shapeId] = emptySet;
shapeIds.insert(shapeId);
}
shapeIdToVtkIdSet[shapeId].insert(vtkId);
}
std::map<int, std::set<DownIdType, DownIdCompare> > shapeIdToEdges; // shapeId --> set of downward edges
std::set<DownIdType, DownIdCompare> emptyEdges;
emptyEdges.clear();
std::map<int, std::set<int> >::iterator itShape = shapeIdToVtkIdSet.begin();
for (; itShape != shapeIdToVtkIdSet.end(); ++itShape)
{
int shapeId = itShape->first;
MESSAGE(" --- Shape ID --- "<< shapeId);
shapeIdToEdges[shapeId] = emptyEdges;
std::vector<int> nodesEdges;
std::set<int>::iterator its = itShape->second.begin();
for (; its != itShape->second.end(); ++its)
{
int vtkId = *its;
MESSAGE(" " << vtkId);
int neighborsVtkIds[NBMAXNEIGHBORS];
int downIds[NBMAXNEIGHBORS];
unsigned char downTypes[NBMAXNEIGHBORS];
int nbNeighbors = grid->GetNeighbors(neighborsVtkIds, downIds, downTypes, vtkId);
for (int n = 0; n < nbNeighbors; n++)
{
if (neighborsVtkIds[n]<0) // only smds faces are considered as neighbors here
continue;
int smdsId = meshDS->fromVtkToSmds(neighborsVtkIds[n]);
const SMDS_MeshElement* elem = meshDS->FindElement(smdsId);
if ( shapeIds.count(elem->getshapeId()) && !sgrps->Contains(elem)) // edge : neighbor in the set of shape, not in the group
{
DownIdType edge(downIds[n], downTypes[n]);
if (!shapeIdToEdges[shapeId].count(edge))
{
shapeIdToEdges[shapeId].insert(edge);
int vtkNodeId[3];
int nbNodes = grid->getDownArray(downTypes[n])->getNodes(downIds[n],vtkNodeId);
nodesEdges.push_back(vtkNodeId[0]);
nodesEdges.push_back(vtkNodeId[nbNodes-1]);
MESSAGE(" --- nodes " << vtkNodeId[0]+1 << " " << vtkNodeId[nbNodes-1]+1);
}
}
}
}
std::list<int> order;
order.clear();
if (nodesEdges.size() > 0)
{
order.push_back(nodesEdges[0]); MESSAGE(" --- back " << order.back()+1); // SMDS id = VTK id + 1;
nodesEdges[0] = -1;
order.push_back(nodesEdges[1]); MESSAGE(" --- back " << order.back()+1);
nodesEdges[1] = -1; // do not reuse this edge
bool found = true;
while (found)
{
int nodeTofind = order.back(); // try first to push back
int i = 0;
for (i = 0; i<nodesEdges.size(); i++)
if (nodesEdges[i] == nodeTofind)
break;
if (i == nodesEdges.size())
found = false; // no follower found on back
else
{
if (i%2) // odd ==> use the previous one
if (nodesEdges[i-1] < 0)
found = false;
else
{
order.push_back(nodesEdges[i-1]); MESSAGE(" --- back " << order.back()+1);
nodesEdges[i-1] = -1;
}
else // even ==> use the next one
if (nodesEdges[i+1] < 0)
found = false;
else
{
order.push_back(nodesEdges[i+1]); MESSAGE(" --- back " << order.back()+1);
nodesEdges[i+1] = -1;
}
}
if (found)
continue;
// try to push front
found = true;
nodeTofind = order.front(); // try to push front
for (i = 0; i<nodesEdges.size(); i++)
if (nodesEdges[i] == nodeTofind)
break;
if (i == nodesEdges.size())
{
found = false; // no predecessor found on front
continue;
}
if (i%2) // odd ==> use the previous one
if (nodesEdges[i-1] < 0)
found = false;
else
{
order.push_front(nodesEdges[i-1]); MESSAGE(" --- front " << order.front()+1);
nodesEdges[i-1] = -1;
}
else // even ==> use the next one
if (nodesEdges[i+1] < 0)
found = false;
else
{
order.push_front(nodesEdges[i+1]); MESSAGE(" --- front " << order.front()+1);
nodesEdges[i+1] = -1;
}
}
}
std::vector<int> nodes;
nodes.push_back(shapeId);
std::list<int>::iterator itl = order.begin();
for (; itl != order.end(); itl++)
{
nodes.push_back((*itl) + 1); // SMDS id = VTK id + 1;
MESSAGE(" ordered node " << nodes[nodes.size()-1]);
}
listOfListOfNodes.push_back(nodes);
}
// partition geom faces with blocFissure
// mesh blocFissure and geom faces of the skin (external wires given, triangle algo to choose)
// mesh volume around blocFissure (skin triangles and quadrangle given, tetra algo to choose)
return;
}
//================================================================================
/*!
* \brief Generates skin mesh (containing 2D cells) from 3D mesh

View File

@ -34,6 +34,7 @@
#include "SMESH_Controls.hxx"
#include "SMESH_Mesh.hxx"
#include "SMESH_TypeDefs.hxx"
#include "SMESH_ComputeError.hxx"
#include <utilities.h>
@ -110,6 +111,14 @@ public:
SMESH_MeshEditor( SMESH_Mesh* theMesh );
SMESH_Mesh * GetMesh() { return myMesh; }
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
SMESH_ComputeErrorPtr & GetError() { return myError; }
/*!
* \brief Add element
*/
@ -561,14 +570,6 @@ public:
// Return an index of the shape theElem is on
// or zero if a shape not found
SMESH_Mesh * GetMesh() { return myMesh; }
SMESHDS_Mesh * GetMeshDS() { return myMesh->GetMeshDS(); }
const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
bool DoubleNodes( const std::list< int >& theListOfNodes,
const std::list< int >& theListOfModifiedElems );
@ -576,6 +577,11 @@ public:
const TIDSortedElemSet& theNodesNot,
const TIDSortedElemSet& theAffectedElems );
bool AffectedElemGroupsInRegion( const TIDSortedElemSet& theElems,
const TIDSortedElemSet& theNodesNot,
const TopoDS_Shape& theShape,
TIDSortedElemSet& theAffectedElems);
bool DoubleNodesInRegion( const TIDSortedElemSet& theElems,
const TIDSortedElemSet& theNodesNot,
const TopoDS_Shape& theShape );
@ -587,6 +593,13 @@ public:
bool CreateFlatElementsOnFacesGroups( const std::vector<TIDSortedElemSet>& theElems );
void CreateHoleSkin(double radius,
const TopoDS_Shape& theShape,
SMESH_NodeSearcher* theNodeSearcher,
const char* groupName,
std::vector<double>& nodesCoords,
std::vector<std::vector<int> >& listOfListOfNodes);
/*!
* \brief Generated skin mesh (containing 2D cells) from 3D mesh
* The created 2D mesh elements based on nodes of free faces of boundary volumes
@ -711,16 +724,11 @@ private:
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

View File

@ -26,13 +26,17 @@
//
#include "SMESH_MesherHelper.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMDS_EdgePosition.hxx"
#include "SMDS_FaceOfNodes.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMDS_IteratorOnIterators.hxx"
#include "SMDS_VolumeTool.hxx"
#include "SMESH_subMesh.hxx"
#include "SMESH_ProxyMesh.hxx"
#include "SMESH_subMesh.hxx"
#include <BRepAdaptor_Curve.hxx>
#include <BRepAdaptor_Surface.hxx>
#include <BRepClass3d_SolidClassifier.hxx>
#include <BRepTools.hxx>
#include <BRepTools_WireExplorer.hxx>
#include <BRep_Tool.hxx>
@ -403,7 +407,7 @@ void SMESH_MesherHelper::AddTLinks(const SMDS_MeshVolume* volume)
{
int iN1 = iNodes[i++];
int iN12 = iNodes[i++];
int iN2 = iNodes[i++];
int iN2 = iNodes[i];
if ( iN1 > iN2 ) std::swap( iN1, iN2 );
int linkID = iN1 * vTool.NbNodes() + iN2;
pair< set<int>::iterator, bool > it_isNew = addedLinks.insert( linkID );
@ -1675,6 +1679,24 @@ SMESH_MesherHelper::AddPolyhedralVolume (const std::vector<const SMDS_MeshNode*>
return elem;
}
namespace
{
//================================================================================
/*!
* \brief Check if a node belongs to any face of sub-mesh
*/
//================================================================================
bool isNodeInSubMesh( const SMDS_MeshNode* n, const SMESHDS_SubMesh* sm )
{
SMDS_ElemIteratorPtr fIt = n->GetInverseElementIterator( SMDSAbs_Face );
while ( fIt->more() )
if ( sm->Contains( fIt->next() ))
return true;
return false;
}
}
//=======================================================================
//function : LoadNodeColumns
//purpose : Load nodes bound to face into a map of node columns
@ -1746,13 +1768,36 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2
SMESH_Algo::GetSortedNodesOnEdge( theMesh, *edge,/*noMedium=*/true, sortedBaseNodes);
if ( sortedBaseNodes.empty() ) continue;
map< double, const SMDS_MeshNode*>::iterator u_n = sortedBaseNodes.begin();
if ( theProxyMesh ) // from sortedBaseNodes remove nodes not shared by faces of faceSubMesh
{
const SMDS_MeshNode* n1 = sortedBaseNodes.begin()->second;
const SMDS_MeshNode* n2 = sortedBaseNodes.rbegin()->second;
bool allNodesAreProxy = ( n1 != theProxyMesh->GetProxyNode( n1 ) &&
n2 != theProxyMesh->GetProxyNode( n2 ));
if ( allNodesAreProxy )
for ( u_n = sortedBaseNodes.begin(); u_n != sortedBaseNodes.end(); u_n++ )
u_n->second = theProxyMesh->GetProxyNode( u_n->second );
if ( u_n = sortedBaseNodes.begin(), !isNodeInSubMesh( u_n->second, faceSubMesh ))
{
while ( ++u_n != sortedBaseNodes.end() && !isNodeInSubMesh( u_n->second, faceSubMesh ));
sortedBaseNodes.erase( sortedBaseNodes.begin(), u_n );
}
else if ( u_n = --sortedBaseNodes.end(), !isNodeInSubMesh( u_n->second, faceSubMesh ))
{
while ( u_n != sortedBaseNodes.begin() && !isNodeInSubMesh( (--u_n)->second, faceSubMesh ));
sortedBaseNodes.erase( ++u_n, sortedBaseNodes.end() );
}
if ( sortedBaseNodes.empty() ) continue;
}
double f, l;
BRep_Tool::Range( *edge, f, l );
if ( edge->Orientation() == TopAbs_REVERSED ) std::swap( f, l );
const double coeff = 1. / ( l - f ) * length[iE] / fullLen;
const double prevPar = theParam2ColumnMap.empty() ? 0 : theParam2ColumnMap.rbegin()->first;
map< double, const SMDS_MeshNode*>::iterator u_n = sortedBaseNodes.begin();
for ( ; u_n != sortedBaseNodes.end(); u_n++ )
for ( u_n = sortedBaseNodes.begin(); u_n != sortedBaseNodes.end(); u_n++ )
{
double par = prevPar + coeff * ( u_n->first - f );
TParam2ColumnMap::iterator u2nn =
@ -1760,21 +1805,16 @@ bool SMESH_MesherHelper::LoadNodeColumns(TParam2ColumnMap & theParam2
u2nn->second.push_back( u_n->second );
}
}
TParam2ColumnMap::iterator par_nVec_2, par_nVec_1 = theParam2ColumnMap.begin();
if ( theProxyMesh )
{
for ( ; par_nVec_1 != theParam2ColumnMap.end(); ++par_nVec_1 )
{
const SMDS_MeshNode* & n = par_nVec_1->second[0];
n = theProxyMesh->GetProxyNode( n );
}
}
if ( theParam2ColumnMap.empty() )
return false;
int nbRows = 1 + faceSubMesh->NbElements() / ( theParam2ColumnMap.size()-1 );
// fill theParam2ColumnMap column by column by passing from nodes on
// theBaseEdge up via mesh faces on theFace
TParam2ColumnMap::iterator par_nVec_1, par_nVec_2;
par_nVec_2 = theParam2ColumnMap.begin();
par_nVec_1 = par_nVec_2++;
TIDSortedElemSet emptySet, avoidSet;
@ -1947,6 +1987,30 @@ TopoDS_Vertex SMESH_MesherHelper::IthVertex( const bool is2nd,
return ( vIt.More() ? TopoDS::Vertex(vIt.Value()) : TopoDS_Vertex() );
}
//================================================================================
/*!
* \brief Return type of shape contained in a group
* \param group - a shape of type TopAbs_COMPOUND
* \param avoidCompound - not to return TopAbs_COMPOUND
*/
//================================================================================
TopAbs_ShapeEnum SMESH_MesherHelper::GetGroupType(const TopoDS_Shape& group,
const bool avoidCompound)
{
if ( !group.IsNull() )
{
if ( group.ShapeType() != TopAbs_COMPOUND )
return group.ShapeType();
// iterate on a compound
TopoDS_Iterator it( group );
if ( it.More() )
return avoidCompound ? GetGroupType( it.Value() ) : it.Value().ShapeType();
}
return TopAbs_SHAPE;
}
//=======================================================================
//function : IsQuadraticMesh
//purpose : Check mesh without geometry for: if all elements on this shape are quadratic,
@ -1961,6 +2025,8 @@ SMESH_MesherHelper:: MType SMESH_MesherHelper::IsQuadraticMesh()
int NbFacesAndEdges=0;
//All faces and edges
NbAllEdgsAndFaces = myMesh->NbEdges() + myMesh->NbFaces();
if ( NbAllEdgsAndFaces == 0 )
return SMESH_MesherHelper::LINEAR;
//Quadratic faces and edges
NbQuadFacesAndEdgs = myMesh->NbEdges(ORDER_QUADRATIC) + myMesh->NbFaces(ORDER_QUADRATIC);
@ -3021,18 +3087,349 @@ namespace { // Structures used by FixQuadraticElements()
return _OK;
}
//================================================================================
/*!
* \brief Place medium nodes at the link middle for elements whose corner nodes
* are out of geometrical boundary to prevent distorting elements.
* Issue 0020982, note 0013990
*/
//================================================================================
void force3DOutOfBoundary( SMESH_MesherHelper& theHelper,
SMESH_ComputeErrorPtr& theError)
{
SMESHDS_Mesh* meshDS = theHelper.GetMeshDS();
TopoDS_Shape shape = theHelper.GetSubShape().Oriented( TopAbs_FORWARD );
if ( shape.IsNull() ) return;
if ( !theError ) theError = SMESH_ComputeError::New();
gp_XYZ faceNorm;
if ( shape.ShapeType() == TopAbs_FACE ) // 2D
{
if ( theHelper.GetMesh()->NbTriangles( ORDER_QUADRATIC ) < 1 ) return;
SMESHDS_SubMesh* faceSM = meshDS->MeshElements( shape );
if ( !faceSM ) return;
const TopoDS_Face& face = TopoDS::Face( shape );
Handle(Geom_Surface) surface = BRep_Tool::Surface( face );
TopExp_Explorer edgeIt( face, TopAbs_EDGE );
for ( ; edgeIt.More(); edgeIt.Next() ) // loop on EDGEs of a FACE
{
// check if the EDGE needs checking
const TopoDS_Edge& edge = TopoDS::Edge( edgeIt.Current() );
if ( BRep_Tool::Degenerated( edge ) )
continue;
if ( theHelper.IsRealSeam( edge ) &&
edge.Orientation() == TopAbs_REVERSED )
continue;
SMESHDS_SubMesh* edgeSM = meshDS->MeshElements( edge );
if ( !edgeSM ) continue;
double f,l;
Handle(Geom2d_Curve) pcurve = BRep_Tool::CurveOnSurface( edge, face, f, l );
BRepAdaptor_Curve curve3D( edge );
switch ( curve3D.GetType() ) {
case GeomAbs_Line: continue;
case GeomAbs_Circle:
case GeomAbs_Ellipse:
case GeomAbs_Hyperbola:
case GeomAbs_Parabola:
try
{
gp_Vec D1, D2, Du1, Dv1; gp_Pnt p;
curve3D.D2( 0.5 * ( f + l ), p, D1, D2 );
gp_Pnt2d uv = pcurve->Value( 0.5 * ( f + l ) );
surface->D1( uv.X(), uv.Y(), p, Du1, Dv1 );
gp_Vec fNorm = Du1 ^ Dv1;
if ( fNorm.IsParallel( D2, M_PI * 25./180. ))
continue; // face is normal to the curve3D
gp_Vec curvNorm = fNorm ^ D1;
if ( edge.Orientation() == TopAbs_REVERSED ) curvNorm.Reverse();
if ( curvNorm * D2 > 0 )
continue; // convex edge
}
catch ( Standard_Failure )
{
continue;
}
}
// get nodes shared by faces that may be distorted
SMDS_NodeIteratorPtr nodeIt;
if ( edgeSM->NbNodes() > 0 ) {
nodeIt = edgeSM->GetNodes();
}
else {
SMESHDS_SubMesh* vertexSM = meshDS->MeshElements( theHelper.IthVertex( 0, edge ));
if ( !vertexSM )
vertexSM = meshDS->MeshElements( theHelper.IthVertex( 1, edge ));
if ( !vertexSM ) continue;
nodeIt = vertexSM->GetNodes();
}
// find suspicious faces
TIDSortedElemSet checkedFaces;
vector< const SMDS_MeshNode* > nOnEdge( 2 );
const SMDS_MeshNode* nOnFace;
while ( nodeIt->more() )
{
const SMDS_MeshNode* n = nodeIt->next();
SMDS_ElemIteratorPtr faceIt = n->GetInverseElementIterator( SMDSAbs_Face );
while ( faceIt->more() )
{
const SMDS_MeshElement* f = faceIt->next();
if ( !faceSM->Contains( f ) ||
f->NbNodes() != 6 || // check quadratic triangles only
!checkedFaces.insert( f ).second )
continue;
// get nodes on EDGE and on FACE of a suspicious face
nOnEdge.clear(); nOnFace = 0;
SMDS_MeshElement::iterator triNode = f->begin_nodes();
for ( int nbN = 0; nbN < 3; ++triNode, ++nbN )
{
n = *triNode;
if ( n->GetPosition()->GetDim() == 2 )
nOnFace = n;
else
nOnEdge.push_back( n );
}
// check if nOnFace is inside the FACE
if ( nOnFace && nOnEdge.size() == 2 )
{
theHelper.AddTLinks( static_cast< const SMDS_MeshFace* > ( f ));
if ( !SMESH_Algo::FaceNormal( f, faceNorm, /*normalized=*/false ))
continue;
gp_XYZ edgeDir = SMESH_TNodeXYZ( nOnEdge[0] ) - SMESH_TNodeXYZ( nOnEdge[1] );
gp_XYZ edgeNorm = faceNorm ^ edgeDir;
n = theHelper.GetMediumNode( nOnEdge[0], nOnEdge[1], true );
gp_XYZ pN0 = SMESH_TNodeXYZ( nOnEdge[0] );
gp_XYZ pMedium = SMESH_TNodeXYZ( n ); // on-edge node location
gp_XYZ pFaceN = SMESH_TNodeXYZ( nOnFace ); // on-face node location
double hMedium = edgeNorm * gp_Vec( pN0, pMedium ).XYZ();
double hFace = edgeNorm * gp_Vec( pN0, pFaceN ).XYZ();
if ( Abs( hMedium ) > Abs( hFace * 0.6 ))
{
// nOnFace is out of FACE, move a medium on-edge node to the middle
gp_XYZ pMid3D = 0.5 * ( pN0 + SMESH_TNodeXYZ( nOnEdge[1] ));
meshDS->MoveNode( n, pMid3D.X(), pMid3D.Y(), pMid3D.Z() );
MSG( "move OUT of face " << n );
theError->myBadElements.push_back( f );
}
}
}
}
}
if ( !theError->myBadElements.empty() )
theError->myName = EDITERR_NO_MEDIUM_ON_GEOM;
return;
} // 2D ==============================================================================
if ( shape.ShapeType() == TopAbs_SOLID ) // 3D
{
if ( theHelper.GetMesh()->NbTetras ( ORDER_QUADRATIC ) < 1 &&
theHelper.GetMesh()->NbPyramids( ORDER_QUADRATIC ) < 1 ) return;
SMESHDS_SubMesh* solidSM = meshDS->MeshElements( shape );
if ( !solidSM ) return;
// check if the SOLID is bound by concave FACEs
vector< TopoDS_Face > concaveFaces;
TopExp_Explorer faceIt( shape, TopAbs_FACE );
for ( ; faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
{
const TopoDS_Face& face = TopoDS::Face( faceIt.Current() );
if ( !meshDS->MeshElements( face )) continue;
BRepAdaptor_Surface surface( face );
switch ( surface.GetType() ) {
case GeomAbs_Plane: continue;
case GeomAbs_Cylinder:
case GeomAbs_Cone:
case GeomAbs_Sphere:
try
{
double u = 0.5 * ( surface.FirstUParameter() + surface.LastUParameter() );
double v = 0.5 * ( surface.FirstVParameter() + surface.LastVParameter() );
gp_Vec Du1, Dv1, Du2, Dv2, Duv2; gp_Pnt p;
surface.D2( u,v, p, Du1, Dv1, Du2, Dv2, Duv2 );
gp_Vec fNorm = Du1 ^ Dv1;
if ( face.Orientation() == TopAbs_REVERSED ) fNorm.Reverse();
bool concaveU = ( fNorm * Du2 > 1e-100 );
bool concaveV = ( fNorm * Dv2 > 1e-100 );
if ( concaveU || concaveV )
concaveFaces.push_back( face );
}
catch ( Standard_Failure )
{
concaveFaces.push_back( face );
}
}
}
if ( concaveFaces.empty() )
return;
// fix 2D mesh on the SOLID
for ( faceIt.ReInit(); faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
{
SMESH_MesherHelper faceHelper( *theHelper.GetMesh() );
faceHelper.SetSubShape( faceIt.Current() );
force3DOutOfBoundary( faceHelper, theError );
}
// get an iterator over faces on concaveFaces
vector< SMDS_ElemIteratorPtr > faceIterVec( concaveFaces.size() );
for ( size_t i = 0; i < concaveFaces.size(); ++i )
faceIterVec[i] = meshDS->MeshElements( concaveFaces[i] )->GetElements();
typedef SMDS_IteratorOnIterators
< const SMDS_MeshElement*, vector< SMDS_ElemIteratorPtr > > TIterOnIter;
SMDS_ElemIteratorPtr faceIter( new TIterOnIter( faceIterVec ));
// a seacher to check if a volume is close to a concave face
std::auto_ptr< SMESH_ElementSearcher > faceSearcher
( SMESH_MeshEditor( theHelper.GetMesh() ).GetElementSearcher( faceIter ));
// classifier
//BRepClass3d_SolidClassifier solidClassifier( shape );
TIDSortedElemSet checkedVols, movedNodes;
for ( faceIt.ReInit(); faceIt.More(); faceIt.Next() ) // loop on FACEs of a SOLID
{
const TopoDS_Shape& face = faceIt.Current();
SMESHDS_SubMesh* faceSM = meshDS->MeshElements( face );
if ( !faceSM ) continue;
// get nodes shared by volumes (tet and pyra) on the FACE that may be distorted
SMDS_NodeIteratorPtr nodeIt;
if ( faceSM->NbNodes() > 0 ) {
nodeIt = faceSM->GetNodes();
}
else {
TopExp_Explorer vertex( face, TopAbs_VERTEX );
SMESHDS_SubMesh* vertexSM = meshDS->MeshElements( vertex.Current() );
if ( !vertexSM ) continue;
nodeIt = vertexSM->GetNodes();
}
// find suspicious volumes adjacent to the FACE
vector< const SMDS_MeshNode* > nOnFace( 4 );
const SMDS_MeshNode* nInSolid;
//vector< const SMDS_MeshElement* > intersectedFaces;
while ( nodeIt->more() )
{
const SMDS_MeshNode* n = nodeIt->next();
SMDS_ElemIteratorPtr volIt = n->GetInverseElementIterator( SMDSAbs_Volume );
while ( volIt->more() )
{
const SMDS_MeshElement* vol = volIt->next();
int nbN = vol->NbCornerNodes();
if ( ( nbN != 4 && nbN != 5 ) ||
!solidSM->Contains( vol ) ||
!checkedVols.insert( vol ).second )
continue;
// get nodes on FACE and in SOLID of a suspicious volume
nOnFace.clear(); nInSolid = 0;
SMDS_MeshElement::iterator volNode = vol->begin_nodes();
for ( int nb = nbN; nb > 0; ++volNode, --nb )
{
n = *volNode;
if ( n->GetPosition()->GetDim() == 3 )
nInSolid = n;
else
nOnFace.push_back( n );
}
if ( !nInSolid || nOnFace.size() != nbN - 1 )
continue;
// get size of the vol
SMESH_TNodeXYZ pInSolid( nInSolid ), pOnFace0( nOnFace[0] );
double volLength = pInSolid.SquareDistance( nOnFace[0] );
for ( size_t i = 1; i < nOnFace.size(); ++i )
{
volLength = Max( volLength, pOnFace0.SquareDistance( nOnFace[i] ));
}
// check if vol is close to concaveFaces
const SMDS_MeshElement* closeFace =
faceSearcher->FindClosestTo( pInSolid, SMDSAbs_Face );
if ( !closeFace ||
pInSolid.SquareDistance( closeFace->GetNode(0) ) > 4 * volLength )
continue;
// check if vol is distorted, i.e. a medium node is much closer
// to nInSolid than the link middle
bool isDistorted = false;
SMDS_FaceOfNodes onFaceTria( nOnFace[0], nOnFace[1], nOnFace[2] );
if ( !SMESH_Algo::FaceNormal( &onFaceTria, faceNorm, /*normalized=*/false ))
continue;
theHelper.AddTLinks( static_cast< const SMDS_MeshVolume* > ( vol ));
vector< pair< SMESH_TLink, const SMDS_MeshNode* > > links;
for ( size_t i = 0; i < nOnFace.size(); ++i ) // loop on links between nOnFace
for ( size_t j = i+1; j < nOnFace.size(); ++j )
{
SMESH_TLink link( nOnFace[i], nOnFace[j] );
TLinkNodeMap::const_iterator linkIt =
theHelper.GetTLinkNodeMap().find( link );
if ( linkIt != theHelper.GetTLinkNodeMap().end() )
{
links.push_back( make_pair( linkIt->first, linkIt->second ));
if ( !isDistorted ) {
// compare projections of nInSolid and nMedium to face normal
gp_Pnt pMedium = SMESH_TNodeXYZ( linkIt->second );
double hMedium = faceNorm * gp_Vec( pOnFace0, pMedium ).XYZ();
double hVol = faceNorm * gp_Vec( pOnFace0, pInSolid ).XYZ();
isDistorted = ( Abs( hMedium ) > Abs( hVol * 0.5 ));
}
}
}
// move medium nodes to link middle
if ( isDistorted )
{
for ( size_t i = 0; i < links.size(); ++i )
{
const SMDS_MeshNode* nMedium = links[i].second;
if ( movedNodes.insert( nMedium ).second )
{
gp_Pnt pMid3D = 0.5 * ( SMESH_TNodeXYZ( links[i].first.node1() ) +
SMESH_TNodeXYZ( links[i].first.node2() ));
meshDS->MoveNode( nMedium, pMid3D.X(), pMid3D.Y(), pMid3D.Z() );
MSG( "move OUT of solid " << nMedium );
}
}
theError->myBadElements.push_back( vol );
}
} // loop on volumes sharing a node on FACE
} // loop on nodes on FACE
} // loop on FACEs of a SOLID
if ( !theError->myBadElements.empty() )
theError->myName = EDITERR_NO_MEDIUM_ON_GEOM;
} // 3D case
}
} //namespace
//=======================================================================
/*!
* \brief Move medium nodes of faces and volumes to fix distorted elements
* \param error - container of fixed distorted elements
* \param volumeOnly - to fix nodes on faces or not, if the shape is solid
*
* Issue 0020307: EDF 992 SMESH : Linea/Quadratic with Medium Node on Geometry
*/
//=======================================================================
void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
bool volumeOnly)
{
// setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
if ( getenv("NO_FixQuadraticElements") )
@ -3065,7 +3462,7 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
#endif
SMESH_MesherHelper h(*myMesh);
h.SetSubShape( s.Current() );
h.FixQuadraticElements(false);
h.FixQuadraticElements( error, false );
}
}
// fix nodes on geom faces
@ -3076,10 +3473,13 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
MSG("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key()));
SMESH_MesherHelper h(*myMesh);
h.SetSubShape( fIt.Key() );
h.FixQuadraticElements(true);
h.FixQuadraticElements( error, true);
h.ToFixNodeParameters(true);
}
//perf_print_all_meters(1);
if ( error && error->myName == EDITERR_NO_MEDIUM_ON_GEOM )
error->myComment = "during conversion to quadratic, "
"some medium nodes were not placed on geometry to avoid distorting elements";
return;
}
@ -3118,6 +3518,11 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
TIDSortedNodeSet apexOfPyramid;
const int apexIndex = 4;
// Issue 0020982
// Move medium nodes to the link middle for elements whose corner nodes
// are out of geometrical boundary to fix distorted elements.
force3DOutOfBoundary( *this, error );
if ( elemType == SMDSAbs_Volume )
{
while ( elemIt->more() ) // loop on volumes
@ -3392,109 +3797,73 @@ void SMESH_MesherHelper::FixQuadraticElements(bool volumeOnly)
} // loop on chains of links
} // loop on 2 directions of propagation from quadrangle
} // loop on faces
}
} // fix faces and/or volumes
// 4. Move nodes
// -------------
// vector<const SMDS_MeshElement*> vols( 100 );
// vector<double> volSize( 100 );
// int nbVols;
// bool ok;
for ( pLink = links.begin(); pLink != links.end(); ++pLink ) {
if ( pLink->IsMoved() ) {
gp_Pnt p = pLink->MiddlePnt() + pLink->Move();
GetMeshDS()->MoveNode( pLink->_mediumNode, p.X(), p.Y(), p.Z());
//
// gp_Pnt pNew = pLink->MiddlePnt() + pLink->Move();
// if ( pLink->MediumPos() != SMDS_TOP_3DSPACE )
// {
// // avoid making distorted volumes near boundary
// SMDS_ElemIteratorPtr volIt =
// (*pLink)._mediumNode->GetInverseElementIterator( SMDSAbs_Volume );
// for ( nbVols = 0; volIt->more() && volTool.Set( volIt->next() ); ++nbVols )
// {
// vols [ nbVols ] = volTool.Element();
// volSize[ nbVols ] = volTool.GetSize();
// }
// gp_Pnt pOld = pLink->MediumPnt();
// const_cast<SMDS_MeshNode*>( pLink->_mediumNode )->setXYZ( pNew.X(), pNew.Y(), pNew.Z() );
// ok = true;
// while ( nbVols-- && ok )
// {
// volTool.Set( vols[ nbVols ]);
// ok = ( volSize[ nbVols ] * volTool.GetSize() > 1e-20 );
// }
// if ( !ok )
// {
// const_cast<SMDS_MeshNode*>( pLink->_mediumNode )->setXYZ( pOld.X(), pOld.Y(), pOld.Z() );
// MSG( "Do NOT move \t" << pLink->_mediumNode->GetID()
// << " because of distortion of volume " << vols[ nbVols+1 ]->GetID());
// continue;
// }
// }
// GetMeshDS()->MoveNode( pLink->_mediumNode, pNew.X(), pNew.Y(), pNew.Z() );
}
}
//return;
// Issue 0020982
// Move the apex of pyramid together with the most curved link.
// TIDSortedNodeSet::iterator apexIt = apexOfPyramid.begin();
// for ( ; apexIt != apexOfPyramid.end(); ++apexIt )
// {
// SMESH_TNodeXYZ apex = *apexIt;
// issue 0020982
// Move the apex of pyramid together with the most curved link
// gp_Vec maxMove( 0,0,0 );
// double maxMoveSize2 = 0;
TIDSortedNodeSet::iterator apexIt = apexOfPyramid.begin();
for ( ; apexIt != apexOfPyramid.end(); ++apexIt )
{
SMESH_TNodeXYZ apex = *apexIt;
// // shift of node index to get medium nodes between the base nodes
// const int base2MediumShift = 5;
gp_Vec maxMove( 0,0,0 );
double maxMoveSize2 = 0;
// // 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 );
// shift of node index to get medium nodes between the base nodes
const int base2MediumShift = 5;
// 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;
// }
// }
// }
// 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 );
// // move the apex
// if ( maxMoveSize2 > 1e-20 )
// {
// apex += maxMove.XYZ();
// GetMeshDS()->MoveNode( apex._node, apex.X(), apex.Y(), apex.Z());
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());
}
}
}
// // 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());
// }
// }
// }
}

View File

@ -164,6 +164,9 @@ public:
static TopoDS_Vertex IthVertex( const bool is2nd, TopoDS_Edge anEdge, const bool CumOri=true );
static TopAbs_ShapeEnum GetGroupType(const TopoDS_Shape& group,
const bool avoidCompound=false);
public:
// ---------- PUBLIC INSTANCE METHODS ----------
@ -192,9 +195,10 @@ public:
/*!
* \brief Move medium nodes of faces and volumes to fix distorted elements
* \param error - container of fixed distorted elements
* \param volumeOnly - fix nodes on geom faces or not if the shape is solid
*/
void FixQuadraticElements(bool volumeOnly=true);
void FixQuadraticElements(SMESH_ComputeErrorPtr& error, bool volumeOnly=true);
/*!
* \brief To set created elements on the shape set by IsQuadraticSubMesh()

View File

@ -406,6 +406,10 @@ const map < int, SMESH_subMesh * >& SMESH_subMesh::DependsOn()
{
insertDependence(exp.Current());
}
for (TopExp_Explorer exp(_subShape, TopAbs_VERTEX, TopAbs_EDGE); exp.More();exp.Next())
{
insertDependence(exp.Current());
}
break;
}
case TopAbs_COMPSOLID:
@ -1462,16 +1466,18 @@ bool SMESH_subMesh::ComputeStateEngine(int event)
else
ret = false;
}
// check if an error reported on any sub-shape
bool isComputeErrorSet = !checkComputeError( algo, ret, shape );
// check if anything was built
TopExp_Explorer subS(shape, _subShape.ShapeType());
if (ret) // check if anything was built
if (ret)
{
for (; ret && subS.More(); subS.Next())
ret = _father->GetSubMesh( subS.Current() )->IsMeshComputed();
}
bool isComputeErrorSet = !checkComputeError( algo, shape );
// Set _computeError
if (!ret && !isComputeErrorSet)
{
// Set _computeError
for (subS.ReInit(); subS.More(); subS.Next())
{
SMESH_subMesh* sm = _father->GetSubMesh( subS.Current() );
@ -1723,7 +1729,9 @@ bool SMESH_subMesh::Evaluate(MapShapeNbElems& aResMap)
*/
//=======================================================================
bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& theShape)
bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo,
const bool theComputeOK,
const TopoDS_Shape& theShape)
{
bool noErrors = true;
@ -1734,7 +1742,7 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t
{
SMESH_subMeshIteratorPtr smIt = getDependsOnIterator(false,false);
while ( smIt->more() )
if ( !smIt->next()->checkComputeError( theAlgo ))
if ( !smIt->next()->checkComputeError( theAlgo, theComputeOK ))
noErrors = false;
}
@ -1746,7 +1754,7 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t
for (TopoDS_Iterator subIt( theShape ); subIt.More(); subIt.Next()) {
SMESH_subMesh* sm = _father->GetSubMesh( subIt.Value() );
if ( sm != this ) {
if ( !sm->checkComputeError( theAlgo, sm->GetSubShape() ))
if ( !sm->checkComputeError( theAlgo, theComputeOK, sm->GetSubShape() ))
noErrors = false;
updateDependantsState( SUBMESH_COMPUTED ); // send event SUBMESH_COMPUTED
}
@ -1754,13 +1762,24 @@ bool SMESH_subMesh::checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& t
}
}
{
// Check my state
// Set my _computeState
if ( !_computeError || _computeError->IsOK() )
{
// no error description is set to this sub-mesh, check if any mesh is computed
_computeState = IsMeshComputed() ? COMPUTE_OK : FAILED_TO_COMPUTE;
if ( _computeState != COMPUTE_OK )
{
if ( _subShape.ShapeType() == TopAbs_EDGE &&
BRep_Tool::Degenerated( TopoDS::Edge( _subShape )) )
_computeState = COMPUTE_OK;
else if ( theComputeOK )
_computeError = SMESH_ComputeError::New(COMPERR_NO_MESH_ON_SHAPE,"",theAlgo);
}
else
}
if ( _computeError && !_computeError->IsOK() )
{
if ( !_computeError->myAlgo )
_computeError->myAlgo = theAlgo;
@ -2078,6 +2097,23 @@ EventListenerData* SMESH_subMesh::GetEventListenerData(EventListener* listener)
return 0;
}
//================================================================================
/*!
* \brief Return an event listener data
* \param listenerName - the listener name
* \retval EventListenerData* - found data, maybe NULL
*/
//================================================================================
EventListenerData* SMESH_subMesh::GetEventListenerData(const string& listenerName) const
{
map< EventListener*, EventListenerData* >::const_iterator l_d = _eventListeners.begin();
for ( ; l_d != _eventListeners.end(); ++l_d )
if ( listenerName == l_d->first->GetName() )
return l_d->second;
return 0;
}
//================================================================================
/*!
* \brief Notify stored event listeners on the occured event
@ -2118,8 +2154,15 @@ void SMESH_subMesh::DeleteEventListener(EventListener* listener)
map< EventListener*, EventListenerData* >::iterator l_d =
_eventListeners.find( listener );
if ( l_d != _eventListeners.end() ) {
if ( l_d->first && l_d->first->IsDeletable() ) delete l_d->first;
if ( l_d->second && l_d->second->IsDeletable() ) delete l_d->second;
if ( l_d->first && l_d->first->IsDeletable() )
{
l_d->first->BeforeDelete( this, l_d->second );
delete l_d->first;
}
if ( l_d->second && l_d->second->IsDeletable() )
{
delete l_d->second;
}
_eventListeners.erase( l_d );
}
}

View File

@ -138,6 +138,13 @@ class SMESH_EXPORT SMESH_subMesh
*/
EventListenerData* GetEventListenerData(EventListener* listener) const;
/*!
* \brief Return an event listener data
* \param listenerName - the listener name
* \retval EventListenerData* - found data, maybe NULL
*/
EventListenerData* GetEventListenerData(const std::string& listenerName) const;
/*!
* \brief Unregister the listener and delete it and it's data
* \param listener - the event listener to delete
@ -278,7 +285,9 @@ protected:
* \brief Update compute_state by _computeError
* \retval bool - false if there are errors
*/
bool checkComputeError(SMESH_Algo* theAlgo, const TopoDS_Shape& theShape=TopoDS_Shape());
bool checkComputeError(SMESH_Algo* theAlgo,
const bool theComputeOK,
const TopoDS_Shape& theShape=TopoDS_Shape());
/*!
* \brief Return a hypothesis attached to theShape.

View File

@ -46,18 +46,18 @@ class SMESH_EXPORT SMESH_subMeshEventListener
{
bool myIsDeletable; //!< if true, it will be deleted by SMESH_subMesh
mutable std::set<SMESH_subMesh*> myBusySM; //!< to avoid infinite recursion via events
const char* myName; //!< identifier
friend class SMESH_subMesh;
#ifdef _DEBUG_
const char* myName; //!< identifier used for debug
#endif
public:
SMESH_subMeshEventListener(bool isDeletable, const char* name) :myIsDeletable(isDeletable)
#ifdef _DEBUG_
,myName(name)
#endif
{}
SMESH_subMeshEventListener(bool isDeletable, const char* name)
:myIsDeletable(isDeletable), myName(name) {}
virtual ~SMESH_subMeshEventListener() {}
bool IsDeletable() const { return myIsDeletable; }
const char* GetName() const { return myName; }
virtual void BeforeDelete(SMESH_subMesh* subMesh,
SMESH_subMeshEventListenerData* data)
{}
/*!
* \brief Do something on a certain event
* \param event - algo_event or compute_event itself (of SMESH_subMesh)

View File

@ -57,6 +57,7 @@ libSMESHClient_la_CPPFLAGS = \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHDS \
-I$(srcdir)/../SMESH \
-I$(srcdir)/../SMESHUtils \
-I$(top_builddir)/idl
libSMESHClient_la_LDFLAGS = \

View File

@ -38,6 +38,7 @@ class SMESHDS_EXPORT SMESHDS_Document
{
public:
SMESHDS_Document(int UserID);
~SMESHDS_Document();
int NewMesh(bool theIsEmbeddedMode);
void RemoveMesh(int MeshID);
SMESHDS_Mesh * GetMesh(int MeshID);
@ -52,7 +53,6 @@ class SMESHDS_EXPORT SMESHDS_Document
void InitHypothesisIterator();
SMESHDS_Hypothesis * NextHypothesis();
bool MoreHypothesis();
~SMESHDS_Document();
private:
int myUserID;

View File

@ -24,7 +24,6 @@
// File : SMESHDS_Hypothesis.hxx
// Author : Paul RASCLE, EDF
// Module : SMESH
// $Header$
//
#ifndef _SMESHDS_HYPOTHESIS_HXX_
#define _SMESHDS_HYPOTHESIS_HXX_
@ -36,7 +35,7 @@
class SMESHDS_EXPORT SMESHDS_Hypothesis
{
public:
public:
SMESHDS_Hypothesis(int hypId);
virtual ~SMESHDS_Hypothesis();
@ -50,12 +49,12 @@ public:
virtual bool operator==(const SMESHDS_Hypothesis& other) const;
bool operator!=(const SMESHDS_Hypothesis& other) const { return !(*this==other); }
enum hypothesis_type {PARAM_ALGO, ALGO_0D, ALGO_1D, ALGO_2D, ALGO_3D};
enum hypothesis_type { PARAM_ALGO, ALGO_0D, ALGO_1D, ALGO_2D, ALGO_3D };
protected:
std::string _name;
int _hypId;
int _type;
protected:
std::string _name; // identifier if hypothesis type
int _hypId; // ID unique within application session
int _type; // enum hypothesis_type
};
#endif

View File

@ -49,7 +49,6 @@ salomeinclude_HEADERS = \
SMESHGUI_RemoveElementsDlg.h \
SMESHGUI_MeshInfo.h \
SMESHGUI_Measurements.h \
SMESHGUI_Preferences_ColorDlg.h \
SMESHGUI_Preferences_ScalarBarDlg.h \
SMESHGUI_AddMeshElementDlg.h \
SMESHGUI_XmlHandler.h \
@ -97,6 +96,7 @@ salomeinclude_HEADERS = \
SMESHGUI_CopyMeshDlg.h \
SMESHGUI_PreviewDlg.h \
SMESHGUI_ReorientFacesDlg.h \
SMESHGUI_PropertiesDlg.h \
SMESH_SMESHGUI.hxx
# Libraries targets
@ -115,7 +115,6 @@ dist_libSMESH_la_SOURCES = \
SMESHGUI_RemoveElementsDlg.cxx \
SMESHGUI_MeshInfo.cxx \
SMESHGUI_Measurements.cxx \
SMESHGUI_Preferences_ColorDlg.cxx \
SMESHGUI_Preferences_ScalarBarDlg.cxx \
SMESHGUI_AddMeshElementDlg.cxx \
SMESHGUI_XmlHandler.cxx \
@ -173,7 +172,8 @@ dist_libSMESH_la_SOURCES = \
SMESHGUI_CopyMeshDlg.cxx \
SMESHGUI_FileValidator.cxx \
SMESHGUI_PreviewDlg.cxx \
SMESHGUI_ReorientFacesDlg.cxx
SMESHGUI_ReorientFacesDlg.cxx \
SMESHGUI_PropertiesDlg.cxx
MOC_FILES = \
SMESHGUI_moc.cxx \
@ -189,7 +189,6 @@ MOC_FILES = \
SMESHGUI_RemoveElementsDlg_moc.cxx \
SMESHGUI_MeshInfo_moc.cxx \
SMESHGUI_Measurements_moc.cxx \
SMESHGUI_Preferences_ColorDlg_moc.cxx \
SMESHGUI_Preferences_ScalarBarDlg_moc.cxx \
SMESHGUI_AddMeshElementDlg_moc.cxx \
SMESHGUI_FilterDlg_moc.cxx \
@ -233,7 +232,8 @@ MOC_FILES = \
SMESHGUI_CopyMeshDlg_moc.cxx \
SMESHGUI_MeshOrderOp_moc.cxx \
SMESHGUI_PreviewDlg_moc.cxx \
SMESHGUI_ReorientFacesDlg_moc.cxx
SMESHGUI_ReorientFacesDlg_moc.cxx \
SMESHGUI_PropertiesDlg_moc.cxx
nodist_libSMESH_la_SOURCES= \
$(MOC_FILES)

View File

@ -59,8 +59,8 @@
#include "SMESHGUI_MeshPatternDlg.h"
#include "SMESHGUI_MultiEditDlg.h"
#include "SMESHGUI_NodesDlg.h"
#include "SMESHGUI_Preferences_ColorDlg.h"
#include "SMESHGUI_Preferences_ScalarBarDlg.h"
#include "SMESHGUI_PropertiesDlg.h"
#include "SMESHGUI_RemoveElementsDlg.h"
#include "SMESHGUI_RemoveNodesDlg.h"
#include "SMESHGUI_RenumberingDlg.h"
@ -212,6 +212,10 @@
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() )
@ -294,6 +298,22 @@
}
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 ) {
@ -368,6 +388,7 @@
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 ||
@ -419,7 +440,7 @@
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++ ) {
@ -495,6 +516,21 @@
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();
@ -547,12 +583,16 @@
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,
@ -801,6 +841,10 @@
toOverwrite && aMeshIndex == 0 );
}
}
else if ( isGMF )
{
aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data() );
}
}
catch (const SALOME::SALOME_Exception& S_ex){
wc.suspend();
@ -895,6 +939,8 @@
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:
@ -905,9 +951,11 @@
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 );
}
@ -1158,250 +1206,224 @@
(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);
if ( !IObject->hasEntry() ) continue;
SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
if ( !anActor || !anActor->GetObject() ) continue;
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);
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();
}
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);
firstTime = false; // we only take properties from first object (for performance reasons)
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);
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;
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
// 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 );
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(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();
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.;
/* Point marker */
theMarkerMap[ aStudy->StudyId() ] = aDlg->getCustomMarkerMap();
// 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.);
if ( !IObject->hasEntry() ) continue;
SMESH_Actor* anActor = SMESH::FindActorByEntry( IObject->getEntry() );
if ( !anActor ) continue;
/* 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 );
// 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() )
{
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;
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 = (float)aColor.red() / 255.0;
aGroupColor.G = (float)aColor.green() / 255.0;
aGroupColor.B = (float)aColor.blue() / 255.0;
aGroupColor.R = aColor.redF();
aGroupColor.G = aColor.greenF();
aGroupColor.B = aColor.blueF();
aGroupObject->SetColor( aGroupColor );
}
}
}
}
} // if ( !aGroupObject->_is_nil() )
} // for ( ; It.More(); It.Next() )
SMESH::RepaintCurrentView();
}
delete aDlg;
} // if ( dlg.exec() )
return;
}
}
} // case 1132:
} // switch(theCommandID)
SALOME_ListIteratorOfListIO It( selected );
for( ; It.More(); It.Next()){
Handle(SALOME_InteractiveObject) IObject = It.Value();
@ -2160,6 +2182,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
case 116:
case 115:
case 117:
case 118:
case 113:
case 112:
case 111: // IMPORT
@ -2200,6 +2223,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
case 143:
case 144:
case 145:
case 146:
case 147:
{
::ExportMeshToFile(theCommandID);
break;
@ -3509,25 +3534,28 @@ void SMESHGUI::initialize( CAM_Application* app )
// ----- create actions --------------
createSMESHAction( 111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
//createSMESHAction( 111, "IMPORT_DAT", "", (Qt::CTRL+Qt::Key_B) );
createSMESHAction( 112, "IMPORT_UNV", "", (Qt::CTRL+Qt::Key_U) );
createSMESHAction( 113, "IMPORT_MED", "", (Qt::CTRL+Qt::Key_M) );
createSMESHAction( 114, "NUM" );
createSMESHAction( 115, "IMPORT_STL" );
createSMESHAction( 116, "IMPORT_CGNS" );
createSMESHAction( 117, "IMPORT_SAUV" );
createSMESHAction( 118, "IMPORT_GMF" );
createSMESHAction( 121, "DAT" );
createSMESHAction( 122, "MED" );
createSMESHAction( 123, "UNV" );
createSMESHAction( 140, "STL" );
createSMESHAction( 142, "CGNS" );
createSMESHAction( 144, "SAUV" );
createSMESHAction( 142, "CGNS");
createSMESHAction( 144, "SAUV");
createSMESHAction( 146, "GMF" );
createSMESHAction( 124, "EXPORT_DAT" );
createSMESHAction( 125, "EXPORT_MED" );
createSMESHAction( 126, "EXPORT_UNV" );
createSMESHAction( 141, "EXPORT_STL" );
createSMESHAction( 143, "EXPORT_CGNS" );
createSMESHAction( 145, "EXPORT_SAUV" );
createSMESHAction( 143, "EXPORT_CGNS");
createSMESHAction( 145, "EXPORT_SAUV");
createSMESHAction( 147, "EXPORT_GMF" );
createSMESHAction( 150, "FILE_INFO" );
createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete );
createSMESHAction( 5105, "SEL_FILTER_LIB" );
@ -3699,7 +3727,7 @@ void SMESHGUI::initialize( CAM_Application* app )
renumId = createMenu( tr( "MEN_RENUM" ), modifyId, 404 ),
transfId = createMenu( tr( "MEN_TRANSF" ), modifyId, 405 );
createMenu( 111, importId, -1 );
//createMenu( 111, importId, -1 );
createMenu( 112, importId, -1 );
createMenu( 113, importId, -1 );
createMenu( 115, importId, -1 );
@ -3707,6 +3735,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 116, importId, -1 );
#endif
createMenu( 117, importId, -1 );
createMenu( 118, importId, -1 );
createMenu( 121, exportId, -1 );
createMenu( 122, exportId, -1 );
createMenu( 123, exportId, -1 );
@ -3715,6 +3744,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 142, exportId, -1 ); // export to CGNS
#endif
createMenu( 144, exportId, -1 ); // export to SAUV
createMenu( 146, exportId, -1 ); // export to GMF
createMenu( separator(), fileId, 10 );
createMenu( 33, editId, -1 );
@ -4042,6 +4072,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createPopupItem( 143, OB, mesh_group, multiple_non_empty ); // EXPORT_CGNS
#endif
createPopupItem( 145, OB, mesh_group, multiple_non_empty ); // EXPORT_SAUV
createPopupItem( 147, OB, mesh_group, multiple_non_empty ); // EXPORT_GMF
createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE
createPopupItem( 813, OB, group ); // DEL_GROUP with contents
popupMgr()->insert( separator(), -1, 0 );
@ -4407,7 +4438,7 @@ bool SMESHGUI::activateModule( SUIT_Study* study )
// end of GEOM plugins loading
// Reset actions accelerator keys
action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
//action(111)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_B)); // Import DAT
action(112)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_U)); // Import UNV
action(113)->setShortcut(QKeySequence(Qt::CTRL + Qt::Key_M)); // Import MED
@ -4442,7 +4473,7 @@ bool SMESHGUI::deactivateModule( SUIT_Study* study )
EmitSignalCloseAllDialogs();
// Unset actions accelerator keys
action(111)->setShortcut(QKeySequence()); // Import DAT
//action(111)->setShortcut(QKeySequence()); // Import DAT
action(112)->setShortcut(QKeySequence()); // Import UNV
action(113)->setShortcut(QKeySequence()); // Import MED
@ -4761,20 +4792,23 @@ void SMESHGUI::createPreferences()
setPreferenceProperty( markerScale, "indexes", aMarkerScaleIndicesList );
int elemGroup = addPreference( tr( "PREF_GROUP_ELEMENTS" ), meshTab );
setPreferenceProperty( elemGroup, "columns", 2 );
//setPreferenceProperty( elemGroup, "columns", 2 );
int ColorId = addPreference( tr( "PREF_FILL" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "fill_color" );
setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
ColorId = addPreference( tr( "PREF_VOLUME" ), elemGroup, LightApp_Preferences::BiColor, "SMESH", "volume_color" );
setPreferenceProperty( ColorId, "text", tr("PREF_REVERSEDVOLUME") );
addPreference( tr( "PREF_COLOR_0D" ), elemGroup, LightApp_Preferences::Color, "SMESH", "elem0d_color" );
addPreference( tr( "PREF_BALL_COLOR" ), elemGroup, LightApp_Preferences::Color, "SMESH", "ball_elem_color" );
addPreference( tr( "PREF_OUTLINE" ), elemGroup, LightApp_Preferences::Color, "SMESH", "outline_color" );
addPreference( tr( "PREF_WIREFRAME" ), elemGroup, LightApp_Preferences::Color, "SMESH", "wireframe_color" );
setPreferenceProperty( ColorId, "text", tr("PREF_BACKFACE") );
int grpGroup = addPreference( tr( "PREF_GROUP_GROUPS" ), meshTab );
setPreferenceProperty( grpGroup, "columns", 2 );
addPreference( tr( "PREF_GRP_NAMES" ), grpGroup, LightApp_Preferences::Color, "SMESH", "group_name_color" );
addPreference( tr( "PREF_GRP_DEF_COLOR" ), grpGroup, LightApp_Preferences::Color, "SMESH", "default_grp_color" );
int size0d = addPreference(tr("PREF_SIZE_0D"), elemGroup,
LightApp_Preferences::IntSpin, "SMESH", "elem0d_size");
@ -4782,6 +4816,8 @@ void SMESHGUI::createPreferences()
LightApp_Preferences::IntSpin, "SMESH", "ball_elem_size");
int elemW = addPreference(tr("PREF_WIDTH"), elemGroup,
LightApp_Preferences::IntSpin, "SMESH", "element_width");
int outW = addPreference(tr("PREF_OUTLINE_WIDTH"), elemGroup,
LightApp_Preferences::IntSpin, "SMESH", "outline_width");
int shrink = addPreference(tr("PREF_SHRINK_COEFF"), elemGroup,
LightApp_Preferences::IntSpin, "SMESH", "shrink_coeff");
@ -4794,6 +4830,9 @@ void SMESHGUI::createPreferences()
setPreferenceProperty( elemW, "min", 1 );
setPreferenceProperty( elemW, "max", 5 );
setPreferenceProperty( outW, "min", 1 );
setPreferenceProperty( outW, "max", 5 );
setPreferenceProperty( shrink, "min", 0 );
setPreferenceProperty( shrink, "max", 100 );
@ -5169,9 +5208,9 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReser
aColor.setHsv( aHue, 255, 255 );
SALOMEDS::Color aSColor;
aSColor.R = (double)aColor.red() / 255.0;
aSColor.G = (double)aColor.green() / 255.0;
aSColor.B = (double)aColor.blue() / 255.0;
aSColor.R = aColor.redF();
aSColor.G = aColor.greenF();
aSColor.B = aColor.blueF();
return aSColor;
}

View File

@ -498,12 +498,12 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
int idx = 0;
if( addToGroup ) {
aGroupName = ComboBox_GroupName->currentText();
for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
QString aName = ComboBox_GroupName->itemText( i );
if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
idx = i;
}
if ( idx > 0 && idx < myGroups.count() ) {
if ( idx > 0 && idx <= myGroups.count() ) {
SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
if ( !aGeomGroup->_is_nil() ) {
int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),

View File

@ -711,12 +711,12 @@ void SMESHGUI_AddQuadraticElementDlg::ClickOnApply()
int idx = 0;
if( addToGroup ) {
aGroupName = ComboBox_GroupName->currentText();
for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
QString aName = ComboBox_GroupName->itemText( i );
if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
idx = i;
}
if ( idx > 0 && idx < myGroups.count() ) {
if ( idx > 0 && idx <= myGroups.count() ) {
SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
if ( !aGeomGroup->_is_nil() ) {
int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),

View File

@ -477,7 +477,7 @@ SMESHGUI_ClippingDlg::SMESHGUI_ClippingDlg( SMESHGUI* theModule, SVTK_ViewWindow
connect(SpinBoxRot1, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam()));
connect(SpinBoxRot2, SIGNAL(valueChanged(double)), this, SLOT(SetCurrentPlaneParam()));
connect(PreviewCheckBox, SIGNAL(toggled(bool)), this, SLOT(OnPreviewToggle(bool)));
connect(AutoApplyCheckBox, SIGNAL(toggled(bool)), this, SLOT(ClickOnApply()));
connect(AutoApplyCheckBox, SIGNAL(toggled(bool)), this, SLOT(onAutoApply(bool)));
connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
@ -1063,7 +1063,9 @@ void SMESHGUI_ClippingDlg::initializePlaneData()
SMESHGUI_ClippingPlaneInfoList::const_iterator anIter2 = aClippingPlaneInfoList.begin();
for( ; anIter2 != aClippingPlaneInfoList.end(); anIter2++ ) {
const SMESH::ClippingPlaneInfo& aClippingPlaneInfo = *anIter2;
SMESH::TPlane aTPlane( aClippingPlaneInfo.Plane );
SMESH::OrientedPlane* anOrientedPlane = SMESH::OrientedPlane::New(myViewWindow);
anOrientedPlane->ShallowCopy(aClippingPlaneInfo.Plane);
SMESH::TPlane aTPlane( anOrientedPlane );
SMESH::TPlaneData aPlaneData( aTPlane, aClippingPlaneInfo.ActorList );
myPlanes.push_back( aPlaneData );
}
@ -1170,3 +1172,8 @@ void SMESHGUI_ClippingDlg::dumpPlaneData() const
}
printf( "----------------------------------\n" );
}
void SMESHGUI_ClippingDlg::onAutoApply(bool toggled)
{
if ( toggled ) ClickOnApply();
}

View File

@ -201,6 +201,7 @@ public slots:
void onSelectOrientation( int );
void SetCurrentPlaneParam();
void OnPreviewToggle( bool );
void onAutoApply(bool);
void ClickOnOk();
void ClickOnCancel();
void ClickOnApply();

View File

@ -338,7 +338,7 @@ namespace SMESH
QString text;
switch ( errCode ) {
CASE2TEXT( COMPERR_OK );
CASE2TEXT( COMPERR_BAD_INPUT_MESH);
CASE2TEXT( COMPERR_BAD_INPUT_MESH );
CASE2TEXT( COMPERR_STD_EXCEPTION );
CASE2TEXT( COMPERR_OCC_EXCEPTION );
case SMESH::COMPERR_SLM_EXCEPTION: break; // avoid double "Salome exception"
@ -346,6 +346,7 @@ namespace SMESH
CASE2TEXT( COMPERR_MEMORY_PB );
CASE2TEXT( COMPERR_BAD_SHAPE );
CASE2TEXT( COMPERR_CANCELED );
CASE2TEXT( COMPERR_NO_MESH_ON_SHAPE );
case SMESH::COMPERR_ALGO_FAILED:
if ( strlen(comment) == 0 )
text = QObject::tr("COMPERR_ALGO_FAILED");
@ -550,6 +551,9 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
myTable->hideColumn( COL_SHAPEID );
myTable->hideColumn( COL_BAD_MESH );
myTable->horizontalHeader()->setResizeMode( COL_ERROR, QHeaderView::Interactive );
myTable->setWordWrap( true );
myTable->horizontalHeader()->setStretchLastSection( true );
myTable->setMinimumWidth( 500 );
QStringList headers;
headers << tr( "COL_ALGO_HEADER" );
@ -564,12 +568,12 @@ QFrame* SMESHGUI_ComputeDlg::createMainFrame (QWidget* theParent, bool ForEval)
QGridLayout* grpLayout = new QGridLayout(myCompErrorGroup);
grpLayout->setSpacing(SPACING);
grpLayout->setMargin(MARGIN);
grpLayout->addWidget( myWarningLabel, 0, 0 );
grpLayout->addWidget( myTable, 1, 0, 4, 1 );
grpLayout->addWidget( myShowBtn, 1, 1 );
grpLayout->addWidget( myWarningLabel, 0, 0, 1, 4 );
grpLayout->addWidget( myTable, 1, 0, 1, 4 );
grpLayout->addWidget( myShowBtn, 2, 0 );
grpLayout->addWidget( myPublishBtn, 2, 1 );
grpLayout->addWidget( myBadMeshBtn, 3, 1 );
grpLayout->setRowStretch( 4, 1 );
grpLayout->addWidget( myBadMeshBtn, 2, 2 );
grpLayout->setColumnStretch( 3, 1 );
// Hypothesis definition errors
@ -948,7 +952,8 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack,
{
bool onlyWarnings = !theNoCompError; // == valid mesh computed but there are errors reported
for ( int i = 0; i < theCompErrors->length() && onlyWarnings; ++i )
onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING );
onlyWarnings = ( theCompErrors[ i ].code == SMESH::COMPERR_WARNING ||
theCompErrors[ i ].code == SMESH::COMPERR_NO_MESH_ON_SHAPE );
// full or brief mesh info
SMESH::long_array_var aRes = myMesh->GetMeshInfo();
@ -1035,6 +1040,7 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack,
}
tbl->resizeColumnToContents( COL_ALGO );
tbl->resizeColumnToContents( COL_SHAPE );
tbl->setWordWrap( true );
if ( hasBadMesh )
aCompDlg->myBadMeshBtn->show();
@ -1142,13 +1148,13 @@ void SMESHGUI_BaseComputeOp::onShowBadMesh()
SMESH::MeshPreviewStruct_var aMeshData = gen->GetBadInputElements(myMesh,curSub);
vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3);
vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
// delete property !!!!!!!!!!
vtkProperty* prop = vtkProperty::New();
prop->SetLineWidth( aLineWidth * 3 );
prop->SetPointSize( aPointSize * 3 );
prop->SetColor( 250, 0, 250 );
myBadMeshDisplayer->GetActor()->SetProperty( prop );
myBadMeshDisplayer->SetData( aMeshData._retn() );
prop->Delete();
}
}
}
@ -2084,6 +2090,7 @@ void SMESHGUI_BaseComputeOp::showEvaluateResult(const SMESH::long_array& theRes,
}
tbl->resizeColumnToContents( COL_ALGO );
tbl->resizeColumnToContents( COL_SHAPE );
tbl->setWordWrap( true );
if ( hasBadMesh )
aCompDlg->myBadMeshBtn->show();

View File

@ -29,21 +29,26 @@
#include "SMESHGUI.h"
#include "SMESHGUI_ConvToQuadDlg.h"
#include "SMESHGUI_MeshEditPreview.h"
#include "SMESHGUI_Utils.h"
#include "SMDSAbs_ElementType.hxx"
#include "SMESH_ActorUtils.h"
#include "SMESH_TypeFilter.hxx"
#include "SMDSAbs_ElementType.hxx"
// SALOME GUI includes
#include <LightApp_UpdateFlags.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h>
#include <SalomeApp_Tools.h>
#include <SALOME_Actor.h>
// IDL includes
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
// VTK includes
#include <vtkProperty.h>
//================================================================================
/*!
* \brief Constructor
@ -53,7 +58,8 @@
//================================================================================
SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp()
: SMESHGUI_SelectionOp(),
myDlg( 0 )
myDlg( 0 ),
myBadElemsPreview(0)
{
}
@ -64,8 +70,8 @@ SMESHGUI_ConvToQuadOp::SMESHGUI_ConvToQuadOp()
//================================================================================
SMESHGUI_ConvToQuadOp::~SMESHGUI_ConvToQuadOp()
{
if ( myDlg )
delete myDlg;
if ( myDlg ) delete myDlg;
if ( myBadElemsPreview ) delete myBadElemsPreview;
}
//================================================================================
@ -237,14 +243,47 @@ bool SMESHGUI_ConvToQuadOp::onApply()
SMESH::SMESH_Mesh_var sourceMesh = SMESH::SObjectToInterface<SMESH::SMESH_Mesh>( pObj );
if( !myDlg->CurrentRB() )
{
bool aParam = true;
bool force3d = true;
if( myDlg->IsEnabledCheck() )
aParam = myDlg->IsMediumNdsOnGeom();
force3d = myDlg->IsMediumNdsOnGeom();
if ( sourceMesh->_is_nil() )
aEditor->ConvertToQuadraticObject( aParam, idSource );
aEditor->ConvertToQuadraticObject( force3d, idSource );
else
aEditor->ConvertToQuadratic( aParam );
aEditor->ConvertToQuadratic( force3d );
if ( !force3d )
{
SMESH::ComputeError_var error = aEditor->GetLastError();
if ( error->hasBadMesh )
{
if ( myBadElemsPreview ) delete myBadElemsPreview; // viewWindow may change
myBadElemsPreview = new SMESHGUI_MeshEditPreview( viewWindow() );
vtkFloatingPointType aPointSize = SMESH::GetFloat("SMESH:node_size",3);
vtkFloatingPointType aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
vtkProperty* prop = vtkProperty::New();
prop->SetLineWidth( aLineWidth * 3 );
prop->SetPointSize( aPointSize * 3 );
prop->SetColor( 250, 0, 250 );
myBadElemsPreview->GetActor()->SetProperty( prop );
prop->Delete();
SMESH::MeshPreviewStruct_var previewData = aEditor->GetPreviewData();
myBadElemsPreview->SetData( & previewData.in() );
myBadElemsPreview->SetVisibility(true);
SUIT_MessageBox* mb = new SUIT_MessageBox(SUIT_MessageBox::Warning,
tr( "SMESH_WRN_WARNING" ),
tr("EDITERR_NO_MEDIUM_ON_GEOM"),
SUIT_MessageBox::Ok, myDlg);
mb->setWindowModality( Qt::NonModal );
mb->setAttribute( Qt::WA_DeleteOnClose );
mb->show();
connect ( mb, SIGNAL( finished(int) ), this, SLOT( onWarningWinFinished() ));
//connect ( mb, SIGNAL( rejected() ), this, SLOT( onWarningWinFinished() ));
}
}
}
else
{
@ -272,6 +311,18 @@ bool SMESHGUI_ConvToQuadOp::onApply()
return aResult;
}
//================================================================================
/*!
* \brief SLOT called when a warning window is closed
*/
//================================================================================
void SMESHGUI_ConvToQuadOp::onWarningWinFinished()
{
if ( myBadElemsPreview )
myBadElemsPreview->SetVisibility(false);
}
//================================================================================
/*! ConsistMesh
* Determines, what elements this mesh contains.

View File

@ -37,6 +37,7 @@
#include CORBA_SERVER_HEADER(SMESH_Mesh)
class SMESHGUI_ConvToQuadDlg;
class SMESHGUI_MeshEditPreview;
class SMESHGUI_EXPORT SMESHGUI_ConvToQuadOp : public SMESHGUI_SelectionOp
{
@ -60,9 +61,11 @@ protected:
protected slots:
virtual bool onApply();
void ConnectRadioButtons( int );
void onWarningWinFinished();
private:
SMESHGUI_ConvToQuadDlg* myDlg;
SMESHGUI_MeshEditPreview* myBadElemsPreview;
};
#endif // SMESHGUI_CONVTOQUADOP_H

View File

@ -458,12 +458,12 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnApply()
int idx = 0;
if( addToGroup ) {
aGroupName = ComboBox_GroupName->currentText();
for ( int i = 1; i < ComboBox_GroupName->count(); i++ ) {
for ( int i = 1; i <= ComboBox_GroupName->count(); i++ ) {
QString aName = ComboBox_GroupName->itemText( i );
if ( aGroupName == aName && ( i == ComboBox_GroupName->currentIndex() || idx == 0 ) )
idx = i;
}
if ( idx > 0 && idx < myGroups.count() ) {
if ( idx > 0 && idx <= myGroups.count() ) {
SMESH::SMESH_GroupOnGeom_var aGeomGroup = SMESH::SMESH_GroupOnGeom::_narrow( myGroups[idx-1] );
if ( !aGeomGroup->_is_nil() ) {
int res = SUIT_MessageBox::question( this, tr( "SMESH_WRN_WARNING" ),

View File

@ -280,15 +280,22 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
mySMESHGUI->SetActiveDialogBox(this);
// Costruction of the logical filter for the elements: mesh/sub-mesh/group
SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP);
QList<SUIT_SelectionFilter*> aListOfFilters;
if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter);
myMeshOrSubMeshOrGroupFilter =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
aListOfFilters.append(new SMESH_TypeFilter (MESH));
aListOfFilters.append(new SMESH_TypeFilter (SUBMESH_VERTEX));
aListOfFilters.append(new SMESH_TypeFilter (GROUP_NODE));
myMeshOrSubMeshOrGroupFilter0D =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
aListOfFilters[0] = new SMESH_TypeFilter (MESH);
aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_EDGE);
aListOfFilters[2] = new SMESH_TypeFilter (GROUP_EDGE);
myMeshOrSubMeshOrGroupFilter1D =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
aListOfFilters[0] = new SMESH_TypeFilter (MESH);
aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_FACE);
aListOfFilters[2] = new SMESH_TypeFilter (GROUP_FACE);
myMeshOrSubMeshOrGroupFilter2D =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
myHelpFileName = "extrusion_page.html";
@ -351,6 +358,9 @@ SMESHGUI_ExtrusionDlg::~SMESHGUI_ExtrusionDlg()
myFilterDlg->setParent( 0 );
delete myFilterDlg;
}
if ( myMeshOrSubMeshOrGroupFilter0D ) delete myMeshOrSubMeshOrGroupFilter0D;
if ( myMeshOrSubMeshOrGroupFilter1D ) delete myMeshOrSubMeshOrGroupFilter1D;
if ( myMeshOrSubMeshOrGroupFilter2D ) delete myMeshOrSubMeshOrGroupFilter2D;
}
//=================================================================================
@ -898,11 +908,18 @@ void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument()
if (send == SelectElementsButton) {
myEditCurrentArgument = (QWidget*)LineEditElements;
if (CheckBoxMesh->isChecked()) {
if (CheckBoxMesh->isChecked())
{
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
} else {
switch( GetConstructorId() ) {
case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
}
}
else
{
int aConstructorId = GetConstructorId();
switch(aConstructorId) {
case 0:
@ -1028,13 +1045,20 @@ void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh)
mySelectionMgr->clearFilters();
if (toSelectMesh) {
if (toSelectMesh)
{
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter);
switch( GetConstructorId() ) {
case 0: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter0D); break;
case 1: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter1D); break;
case 2: mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter2D); break;
}
LineEditElements->setReadOnly(true);
LineEditElements->setValidator(0);
} else {
}
else
{
int aConstructorId = GetConstructorId();
switch(aConstructorId) {
case 0:

Some files were not shown because too many files have changed in this diff Show More