Merge from V6_main 13/12/2012

This commit is contained in:
vsr 2012-12-13 11:41:29 +00:00
parent e6fb82fec1
commit 1067ffa6e7
239 changed files with 10508 additions and 6958 deletions

View File

@ -574,6 +574,7 @@ AC_OUTPUT([ \
src/SMESH_PY/Makefile \ src/SMESH_PY/Makefile \
src/Tools/Makefile \ src/Tools/Makefile \
src/Tools/MeshCut/Makefile \ src/Tools/MeshCut/Makefile \
src/Tools/YamsPlug/Makefile \
src/Tools/padder/Makefile \ src/Tools/padder/Makefile \
src/Tools/padder/meshjob/Makefile \ src/Tools/padder/meshjob/Makefile \
src/Tools/padder/meshjob/idl/Makefile \ src/Tools/padder/meshjob/idl/Makefile \
@ -587,8 +588,7 @@ AC_OUTPUT([ \
src/Tools/padder/resources/appligen/Makefile \ src/Tools/padder/resources/appligen/Makefile \
src/Tools/padder/resources/appligen/appligen.sh \ src/Tools/padder/resources/appligen/appligen.sh \
src/Tools/padder/resources/appligen/config_appli.xml \ src/Tools/padder/resources/appligen/config_appli.xml \
src/Tools/padder/resources/padderexe/Makefile \ src/Tools/padder/resources/testdata/Makefile \
src/Tools/padder/resources/padderexe/envPadder.sh \
src/Tools/padder/unittests/Makefile \ src/Tools/padder/unittests/Makefile \
src/Tools/padder/unittests/autotest.sh \ src/Tools/padder/unittests/autotest.sh \
src/Tools/padder/doc/Makefile \ src/Tools/padder/doc/Makefile \

View File

@ -0,0 +1,78 @@
# Copyright (C) 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(${KERNEL_ROOT_DIR}/salome_adm/cmake_files/SalomeMacros.cmake)
SET(top_builddir ${CMAKE_BINARY_DIR})
SET(top_srcdir ${CMAKE_SOURCE_DIR})
SET(srcdir ${CMAKE_CURRENT_SOURCE_DIR})
SET(builddir ${CMAKE_CURRENT_BINARY_DIR})
SET(datadir ${CMAKE_INSTALL_PREFIX}/share)
SET(docdir ${datadir}/doc/salome)
SET(guidocdir ${docdir}/gui/SMESH)
SALOME_CONFIGURE_FILE(doxyfile.in doxyfile)
SALOME_CONFIGURE_FILE(doxyfile_py.in doxyfile_py)
SALOME_CONFIGURE_FILE(static/header.html.in ${builddir}/static/header.html)
SALOME_CONFIGURE_FILE(static/header_py.html.in ${builddir}/static/header_py.html)
SALOME_INSTALL_SCRIPTS(collect_mesh_methods.py bin/salome)
SET(DOC_SMESH_MeshersList StdMeshers)
SET(f1 "${srcdir}/collect_mesh_methods.py")
SET(f "$ENV{KERNEL_ROOT_DIR}/bin/salome/prepare_generating_doc.py")
IF(WINDOWS)
STRING(REPLACE "/" "\\" f ${f})
STRING(REPLACE "/" "\\" f1 ${f1})
STRING(REPLACE "/" "\\" SCR "@SET PYTHONPATH=${OMNIORB_ROOT_USER}/lib/x86_win32\;%PYTHONPATH%
@SET PYTHONPATH=${OMNIORB_ROOT_USER}/lib/python\;%PYTHONPATH%
@SET PATH=${OMNIORB_ROOT_USER}/lib/x86_win32\;%PATH%
@SET PATH=$ENV{KERNEL_ROOT_DIR}/lib/salome\;%PATH%
@SET PYTHONPATH=$ENV{KERNEL_ROOT_DIR}/bin/salome\;%PYTHONPATH%
@SET PYTHONPATH=$ENV{KERNEL_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
@SET PYTHONPATH=$ENV{MED_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
@SET PYTHONPATH=$ENV{MED_ROOT_DIR}/bin/salome\;%PYTHONPATH%
@SET PYTHONPATH=$ENV{GEOM_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
@SET PYTHONPATH=$ENV{GEOM_ROOT_DIR}/bin/salome\;%PYTHONPATH%
@SET PYTHONPATH=${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH%
@SET PYTHONPATH=${CMAKE_INSTALL_PREFIX}/bin/salome\;%PYTHONPATH%
@SET SMESH_MeshersList=${DOC_SMESH_MeshersList}
")
SET(EXT "bat")
SET(CALL_STR "call")
ELSE(WINDOWS)
SET(DOC_PYTHONPATH "${CMAKE_INSTALL_PREFIX}/bin/salome:${CMAKE_INSTALL_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_USER}/lib/python${PYTHON_VERSION}/site-packages:${OMNIORB_ROOT_USER}/lib64/python${PYTHON_VERSION}/site-packages")
SET(SCR "export PYTHONPATH=${DOC_PYTHONPATH}:${PYTHONPATH}
export SMESH_MeshersList=${DOC_SMESH_MeshersList}
")
SET(EXT "sh")
SET(CALL_STR ".")
ENDIF(WINDOWS)
FILE(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp_env.${EXT} "${SCR}")
ADD_CUSTOM_TARGET(usr_docs ${PYTHON_EXECUTABLE} ${f} smesh.py ${CMAKE_SOURCE_DIR}/src/SMESH_SWIG/smeshDC.py smesh
COMMAND mkdir tmp && ${CALL_STR} ${CMAKE_CURRENT_BINARY_DIR}/tmp_env.${EXT} && ${PYTHON_EXECUTABLE} ${f1} -o tmp/smesh.py StdMeshers
COMMAND ${DOXYGEN_EXECUTABLE} doxyfile_py
COMMAND ${DOXYGEN_EXECUTABLE} doxyfile
COMMAND ${PYTHON_EXECUTABLE} -c "import os, shutil; os.remove(r'''smesh.py'''); shutil.rmtree(r'''tmp''')"
COMMAND ${PYTHON_EXECUTABLE} -c "import shutil, sys; shutil.rmtree(r'''${CMAKE_INSTALL_PREFIX}/share/doc/salome/gui/SMESH''', True); shutil.copytree(r'''${CMAKE_CURRENT_BINARY_DIR}''', r'''${CMAKE_INSTALL_PREFIX}/share/doc/salome/gui/SMESH''', ignore=shutil.ignore_patterns('tmp_env.*', '*usr_docs*', '*CMakeFiles*', '*.cmake', 'doxyfile*', '*.vcproj', 'static', 'Makefile*')); shutil.copy(r'''${CMAKE_CURRENT_SOURCE_DIR}/images/head.png''', r'''${CMAKE_INSTALL_PREFIX}/share/doc/salome/gui/SMESH''')"
VERBATIM
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -18,11 +18,11 @@ different meshing parameters than the whole mesh.
Several created meshes can be \subpage building_compounds_page "combined into another mesh". Several created meshes can be \subpage building_compounds_page "combined into another mesh".
The whole mesh or it's part can be \subpage copy_mesh_page "copied" into another mesh. The whole mesh or its part can be \subpage copy_mesh_page "copied" into another mesh.
Meshing parameters of meshes and sub-meshes can be Meshing parameters of meshes and sub-meshes can be
\subpage editing_meshes_page "edited", then only a path of mesh \subpage editing_meshes_page "edited", then only the mesh part
depending on changed parameters will be re-computed. depending on the changed parameters will be re-computed.
Meshes can be edited using the MESH functions destined for Meshes can be edited using the MESH functions destined for
\ref modifying_meshes_page "modification" of generated meshes. \ref modifying_meshes_page "modification" of generated meshes.

View File

@ -7,6 +7,7 @@
<ul> <ul>
<li>\ref adding_nodes_anchor "Nodes"</li> <li>\ref adding_nodes_anchor "Nodes"</li>
<li>\ref adding_0delems_anchor "0D Elements"</li> <li>\ref adding_0delems_anchor "0D Elements"</li>
<li>\ref adding_0delems_on_all_nodes_anchor "0D elements on Element Nodes"</li>
<li>\ref adding_balls_anchor "Ball Elements"</li> <li>\ref adding_balls_anchor "Ball Elements"</li>
<li>\ref adding_edges_anchor "Edges"</li> <li>\ref adding_edges_anchor "Edges"</li>
<li>\ref adding_triangles_anchor "Triangles"</li> <li>\ref adding_triangles_anchor "Triangles"</li>
@ -23,19 +24,19 @@
<li>Select your mesh in the Object Browser or in the 3D viewer.</li> <li>Select your mesh in the Object Browser or in the 3D viewer.</li>
<li>From the \b Modification menu choose the \b Add item, the <li>From the \b Modification menu choose the \b Add item, the
following associated submenu will appear:</li> following associated sub-menu will appear:</li>
\image html image146.png \image html image146.png
From this submenu select the type of element which you would like to add to your mesh. From this sub-menu select the type of element which you would like to add to your mesh.
\note All dialogs for new node or element adding to the mesh (except for \note All dialogs for new node or element adding to the mesh provide
the dialog for 0D elements) provide the possibility to automatically add the possibility to automatically add
a node or element to the specified group or to create the anew using a node or element to the specified group or to create it anew using
<b>Add to group</b> box, that allows choosing an existing group for <b>Add to group</b> box, that allows choosing an existing group for
the created node or element or giving the name to a new group. By the created node or element or giving the name to a new group. By
default, the <b>Add to group</b> check box is switched off. If the user default, the <b>Add to group</b> check box is switched off. If the user
swiches this check box on, the combo box listing all currently switches this check box on, the combo box listing all currently
existing groups of the corresponding type becomes available. By existing groups of the corresponding type becomes available. By
default, no group is selected. In this case, when the user presses default, no group is selected. In this case, when the user presses
<b>Apply</b> or <b>Apply & Close</b> button, the warning message box <b>Apply</b> or <b>Apply & Close</b> button, the warning message box
@ -71,21 +72,50 @@ created:
\image html add0delement.png \image html add0delement.png
In this dialog box specify the node which will form your 0d element by In this dialog box specify nodes which will form your 0D elements by
selecting it in the 3D viewer and click the \b Apply or selecting them in the 3D viewer and click the \b Apply or
<b>Apply and Close</b> button. Your 0D element will be created: <b>Apply and Close</b> button. Your 0D elements will be created:
\image html add_0delement.png \image html add_0delement.png
\anchor adding_0delems_on_all_nodes_anchor
<h2>Making 0D elements on Element Nodes</h2>
There is another way to create 0D elements. It is possible to create
0D elements on all nodes of the selected mesh, sub-mesh, or a group of elements or nodes.
\image html dlg_0D_on_all_nodes.png
In this dialog
<ul>
<li> The radio-buttons allow choosing the type of object to create 0D elements on.
<ul>
<li><b> Mesh, sub-mesh, group </b> - this button allows selecting
a mesh, a sub-mesh or a group to create 0D elements on the nodes of its
elements. The name of the selected object is shown in the dialog. </li>
<li><b> Elements </b> - this button allows selecting elements in the
VTK viewer or typing their IDs in the dialog.</li>
<li><b> Nodes </b> - this button allows selecting nodes to create
0D elements on in the VTK viewer or typing their IDs in the dialog.</li>
</ul></li>
<li><b> Set Filter </b> button allows selecting elements or nodes
by filtering mesh elements or nodes with different criteria
(see \ref filtering_elements "Filter usage").</li>
<li> Switching on <b>Add to group</b> check-box allows specifying the
name of the group to which all created or found 0D elements will be added. You can either select an existing group from
a drop-down list, or enter the name of the group to be created.</li>
</ul>
\anchor adding_balls_anchor \anchor adding_balls_anchor
<h2>Adding ball elements</h2> <h2>Adding ball elements</h2>
\image html addball.png \image html addball.png
In this dialog box specify the node which will form your ball element In this dialog box specify the nodes, which will form your ball elements,
either by selecting it in the 3D viewer or by manual entering its ID, either by selecting them in the 3D viewer or by manually entering their IDs,
specify a ball diameter and click the \b Apply or <b>Apply and specify the ball diameter and click the \b Apply or <b>Apply and
Close</b> button. Your ball element will be created: Close</b> button.
\image html add_ball.png \image html add_ball.png

View File

@ -20,8 +20,8 @@ adjacent elements).
<h2>Quadratic Mesh</h2> <h2>Quadratic Mesh</h2>
Quadratic Mesh hypothesis allows to build a quadratic mesh (whose Quadratic Mesh hypothesis allows to build a quadratic mesh (whose
edges are not straight but broken lines and can be defined by three edges are not straight but curved lines and can be defined by three
points: first, middle and last) instead of an ordinary one. points: first, middle and last instead of an ordinary two).
\anchor propagation_anchor \anchor propagation_anchor
<h2>Propagation of 1D Hypothesis on opposite edges</h2> <h2>Propagation of 1D Hypothesis on opposite edges</h2>
@ -47,27 +47,34 @@ hypothesis, this hypothesis has one restriction on its work: the total quantity
segments on all four sides of the face must be even (divisible by 2). segments on all four sides of the face must be even (divisible by 2).
\anchor viscous_layers_anchor \anchor viscous_layers_anchor
<h2>Viscous Layers</h2> <h2>Viscous Layers and Viscous Layers 2D</h2>
<b>Viscous Layers</b> additional hypothesis can be used together with
some 3D algorithms, Hexahedron(i,j,k) for example. This
hypothesis allows creation of layers of highly stretched prisms near
mesh boundary, which is beneficial for high quality viscous
computations. The prisms constructed on the quadrangular mesh faces are
actually the hexahedrons.
<b>Viscous Layers</b> and <b>Viscous Layers 2D </b> additional
hypotheses can be used together with some 3D algorithms, for example,
Hexahedron(i,j,k) or 2D algorithms, for example, Triangle
(MEFISTO), correspondingly. These hypotheses allow creation of layers
of highly stretched elements, prisms in 3D and quadrilaterals in 2D,
near mesh boundary, which is beneficial for high quality viscous
computations.
\image html viscous_layers_hyp.png \image html viscous_layers_hyp.png
<ul> <ul>
<li><b>Name</b> - allows to define the name of the hypothesis.</li> <li><b>Name</b> - allows to define the name of the hypothesis.</li>
<li><b>Total thicknes</b> - gives the total thickness of prism layers.</li> <li><b>Total thickness</b> - gives the total thickness of element layers.</li>
<li><b>Number of layers</b> - defines the number of prism layers.</li> <li><b>Number of layers</b> - defines the number of element layers.</li>
<li><b>Stretch factor</b> - defines the growth factor of prism height <li><b>Stretch factor</b> - defines the growth factor of element height
from the mesh boundary inwards.</li> from the mesh boundary inwards.</li>
<li><b>Faces without layers</b> - defines geometrical faces on which <li><b>Faces (Edges) without layers</b> - defines geometrical faces
prism layers should not be constructed. By default the prism layers (or edges in 2D) on which element layers should not be
are not constructed on geometrical faces shared by solids.</li> constructed. By default the element layers are not constructed on
geometrical faces shared by solids (and edges shared by faces in 2D).
\note A mesh shown in the 3D Viewer can prevent selection of faces
and edges, in this case just hide the mesh. To avoid a long wait when a
geometry with many faces (or edges) is displayed, the number of faces
(edges) shown at a time is limited by the value of "Sub-shapes
preview chunk size" preference (in Preferences/Mesh/General tab).
</li>
</ul> </ul>
\image html viscous_layers_mesh.png A group containing viscous layer prisms. \image html viscous_layers_mesh.png A group containing viscous layer prisms.

View File

@ -64,7 +64,7 @@ There is also a number of more specific algorithms:
</ul> </ul>
\ref use_existing_anchor "Use existing edges" and \ref use_existing_anchor "Use existing edges" and
\ref use_existing_anchor "Use existing faces" algorithms can be \ref use_existing_anchor "Use existing faces" algorithms can be
used to create an 1D or a 2D mesh in a python script. used to create a 1D or a 2D mesh in a python script.
\ref constructing_meshes_page "Constructing meshes" page describes in \ref constructing_meshes_page "Constructing meshes" page describes in
detail how to apply meshing algorithms. detail how to apply meshing algorithms.

View File

@ -14,7 +14,7 @@ shown.
- \b Nodes: - \b Nodes:
- \b Color - color of nodes. - \b Color - color of nodes.
- \b Type and \b Scale - these options allow changing of the nodes - \b Type and \b Scale - these options allow changing the nodes
representation (see \subpage point_marker_page "Point Marker" page representation (see \subpage point_marker_page "Point Marker" page
for more details). for more details).
- <b>Edges / wireframe</b>: - <b>Edges / wireframe</b>:
@ -23,13 +23,13 @@ shown.
in wireframe mode). in wireframe mode).
- \b Faces: - \b Faces:
- \b Front - surface color of face elements (seen in shading mode). - \b Front - surface color of face elements (seen in shading mode).
- \b Back - backside surface color of face elements. Use slider to - \b Back - backside surface color of face elements. Use the slider to
select this color generated on base of the \b Face color by select this color generated on the base of the \b Face color by
changing its brightness and saturation. changing its brightness and saturation.
- \b Volumes: - \b Volumes:
- \b Normal - surface color of normal volume elements (seen in shading mode). - \b Normal - surface color of normal volume elements (seen in shading mode).
- \b Reversed - surface color of volume elements. Use slider to - \b Reversed - surface color of volume elements. Use the slider to
select this color generated on base of the \b Normal color by select this color generated on the base of the \b Normal color by
changing its brightness and saturation. changing its brightness and saturation.
- \b Outlines: - \b Outlines:
- \b Color - color of element borders in shading mode. - \b Color - color of element borders in shading mode.

View File

@ -37,42 +37,42 @@ written in Python.
"Create mesh" dialog box contains several tab pages titled \b 3D, "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 \b 2D, \b 1D and \b 0D. The title of each page reflects the
dimension of the CAD model (geometry) the algorithms listed on dimension of the CAD model (geometry) the algorithms listed on
this page affect to. For example, \b 3D page lists algorithms this page affect. For example, \b 3D page lists the algorithms
that affect 3D geometrical objects (solids). that affect 3D geometrical objects (solids).
\note \note
- Some page(s) can be disabled - if the source geometrical - Some page(s) can be disabled if the source geometrical
object does not include shapes (sub-shapes) of the corresponding object does not include shapes (sub-shapes) of the corresponding
dimension(s). For example, if input object is a geometrical face, dimension(s). For example, if the input object is a geometrical face,
\b 3D page is disabled. \b 3D page is disabled.
- Some algorithms affect on geometry of several dimensions, - Some algorithms affect the geometry of several dimensions,
i.e. "1D-2D" or "1D-2D-3D". If such algorithm is selected by the i.e. "1D-2D" or "1D-2D-3D". If such an algorithm is selected by the
user, dialog box pages related to the corresponding lower level user, the dialog box pages related to the corresponding lower level
dimensions are disabled. dimensions are disabled.
- \b 0D page does not refer to the 0D elements, but to 0D - \b 0D page does not refer to the 0D elements, but to 0D
geometry (vertices). Mesh module does not provide algorithms that geometry (vertices). Mesh module does not provide algorithms that
produce 0D elements. Currently \b 0D page provides only one produce 0D elements. Currently \b 0D page provides only one
algorithm "Segments around vertex" that allows specyfing required algorithm "Segments around vertex" that allows specyfying the required
size of mesh edges about some selected vertex(vertices). size of mesh edges about the selected vertex (or vertices).
For example, you need to mesh a 3D object. For example, you need to mesh a 3D object.
First, type the name for your mesh in the \b Name box, by default, First, type the name of your mesh in the \b Name box, by default,
it is "Mesh_1". Then select the geometrical object you wish to it is "Mesh_1". Then select the geometrical object you wish to
mesh in the Object Browser and click "Select" button near \b Geometry mesh in the Object Browser and click "Select" button near \b Geometry
field (if name of the object not yet appeared in \b Geometry field). field (if the name of the object has not yet appeared in \b Geometry field).
\image html image120.png \image html image120.png
<em>"Select" button</em> <em>"Select" button</em>
Now you can define 3D Algorithm and 3D Hypotheses, which will be Now you can define 3D Algorithm and 3D Hypotheses, which will be
applied to solids of your geometrical object. Click the <em>"Add applied to the solids of your geometrical object. Click the <em>"Add
Hypothesis"</em> button to add a hypothesis. Hypothesis"</em> button to add a hypothesis.
\image html image121.png \image html image121.png
<em>"Add Hypothesis" button</em> <em>"Add Hypothesis" button</em>
Click the <em>"Edit Hypothesis"</em> button to change values for the Click the <em>"Edit Hypothesis"</em> button to change the values for the
current hypothesis. current hypothesis.
\image html image122.png \image html image122.png
@ -86,14 +86,14 @@ written in Python.
will be used to mesh faces and edges of your geometry. (Note will be used to mesh faces and edges of your geometry. (Note
that any object has edges, even if their existence is not that any object has edges, even if their existence is not
apparent, for example, a sphere has 4 edges). Note that the apparent, for example, a sphere has 4 edges). Note that the
choice of hypotheses and of an algorithm of lower dimension depends on choice of hypotheses and lower dimension algorithms depends on
the algorithm. the higher dimension algorithm.
Some algorithms generate mesh of several dimensions while others, of Some algorithms generate mesh of several dimensions, while others
only one dimension. In the latter case there must be one Algorithm and zero or several produce mesh of only one dimension. In the latter case there must be one Algorithm and zero or several
Hypotheses for each dimension of your object, otherwise you will Hypotheses for each dimension of your object, otherwise you will
not get any mesh at all. Of course, if you wish to mesh a face, not get any mesh at all. Of course, if you wish to mesh a face,
which is a 2D object, you don't need to define 3D Algorithm and which is a 2D object, you do not need to define a 3D Algorithm and
Hypotheses. Hypotheses.
In the <b>Object Browser</b> the structure of the new mesh will be In the <b>Object Browser</b> the structure of the new mesh will be
@ -122,7 +122,7 @@ written in Python.
tags). tags).
\image html hypo_sets.png \image html hypo_sets.png
List of sets of hypotheses: <em>[custom]</em> List of sets of hypotheses. Tag <em>[custom]</em> is
automatically added to the sets defined by the user automatically added to the sets defined by the user
</li> </li>
</ol> </ol>
@ -164,7 +164,7 @@ Select <b>1D mesh</b> or <b>2D mesh</b> preview mode in the Preview dialog.
<b>Compute</b> button computes the whole mesh. <b>Compute</b> button computes the whole mesh.
When the Preview dialog is closed, the question about the storage of temporarily When the Preview dialog is closed, the question about the storage of temporarily
created mesh elements appers: created mesh elements appears:
\image html preview_tmp_data.png \image html preview_tmp_data.png
@ -185,7 +185,7 @@ Choose "Change submesh priority" from the Mesh menu or a pop-up
menu. The opened dialog shows a list of submeshes in the order of menu. The opened dialog shows a list of submeshes in the order of
their priority. their priority.
There is an example of submesh order modifications of the Mesh created on a Box There is an example of submesh order modifications taking a Mesh created on a Box
shape. The main Mesh object: shape. The main Mesh object:
<ul> <ul>
<li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=20</li> <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=20</li>
@ -195,22 +195,22 @@ shape. The main Mesh object:
The first submesh object <b>Submesh_1</b> created on <b>Face_1</b> is: The first submesh object <b>Submesh_1</b> created on <b>Face_1</b> is:
<ul> <ul>
<li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=4</li> <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=4</li>
<li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis<b>MaxElementArea</b>=1200</li> <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis <b>MaxElementArea</b>=1200</li>
</ul> </ul>
The second submesh object <b>Submesh_2</b> created on <b>Face_2</b> is: The second submesh object <b>Submesh_2</b> created on <b>Face_2</b> is:
<ul> <ul>
<li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=8</li> <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=8</li>
<li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis<b>MaxElementArea</b>=1200</li> <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis <b>MaxElementArea</b>=1200</li>
</ul> </ul>
And the last submesh object <b>Submesh_3</b> created on <b>Face_3</b> is: And the last submesh object <b>Submesh_3</b> created on <b>Face_3</b> is:
<ul> <ul>
<li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=12</li> <li><i>1D</i> <b>Wire discretisation</b> with <b>Number of Segments</b>=12</li>
<li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis<b>MaxElementArea</b>=1200</li> <li><i>2D</i> <b>Triangle (Mefisto)</b> with Hypothesis <b>MaxElementArea</b>=1200</li>
</ul> </ul>
The sub-meshes become concurrent if they share sub-shapes that can be The sub-meshes become concurrent if they share sub-shapes that can be
meshed with different algorithms (or different hypothesises). In the meshed with different algorithms (or different hypotheses). In the
example, we have three submeshes with concurrent algorithms, because example, we have three submeshes with concurrent algorithms, because
they have different hypotheses. they have different hypotheses.
@ -289,21 +289,21 @@ visualizing in magenta the geometrical entity that causes it.
"Mesh computation/Show a computation result notification" preference "Mesh computation/Show a computation result notification" preference
to the "Never" value. This option gives the possibility to control mesh to the "Never" value. This option gives the possibility to control mesh
computation reporting. There are the following possibilities: always computation reporting. There are the following possibilities: always
show information box, only if an error occurs or never. show the information box, show only if an error occurs or never.
By default, the information box is always shown after mesh computation operation. By default, the information box is always shown after mesh computation operation.
<b>Publish Sub-shape</b> button publishes the sub-shape, whose meshing <b>Publish Sub-shape</b> button publishes the sub-shape, whose meshing
failed, in GEOM component as a child of the mesh geometry, which has failed, in GEOM component as a child of the mesh geometry, which
allows analyzing the problem geometry and creating a submesh on it in allows analyzing the problem geometry and creating a submesh on it in
order to locally tune hypotheses. order to locally tune the hypotheses.
If a cause of failure is an invalid input mesh and the algorithm has If the failure is caused by an invalid input mesh and the algorithm has
provided information on what mesh entities are bad <b>Show bad Mesh</b> found which mesh entities are bad, <b>Show bad Mesh</b>
button appears in the dialog. Clicked, it shows bad mesh entities in button appears in the dialog. Clicked, it shows the bad mesh entities in
the Viewer in magenta. Sometimes the shown mesh entities are too small the Viewer in magenta. Sometimes the shown mesh entities are too small
or/and hidden by other mesh elements, to see them it can be helpful to or/and hidden by other mesh elements. They can be seen after
switch the mesh to Wireframe visualization mode or to switch off switching the mesh to Wireframe visualization mode or switching off
visualization of faces and volumes (if any). the visualization of faces and volumes (if any).
\image html show_bad_mesh.png \image html show_bad_mesh.png
<em>Too close nodes causing meshing failure are shown in magenta using <b>Show <em>Too close nodes causing meshing failure are shown in magenta using <b>Show
@ -313,22 +313,22 @@ visualization of faces and volumes (if any).
\anchor use_existing_anchor \anchor use_existing_anchor
<h2>"Use existing edges" and "Use existing faces" algorithms</h2> <h2>"Use existing edges" and "Use existing faces" algorithms</h2>
It is possible to create an 1D or a 2D mesh in a python script It is possible to create a 1D or a 2D mesh in a python script
(using <em>AddNode, AddEdge</em> and <em>AddFace</em> commands) and (using <em>AddNode, AddEdge</em> and <em>AddFace</em> commands) and
then use such sub-meshes in the construction of a 2D or a 3D mesh. For then use such sub-meshes in the construction of a 2D or a 3D mesh. For
this, there exist two algorithms: <b>Use existing edges</b> and <b>Use this, there exist two algorithms: <b>Use existing edges</b> and <b>Use
existing faces</b>. Scenario of their usage is following. For existing faces</b>.
example, you want to use standard algorithms to generate 1D and 3D For example, you want to use standard algorithms to generate 1D and 3D
meshes and to create 2D mesh by your python code. Then you meshes and to create 2D mesh by your python code. Then you
<ul> <ul>
<li> create a mesh object, assign an 1D algorithm,</li> <li> create a mesh object, assign a 1D algorithm,</li>
<li> invoke \b Compute command, which computes an 1D mesh,</li> <li> invoke \b Compute command, which computes a 1D mesh,</li>
<li> assign <b>Use existing faces</b> and a 3D algorithm,</li> <li> assign <b>Use existing faces</b> and a 3D algorithm,</li>
<li> run your python code, which creates a 2D mesh,</li> <li> run your python code, which creates a 2D mesh,</li>
<li> invoke \b Compute command, which computes a 3D mesh.</li> <li> invoke \b Compute command, which computes a 3D mesh.</li>
</ul> </ul>
Consider trying a sample script demonstrating usage of Consider trying a sample script demonstrating the usage of
\ref tui_use_existing_faces "Use existing faces" algorithm for \ref tui_use_existing_faces "Use existing faces" algorithm for
construction of a 2D mesh using Python commands. construction of a 2D mesh using Python commands.

View File

@ -18,7 +18,9 @@ while the box is a 3D object. <br>
will be used. This means that an edge shared by two faces each having will be used. This means that an edge shared by two faces each having
its own different sub-mesh, will be meshed using algorithms and its own different sub-mesh, will be meshed using algorithms and
hypotheses of any of the two, chosen randomly. This indeterminacy can hypotheses of any of the two, chosen randomly. This indeterminacy can
be fixed by defining \ref submesh_order_anchor "Sub-mesh priority". be fixed by defining \ref submesh_order_anchor "Sub-mesh priority". The
default sub-meshes priority is such that multi-dimensional algorithms
are processed first.
<br> <br>
\n Construction of a sub-mesh consists of: \n Construction of a sub-mesh consists of:
@ -54,30 +56,32 @@ sub-mesh. You can define algorithms and hypotheses in the same way as
in \ref constructing_meshes_page "Create mesh" menu. in \ref constructing_meshes_page "Create mesh" menu.
\par \par
If the parent mesh is already computed, then you can define If the parent mesh is already computed, then you can define the
\b Geometry by picking mesh elements computed on a sub-shape of interest \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 in the 3D Viewer, i.e. you do not have to extract this sub-shape
previously in Geometry module. To start element selection, press \a in Geometry module beforehand. To start element selection, press \a
Selection button to the right of \b Geometry label. If this button is 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 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 following pop-up menu allowing to choose a way of geometry definition will
appear. appear.
\par \par
\image html choose_geom_selection_way.png \image html choose_geom_selection_way.png
\par \par
There the first item enables selecting the sub-shape in the Object <b>Direct geometry selection</b> enables selecting the sub-shape in the Object
Browser, the second one makes appear the following dialog. Browser.
<b>Find geometry by mesh element selection</b> activates the following dialog.
\par \par
\image html find_geom_by_mesh_elem.png \image html find_geom_by_mesh_elem.png
\par \par
In this dialog, <b> Element Type </b> defines kind of element to pick in the 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 Viewer.
ID in <b> Element ID</b> field. <b> Geometry name </b> allow you Instead of picking an element in the Viewer, you can type its
define a name of the sub-shape with which it will be published in the Study. ID in <b> Element ID</b> field.
<b> Geometry name </b> field allows defining a name of the sub-shape.
\par \par

View File

@ -15,6 +15,8 @@ viewer.</li>
elements which will form your group:</li> elements which will form your group:</li>
<ul> <ul>
<li><b>Nodes</b></li> <li><b>Nodes</b></li>
<li><b>0D Element</b></li>
<li><b>Ball</b></li>
<li><b>Edges</b></li> <li><b>Edges</b></li>
<li><b>Faces</b></li> <li><b>Faces</b></li>
<li><b>Volumes</b></li> <li><b>Volumes</b></li>

View File

@ -28,7 +28,7 @@ the ID of this quadrangle will be added to the list. To remove a
selected element or elements from the list click \b Remove button. <b>Sort 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 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> 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 <li><b>Apply to all</b> check box allows to modify the orientation of all
quadrangles of the currently displayed mesh or sub-mesh.</li> quadrangles of the currently displayed mesh or sub-mesh.</li>
<li>\b Preview - provides a preview of cutting in the viewer.</li> <li>\b Preview - provides a preview of cutting in the viewer.</li>
</ul> </ul>
@ -39,8 +39,19 @@ quadrangles of the currently displayed mesh or sub-mesh.</li>
<li><b>Use diagonal 1-3</b> and <b>Use diagonal 2-4</b> allows to <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 specify the opposite corners which will be connected by the cutting
edge.</li> edge.</li>
<li><b>Use numeric factor</b> - allows to chose a quality criterion <li><b>Use numeric functor</b> - allows to choose a quality criterion
optimization of which will be used to select the cutting edge.</li> which will be optimized at the outcome of the operation.
<ul>
<li><b>Minimum diagonal</b> - cuts by the shortest edge.</li>
<li><b>Aspect Ratio</b> - cuts by the edge splitting the quadrangle
into triangles with optimal \ref aspect_ratio_page "Aspect Ratio". The reference value is 1.</li>
<li><b>Minimum Angle</b> - cuts by the edge splitting the quadrangle
into triangles with optimal \ref minimum_angle_page "Minimum Angle". The reference value is 60 degrees.</li>
<li><b>Skew</b> - cuts by the edge splitting the quadrangle
into triangles with optimal \ref skew_page "Skew". The reference value
is 0.0 degrees.</li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li><b>Select from</b> - allows to choose a sub-mesh or an existing <li><b>Select from</b> - allows to choose a sub-mesh or an existing

View File

@ -3,18 +3,27 @@
\page extrusion_page Extrusion \page extrusion_page Extrusion
\n Extrusion is used to build mesh elements of plus one \n Extrusion is used to build mesh elements of plus one
dimension than the input ones. Any line or planar element can be dimension than the input ones. Any node, segment or 2D element can be
extruded. Line elements will extrude into quadrilateral plane elements. extruded. Each type of elements has a corresponding type of extruded elements:
Triangular and Quadrilateral plane elements extrude into Pentahedron <table>
and Hexahedron solids respectively. <tr><td><b>Extruded element</b></td><td><b> Result elements </b></td></tr>
<tr><td>Node </td><td> Segments </td></tr>
<tr><td>Segment </td><td> Quadrilaterals </td></tr>
<tr><td>Triangle </td><td> Pentahedrons </td></tr>
<tr><td>Quadrilateral </td><td> Hexahedrons </td></tr>
<tr><td>Polygon </td><td> Polyhedrons </td></tr>
<tr><td>Hexagonal polygon </td><td> Hexagonal prism </td></tr>
</table>
<em>To use extrusion:</em> <em>To use extrusion:</em>
<ol> <ol>
<li>From the \b Modification menu choose the \b Extrusion item or click <li>From the \b Modification menu choose the \b Extrusion item or click
<em>"Extrusion"</em> button in the toolbar. <em>"Extrusion"</em> button in the toolbar.
<center>
\image html image91.png \image html image91.png
<center><em>"Extrusion" button</em></center> <em>"Extrusion" button</em>
</center>
The following dialog common for line and planar elements will appear: The following dialog common for line and planar elements will appear:
@ -26,32 +35,36 @@ The following dialog common for line and planar elements will appear:
<li>In this dialog: <li>In this dialog:
<ul> <ul>
<li>select the type of elements which will be extruded (0D, 1D or 2D),</li> <li>Select the type of elements which will be extruded (0D, 1D or 2D).</li>
<li>specify the IDs of the elements which will be extruded: <li>Specify the IDs of the elements which will be extruded by one
<ul> following means:
<li><b>Select the whole mesh, submesh or group</b> activating this <ul>
checkbox; or</li> <li><b>Select the whole mesh, submesh or group</b> activating this
<li>choose mesh elements with the mouse in the 3D Viewer. It is checkbox.</li>
possible to select a whole area with a mouse frame; or</li> <li>Choose mesh elements with the mouse in the 3D Viewer. It is
<li>input the element IDs directly in <b>ID Elements</b> field. The selected elements will be highlighted in the possible to select a whole area with a mouse frame.</li>
viewer; or</li> <li>Input the element IDs directly in <b>ID Elements</b>
<li>apply Filters. <b>Set filter</b> button allows to apply a filter to the selection of elements. See more field. The selected elements will be highlighted in the viewer.</li>
about filters in the \ref selection_filter_library_page "Selection filter library" page.</li> <li>Apply Filters. <b>Set filter</b> button allows to apply a
</ul> filter to the selection of elements. See more about filters in
</li> the \ref filtering_elements "Selection filters" page.</li>
<li>If the <b>Extrude to Distance</b> radio button is selected</li> </ul>
<ul> </li>
<li>specify the distance at which the elements will be extruded,</li> <li>If the <b>Extrude to Distance</b> radio button is selected</li>
</ul> <ul>
<li>If the <b>Extrude Along Vector</b> radio button is selected</li> <li>specify the distance at which the elements will be extruded.</li>
<ul> </ul>
<li>specify the coordinates of the vector along which the elements will be extruded, or select the face (the normal to the face will define the vector)</li> <li>If the <b>Extrude Along Vector</b> radio button is selected</li>
<li>specify the distance of extrusion along the vector,</li> <ul>
</ul> <li>specify the coordinates of the vector along which the elements
<li>specify the number of steps;</li> will be extruded, or select the face (the normal to the face will
<li>activate <b>Generate Groups</b> checkbox if it is necessary to copy the groups of define the vector),</li>
elements of the source mesh to the newly created one. </li> <li>specify the distance of extrusion along the vector.</li>
</li> </ul>
<li>Specify the number of steps.</li>
<li>If you activate <b>Generate Groups</b> check-box, the created
elements contained in groups will be included into new groups named
by pattern "<old group name>_extruded". </li>
</ul> </ul>
<li>Click \b Apply or <b> Apply and Close</b> button to confirm the operation.</li> <li>Click \b Apply or <b> Apply and Close</b> button to confirm the operation.</li>

View File

@ -4,7 +4,7 @@
\n In MESH there is a functionality allowing importation/exportation \n In MESH there is a functionality allowing importation/exportation
of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (simple ascii format), \b STL, 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. \b GMF (internal format of DISTENE products, namely BLSurf, GHS3D and Hexotic algorithms) and \b CGNS format files. You can also export a group as a whole mesh.
<em>To import a mesh:</em> <em>To import a mesh:</em>

View File

@ -98,6 +98,12 @@ number of segments on each edge</li>
<li><b>Area precision</b> - allows to adjust input precision of mesh element area.</li> <li><b>Area precision</b> - allows to adjust input precision of mesh element area.</li>
<li><b>Volume precision</b> - allows to adjust input precision of mesh element volume.</li> <li><b>Volume precision</b> - allows to adjust input precision of mesh element volume.</li>
</ul> </ul>
<li><b>Preview</b></li>
<ul>
<li><b>Sub-shapes preview chunk size</b> - allows to limit the number
of preview sub-shapes shown in the hypotheses creation dialog boxes,
for example "Reverse Edges" parameter of \ref number_of_segments_anchor "Number of segments" hypothesis.
</ul>
<li><b>Python Dump</b></li> <li><b>Python Dump</b></li>
<ul> <ul>
<li><b>Historical python dump</b> checkbox allows switching between <li><b>Historical python dump</b> checkbox allows switching between

View File

@ -122,9 +122,16 @@ button in the toolbar. You can also right-click on the mesh in the
Object Browser and select Clear Mesh Data in the pop-up menu.</li> Object Browser and select Clear Mesh Data in the pop-up menu.</li>
</ol> </ol>
<center>
\image html mesh_clear.png \image html mesh_clear.png
<center><em>"Clear Mesh Data" button</em></center> <em>"Clear Mesh Data" button</em></center>
\note This command works in a different way in different situations: <ul>
<li> if the mesh is computed on a geometry, then "Clear Mesh Data" removes
all elements and nodes.</li>
<li> if the mesh is not based on a geometry (imported, compound, created from
scratch etc), then "Clear Mesh Data" removes only the elements and
nodes computed by algorithms. If no such elements or nodes have been created, can remove nothing.</li></ul>
<br><b>See Also</b> a sample TUI Script of a <br><b>See Also</b> a sample TUI Script of a
\ref tui_removing_nodes_and_elements "Removing Nodes and Elements" operation. \ref tui_removing_nodes_and_elements "Removing Nodes and Elements" operation.

View File

@ -3,17 +3,17 @@
\page reorient_faces_page Reorient faces by vector \page reorient_faces_page Reorient faces by vector
\n This operation allows changing orientation of a set of neighboring \n This operation allows changing orientation of a set of neighboring
faces. The desired orientation is defined by a vector. Since direction faces. The desired orientation is defined by a vector. Since the direction
of face normals in the set can be even opposite, it is necessary to of face normals in the set can be even opposite, it is necessary to
specify a control face whose normal will be compared with the vector. This specify a control face whose normal will be compared with the vector. This
face can be specified either explicitly or can be found by closeness to face can be either specified explicitly or found by proximity to
a given point. a given point.
Orientation of a face is changed by reverting the order of its nodes. Orientation of a face is changed by reverting the order of its nodes.
<em>To change orientation of faces:</em> <em>To change orientation of faces:</em>
<ol> <ol>
<li>In the \b Modification menu select the <b>Reorient faces by <li>In the \b Modification menu select <b>Reorient faces by
vector</b> item or click <em>Reorient faces by vector</b> item or click <em>Reorient faces by
vector</em> button in the toolbar. vector</em> button in the toolbar.
@ -31,24 +31,19 @@ The following dialog box will appear:
<li>In this dialog <li>In this dialog
<ul> <ul>
<li>Specify a way of selection of the control face: by point or <li>Specify the way of selection of the control face: by point or
explicitely.</li> explicitly.</li>
<li>Select an \b Object containing faces to reorient, either in the Object <li>Select the \b Object (mesh, sub-mesh or a group of faces) containing faces to reorient in the Object Browser or in the 3D Viewer.</li>
Browser or in the 3D Viewer; it can be either <ul> <li>Specify the coordinates of the \b Point by which the control face
<li>group of faces,</li> will be found or of the control \b Face itself. You can easy specify the \b
<li>sub-mesh of faces or</li> Point by either picking a node in the 3D Viewer or selecting a vertex
<li>mesh.</li> in the Object Browser. It is possible to pick the \b Face by mouse in
</ul></li> the 3D Viewer or enter its ID.</li>
<li>Specify either coordinates of a \b Point by which the control face <li>Set up the \b Direction vector to be compared with the normal of the
will be found or the control \b Face it-self. You can easy specify the \b control face. If you pick a node in the 3D Viewer then the \b Direction
Point by either picking a node in the 3D Viewer or by selecting a vertex vector will go from the coordinate system origin to the selected node.
in the Object Browser. The \b Face can be either picked by mouse in If you pick two nodes (holding Shift button) then the \b Direction vector
the 3D Viewer or its ID can be entered by typing.</li> will go from the first to the second node.</li>
<li>Set up a \b Direction to be compared with the normal of the
control face. You can either pick a node in the 3D Viewer then a \b Direction
from the coordinate system origin to the selected node will be set,
or you can pick two nodes (holding Shift button) then a \b Direction
from the first to the second node will be set.</li>
</ul> </ul>
</li> </li>

View File

@ -15,7 +15,14 @@ load an existing filter library.
the current study. You can \b Add or \b Delete filters. the current study. You can \b Add or \b Delete filters.
\n In <b>Filter name</b> box you can specify the name for your \n In <b>Filter name</b> box you can specify the name for your
filter. By default it is prefixed with the corresponding entity type. filter. By default it is prefixed with the corresponding entity type.
\n Each filter can be applicable to \b Nodes, \b Edges, \b Faces or \b
\anchor filtering_elements
When we use filters during a group creation or another operation (by
clicking <b>Set Filters</b> button in the corresponding dialog), the
menu for setting filters looks a bit differently (see the image below).
Each filter can be applicable to \b Nodes, \b Edges, \b Faces or \b
Volumes. You can combine many criteria in one filter, but they all Volumes. You can combine many criteria in one filter, but they all
must be of the same <b>Entity type</b>. must be of the same <b>Entity type</b>.
\n The \b Add button creates a new criterion at the end of the list of \n The \b Add button creates a new criterion at the end of the list of
@ -30,21 +37,18 @@ sense of a criterion using \b Unary operator Not and you should
specify logical relations between criteria using \b Binary operators specify logical relations between criteria using \b Binary operators
Or and And. Or and And.
\n Some criteria should have the additional parameter of \b Tolerance. \n Some criteria should have the additional parameter of \b Tolerance.
<br>
When we create a group using filters (for this click Switching on <b>Insert filter in viewer</b> checkbox limits
<b>Set Filters</b> button in the <b>Create Group</b> dialog), the menu selection of elements in the Viewer to the current filter.
for setting filters looks a bit differently (see below). Switching
on <b>Insert filter in viewer</b> checkbox limits selection of elements
in the Viewer using your current filter.
<br> <br>
In the \b Source field you choose if the filter will be applied to In the \b Source field you choose if the filter will be applied to
the whole \b Mesh, the <b>Initial Selection</b> or the <b>Current the whole \b Mesh, the <b>Initial Selection</b> or the <b>Current
Group</b>. If \b Mesh is chosen, the elements satisfying the filter Group</b>. If \b Mesh is chosen, the elements satisfying the filter
will be selected in the 3D Viewer. If <b> Initial Selection</b> is will be selected in the 3D Viewer. If <b> Initial Selection</b> is
chosen, the filter will be applied to the selected elements and the chosen, the filter will be applied to the selected elements and the
elements rejected by the filter will be deseleced. If <b>Current elements rejected by the filter will be deselected. If <b>Current
Group</b> is chosen, the filter will be applied to the list of Group</b> is chosen, the filter will be applied to the list of
elements in the <em>Greate Croup</em> dialog and the elements rejected elements in the current dialog and the elements rejected
by the filter will be removed from the list. by the filter will be removed from the list.
<br> <br>
<b>Copy from...</b> button gives you a possibility to load an <b>Copy from...</b> button gives you a possibility to load an
@ -68,7 +72,7 @@ shape the algorithm works slower.
</li><li> </li><li>
<b>Lying on Geom</b> selects entities whose at least one node <b>Lying on Geom</b> selects entities whose at least one node
lies on the shape defined by the <b>Threshold Value</b>. lies on the shape defined by the <b>Threshold Value</b>.
If the hreshold shape is a sub-shape of the main shape of the mesh the If the threshold shape is a sub-shape of the main shape of the mesh the
algorithm works faster, if this is any other algorithm works faster, if this is any other
shape, the algorithm works slower. shape, the algorithm works slower.
</li><li> </li><li>
@ -167,7 +171,7 @@ The following criteria allow selecting mesh <b>Faces</b>:
one element of mesh only. See also a one element of mesh only. See also a
\ref free_edges_page "Free Edges quality control". \ref free_edges_page "Free Edges quality control".
</li><li> </li><li>
<b>Free faces</b> selects 2D mesh elements wich belong to less than two volumes. <b>Free faces</b> selects 2D mesh elements, which belong to less than two volumes.
</li><li> </li><li>
<b>Double faces</b> selects 2D mesh elements basing on the same set of nodes. <b>Double faces</b> selects 2D mesh elements basing on the same set of nodes.
See also \ref filter_double_elements "Double Elements quality control". See also \ref filter_double_elements "Double Elements quality control".

View File

@ -116,6 +116,7 @@ the following links:
- \subpage tui_creating_meshes_page - \subpage tui_creating_meshes_page
- \subpage tui_cartesian_algo - \subpage tui_cartesian_algo
- \subpage tui_use_existing_faces
- \subpage tui_viewing_meshes_page - \subpage tui_viewing_meshes_page
- \subpage tui_defining_hypotheses_page - \subpage tui_defining_hypotheses_page
- \subpage tui_quality_controls_page - \subpage tui_quality_controls_page

View File

@ -11,9 +11,9 @@
<h3>Add Node</h3> <h3>Add Node</h3>
\code \code
import SMESH_mechanic import smesh
mesh = SMESH_mechanic.mesh mesh = smesh.Mesh()
# add node # add node
new_id = mesh.AddNode(50, 10, 0) new_id = mesh.AddNode(50, 10, 0)
@ -27,9 +27,9 @@ else: print "New Node has been added with ID ", new_id
<h3>Add 0D Element</h3> <h3>Add 0D Element</h3>
\code \code
import SMESH_mechanic import smesh
mesh = SMESH_mechanic.mesh mesh = smesh.Mesh()
# add node # add node
node_id = mesh.AddNode(50, 10, 0) node_id = mesh.AddNode(50, 10, 0)
@ -42,6 +42,54 @@ if new_id == 0: print "KO node addition."
else: print "New 0D Element has been added with ID ", new_id else: print "New 0D Element has been added with ID ", new_id
\endcode \endcode
<br>
\anchor tui_add_0DElement_on_all_nodes
<h3>Add 0D Element on Element Nodes</h3>
\code
import smesh, SMESH, geompy
# create a geometry
box = geompy.MakeBoxDXDYDZ( 10, 10, 10 )
face = geompy.SubShapeAll( box, geompy.ShapeType["FACE"])[0]
# make 3D mesh
mesh = smesh.Mesh( box )
mesh.AutomaticHexahedralization(0)
# create 0D elements on all nodes of the mesh
res = mesh.Add0DElementsToAllNodes( mesh )
# find 0D elements on all nodes of the mesh, all found nodes are added to a new group
groupName = "0Dmesh"
res = mesh.Add0DElementsToAllNodes( mesh, groupName )
mesh.RemoveGroupWithContents( res ) # remove all found 0D elements
# create 0D elements on all nodes of a sub-mesh, with group creation
groupName = "0Dsubmesh"
submesh = mesh.GetSubMesh( face, "faceSM")
res = mesh.Add0DElementsToAllNodes( submesh, groupName )
# create 0D elements on all nodes of a group
group = mesh.Group( face, "faceGroup" )
res = mesh.Add0DElementsToAllNodes( group )
# remove all 0D elements
mesh.RemoveElements( mesh.GetIdsFromFilter( smesh.GetFilter( SMESH.ELEM0D,
SMESH.FT_ElemGeomType,
"=",SMESH.Geom_POINT )))
# create 0D elements on all nodes of some elements
res = mesh.Add0DElementsToAllNodes( mesh.GetElementsId() )
mesh.RemoveElements( mesh.GetElementsByType( SMESH.ELEM0D ))
# create 0D elements on some nodes
nodes = range(1,10)
res = mesh.Add0DElementsToAllNodes( mesh.GetIDSource( nodes, SMESH.NODE ))
\endcode
<br> <br>
\anchor tui_add_edge \anchor tui_add_edge
<h3>Add Edge</h3> <h3>Add Edge</h3>

View File

@ -1,6 +1,6 @@
/*! /*!
\page tui_use_existing_faces Use existing faces \page tui_use_existing_faces Use existing faces algorithm
This sample demonstrates how to use <b>Use existing faces</b> algorithm, This sample demonstrates how to use <b>Use existing faces</b> algorithm,
which is actulally just a stub allowing to use your own 2D algoritm which is actulally just a stub allowing to use your own 2D algoritm

View File

@ -28,8 +28,8 @@ to sort the list of IDs. The <b>Set filter</b> button allows to apply a
definite filter to selection of triangles.</li> definite filter to selection of triangles.</li>
<li><b>Apply to all</b> radio button allows to modify connectivity and <li><b>Apply to all</b> radio button allows to modify connectivity and
type of all triangles of the currently displayed mesh or sub-mesh.</li> type of all triangles of the currently displayed mesh or sub-mesh.</li>
<li>\b Criterion menu allows to chose a quality criterion <li>\b Criterion menu allows to choose a quality criterion,
optimization of which will be used to select triangles to unite.</li> which will be optimized to select triangles to unite.</li>
<li><b>Select from</b> set of fields allows to choose a sub-mesh or an <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 existing group whose triangle elements will be automatically added to
the list.</li> the list.</li>

View File

@ -861,6 +861,39 @@ module StdMeshers
double GetStretchFactor(); double GetStretchFactor();
}; };
/*!
* interface of "Viscous Layers 2D" hypothesis.
* This hypothesis specifies parameters of layers of quadrilaterals to build
* near mesh boundary. This hypothesis can be used by several 2D algorithms:
* Mefisto, Quadrangle (mapping), NETGEN, BLSURF
*/
interface StdMeshers_ViscousLayers2D : SMESH::SMESH_Hypothesis
{
/*!
* Set edges to exclude from treatment
*/
void SetIgnoreEdges(in SMESH::long_array edgeIDs) raises (SALOME::SALOME_Exception);
SMESH::long_array GetIgnoreEdges();
/*!
* Set total thickness of layers of prisms
*/
void SetTotalThickness(in double thickness) raises (SALOME::SALOME_Exception);
double GetTotalThickness();
/*!
* Set number of layers of prisms
*/
void SetNumberLayers(in short nb) raises (SALOME::SALOME_Exception);
short GetNumberLayers();
/*!
* Set factor (>1.0) of growth of layer thickness towards inside of mesh
*/
void SetStretchFactor(in double factor) raises (SALOME::SALOME_Exception);
double GetStretchFactor();
};
/*! /*!
* interface of "Body fitting Parameters" hypothesis. * interface of "Body fitting Parameters" hypothesis.
* This hypothesis specifies * This hypothesis specifies

View File

@ -240,8 +240,11 @@ module SMESH
/*! /*!
* Create Mesh object importing data from given GMF file * Create Mesh object importing data from given GMF file
* \param theFileName - a name of file to import
* \param theMakeRequiredGroups - if true, groups of required entities will be created
*/ */
SMESH_Mesh CreateMeshesFromGMF( in string theFileName, SMESH_Mesh CreateMeshesFromGMF( in string theFileName,
in boolean theMakeRequiredGroups,
out SMESH::ComputeError theError) out SMESH::ComputeError theError)
raises ( SALOME::SALOME_Exception ); raises ( SALOME::SALOME_Exception );

View File

@ -663,7 +663,8 @@ module SMESH
in string file, in string file,
in boolean overwrite ) raises (SALOME::SALOME_Exception); in boolean overwrite ) raises (SALOME::SALOME_Exception);
void ExportGMF( in SMESH_IDSource meshPart, void ExportGMF( in SMESH_IDSource meshPart,
in string file ) raises (SALOME::SALOME_Exception); in string file,
in boolean withRequiredGroups) raises (SALOME::SALOME_Exception);
void ExportPartToDAT( in SMESH_IDSource meshPart, void ExportPartToDAT( in SMESH_IDSource meshPart,
in string file ) raises (SALOME::SALOME_Exception); in string file ) raises (SALOME::SALOME_Exception);
void ExportPartToUNV( in SMESH_IDSource meshPart, void ExportPartToUNV( in SMESH_IDSource meshPart,

View File

@ -151,7 +151,6 @@ module SMESH
*/ */
long AddPolyhedralVolume (in long_array IdsOfNodes, long AddPolyhedralVolume (in long_array IdsOfNodes,
in long_array Quantities); in long_array Quantities);
/*! /*!
* Create volume of many faces, giving IDs of existing faces. * Create volume of many faces, giving IDs of existing faces.
* \param IdsOfFaces List of face IDs for volume creation. * \param IdsOfFaces List of face IDs for volume creation.
@ -160,6 +159,19 @@ module SMESH
*/ */
long AddPolyhedralVolumeByFaces (in long_array IdsOfFaces); long AddPolyhedralVolumeByFaces (in long_array IdsOfFaces);
/*!
* Create 0D elements on all nodes of the given object except those
* nodes on which a 0D element already exists.
* \param theObject object on whose nodes 0D elements will be created.
* \param theGroupName optional name of a group to add 0D elements created
* and/or found on nodes of \a theObject.
* \return an object (a new group or a temporary SMESH_IDSource) holding
* ids of new and/or found 0D elements.
*/
SMESH_IDSource Create0DElementsOnAllNodes(in SMESH_IDSource theObject,
in string theGroupName)
raises (SALOME::SALOME_Exception);
/*! /*!
* \brief Bind a node to a vertex * \brief Bind a node to a vertex
* \param NodeID - node ID * \param NodeID - node ID

View File

@ -113,6 +113,8 @@ dist_salomeres_DATA = \
mesh_update.png \ mesh_update.png \
mesh_vertex_n.png \ mesh_vertex_n.png \
mesh_vertex.png \ mesh_vertex.png \
mesh_0D_elem.png \
mesh_0D_on_all_nodes.png \
mesh_volume_3d.png \ mesh_volume_3d.png \
bare_border_volume.png \ bare_border_volume.png \
bare_border_face.png \ bare_border_face.png \

View File

@ -34,170 +34,176 @@
gui-lib="StdMeshersGUI"> gui-lib="StdMeshersGUI">
<hypotheses> <hypotheses>
<hypothesis type="SegmentLengthAroundVertex" <hypothesis type ="SegmentLengthAroundVertex"
label-id="Length Near Vertex" label-id ="Length Near Vertex"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="0"/> dim ="0"/>
<hypothesis type="LocalLength" <hypothesis type ="LocalLength"
label-id="Local Length" label-id ="Local Length"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="MaxLength" <hypothesis type ="MaxLength"
label-id="Max Size" label-id ="Max Size"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="Arithmetic1D" <hypothesis type ="Arithmetic1D"
label-id="Arithmetic 1D" label-id ="Arithmetic 1D"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="FixedPoints1D" <hypothesis type ="FixedPoints1D"
label-id="Fixed Points 1D" label-id ="Fixed Points 1D"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="StartEndLength" <hypothesis type ="StartEndLength"
label-id="Start and End Length" label-id ="Start and End Length"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="NumberOfSegments" <hypothesis type ="NumberOfSegments"
label-id="Nb. Segments" label-id ="Nb. Segments"
icon-id="mesh_hypo_segment.png" icon-id ="mesh_hypo_segment.png"
dim="1"/> dim ="1"/>
<hypothesis type="Deflection1D" <hypothesis type ="Deflection1D"
label-id="Deflection 1D" label-id ="Deflection 1D"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="Propagation" <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" icon-id ="mesh_hypo_length.png"
dim="1" dim ="1"
auxiliary="true"/> auxiliary="true"/>
<hypothesis type="AutomaticLength" <hypothesis type ="AutomaticLength"
label-id="Automatic Length" label-id ="Automatic Length"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="LengthFromEdges" <hypothesis type ="LengthFromEdges"
label-id="Length From Edges" label-id ="Length From Edges"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="2"/> dim ="2"/>
<hypothesis type="QuadranglePreference" <hypothesis type ="QuadranglePreference"
label-id="Quadrangle Preference" label-id ="Quadrangle Preference"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
auxiliary="true" auxiliary="true"
dim="2"/> dim ="2"/>
<hypothesis type="QuadraticMesh" <hypothesis type ="QuadraticMesh"
label-id="Quadratic Mesh" label-id ="Quadratic Mesh"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
dim="1" dim ="1"
auxiliary="true"/> auxiliary="true"/>
<hypothesis type="MaxElementArea" <hypothesis type ="MaxElementArea"
label-id="Max. Element Area" label-id ="Max. Element Area"
icon-id="mesh_hypo_area.png" icon-id ="mesh_hypo_area.png"
dim="2"/> dim ="2"/>
<hypothesis type="NotConformAllowed" <hypothesis type ="NotConformAllowed"
label-id="Not Conform Mesh Allowed" label-id ="Not Conform Mesh Allowed"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1,2,3" dim ="1,2,3"
auxiliary="true"/> auxiliary="true"/>
<hypothesis type="MaxElementVolume" <hypothesis type ="MaxElementVolume"
label-id="Max. Element Volume" label-id ="Max. Element Volume"
icon-id="mesh_hypo_volume.png" icon-id ="mesh_hypo_volume.png"
dim="3"/> dim ="3"/>
<hypothesis type="ProjectionSource3D" <hypothesis type ="ProjectionSource3D"
label-id="Source Shape 3D" label-id ="Source Shape 3D"
icon-id="mesh_hypo_volume.png" icon-id ="mesh_hypo_volume.png"
dim="3"/> dim ="3"/>
<hypothesis type="ProjectionSource2D" <hypothesis type ="ProjectionSource2D"
label-id="Source Face" label-id ="Source Face"
icon-id="mesh_hypo_area.png" icon-id ="mesh_hypo_area.png"
dim="2"/> dim ="2"/>
<hypothesis type="ProjectionSource1D" <hypothesis type ="ProjectionSource1D"
label-id="Source Edge" label-id ="Source Edge"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="ImportSource2D" <hypothesis type ="ImportSource2D"
label-id="Source Faces" label-id ="Source Faces"
icon-id="mesh_hypo_area.png" icon-id ="mesh_hypo_area.png"
dim="2"/> dim ="2"/>
<hypothesis type="ImportSource1D" <hypothesis type ="ImportSource1D"
label-id="Source Edges" label-id ="Source Edges"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="1"/> dim ="1"/>
<hypothesis type="NumberOfLayers" <hypothesis type ="NumberOfLayers"
label-id="Number of Layers" label-id ="Number of Layers"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="3"/> dim ="3"/>
<hypothesis type="LayerDistribution" <hypothesis type ="LayerDistribution"
label-id="Distribution of Layers" label-id ="Distribution of Layers"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="3"/> dim ="3"/>
<hypothesis type="ViscousLayers" <hypothesis type ="ViscousLayers2D"
label-id="Viscous Layers" label-id ="Viscous Layers 2D"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
auxiliary="true" auxiliary="true"
dim="3"/> dim ="2"/>
<hypothesis type="NumberOfLayers2D" <hypothesis type ="ViscousLayers"
label-id="Number of Layers" label-id ="Viscous Layers"
icon-id="mesh_hypo_length.png" icon-id ="mesh_algo_quad.png"
dim="2"/> auxiliary="true"
dim ="3"/>
<hypothesis type="LayerDistribution2D" <hypothesis type ="NumberOfLayers2D"
label-id="Distribution of Layers" label-id ="Number of Layers"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="2"/> dim ="2"/>
<hypothesis type="QuadrangleParams" <hypothesis type ="LayerDistribution2D"
label-id="Quadrangle Parameters" label-id ="Distribution of Layers"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="2"/> dim ="2"/>
<hypothesis type="CartesianParameters3D" <hypothesis type ="QuadrangleParams"
label-id="Body Fitting Parameters" label-id ="Quadrangle Parameters"
icon-id="mesh_hypo_length.png" icon-id ="mesh_hypo_length.png"
dim="3"/> dim ="2"/>
<hypothesis type ="CartesianParameters3D"
label-id ="Body Fitting Parameters"
icon-id ="mesh_hypo_length.png"
dim ="3"/>
</hypotheses> </hypotheses>
<algorithms> <algorithms>
<algorithm type="SegmentAroundVertex_0D" <algorithm type ="SegmentAroundVertex_0D"
label-id="Segments around Vertex" label-id ="Segments around Vertex"
icon-id="mesh_algo_regular.png" icon-id ="mesh_algo_regular.png"
hypos="SegmentLengthAroundVertex" hypos ="SegmentLengthAroundVertex"
output="VERTEX" output ="VERTEX"
dim="0"/> dim ="0"/>
<algorithm type="Regular_1D" <algorithm type ="Regular_1D"
label-id="Wire Discretisation" label-id ="Wire Discretisation"
icon-id="mesh_algo_regular.png" icon-id ="mesh_algo_regular.png"
hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D" hypos ="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
opt-hypos="Propagation,QuadraticMesh" opt-hypos="Propagation,QuadraticMesh"
input="VERTEX" input ="VERTEX"
output="EDGE" output ="EDGE"
dim="1"> dim ="1">
<python-wrap> <python-wrap>
<algo>Regular_1D=Segment()</algo> <algo>Regular_1D=Segment()</algo>
<hypo>LocalLength=LocalLength(SetLength(1),,SetPrecision(1))</hypo> <hypo>LocalLength=LocalLength(SetLength(1),,SetPrecision(1))</hypo>
@ -212,14 +218,14 @@
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="CompositeSegment_1D" <algorithm type ="CompositeSegment_1D"
label-id="Composite Side Discretisation" label-id ="Composite Side Discretisation"
icon-id="mesh_algo_regular.png" icon-id ="mesh_algo_regular.png"
hypos="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D" hypos ="LocalLength,MaxLength,Arithmetic1D,StartEndLength,NumberOfSegments,Deflection1D,AutomaticLength,FixedPoints1D"
opt-hypos="Propagation,QuadraticMesh" opt-hypos="Propagation,QuadraticMesh"
input="VERTEX" input ="VERTEX"
output="EDGE" output ="EDGE"
dim="1"> dim ="1">
<python-wrap> <python-wrap>
<algo>CompositeSegment_1D=Segment(algo=smesh.COMPOSITE)</algo> <algo>CompositeSegment_1D=Segment(algo=smesh.COMPOSITE)</algo>
<hypo>LocalLength=LocalLength(SetLength(), ,SetPrecision())</hypo> <hypo>LocalLength=LocalLength(SetLength(), ,SetPrecision())</hypo>
@ -243,184 +249,187 @@
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="MEFISTO_2D" <algorithm type ="MEFISTO_2D"
label-id="Triangle (Mefisto)" label-id ="Triangle (Mefisto)"
icon-id="mesh_algo_mefisto.png" icon-id ="mesh_algo_mefisto.png"
hypos="LengthFromEdges,MaxElementArea" hypos ="LengthFromEdges,MaxElementArea"
input="EDGE" opt-hypos ="ViscousLayers2D"
output="TRIA" input ="EDGE"
dim="2"> output ="TRIA"
dim ="2">
<python-wrap> <python-wrap>
<algo>MEFISTO_2D=Triangle(algo=smesh.MEFISTO)</algo> <algo>MEFISTO_2D=Triangle(algo=smesh.MEFISTO)</algo>
<hypo>LengthFromEdges=LengthFromEdges()</hypo> <hypo>LengthFromEdges=LengthFromEdges()</hypo>
<hypo>MaxElementArea=MaxElementArea(SetMaxElementArea())</hypo> <hypo>MaxElementArea=MaxElementArea(SetMaxElementArea())</hypo>
<hypo>ViscousLayers2D=ViscousLayers2D(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreEdges())</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Quadrangle_2D" <algorithm type ="Quadrangle_2D"
label-id="Quadrangle (Mapping)" label-id ="Quadrangle (Mapping)"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
hypos="QuadrangleParams" hypos ="QuadrangleParams"
input="EDGE" opt-hypos="ViscousLayers2D"
output="QUAD" input ="EDGE"
dim="2"> output ="QUAD"
dim ="2">
<python-wrap> <python-wrap>
<algo>Quadrangle_2D=Quadrangle(algo=smesh.QUADRANGLE)</algo> <algo>Quadrangle_2D=Quadrangle(algo=smesh.QUADRANGLE)</algo>
<hypo>QuadrangleParams=QuadrangleParameters(SetQuadType(),SetTriaVertex())</hypo> <hypo>QuadrangleParams=QuadrangleParameters(SetQuadType(),SetTriaVertex())</hypo>
<hypo>ViscousLayers2D=ViscousLayers2D(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreEdges())</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Hexa_3D" <algorithm type ="Hexa_3D"
label-id="Hexahedron (i,j,k)" label-id ="Hexahedron (i,j,k)"
icon-id="mesh_algo_hexa.png" icon-id ="mesh_algo_hexa.png"
input="QUAD" input ="QUAD"
need-geom="false" need-geom="false"
opt-hypos="ViscousLayers" opt-hypos="ViscousLayers"
dim="3"> dim ="3">
<python-wrap> <python-wrap>
<algo>Hexa_3D=Hexahedron(algo=smesh.Hexa)</algo> <algo>Hexa_3D=Hexahedron(algo=smesh.Hexa)</algo>
<hypo>ViscousLayers=ViscousLayers(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreFaces())</hypo> <hypo>ViscousLayers=ViscousLayers(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreFaces())</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Projection_1D" <algorithm type ="Projection_1D"
label-id="Projection 1D" label-id="Projection 1D"
icon-id="mesh_algo_regular.png" icon-id ="mesh_algo_regular.png"
hypos="ProjectionSource1D" hypos ="ProjectionSource1D"
output="EDGE" output ="EDGE"
dim="1"> dim ="1">
<python-wrap> <python-wrap>
<algo>Projection_1D=Projection1D()</algo> <algo>Projection_1D=Projection1D()</algo>
<hypo>ProjectionSource1D=SourceEdge(SetSourceEdge(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2))</hypo> <hypo>ProjectionSource1D=SourceEdge(SetSourceEdge(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2))</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Projection_2D" <algorithm type ="Projection_2D"
label-id="Projection 2D" label-id="Projection 2D"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
input="EDGE" input ="EDGE"
hypos="ProjectionSource2D" hypos ="ProjectionSource2D"
output="QUAD,TRIA" output ="QUAD,TRIA"
dim="2"> dim ="2">
<python-wrap> <python-wrap>
<algo>Projection_2D=Projection2D()</algo> <algo>Projection_2D=Projection2D()</algo>
<hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo> <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Projection_1D2D" <algorithm type ="Projection_1D2D"
label-id="Projection 1D-2D" label-id="Projection 1D-2D"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
input="" hypos ="ProjectionSource2D"
hypos="ProjectionSource2D" output ="QUAD,TRIA"
output="QUAD,TRIA" dim ="2">
dim="2">
<python-wrap> <python-wrap>
<algo>Projection_1D2D=Projection1D2D()</algo> <algo>Projection_1D2D=Projection1D2D()</algo>
<hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2),SetVertexAssociation(3),SetVertexAssociation(4))</hypo> <hypo>ProjectionSource2D=SourceFace(SetSourceFace(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(2),SetVertexAssociation(3),SetVertexAssociation(4))</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Projection_3D" <algorithm type ="Projection_3D"
label-id="Projection 3D" label-id="Projection 3D"
icon-id="mesh_algo_hexa.png" icon-id ="mesh_algo_hexa.png"
hypos="ProjectionSource3D" hypos ="ProjectionSource3D"
input="QUAD,TRIA" input ="QUAD,TRIA"
dim="3"> dim ="3">
<python-wrap> <python-wrap>
<algo>Projection_3D=Projection3D()</algo> <algo>Projection_3D=Projection3D()</algo>
<hypo>ProjectionSource3D=SourceShape3D(SetSource3DShape(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo> <hypo>ProjectionSource3D=SourceShape3D(SetSource3DShape(),SetSourceMesh(),SetVertexAssociation(1),SetVertexAssociation(3),SetVertexAssociation(2),SetVertexAssociation(4))</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Import_1D" <algorithm type ="Import_1D"
label-id="Use Existing 1D Elements" label-id="Use Existing 1D Elements"
icon-id="mesh_algo_regular.png" icon-id ="mesh_algo_regular.png"
hypos="ImportSource1D" hypos ="ImportSource1D"
output="EDGE" output ="EDGE"
dim="1"> dim ="1">
<python-wrap> <python-wrap>
<algo>Import_1D=UseExisting1DElements()</algo> <algo>Import_1D=UseExisting1DElements()</algo>
<hypo>ImportSource1D=SourceEdges(SetSourceEdges(),SetCopySourceMesh(1),SetCopySourceMesh(2))</hypo> <hypo>ImportSource1D=SourceEdges(SetSourceEdges(),SetCopySourceMesh(1),SetCopySourceMesh(2))</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Import_1D2D" <algorithm type ="Import_1D2D"
label-id="Use Existing 2D Elements" label-id ="Use Existing 2D Elements"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
hypos="ImportSource2D" hypos ="ImportSource2D"
output="QUAD,TRIA" output ="QUAD,TRIA"
support-submeshes="false" support-submeshes="false"
dim="2"> dim ="2">
<python-wrap> <python-wrap>
<algo>Import_1D2D=UseExisting2DElements()</algo> <algo>Import_1D2D=UseExisting2DElements()</algo>
<hypo>ImportSource2D=SourceFaces(SetSourceFaces(),SetCopySourceMesh(1),SetCopySourceMesh(2))</hypo> <hypo>ImportSource2D=SourceFaces(SetSourceFaces(),SetCopySourceMesh(1),SetCopySourceMesh(2))</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Prism_3D" <algorithm type ="Prism_3D"
label-id="3D Extrusion" label-id="3D Extrusion"
icon-id="mesh_algo_hexa.png" icon-id ="mesh_algo_hexa.png"
input="QUAD,TRIA" input ="QUAD,TRIA"
dim="3"> dim ="3">
<python-wrap> <python-wrap>
<algo>Prism_3D=Prism()</algo> <algo>Prism_3D=Prism()</algo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="RadialPrism_3D" <algorithm type ="RadialPrism_3D"
label-id="Radial Prism 3D" label-id="Radial Prism 3D"
icon-id="mesh_algo_hexa.png" icon-id ="mesh_algo_hexa.png"
hypos="NumberOfLayers, LayerDistribution" hypos ="NumberOfLayers, LayerDistribution"
input="QUAD,TRIA" input ="QUAD,TRIA"
dim="3"> dim ="3">
<python-wrap> <python-wrap>
<algo>RadialPrism_3D=Prism('RadialPrism_3D')</algo> <algo>RadialPrism_3D=Prism('RadialPrism_3D')</algo>
<hypo>NumberOfLayers=NumberOfLayers(SetNumberOfLayers())</hypo> <hypo>NumberOfLayers=NumberOfLayers(SetNumberOfLayers())</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="UseExisting_1D" <algorithm type ="UseExisting_1D"
label-id="Use Existing Edges" label-id="Use Existing Edges"
icon-id="mesh_algo_regular.png" icon-id ="mesh_algo_regular.png"
input="VERTEX" input ="VERTEX"
output="EDGE" output ="EDGE"
dim="1"> dim ="1">
<python-wrap> <python-wrap>
<algo>UseExisting_1D=UseExistingSegments()</algo> <algo>UseExisting_1D=UseExistingSegments()</algo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="UseExisting_2D" <algorithm type ="UseExisting_2D"
label-id="Use Existing Faces" label-id="Use Existing Faces"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
input="EDGE" input ="EDGE"
output="QUAD,TRIA" output ="QUAD,TRIA"
dim="2"> dim ="2">
<python-wrap> <python-wrap>
<algo>UseExisting_2D=UseExistingFaces()</algo> <algo>UseExisting_2D=UseExistingFaces()</algo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="RadialQuadrangle_1D2D" <algorithm type ="RadialQuadrangle_1D2D"
label-id="Radial Quadrangle 1D2D" label-id="Radial Quadrangle 1D2D"
icon-id="mesh_algo_quad.png" icon-id ="mesh_algo_quad.png"
hypos="NumberOfLayers2D, LayerDistribution2D" hypos ="NumberOfLayers2D, LayerDistribution2D"
input="EDGE" input ="EDGE"
output="QUAD,TRIA" output ="QUAD,TRIA"
dim="2"> dim ="2">
<python-wrap> <python-wrap>
<algo>RadialQuadrangle_1D2D=Quadrangle(algo=smesh.RADIAL_QUAD)</algo> <algo>RadialQuadrangle_1D2D=Quadrangle(algo=smesh.RADIAL_QUAD)</algo>
<hypo>NumberOfLayers2D=NumberOfLayers(SetNumberOfLayers())</hypo> <hypo>NumberOfLayers2D=NumberOfLayers(SetNumberOfLayers())</hypo>
</python-wrap> </python-wrap>
</algorithm> </algorithm>
<algorithm type="Cartesian_3D" <algorithm type ="Cartesian_3D"
label-id="Body Fitting" label-id ="Body Fitting"
icon-id="mesh_algo_hexa.png" icon-id ="mesh_algo_hexa.png"
hypos="CartesianParameters3D" hypos ="CartesianParameters3D"
support-submeshes="false" support-submeshes="false"
dim="3"> dim ="3">
<python-wrap> <python-wrap>
<algo>Cartesian_3D=BodyFitted()</algo> <algo>Cartesian_3D=BodyFitted()</algo>
</python-wrap> </python-wrap>

BIN
resources/mesh_0D_elem.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 579 B

View File

@ -70,7 +70,10 @@
AUXILIARY METHODS AUXILIARY METHODS
*/ */
namespace{ namespace {
const double theEps = 1e-100;
const double theInf = 1e+100;
inline gp_XYZ gpXYZ(const SMDS_MeshNode* aNode ) inline gp_XYZ gpXYZ(const SMDS_MeshNode* aNode )
{ {
@ -231,7 +234,11 @@ bool NumericalFunctor::GetPoints(const int theId,
if ( myMesh == 0 ) if ( myMesh == 0 )
return false; return false;
return GetPoints( myMesh->FindElement( theId ), theRes ); const SMDS_MeshElement* anElem = myMesh->FindElement( theId );
if ( !anElem || anElem->GetType() != this->GetType() )
return false;
return GetPoints( anElem, theRes );
} }
bool NumericalFunctor::GetPoints(const SMDS_MeshElement* anElem, bool NumericalFunctor::GetPoints(const SMDS_MeshElement* anElem,
@ -239,7 +246,7 @@ bool NumericalFunctor::GetPoints(const SMDS_MeshElement* anElem,
{ {
theRes.clear(); theRes.clear();
if ( anElem == 0) if ( anElem == 0 )
return false; return false;
theRes.reserve( anElem->NbNodes() ); theRes.reserve( anElem->NbNodes() );
@ -424,66 +431,60 @@ SMDSAbs_ElementType Volume::GetType() const
return SMDSAbs_Volume; return SMDSAbs_Volume;
} }
//=======================================================================
/* /*
Class : MaxElementLength2D Class : MaxElementLength2D
Description : Functor calculating maximum length of 2D element Description : Functor calculating maximum length of 2D element
*/ */
double MaxElementLength2D::GetValue( const TSequenceOfXYZ& P )
{
if(P.size() == 0)
return 0.;
double aVal = 0;
int len = P.size();
if( len == 3 ) { // triangles
double L1 = getDistance(P( 1 ),P( 2 ));
double L2 = getDistance(P( 2 ),P( 3 ));
double L3 = getDistance(P( 3 ),P( 1 ));
aVal = Max(L1,Max(L2,L3));
}
else if( len == 4 ) { // quadrangles
double L1 = getDistance(P( 1 ),P( 2 ));
double L2 = getDistance(P( 2 ),P( 3 ));
double L3 = getDistance(P( 3 ),P( 4 ));
double L4 = getDistance(P( 4 ),P( 1 ));
double D1 = getDistance(P( 1 ),P( 3 ));
double D2 = getDistance(P( 2 ),P( 4 ));
aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
}
else if( len == 6 ) { // quadratic triangles
double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 1 ));
aVal = Max(L1,Max(L2,L3));
}
else if( len == 8 || len == 9 ) { // quadratic quadrangles
double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 7 ));
double L4 = getDistance(P( 7 ),P( 8 )) + getDistance(P( 8 ),P( 1 ));
double D1 = getDistance(P( 1 ),P( 5 ));
double D2 = getDistance(P( 3 ),P( 7 ));
aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
}
if( myPrecision >= 0 )
{
double prec = pow( 10., (double)myPrecision );
aVal = floor( aVal * prec + 0.5 ) / prec;
}
return aVal;
}
double MaxElementLength2D::GetValue( long theElementId ) double MaxElementLength2D::GetValue( long theElementId )
{ {
TSequenceOfXYZ P; TSequenceOfXYZ P;
if( GetPoints( theElementId, P ) ) { return GetPoints( theElementId, P ) ? GetValue(P) : 0.0;
double aVal = 0;
const SMDS_MeshElement* aElem = myMesh->FindElement( theElementId );
SMDSAbs_ElementType aType = aElem->GetType();
int len = P.size();
switch( aType ) {
case SMDSAbs_Face:
if( len == 3 ) { // triangles
double L1 = getDistance(P( 1 ),P( 2 ));
double L2 = getDistance(P( 2 ),P( 3 ));
double L3 = getDistance(P( 3 ),P( 1 ));
aVal = Max(L1,Max(L2,L3));
break;
}
else if( len == 4 ) { // quadrangles
double L1 = getDistance(P( 1 ),P( 2 ));
double L2 = getDistance(P( 2 ),P( 3 ));
double L3 = getDistance(P( 3 ),P( 4 ));
double L4 = getDistance(P( 4 ),P( 1 ));
double D1 = getDistance(P( 1 ),P( 3 ));
double D2 = getDistance(P( 2 ),P( 4 ));
aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
break;
}
else if( len == 6 ) { // quadratic triangles
double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 1 ));
aVal = Max(L1,Max(L2,L3));
break;
}
else if( len == 8 || len == 9 ) { // quadratic quadrangles
double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 ));
double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 ));
double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 7 ));
double L4 = getDistance(P( 7 ),P( 8 )) + getDistance(P( 8 ),P( 1 ));
double D1 = getDistance(P( 1 ),P( 5 ));
double D2 = getDistance(P( 3 ),P( 7 ));
aVal = Max(Max(Max(L1,L2),Max(L3,L4)),Max(D1,D2));
break;
}
}
if( myPrecision >= 0 )
{
double prec = pow( 10., (double)myPrecision );
aVal = floor( aVal * prec + 0.5 ) / prec;
}
return aVal;
}
return 0.;
} }
double MaxElementLength2D::GetBadRate( double Value, int /*nbNodes*/ ) const double MaxElementLength2D::GetBadRate( double Value, int /*nbNodes*/ ) const
@ -496,6 +497,7 @@ SMDSAbs_ElementType MaxElementLength2D::GetType() const
return SMDSAbs_Face; return SMDSAbs_Face;
} }
//=======================================================================
/* /*
Class : MaxElementLength3D Class : MaxElementLength3D
Description : Functor calculating maximum length of 3D element Description : Functor calculating maximum length of 3D element
@ -670,7 +672,7 @@ SMDSAbs_ElementType MaxElementLength3D::GetType() const
return SMDSAbs_Volume; return SMDSAbs_Volume;
} }
//=======================================================================
/* /*
Class : MinimumAngle Class : MinimumAngle
Description : Functor for calculation of minimum angle Description : Functor for calculation of minimum angle
@ -761,8 +763,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
double maxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) ); double maxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) );
double half_perimeter = ( aLen[0] + aLen[1] + aLen[2] ) / 2.; double half_perimeter = ( aLen[0] + aLen[1] + aLen[2] ) / 2.;
double anArea = getArea( P( 1 ), P( 2 ), P( 3 ) ); double anArea = getArea( P( 1 ), P( 2 ), P( 3 ) );
if ( anArea <= Precision::Confusion() ) if ( anArea <= theEps )
return 0.; return theInf;
return alfa * maxLen * half_perimeter / anArea; return alfa * maxLen * half_perimeter / anArea;
} }
else if ( nbNodes == 6 ) { // quadratic triangles else if ( nbNodes == 6 ) { // quadratic triangles
@ -781,8 +783,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
double maxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) ); double maxLen = Max( aLen[ 0 ], Max( aLen[ 1 ], aLen[ 2 ] ) );
double half_perimeter = ( aLen[0] + aLen[1] + aLen[2] ) / 2.; double half_perimeter = ( aLen[0] + aLen[1] + aLen[2] ) / 2.;
double anArea = getArea( P(1), P(3), P(5) ); double anArea = getArea( P(1), P(3), P(5) );
if ( anArea <= Precision::Confusion() ) if ( anArea <= theEps )
return 0.; return theInf;
return alfa * maxLen * half_perimeter / anArea; return alfa * maxLen * half_perimeter / anArea;
} }
else if( nbNodes == 4 ) { // quadrangle else if( nbNodes == 4 ) { // quadrangle
@ -825,8 +827,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
double C2 = Min( anArea[ 0 ], double C2 = Min( anArea[ 0 ],
Min( anArea[ 1 ], Min( anArea[ 1 ],
Min( anArea[ 2 ], anArea[ 3 ] ) ) ); Min( anArea[ 2 ], anArea[ 3 ] ) ) );
if ( C2 <= Precision::Confusion() ) if ( C2 <= theEps )
return 0.; return theInf;
return alpha * L * C1 / C2; return alpha * L * C1 / C2;
} }
else if( nbNodes == 8 || nbNodes == 9 ) { // nbNodes==8 - quadratic quadrangle else if( nbNodes == 8 || nbNodes == 9 ) { // nbNodes==8 - quadratic quadrangle
@ -869,8 +871,8 @@ double AspectRatio::GetValue( const TSequenceOfXYZ& P )
double C2 = Min( anArea[ 0 ], double C2 = Min( anArea[ 0 ],
Min( anArea[ 1 ], Min( anArea[ 1 ],
Min( anArea[ 2 ], anArea[ 3 ] ) ) ); Min( anArea[ 2 ], anArea[ 3 ] ) ) );
if ( C2 <= Precision::Confusion() ) if ( C2 <= theEps )
return 0.; return theInf;
return alpha * L * C1 / C2; return alpha * L * C1 / C2;
} }
return 0; return 0;
@ -1288,8 +1290,8 @@ double Warping::ComputeA( const gp_XYZ& thePnt1,
double aLen1 = gp_Pnt( thePnt1 ).Distance( gp_Pnt( thePnt2 ) ); double aLen1 = gp_Pnt( thePnt1 ).Distance( gp_Pnt( thePnt2 ) );
double aLen2 = gp_Pnt( thePnt2 ).Distance( gp_Pnt( thePnt3 ) ); double aLen2 = gp_Pnt( thePnt2 ).Distance( gp_Pnt( thePnt3 ) );
double L = Min( aLen1, aLen2 ) * 0.5; double L = Min( aLen1, aLen2 ) * 0.5;
if ( L < Precision::Confusion()) if ( L < theEps )
return 0.; return theInf;
gp_XYZ GI = ( thePnt2 + thePnt1 ) / 2. - theG; gp_XYZ GI = ( thePnt2 + thePnt1 ) / 2. - theG;
gp_XYZ GJ = ( thePnt3 + thePnt2 ) / 2. - theG; gp_XYZ GJ = ( thePnt3 + thePnt2 ) / 2. - theG;
@ -1334,8 +1336,8 @@ double Taper::GetValue( const TSequenceOfXYZ& P )
double J4 = getArea( P( 3 ), P( 4 ), P( 1 ) ) / 2.; double J4 = getArea( P( 3 ), P( 4 ), P( 1 ) ) / 2.;
double JA = 0.25 * ( J1 + J2 + J3 + J4 ); double JA = 0.25 * ( J1 + J2 + J3 + J4 );
if ( JA <= Precision::Confusion() ) if ( JA <= theEps )
return 0.; return theInf;
double T1 = fabs( ( J1 - JA ) / JA ); double T1 = fabs( ( J1 - JA ) / JA );
double T2 = fabs( ( J2 - JA ) / JA ); double T2 = fabs( ( J2 - JA ) / JA );
@ -1401,8 +1403,8 @@ double Skew::GetValue( const TSequenceOfXYZ& P )
? 0. : fabs( PI2 - v1.Angle( v2 ) ); ? 0. : fabs( PI2 - v1.Angle( v2 ) );
//BUG SWP12743 //BUG SWP12743
if ( A < Precision::Angular() ) if ( A < theEps )
return 0.; return theInf;
return A * 180. / M_PI; return A * 180. / M_PI;
} }
@ -2645,43 +2647,7 @@ bool ElemGeomType::IsSatisfy( long theId )
const SMDSAbs_ElementType anElemType = anElem->GetType(); const SMDSAbs_ElementType anElemType = anElem->GetType();
if ( myType != SMDSAbs_All && anElemType != myType ) if ( myType != SMDSAbs_All && anElemType != myType )
return false; return false;
const int aNbNode = anElem->NbNodes(); bool isOk = ( anElem->GetGeomType() == myGeomType );
bool isOk = false;
switch( anElemType )
{
case SMDSAbs_Node:
isOk = (myGeomType == SMDSGeom_POINT);
break;
case SMDSAbs_Edge:
isOk = (myGeomType == SMDSGeom_EDGE);
break;
case SMDSAbs_Face:
if ( myGeomType == SMDSGeom_TRIANGLE )
isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 6 : aNbNode == 3));
else if ( myGeomType == SMDSGeom_QUADRANGLE )
isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? ( aNbNode == 8 || aNbNode == 9 ) : aNbNode == 4));
else if ( myGeomType == SMDSGeom_POLYGON )
isOk = anElem->IsPoly();
break;
case SMDSAbs_Volume:
if ( myGeomType == SMDSGeom_TETRA )
isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 10 : aNbNode == 4));
else if ( myGeomType == SMDSGeom_PYRAMID )
isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 13 : aNbNode == 5));
else if ( myGeomType == SMDSGeom_PENTA )
isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? aNbNode == 15 : aNbNode == 6));
else if ( myGeomType == SMDSGeom_HEXA )
isOk = (!anElem->IsPoly() && (anElem->IsQuadratic() ? ( aNbNode == 20 || aNbNode == 27 ): aNbNode == 8));
else if ( myGeomType == SMDSGeom_HEXAGONAL_PRISM )
isOk = (anElem->GetEntityType() == SMDSEntity_Hexagonal_Prism );
else if ( myGeomType == SMDSGeom_POLYHEDRA )
isOk = anElem->IsPoly();
break;
default: break;
}
return isOk; return isOk;
} }
@ -3565,7 +3531,6 @@ void ManifoldPart::getFacesByLink( const ManifoldPart::Link& theLink,
ElementsOnSurface::ElementsOnSurface() ElementsOnSurface::ElementsOnSurface()
{ {
myMesh = 0;
myIds.Clear(); myIds.Clear();
myType = SMDSAbs_All; myType = SMDSAbs_All;
mySurf.Nullify(); mySurf.Nullify();
@ -3575,15 +3540,13 @@ ElementsOnSurface::ElementsOnSurface()
ElementsOnSurface::~ElementsOnSurface() ElementsOnSurface::~ElementsOnSurface()
{ {
myMesh = 0;
} }
void ElementsOnSurface::SetMesh( const SMDS_Mesh* theMesh ) void ElementsOnSurface::SetMesh( const SMDS_Mesh* theMesh )
{ {
if ( myMesh == theMesh ) myMeshModifTracer.SetMesh( theMesh );
return; if ( myMeshModifTracer.IsMeshModified())
myMesh = theMesh; process();
process();
} }
bool ElementsOnSurface::IsSatisfy( long theElementId ) bool ElementsOnSurface::IsSatisfy( long theElementId )
@ -3638,32 +3601,14 @@ void ElementsOnSurface::process()
if ( mySurf.IsNull() ) if ( mySurf.IsNull() )
return; return;
if ( myMesh == 0 ) if ( !myMeshModifTracer.GetMesh() )
return; return;
if ( myType == SMDSAbs_Face || myType == SMDSAbs_All ) myIds.ReSize( myMeshModifTracer.GetMesh()->GetMeshInfo().NbElements( myType ));
{
myIds.ReSize( myMesh->NbFaces() );
SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
for(; anIter->more(); )
process( anIter->next() );
}
if ( myType == SMDSAbs_Edge || myType == SMDSAbs_All ) SMDS_ElemIteratorPtr anIter = myMeshModifTracer.GetMesh()->elementsIterator( myType );
{ for(; anIter->more(); )
myIds.ReSize( myIds.Extent() + myMesh->NbEdges() ); process( anIter->next() );
SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator();
for(; anIter->more(); )
process( anIter->next() );
}
if ( myType == SMDSAbs_Node )
{
myIds.ReSize( myMesh->NbNodes() );
SMDS_NodeIteratorPtr anIter = myMesh->nodesIterator();
for(; anIter->more(); )
process( anIter->next() );
}
} }
void ElementsOnSurface::process( const SMDS_MeshElement* theElemPtr ) void ElementsOnSurface::process( const SMDS_MeshElement* theElemPtr )
@ -3782,26 +3727,7 @@ void ElementsOnShape::SetShape (const TopoDS_Shape& theShape,
if ( !myMesh ) return; if ( !myMesh ) return;
switch (myType) myIds.ReSize( myMeshModifTracer.GetMesh()->GetMeshInfo().NbElements( myType ));
{
case SMDSAbs_All:
myIds.ReSize(myMesh->NbEdges() + myMesh->NbFaces() + myMesh->NbVolumes());
break;
case SMDSAbs_Node:
myIds.ReSize(myMesh->NbNodes());
break;
case SMDSAbs_Edge:
myIds.ReSize(myMesh->NbEdges());
break;
case SMDSAbs_Face:
myIds.ReSize(myMesh->NbFaces());
break;
case SMDSAbs_Volume:
myIds.ReSize(myMesh->NbVolumes());
break;
default:
break;
}
myShapesMap.Clear(); myShapesMap.Clear();
addShape(myShape); addShape(myShape);

View File

@ -162,6 +162,7 @@ namespace SMESH{
class SMESHCONTROLS_EXPORT MaxElementLength2D: public virtual NumericalFunctor{ class SMESHCONTROLS_EXPORT MaxElementLength2D: public virtual NumericalFunctor{
public: public:
virtual double GetValue( long theElementId ); virtual double GetValue( long theElementId );
virtual double GetValue( const TSequenceOfXYZ& P );
virtual double GetBadRate( double Value, int nbNodes ) const; virtual double GetBadRate( double Value, int nbNodes ) const;
virtual SMDSAbs_ElementType GetType() const; virtual SMDSAbs_ElementType GetType() const;
}; };
@ -783,7 +784,7 @@ namespace SMESH{
bool isOnSurface( const SMDS_MeshNode* theNode ); bool isOnSurface( const SMDS_MeshNode* theNode );
private: private:
const SMDS_Mesh* myMesh; TMeshModifTracer myMeshModifTracer;
TColStd_MapOfInteger myIds; TColStd_MapOfInteger myIds;
SMDSAbs_ElementType myType; SMDSAbs_ElementType myType;
//Handle(Geom_Surface) mySurf; //Handle(Geom_Surface) mySurf;

View File

@ -0,0 +1,66 @@
// 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.hxx
// Created : Thu Nov 15 16:45:58 2012
// Author : Edward AGAPOV (eap)
#include "DriverGMF.hxx"
#include <boost/filesystem.hpp>
extern "C"
{
#include "libmesh5.h"
}
namespace DriverGMF
{
//================================================================================
/*!
* \brief Closes GMF mesh at destruction
*/
//================================================================================
MeshCloser::~MeshCloser()
{
if ( _gmfMeshID )
GmfCloseMesh( _gmfMeshID );
}
//================================================================================
/*!
* \brief Checks GMF file extension
*/
//================================================================================
bool isExtensionCorrect( const std::string& fileName )
{
std::string ext = boost::filesystem::extension(fileName);
switch ( ext.size() ) {
case 5: return ( ext == ".mesh" || ext == ".solb" );
case 6: return ( ext == ".meshb" );
case 4: return ( ext == ".sol" );
}
return false;
}
}

View File

@ -0,0 +1,46 @@
// 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.hxx
// Created : Thu Nov 15 16:45:58 2012
// Author : Edward AGAPOV (eap)
#ifndef __DriverGMF_HXX__
#define __DriverGMF_HXX__
#include <string>
namespace DriverGMF
{
/*!
* \brief An object closing GMF mesh at destruction
*/
struct MeshCloser
{
int _gmfMeshID;
MeshCloser( const int gmfMeshID ): _gmfMeshID(gmfMeshID) {}
~MeshCloser();
};
bool isExtensionCorrect( const std::string& fileName );
}
#endif

View File

@ -24,12 +24,14 @@
// Author : Edward AGAPOV (eap) // Author : Edward AGAPOV (eap)
#include "DriverGMF_Read.hxx" #include "DriverGMF_Read.hxx"
#include "DriverGMF_Write.hxx" #include "DriverGMF.hxx"
#include "SMESHDS_Group.hxx" #include "SMESHDS_Group.hxx"
#include "SMESHDS_Mesh.hxx" #include "SMESHDS_Mesh.hxx"
#include "SMESH_Comment.hxx" #include "SMESH_Comment.hxx"
#include <Basics_Utils.hxx>
extern "C" extern "C"
{ {
#include "libmesh5.h" #include "libmesh5.h"
@ -37,16 +39,10 @@ extern "C"
#include <stdarg.h> #include <stdarg.h>
// --------------------------------------------------------------------------------
// Closing GMF mesh at destruction
DriverGMF_MeshCloser::~DriverGMF_MeshCloser()
{
if ( _gmfMeshID )
GmfCloseMesh( _gmfMeshID );
}
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
DriverGMF_Read::DriverGMF_Read(): DriverGMF_Read::DriverGMF_Read():
Driver_SMESHDS_Mesh() Driver_SMESHDS_Mesh(),
_makeRequiredGroups( true )
{ {
} }
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
@ -62,6 +58,8 @@ DriverGMF_Read::~DriverGMF_Read()
Driver_Mesh::Status DriverGMF_Read::Perform() Driver_Mesh::Status DriverGMF_Read::Perform()
{ {
Kernel_Utils::Localizer loc;
Status status = DRS_OK; Status status = DRS_OK;
int dim, version; int dim, version;
@ -69,9 +67,13 @@ Driver_Mesh::Status DriverGMF_Read::Perform()
// open the file // open the file
int meshID = GmfOpenMesh( myFile.c_str(), GmfRead, &version, &dim ); int meshID = GmfOpenMesh( myFile.c_str(), GmfRead, &version, &dim );
if ( !meshID ) if ( !meshID )
return addMessage( SMESH_Comment("Can't open for reading ") << myFile, /*fatal=*/true ); {
if ( DriverGMF::isExtensionCorrect( myFile ))
DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction return addMessage( SMESH_Comment("Can't open for reading ") << myFile, /*fatal=*/true );
else
return addMessage( SMESH_Comment("Not '.mesh' or '.meshb' extension of file ") << myFile, /*fatal=*/true );
}
DriverGMF::MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
// Read nodes // Read nodes
@ -277,40 +279,43 @@ Driver_Mesh::Status DriverGMF_Read::Perform()
// Read required entities into groups // Read required entities into groups
// get ids of existing groups if ( _makeRequiredGroups )
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]; // get ids of existing groups
SMDSAbs_ElementType entity = (SMDSAbs_ElementType) kes[i][1]; std::set< int > groupIDs;
int shift = kes[i][2]; const std::set<SMESHDS_GroupBase*>& groups = myMesh->GetGroups();
if ( int nb = GmfStatKwd(meshID, gmfKwd)) std::set<SMESHDS_GroupBase*>::const_iterator grIter = groups.begin();
{ for ( ; grIter != groups.end(); ++grIter )
const int newID = *groupIDs.rbegin() + 1; groupIDs.insert( (*grIter)->GetID() );
groupIDs.insert( newID ); if ( groupIDs.empty() ) groupIDs.insert( 0 );
SMESHDS_Group* group = new SMESHDS_Group( newID, myMesh, entity );
group->SetStoreName( names[i] );
myMesh->AddGroup( group );
GmfGotoKwd(meshID, gmfKwd); const int kes[4][3] = { { GmfRequiredVertices, SMDSAbs_Node, nodeIDShift },
for ( int i = 0; i < nb; ++i ) { 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))
{ {
GmfGetLin(meshID, gmfKwd, &iN[0] ); const int newID = *groupIDs.rbegin() + 1;
group->Add( shift + iN[0] ); 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] );
}
} }
} }
} }

View File

@ -45,12 +45,19 @@ public:
DriverGMF_Read(); DriverGMF_Read();
~DriverGMF_Read(); ~DriverGMF_Read();
void SetMakeRequiredGroups( bool theMakeRequiredGroups )
{
_makeRequiredGroups = theMakeRequiredGroups;
}
virtual Status Perform(); virtual Status Perform();
private: private:
Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...); Status storeBadNodeIds(const char* gmfKwd, int elemNb, int nb, ...);
bool _makeRequiredGroups;
}; };

View File

@ -24,11 +24,14 @@
// Author : Edward AGAPOV (eap) // Author : Edward AGAPOV (eap)
#include "DriverGMF_Write.hxx" #include "DriverGMF_Write.hxx"
#include "DriverGMF.hxx"
#include "SMESHDS_GroupBase.hxx" #include "SMESHDS_GroupBase.hxx"
#include "SMESHDS_Mesh.hxx" #include "SMESHDS_Mesh.hxx"
#include "SMESH_Comment.hxx" #include "SMESH_Comment.hxx"
#include <Basics_Utils.hxx>
extern "C" extern "C"
{ {
#include "libmesh5.h" #include "libmesh5.h"
@ -57,7 +60,7 @@ extern "C"
DriverGMF_Write::DriverGMF_Write(): DriverGMF_Write::DriverGMF_Write():
Driver_SMESHDS_Mesh() Driver_SMESHDS_Mesh(), _exportRequiredGroups( true )
{ {
} }
DriverGMF_Write::~DriverGMF_Write() DriverGMF_Write::~DriverGMF_Write()
@ -66,13 +69,20 @@ DriverGMF_Write::~DriverGMF_Write()
Driver_Mesh::Status DriverGMF_Write::Perform() Driver_Mesh::Status DriverGMF_Write::Perform()
{ {
const int dim = 3, version = 3; Kernel_Utils::Localizer loc;
const int dim = 3, version = sizeof(long) == 4 ? 2 : 3;
int meshID = GmfOpenMesh( myFile.c_str(), GmfWrite, version, dim ); int meshID = GmfOpenMesh( myFile.c_str(), GmfWrite, version, dim );
if ( !meshID ) if ( !meshID )
return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true ); {
if ( DriverGMF::isExtensionCorrect( myFile ))
return addMessage( SMESH_Comment("Can't open for writing ") << myFile, /*fatal=*/true );
else
return addMessage( SMESH_Comment("Not '.mesh' or '.meshb' extension of file ") << myFile, /*fatal=*/true );
}
DriverGMF_MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction DriverGMF::MeshCloser aMeshCloser( meshID ); // An object closing GMF mesh at destruction
// nodes // nodes
std::map< const SMDS_MeshNode* , int > node2IdMap; std::map< const SMDS_MeshNode* , int > node2IdMap;
@ -233,85 +243,88 @@ Driver_Mesh::Status DriverGMF_Write::Perform()
END_ELEM_WRITE( prism ); END_ELEM_WRITE( prism );
// required entities if ( _exportRequiredGroups )
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; // required entities
std::string groupName = group->GetStoreName(); SMESH_Comment badGroups;
std::string::size_type pos = groupName.find( "_required_" ); const std::set<SMESHDS_GroupBase*>& groupSet = myMesh->GetGroups();
if ( pos == std::string::npos ) continue; std::set<SMESHDS_GroupBase*>::const_iterator grIt = groupSet.begin();
for ( ; grIt != groupSet.end(); ++grIt )
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; const SMESHDS_GroupBase* group = *grIt;
continue; std::string groupName = group->GetStoreName();
} std::string::size_type pos = groupName.find( "_required_" );
if ( pos == std::string::npos ) continue;
// choose a TElem2IDMap int gmfKwd;
TElem2IDMap* elem2IDMap = 0; SMDSAbs_EntityType smdsEntity;
if ( smdsEntity == SMDSEntity_Quadrangle && nbOkElems != myMesh->NbFaces() ) std::string entity = groupName.substr( pos + strlen("_required_"));
elem2IDMap = & quad2IDMap; if ( entity == "Vertices" ) {
else if ( smdsEntity == SMDSEntity_Triangle && nbOkElems != myMesh->NbFaces() ) gmfKwd = GmfRequiredVertices;
elem2IDMap = & tria2IDMap; smdsEntity = SMDSEntity_Node;
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 else if ( entity == "Edges" ) {
for ( int gmfID = 1; elemIt->more(); ++gmfID) gmfKwd = GmfRequiredEdges;
{ smdsEntity = SMDSEntity_Edge;
const SMDS_MeshElement* elem = elemIt->next(); }
if ( elem->GetEntityType() == smdsEntity ) else if ( entity == "Triangles" ) {
GmfSetLin( meshID, gmfKwd, gmfID ); 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;
} }
} // loop on groups // check elem type in the group
int nbOkElems = 0;
SMDS_ElemIteratorPtr elemIt = group->GetElements();
while ( elemIt->more() )
nbOkElems += ( elemIt->next()->GetEntityType() == smdsEntity );
if ( !badGroups.empty() ) if ( nbOkElems != group->Extent() && nbOkElems == 0 )
addMessage( SMESH_Comment("Groups of elements of inappropriate geometry:") {
<< badGroups, /*fatal=*/false ); 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; return DRS_OK;
} }

View File

@ -42,18 +42,16 @@ public:
DriverGMF_Write(); DriverGMF_Write();
~DriverGMF_Write(); ~DriverGMF_Write();
void SetExportRequiredGroups( bool toExport )
{
_exportRequiredGroups = toExport;
}
virtual Status Perform(); virtual Status Perform();
};
/*! private:
* \brief An object closing GMF mesh at destruction
*/
struct DriverGMF_MeshCloser
{
int _gmfMeshID;
DriverGMF_MeshCloser( const int gmfMeshID ): _gmfMeshID(gmfMeshID) {}
~DriverGMF_MeshCloser();
};
bool _exportRequiredGroups;
};
#endif #endif

View File

@ -23,6 +23,7 @@ include $(top_srcdir)/adm_local/unix/make_common_starter.am
salomeinclude_HEADERS = \ salomeinclude_HEADERS = \
DriverGMF_Read.hxx \ DriverGMF_Read.hxx \
DriverGMF_Write.hxx \ DriverGMF_Write.hxx \
DriverGMF.hxx \
SMESH_DriverGMF.hxx \ SMESH_DriverGMF.hxx \
libmesh5.h libmesh5.h
@ -31,20 +32,22 @@ lib_LTLIBRARIES = libMeshDriverGMF.la
dist_libMeshDriverGMF_la_SOURCES = \ dist_libMeshDriverGMF_la_SOURCES = \
DriverGMF_Read.cxx \ DriverGMF_Read.cxx \
DriverGMF_Write.cxx \ DriverGMF_Write.cxx \
DriverGMF.cxx \
libmesh5.c libmesh5.c
# additionnal information to compil and link file # additionnal information to compil and link file
libMeshDriverGMF_la_CPPFLAGS = \ libMeshDriverGMF_la_CPPFLAGS = \
$(KERNEL_CXXFLAGS) \ $(KERNEL_CXXFLAGS) \
$(CAS_CPPFLAGS) \ $(CAS_CPPFLAGS) \
$(VTK_INCLUDES) \ $(VTK_INCLUDES) \
$(BOOST_CPPFLAGS) \ $(BOOST_CPPFLAGS) -DBOOST_SYSTEM_NO_DEPRECATED \
-I$(srcdir)/../Driver \ -I$(srcdir)/../Driver \
-I$(srcdir)/../SMESHUtils \ -I$(srcdir)/../SMESHUtils \
-I$(srcdir)/../SMDS \ -I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHDS -I$(srcdir)/../SMESHDS
libMeshDriverGMF_la_LDFLAGS = \ libMeshDriverGMF_la_LDFLAGS = \
$(BOOST_LIBS) \ $(BOOST_LIBS) -lboost_filesystem \
../Driver/libMeshDriver.la \ ../Driver/libMeshDriver.la \
../SMESHUtils/libSMESHUtils.la ../SMESHUtils/libSMESHUtils.la \
$(KERNEL_LDFLAGS) -lSALOMEBasics

View File

@ -50,7 +50,9 @@ DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh():
myDoGroupOfNodes (false), myDoGroupOfNodes (false),
myDoGroupOfEdges (false), myDoGroupOfEdges (false),
myDoGroupOfFaces (false), myDoGroupOfFaces (false),
myDoGroupOfVolumes (false) myDoGroupOfVolumes (false),
myDoGroupOf0DElems(false),
myDoGroupOfBalls(false)
{} {}
void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName, void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName,

View File

@ -22,6 +22,8 @@
#include <stdio.h> #include <stdio.h>
#include <gp_Pnt.hxx> #include <gp_Pnt.hxx>
#include <Basics_Utils.hxx>
//======================================================================= //=======================================================================
//function : HashCode //function : HashCode
//purpose : //purpose :
@ -104,6 +106,8 @@ void DriverSTL_R_SMDS_Mesh::SetIsCreateFaces( const bool theIsCreate )
Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::Perform() Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::Perform()
{ {
Kernel_Utils::Localizer loc;
Status aResult = DRS_OK; Status aResult = DRS_OK;
TCollection_AsciiString aFileName( (char *)myFile.c_str() ); TCollection_AsciiString aFileName( (char *)myFile.c_str() );

View File

@ -35,12 +35,11 @@
#include "SMESH_TypeDefs.hxx" #include "SMESH_TypeDefs.hxx"
#include <OSD_File.hxx> #include <OSD_File.hxx>
//#include <OSD_FromWhere.hxx>
#include <OSD_Path.hxx> #include <OSD_Path.hxx>
#include <OSD_Protection.hxx> #include <OSD_Protection.hxx>
//#include <OSD_SingleProtection.hxx>
#include <TCollection_AsciiString.hxx> #include <TCollection_AsciiString.hxx>
#include <gp_XYZ.hxx> #include <gp_XYZ.hxx>
#include <Basics_Utils.hxx>
#include "utilities.h" #include "utilities.h"
@ -59,6 +58,8 @@ void DriverSTL_W_SMDS_Mesh::SetIsAscii( const bool theIsAscii )
Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::Perform() Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::Perform()
{ {
Kernel_Utils::Localizer loc;
Status aResult = DRS_OK; Status aResult = DRS_OK;
if ( !myMesh ) { if ( !myMesh ) {

View File

@ -60,6 +60,7 @@ libMeshDriverSTL_la_CPPFLAGS = \
libMeshDriverSTL_la_LDFLAGS = \ libMeshDriverSTL_la_LDFLAGS = \
../Driver/libMeshDriver.la \ ../Driver/libMeshDriver.la \
../SMDS/libSMDS.la \ ../SMDS/libSMDS.la \
$(KERNEL_LDFLAGS) -lSALOMEBasics \
$(CAS_LDPATH) -lTKernel -lTKSTL -lTKTopAlgo -lTKMesh $(CAS_LDPATH) -lTKernel -lTKSTL -lTKTopAlgo -lTKMesh
STL_Test_CPPFLAGS = \ STL_Test_CPPFLAGS = \

View File

@ -77,7 +77,7 @@ bool SMESH_PreviewActorsCollection::Init( const TopoDS_Shape& theShape,
myMapOfShapes.Clear(); myMapOfShapes.Clear();
myIndices.clear(); myIndices.clear();
myCurrentChunk = 0; myCurrentChunk = 0;
myChunkSize = mgr->integerValue( "SMESH", "preview_actor_chunk_size", 100 ); myChunkSize = qMax(1, mgr->integerValue( "SMESH", "preview_actor_chunk_size", 100 ) );
if ( theShape.IsNull() ) if ( theShape.IsNull() )
return false; return false;

View File

@ -22,8 +22,8 @@
// Author : Edward AGAPOV (eap) // Author : Edward AGAPOV (eap)
// Executable to find out a lower RAM limit (MB), i.e. at what size of freeRAM // Executable to find out a lower RAM limit (MB), i.e. at what size of freeRAM
// reported by sysinfo, no more memory can be allocated. // reported by sysinfo, no more memory can be allocated.
// This is not done inside a function of SALOME because allocated memory is not returned // This is not done inside a function of SALOME because allocated memory is not always
// to the system. (PAL16631) // returned to the system. (PAL16631)
// //
#ifndef WIN32 #ifndef WIN32
#include <sys/sysinfo.h> #include <sys/sysinfo.h>

View File

@ -155,7 +155,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
// check for preview dimension limitations // check for preview dimension limitations
if ( aShapesId && GetShapeDim( aShType ) > (int)aDim ) if ( aShapesId && GetShapeDim( aShType ) > (int)aDim )
{ {
// clear compute state to not show previous compute errors // clear compute state not to show previous compute errors
// if preview invoked less dimension less than previous // if preview invoked less dimension less than previous
smToCompute->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); smToCompute->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
continue; continue;
@ -355,23 +355,8 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
MEMOSTAT; MEMOSTAT;
SMESHDS_Mesh *myMesh = aMesh.GetMeshDS(); SMESHDS_Mesh *myMesh = aMesh.GetMeshDS();
myMesh->adjustStructure();
MESSAGE("*** compactMesh after compute"); MESSAGE("*** compactMesh after compute");
myMesh->compactMesh(); myMesh->compactMesh();
//myMesh->adjustStructure();
list<int> listind = myMesh->SubMeshIndices();
list<int>::iterator it = listind.begin();
int total = 0;
for(; it != listind.end(); ++it)
{
::SMESHDS_SubMesh *subMesh = myMesh->MeshElements(*it);
total += subMesh->getSize();
}
MESSAGE("total elements and nodes in submesh sets:" << total);
MESSAGE("Number of node objects " << SMDS_MeshNode::nbNodes);
MESSAGE("Number of cell objects " << SMDS_MeshCell::nbCells);
//myMesh->dumpGrid();
//aMesh.GetMeshDS()->Modified();
// fix quadratic mesh by bending iternal links near concave boundary // fix quadratic mesh by bending iternal links near concave boundary
if ( aShape.IsSame( aMesh.GetShapeToMesh() ) && if ( aShape.IsSame( aMesh.GetShapeToMesh() ) &&
@ -589,6 +574,8 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh& aMesh,
if ( aLocIgnoAlgo ) // algo is hidden by a local algo of upper dim if ( aLocIgnoAlgo ) // algo is hidden by a local algo of upper dim
{ {
theErrors.push_back( SMESH_Gen::TAlgoStateError() );
theErrors.back().Set( SMESH_Hypothesis::HYP_HIDDEN_ALGO, algo, false );
INFOS( "Local <" << algo->GetName() << "> is hidden by local <" INFOS( "Local <" << algo->GetName() << "> is hidden by local <"
<< aLocIgnoAlgo->GetName() << ">"); << aLocIgnoAlgo->GetName() << ">");
} }
@ -598,9 +585,12 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh& aMesh,
int dim = algo->GetDim(); int dim = algo->GetDim();
int aMaxGlobIgnoDim = ( aGlobIgnoAlgo ? aGlobIgnoAlgo->GetDim() : -1 ); int aMaxGlobIgnoDim = ( aGlobIgnoAlgo ? aGlobIgnoAlgo->GetDim() : -1 );
if ( dim < aMaxGlobIgnoDim ) if ( dim < aMaxGlobIgnoDim &&
( isGlobal || !aGlobIgnoAlgo->SupportSubmeshes() ))
{ {
// algo is hidden by a global algo // algo is hidden by a global algo
theErrors.push_back( SMESH_Gen::TAlgoStateError() );
theErrors.back().Set( SMESH_Hypothesis::HYP_HIDDEN_ALGO, algo, true );
INFOS( ( isGlobal ? "Global" : "Local" ) INFOS( ( isGlobal ? "Global" : "Local" )
<< " <" << algo->GetName() << "> is hidden by global <" << " <" << algo->GetName() << "> is hidden by global <"
<< aGlobIgnoAlgo->GetName() << ">"); << aGlobIgnoAlgo->GetName() << ">");
@ -680,7 +670,7 @@ static bool checkMissing(SMESH_Gen* aGen,
} }
case SMESH_subMesh::MISSING_HYP: { case SMESH_subMesh::MISSING_HYP: {
// notify if an algo missing hyp is attached to aSubMesh // notify if an algo missing hyp is attached to aSubMesh
algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() ); algo = aSubMesh->GetAlgo();
ASSERT( algo ); ASSERT( algo );
bool IsGlobalHypothesis = aGen->IsGlobalHypothesis( algo, aMesh ); bool IsGlobalHypothesis = aGen->IsGlobalHypothesis( algo, aMesh );
if (!IsGlobalHypothesis || !globalChecked[ algo->GetDim() ]) if (!IsGlobalHypothesis || !globalChecked[ algo->GetDim() ])
@ -731,7 +721,7 @@ static bool checkMissing(SMESH_Gen* aGen,
{ {
bool checkNoAlgo2 = ( algo->NeedDiscreteBoundary() ); bool checkNoAlgo2 = ( algo->NeedDiscreteBoundary() );
SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false, SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false,
/*complexShapeFirst=*/false); /*complexShapeFirst=*/true);
while ( itsub->more() ) while ( itsub->more() )
{ {
// sub-meshes should not be checked further more // sub-meshes should not be checked further more
@ -823,7 +813,8 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh,
for (dim = 3; dim > 0; dim--) for (dim = 3; dim > 0; dim--)
{ {
if (aGlobAlgoArr[ dim ] && if (aGlobAlgoArr[ dim ] &&
!aGlobAlgoArr[ dim ]->NeedDiscreteBoundary()) !aGlobAlgoArr[ dim ]->NeedDiscreteBoundary() /*&&
!aGlobAlgoArr[ dim ]->SupportSubmeshes()*/ )
{ {
aGlobIgnoAlgo = aGlobAlgoArr[ dim ]; aGlobIgnoAlgo = aGlobAlgoArr[ dim ];
break; break;
@ -880,14 +871,13 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh,
if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX) if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX)
break; break;
if ( aCheckedSubs.insert( smToCheck ).second ) // not yet checked if (!checkMissing (this, theMesh, smToCheck, aTopAlgoDim,
if (!checkMissing (this, theMesh, smToCheck, aTopAlgoDim, globalChecked, checkNoAlgo, aCheckedSubs, theErrors))
globalChecked, checkNoAlgo, aCheckedSubs, theErrors)) {
{ ret = false;
ret = false; if (smToCheck->GetAlgoState() == SMESH_subMesh::NO_ALGO )
if (smToCheck->GetAlgoState() == SMESH_subMesh::NO_ALGO ) checkNoAlgo = false;
checkNoAlgo = false; }
}
} }
if ( !hasAlgo ) { if ( !hasAlgo ) {

View File

@ -24,7 +24,6 @@
// File : SMESH_Hypothesis.cxx // File : SMESH_Hypothesis.cxx
// Author : Paul RASCLE, EDF // Author : Paul RASCLE, EDF
// Module : SMESH // Module : SMESH
// $Header$
// //
#include "SMESH_Hypothesis.hxx" #include "SMESH_Hypothesis.hxx"
#include "SMESH_Gen.hxx" #include "SMESH_Gen.hxx"
@ -50,8 +49,6 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
_type = PARAM_ALGO; _type = PARAM_ALGO;
_shapeType = 0; // to be set by algo with TopAbs_Enum _shapeType = 0; // to be set by algo with TopAbs_Enum
_param_algo_dim = -1; // to be set by algo parameter _param_algo_dim = -1; // to be set by algo parameter
//_parameters = string();
//_lastParameters = string();
} }
//============================================================================= //=============================================================================
@ -171,59 +168,3 @@ SMESH_Mesh* SMESH_Hypothesis::GetMeshByPersistentID(int id)
} }
return 0; return 0;
} }
//=============================================================================
/*!
*
*/
//=============================================================================
// void SMESH_Hypothesis::SetParameters(const char *theParameters)
// {
// string aNewParameters(theParameters);
// if(aNewParameters.size()==0 && _parameters.size()==0)
// aNewParameters = " ";
// if(_parameters.size()>0)
// _parameters +="|";
// _parameters +=aNewParameters;
// SetLastParameters(theParameters);
// }
// //=============================================================================
// /*!
// *
// */
// //=============================================================================
// void SMESH_Hypothesis::ClearParameters()
// {
// _parameters = string();
// }
// //=============================================================================
// /*!
// *
// */
// //=============================================================================
// char* SMESH_Hypothesis::GetParameters() const
// {
// return (char*)_parameters.c_str();
// }
// //=============================================================================
// /*!
// *
// */
// //=============================================================================
// char* SMESH_Hypothesis::GetLastParameters() const
// {
// return (char*)_lastParameters.c_str();
// }
// //=============================================================================
// /*!
// *
// */
// //=============================================================================
// void SMESH_Hypothesis::SetLastParameters(const char* theParameters)
// {
// _lastParameters = string(theParameters);
// }

View File

@ -347,16 +347,32 @@ void SMESH_Mesh::Load()
void SMESH_Mesh::Clear() void SMESH_Mesh::Clear()
{ {
// clear mesh data if ( HasShapeToMesh() ) // remove all nodes and elements
_myMeshDS->ClearMesh();
// update compute state of submeshes
if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
{ {
sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); // clear mesh data
sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); _myMeshDS->ClearMesh();
sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // for event listeners (issue 0020918)
sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN ); // update compute state of submeshes
if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
{
sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
sm->ComputeSubMeshStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE );
sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // for event listeners (issue 0020918)
sm->ComputeSubMeshStateEngine( SMESH_subMesh::CLEAN );
}
}
else // remove only nodes/elements computed by algorithms
{
if ( SMESH_subMesh *sm = GetSubMeshContaining( GetShapeToMesh() ) )
{
SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true,
/*complexShapeFirst=*/true);
while ( smIt->more() )
{
sm = smIt->next();
sm->ComputeStateEngine( SMESH_subMesh::CLEAN );
}
}
} }
_isModified = false; _isModified = false;
} }
@ -545,11 +561,13 @@ int SMESH_Mesh::CGNSToMesh(const char* theFileName,
*/ */
//================================================================================ //================================================================================
SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName) SMESH_ComputeErrorPtr SMESH_Mesh::GMFToMesh(const char* theFileName,
bool theMakeRequiredGroups)
{ {
DriverGMF_Read myReader; DriverGMF_Read myReader;
myReader.SetMesh(_myMeshDS); myReader.SetMesh(_myMeshDS);
myReader.SetFile(theFileName); myReader.SetFile(theFileName);
myReader.SetMakeRequiredGroups( theMakeRequiredGroups );
myReader.Perform(); myReader.Perform();
//theMeshName = myReader.GetMeshName(); //theMeshName = myReader.GetMeshName();
@ -1419,11 +1437,14 @@ void SMESH_Mesh::ExportCGNS(const char * file,
//================================================================================ //================================================================================
void SMESH_Mesh::ExportGMF(const char * file, void SMESH_Mesh::ExportGMF(const char * file,
const SMESHDS_Mesh* meshDS) const SMESHDS_Mesh* meshDS,
bool withRequiredGroups)
{ {
DriverGMF_Write myWriter; DriverGMF_Write myWriter;
myWriter.SetFile( file ); myWriter.SetFile( file );
myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS )); myWriter.SetMesh( const_cast<SMESHDS_Mesh*>( meshDS ));
myWriter.SetExportRequiredGroups( withRequiredGroups );
myWriter.Perform(); myWriter.Perform();
} }
@ -1999,7 +2020,9 @@ void SMESH_Mesh::fillAncestorsMap(const TopoDS_Shape& theShape)
{ {
// a geom group is added. Insert it into lists of ancestors before // a geom group is added. Insert it into lists of ancestors before
// the first ancestor more complex than group members // the first ancestor more complex than group members
int memberType = TopoDS_Iterator( theShape ).Value().ShapeType(); TopoDS_Iterator subIt( theShape );
if ( !subIt.More() ) return;
int memberType = subIt.Value().ShapeType();
for ( desType = TopAbs_VERTEX; desType >= memberType; desType-- ) for ( desType = TopAbs_VERTEX; desType >= memberType; desType-- )
for (TopExp_Explorer des( theShape, TopAbs_ShapeEnum( desType )); des.More(); des.Next()) for (TopExp_Explorer des( theShape, TopAbs_ShapeEnum( desType )); des.More(); des.Next())
{ {

View File

@ -122,7 +122,8 @@ public:
int CGNSToMesh(const char* theFileName, const int theMeshIndex, std::string& theMeshName); int CGNSToMesh(const char* theFileName, const int theMeshIndex, std::string& theMeshName);
SMESH_ComputeErrorPtr GMFToMesh(const char* theFileName); SMESH_ComputeErrorPtr GMFToMesh(const char* theFileName,
bool theMakeRequiredGroups = true );
SMESH_Hypothesis::Hypothesis_Status SMESH_Hypothesis::Hypothesis_Status
AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId) AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
@ -244,7 +245,8 @@ public:
void ExportCGNS(const char * file, void ExportCGNS(const char * file,
const SMESHDS_Mesh* mesh); const SMESHDS_Mesh* mesh);
void ExportGMF(const char * file, void ExportGMF(const char * file,
const SMESHDS_Mesh* mesh); const SMESHDS_Mesh* mesh,
bool withRequiredGroups = true );
void ExportSAUV(const char *file, void ExportSAUV(const char *file,
const char* theMeshName = NULL, const char* theMeshName = NULL,
bool theAutoGroups = true) throw(SALOME_Exception); bool theAutoGroups = true) throw(SALOME_Exception);

View File

@ -120,6 +120,19 @@ SMESH_MeshEditor::SMESH_MeshEditor( SMESH_Mesh* theMesh )
{ {
} }
//================================================================================
/*!
* \brief Clears myLastCreatedNodes and myLastCreatedElems
*/
//================================================================================
void SMESH_MeshEditor::CrearLastCreated()
{
myLastCreatedNodes.Clear();
myLastCreatedElems.Clear();
}
//======================================================================= //=======================================================================
/*! /*!
* \brief Add element * \brief Add element
@ -389,6 +402,44 @@ int SMESH_MeshEditor::Remove (const list< int >& theIDs,
return removed; return removed;
} }
//================================================================================
/*!
* \brief Create 0D elements on all nodes of the given object except those
* nodes on which a 0D element already exists.
* \param elements - Elements on whose nodes to create 0D elements; if empty,
* the all mesh is treated
* \param all0DElems - returns all 0D elements found or created on nodes of \a elements
*/
//================================================================================
void SMESH_MeshEditor::Create0DElementsOnAllNodes( const TIDSortedElemSet& elements,
TIDSortedElemSet& all0DElems )
{
typedef SMDS_SetIterator<const SMDS_MeshElement*, TIDSortedElemSet::const_iterator> TSetIterator;
SMDS_ElemIteratorPtr elemIt;
if ( elements.empty() )
elemIt = GetMeshDS()->elementsIterator( SMDSAbs_Node );
else
elemIt = SMDS_ElemIteratorPtr( new TSetIterator( elements.begin(), elements.end() ));
while ( elemIt->more() )
{
const SMDS_MeshElement* e = elemIt->next();
SMDS_ElemIteratorPtr nodeIt = e->nodesIterator();
while ( nodeIt->more() )
{
const SMDS_MeshNode* n = cast2Node( nodeIt->next() );
SMDS_ElemIteratorPtr it0D = n->GetInverseElementIterator( SMDSAbs_0DElement );
if ( it0D->more() )
all0DElems.insert( it0D->next() );
else {
myLastCreatedElems.Append( GetMeshDS()->Add0DElement( n ));
all0DElems.insert( myLastCreatedElems.Last() );
}
}
}
}
//======================================================================= //=======================================================================
//function : FindShape //function : FindShape
//purpose : Return an index of the shape theElem is on //purpose : Return an index of the shape theElem is on
@ -1065,7 +1116,7 @@ bool SMESH_MeshEditor::Reorient (const SMDS_MeshElement * theElem)
* \brief Reorient faces. * \brief Reorient faces.
* \param theFaces - the faces to reorient. If empty the whole mesh is meant * \param theFaces - the faces to reorient. If empty the whole mesh is meant
* \param theDirection - desired direction of normal of \a theFace * \param theDirection - desired direction of normal of \a theFace
* \param theFace - one of \a theFaces that sould be orientated according to * \param theFace - one of \a theFaces that sould be oriented according to
* \a theDirection and whose orientation defines orientation of other faces * \a theDirection and whose orientation defines orientation of other faces
* \return number of reoriented faces. * \return number of reoriented faces.
*/ */
@ -1093,7 +1144,7 @@ int SMESH_MeshEditor::Reorient2D (TIDSortedElemSet & theFaces,
// Orient other faces // Orient other faces
set< const SMDS_MeshElement* > startFaces; set< const SMDS_MeshElement* > startFaces, visitedFaces;
TIDSortedElemSet avoidSet; TIDSortedElemSet avoidSet;
set< SMESH_TLink > checkedLinks; set< SMESH_TLink > checkedLinks;
pair< set< SMESH_TLink >::iterator, bool > linkIt_isNew; pair< set< SMESH_TLink >::iterator, bool > linkIt_isNew;
@ -1102,16 +1153,26 @@ int SMESH_MeshEditor::Reorient2D (TIDSortedElemSet & theFaces,
theFaces.erase( theFace ); theFaces.erase( theFace );
startFaces.insert( theFace ); startFaces.insert( theFace );
int nodeInd1, nodeInd2;
const SMDS_MeshElement* otherFace;
vector< const SMDS_MeshElement* > facesNearLink;
vector< std::pair< int, int > > nodeIndsOfFace;
set< const SMDS_MeshElement* >::iterator startFace = startFaces.begin(); set< const SMDS_MeshElement* >::iterator startFace = startFaces.begin();
while ( startFace != startFaces.end() ) while ( !startFaces.empty() )
{ {
startFace = startFaces.begin();
theFace = *startFace; theFace = *startFace;
const int nbNodes = theFace->NbCornerNodes(); startFaces.erase( startFace );
if ( !visitedFaces.insert( theFace ).second )
continue;
avoidSet.clear(); avoidSet.clear();
avoidSet.insert(theFace); avoidSet.insert(theFace);
NLink link( theFace->GetNode( 0 ), 0 ); NLink link( theFace->GetNode( 0 ), 0 );
const int nbNodes = theFace->NbCornerNodes();
for ( int i = 0; i < nbNodes; ++i ) // loop on links of theFace for ( int i = 0; i < nbNodes; ++i ) // loop on links of theFace
{ {
link.second = theFace->GetNode(( i+1 ) % nbNodes ); link.second = theFace->GetNode(( i+1 ) % nbNodes );
@ -1120,33 +1181,61 @@ int SMESH_MeshEditor::Reorient2D (TIDSortedElemSet & theFaces,
{ {
// link has already been checked and won't be encountered more // link has already been checked and won't be encountered more
// if the group (theFaces) is manifold // if the group (theFaces) is manifold
checkedLinks.erase( linkIt_isNew.first ); //checkedLinks.erase( linkIt_isNew.first );
} }
else else
{ {
int nodeInd1, nodeInd2; facesNearLink.clear();
const SMDS_MeshElement* otherFace = FindFaceInSet( link.first, link.second, nodeIndsOfFace.clear();
theFaces, avoidSet, while (( otherFace = FindFaceInSet( link.first, link.second,
& nodeInd1, & nodeInd2); theFaces, avoidSet, &nodeInd1, &nodeInd2 )))
if ( otherFace != theFace)
{
facesNearLink.push_back( otherFace );
nodeIndsOfFace.push_back( make_pair( nodeInd1, nodeInd2 ));
avoidSet.insert( otherFace );
}
if ( facesNearLink.size() > 1 )
{
// NON-MANIFOLD mesh shell !
// select a face most co-directed with theFace,
// other faces won't be visited this time
gp_XYZ NF, NOF;
SMESH_Algo::FaceNormal( theFace, NF, /*normalized=*/false );
double proj, maxProj = -1;
for ( size_t i = 0; i < facesNearLink.size(); ++i ) {
SMESH_Algo::FaceNormal( facesNearLink[i], NOF, /*normalized=*/false );
if (( proj = Abs( NF * NOF )) > maxProj ) {
maxProj = proj;
otherFace = facesNearLink[i];
nodeInd1 = nodeIndsOfFace[i].first;
nodeInd2 = nodeIndsOfFace[i].second;
}
}
// not to visit rejected faces
for ( size_t i = 0; i < facesNearLink.size(); ++i )
if ( facesNearLink[i] != otherFace && theFaces.size() > 1 )
visitedFaces.insert( facesNearLink[i] );
}
else if ( facesNearLink.size() == 1 )
{
otherFace = facesNearLink[0];
nodeInd1 = nodeIndsOfFace.back().first;
nodeInd2 = nodeIndsOfFace.back().second;
}
if ( otherFace && otherFace != theFace) if ( otherFace && otherFace != theFace)
{ {
// link must be reversed in otherFace if orientation ot otherFace // link must be reverse in otherFace if orientation ot otherFace
// is same as that of theFace // is same as that of theFace
if ( abs(nodeInd2-nodeInd1) == 1 ? nodeInd2 > nodeInd1 : nodeInd1 > nodeInd2 ) if ( abs(nodeInd2-nodeInd1) == 1 ? nodeInd2 > nodeInd1 : nodeInd1 > nodeInd2 )
{ {
// cout << "Reorient " << otherFace->GetID() << " near theFace=" <<theFace->GetID()
// << " \tlink( " << link.first->GetID() << " " << link.second->GetID() << endl;
nbReori += Reorient( otherFace ); nbReori += Reorient( otherFace );
} }
startFaces.insert( otherFace ); startFaces.insert( otherFace );
if ( theFaces.size() > 1 ) // leave 1 face to prevent finding not selected faces
theFaces.erase( otherFace );
} }
} }
std::swap( link.first, link.second ); std::swap( link.first, link.second ); // reverse the link
} }
startFaces.erase( startFace );
startFace = startFaces.begin();
} }
return nbReori; return nbReori;
} }
@ -1216,7 +1305,8 @@ bool SMESH_MeshEditor::QuadToTri (TIDSortedElemSet & theElems,
if( !elem->IsQuadratic() ) { if( !elem->IsQuadratic() ) {
// split liner quadrangle // split liner quadrangle
// for MaxElementLength2D functor we return minimum diagonal for splitting,
// because aBadRate1=2*len(diagonal 1-3); aBadRate2=2*len(diagonal 2-4)
if ( aBadRate1 <= aBadRate2 ) { if ( aBadRate1 <= aBadRate2 ) {
// tr1 + tr2 is better // tr1 + tr2 is better
newElem1 = aMesh->AddFace( aNodes[2], aNodes[3], aNodes[0] ); newElem1 = aMesh->AddFace( aNodes[2], aNodes[3], aNodes[0] );
@ -1350,7 +1440,8 @@ int SMESH_MeshEditor::BestSplit (const SMDS_MeshElement* theQuad,
SMDS_FaceOfNodes tr3 ( aNodes[1], aNodes[2], aNodes[3] ); SMDS_FaceOfNodes tr3 ( aNodes[1], aNodes[2], aNodes[3] );
SMDS_FaceOfNodes tr4 ( aNodes[3], aNodes[0], aNodes[1] ); SMDS_FaceOfNodes tr4 ( aNodes[3], aNodes[0], aNodes[1] );
aBadRate2 = getBadRate( &tr3, theCrit ) + getBadRate( &tr4, theCrit ); aBadRate2 = getBadRate( &tr3, theCrit ) + getBadRate( &tr4, theCrit );
// for MaxElementLength2D functor we return minimum diagonal for splitting,
// because aBadRate1=2*len(diagonal 1-3); aBadRate2=2*len(diagonal 2-4)
if (aBadRate1 <= aBadRate2) // tr1 + tr2 is better if (aBadRate1 <= aBadRate2) // tr1 + tr2 is better
return 1; // diagonal 1-3 return 1; // diagonal 1-3
@ -3062,7 +3153,7 @@ void SMESH_MeshEditor::Smooth (TIDSortedElemSet & theElems,
SMDS_FaceIteratorPtr fIt = aMesh->facesIterator(); SMDS_FaceIteratorPtr fIt = aMesh->facesIterator();
while ( fIt->more() ) { while ( fIt->more() ) {
const SMDS_MeshElement* face = fIt->next(); const SMDS_MeshElement* face = fIt->next();
theElems.insert( face ); theElems.insert( theElems.end(), face );
} }
} }
// get all face ids theElems are on // get all face ids theElems are on
@ -5082,10 +5173,16 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
if ( BRep_Tool::Degenerated( aTrackEdge ) ) if ( BRep_Tool::Degenerated( aTrackEdge ) )
return EXTR_BAD_PATH_SHAPE; return EXTR_BAD_PATH_SHAPE;
TopExp::Vertices( aTrackEdge, aV1, aV2 ); TopExp::Vertices( aTrackEdge, aV1, aV2 );
aItN = theTrack->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes(); const SMDS_MeshNode* aN1 = 0;
const SMDS_MeshNode* aN1 = aItN->next(); const SMDS_MeshNode* aN2 = 0;
aItN = theTrack->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes(); if ( theTrack->GetSubMesh( aV1 ) && theTrack->GetSubMesh( aV1 )->GetSubMeshDS() ) {
const SMDS_MeshNode* aN2 = aItN->next(); aItN = theTrack->GetSubMesh( aV1 )->GetSubMeshDS()->GetNodes();
aN1 = aItN->next();
}
if ( theTrack->GetSubMesh( aV2 ) && theTrack->GetSubMesh( aV2 )->GetSubMeshDS() ) {
aItN = theTrack->GetSubMesh( aV2 )->GetSubMeshDS()->GetNodes();
aN2 = aItN->next();
}
// starting node must be aN1 or aN2 // starting node must be aN1 or aN2
if ( !( aN1 == theN1 || aN2 == theN1 ) ) if ( !( aN1 == theN1 || aN2 == theN1 ) )
return EXTR_BAD_STARTING_NODE; return EXTR_BAD_STARTING_NODE;
@ -5115,7 +5212,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
} }
} }
list< list<SMESH_MeshEditor_PathPoint> > LLPPs; list< list<SMESH_MeshEditor_PathPoint> > LLPPs;
int startNid = theN1->GetID(); TopoDS_Vertex aVprev;
TColStd_MapOfInteger UsedNums; TColStd_MapOfInteger UsedNums;
int NbEdges = Edges.Length(); int NbEdges = Edges.Length();
int i = 1; int i = 1;
@ -5129,17 +5226,37 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
SMESH_subMesh* locTrack = *itLSM; SMESH_subMesh* locTrack = *itLSM;
SMESHDS_SubMesh* locMeshDS = locTrack->GetSubMeshDS(); SMESHDS_SubMesh* locMeshDS = locTrack->GetSubMeshDS();
TopExp::Vertices( aTrackEdge, aV1, aV2 ); TopExp::Vertices( aTrackEdge, aV1, aV2 );
aItN = locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS()->GetNodes(); bool aN1isOK = false, aN2isOK = false;
const SMDS_MeshNode* aN1 = aItN->next(); if ( aVprev.IsNull() ) {
aItN = locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS()->GetNodes(); // if previous vertex is not yet defined, it means that we in the beginning of wire
const SMDS_MeshNode* aN2 = aItN->next(); // and we have to find initial vertex corresponding to starting node theN1
// starting node must be aN1 or aN2 const SMDS_MeshNode* aN1 = 0;
if ( !( aN1->GetID() == startNid || aN2->GetID() == startNid ) ) continue; const SMDS_MeshNode* aN2 = 0;
if ( locTrack->GetFather()->GetSubMesh(aV1) && locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS() ) {
aItN = locTrack->GetFather()->GetSubMesh(aV1)->GetSubMeshDS()->GetNodes();
aN1 = aItN->next();
}
if ( locTrack->GetFather()->GetSubMesh(aV2) && locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS() ) {
aItN = locTrack->GetFather()->GetSubMesh(aV2)->GetSubMeshDS()->GetNodes();
aN2 = aItN->next();
}
// starting node must be aN1 or aN2
aN1isOK = ( aN1 && aN1 == theN1 );
aN2isOK = ( aN2 && aN2 == theN1 );
}
else {
// we have specified ending vertex of the previous edge on the previous iteration
// and we have just to check that it corresponds to any vertex in current segment
aN1isOK = aVprev.IsSame( aV1 );
aN2isOK = aVprev.IsSame( aV2 );
}
if ( !aN1isOK && !aN2isOK ) continue;
// 2. Collect parameters on the track edge // 2. Collect parameters on the track edge
aPrms.clear(); aPrms.clear();
aItN = locMeshDS->GetNodes(); aItN = locMeshDS->GetNodes();
while ( aItN->more() ) { while ( aItN->more() ) {
const SMDS_MeshNode* pNode = aItN->next(); const SMDS_MeshNode* pNode = aItN->next();
const SMDS_EdgePosition* pEPos = const SMDS_EdgePosition* pEPos =
static_cast<const SMDS_EdgePosition*>( pNode->GetPosition() ); static_cast<const SMDS_EdgePosition*>( pNode->GetPosition() );
double aT = pEPos->GetUParameter(); double aT = pEPos->GetUParameter();
@ -5147,12 +5264,12 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
} }
list<SMESH_MeshEditor_PathPoint> LPP; list<SMESH_MeshEditor_PathPoint> LPP;
//Extrusion_Error err = //Extrusion_Error err =
MakeEdgePathPoints(aPrms, aTrackEdge,(aN1->GetID()==startNid), LPP); MakeEdgePathPoints(aPrms, aTrackEdge, aN1isOK, LPP);
LLPPs.push_back(LPP); LLPPs.push_back(LPP);
UsedNums.Add(k); UsedNums.Add(k);
// update startN for search following egde // update startN for search following egde
if( aN1->GetID() == startNid ) startNid = aN2->GetID(); if ( aN1isOK ) aVprev = aV2;
else startNid = aN1->GetID(); else aVprev = aV1;
break; break;
} }
} }
@ -5171,8 +5288,7 @@ SMESH_MeshEditor::ExtrusionAlongTrack (TIDSortedElemSet & theElements,
SMESH_MeshEditor_PathPoint PP2 = currList.front(); SMESH_MeshEditor_PathPoint PP2 = currList.front();
gp_Dir D1 = PP1.Tangent(); gp_Dir D1 = PP1.Tangent();
gp_Dir D2 = PP2.Tangent(); gp_Dir D2 = PP2.Tangent();
gp_Dir Dnew( gp_Vec( (D1.X()+D2.X())/2, (D1.Y()+D2.Y())/2, gp_Dir Dnew( ( D1.XYZ() + D2.XYZ() ) / 2 );
(D1.Z()+D2.Z())/2 ) );
PP1.SetTangent(Dnew); PP1.SetTangent(Dnew);
fullList.push_back(PP1); fullList.push_back(PP1);
itPP++; itPP++;
@ -5891,7 +6007,7 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens,
vector< TOldNewGroup* > orderedOldNewGroups; // in order of old groups vector< TOldNewGroup* > orderedOldNewGroups; // in order of old groups
// group names // group names
set< string > groupNames; set< string > groupNames;
SMESH_Mesh::GroupIteratorPtr groupIt = GetMesh()->GetGroups(); SMESH_Mesh::GroupIteratorPtr groupIt = GetMesh()->GetGroups();
if ( !groupIt->more() ) return newGroupIDs; if ( !groupIt->more() ) return newGroupIDs;
@ -6103,7 +6219,7 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher
} }
else if ( tree->NbNodes() ) // put a tree to the treeMap else if ( tree->NbNodes() ) // put a tree to the treeMap
{ {
const Bnd_B3d& box = tree->getBox(); const Bnd_B3d& box = *tree->getBox();
double sqDist = thePnt.SquareDistance( 0.5 * ( box.CornerMin() + box.CornerMax() )); double sqDist = thePnt.SquareDistance( 0.5 * ( box.CornerMin() + box.CornerMax() ));
pair<TDistTreeMap::iterator,bool> it_in = treeMap.insert( make_pair( sqDist, tree )); pair<TDistTreeMap::iterator,bool> it_in = treeMap.insert( make_pair( sqDist, tree ));
if ( !it_in.second ) // not unique distance to box center if ( !it_in.second ) // not unique distance to box center
@ -6115,7 +6231,7 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher
TDistTreeMap::iterator sqDist_tree = treeMap.begin(); TDistTreeMap::iterator sqDist_tree = treeMap.begin();
if ( treeMap.size() > 5 ) { if ( treeMap.size() > 5 ) {
SMESH_OctreeNode* closestTree = sqDist_tree->second; SMESH_OctreeNode* closestTree = sqDist_tree->second;
const Bnd_B3d& box = closestTree->getBox(); const Bnd_B3d& box = *closestTree->getBox();
double limit = sqrt( sqDist_tree->first ) + sqrt ( box.SquareExtent() ); double limit = sqrt( sqDist_tree->first ) + sqrt ( box.SquareExtent() );
sqLimit = limit * limit; sqLimit = limit * limit;
} }
@ -6200,7 +6316,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
protected: protected:
ElementBndBoxTree():_size(0) {} ElementBndBoxTree():_size(0) {}
SMESH_Octree* allocateOctreeChild() const { return new ElementBndBoxTree; } SMESH_Octree* newChild() const { return new ElementBndBoxTree; }
void buildChildrenData(); void buildChildrenData();
Bnd_B3d* buildRootBox(); Bnd_B3d* buildRootBox();
private: private:
@ -6222,7 +6338,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
//================================================================================ //================================================================================
ElementBndBoxTree::ElementBndBoxTree(const SMDS_Mesh& mesh, SMDSAbs_ElementType elemType, SMDS_ElemIteratorPtr theElemIt, double tolerance) ElementBndBoxTree::ElementBndBoxTree(const SMDS_Mesh& mesh, SMDSAbs_ElementType elemType, SMDS_ElemIteratorPtr theElemIt, double tolerance)
:SMESH_Octree( new SMESH_Octree::Limit( MaxLevel, /*minSize=*/0. )) :SMESH_Octree( new SMESH_TreeLimit( MaxLevel, /*minSize=*/0. ))
{ {
int nbElems = mesh.GetMeshInfo().NbElements( elemType ); int nbElems = mesh.GetMeshInfo().NbElements( elemType );
_elements.reserve( nbElems ); _elements.reserve( nbElems );
@ -6273,7 +6389,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
{ {
for (int j = 0; j < 8; j++) for (int j = 0; j < 8; j++)
{ {
if ( !_elements[i]->IsOut( myChildren[j]->getBox() )) if ( !_elements[i]->IsOut( *myChildren[j]->getBox() ))
{ {
_elements[i]->_refCount++; _elements[i]->_refCount++;
((ElementBndBoxTree*)myChildren[j])->_elements.push_back( _elements[i]); ((ElementBndBoxTree*)myChildren[j])->_elements.push_back( _elements[i]);
@ -6304,7 +6420,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
void ElementBndBoxTree::getElementsNearPoint( const gp_Pnt& point, void ElementBndBoxTree::getElementsNearPoint( const gp_Pnt& point,
TIDSortedElemSet& foundElems) TIDSortedElemSet& foundElems)
{ {
if ( getBox().IsOut( point.XYZ() )) if ( getBox()->IsOut( point.XYZ() ))
return; return;
if ( isLeaf() ) if ( isLeaf() )
@ -6329,7 +6445,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
void ElementBndBoxTree::getElementsNearLine( const gp_Ax1& line, void ElementBndBoxTree::getElementsNearLine( const gp_Ax1& line,
TIDSortedElemSet& foundElems) TIDSortedElemSet& foundElems)
{ {
if ( getBox().IsOut( line )) if ( getBox()->IsOut( line ))
return; return;
if ( isLeaf() ) if ( isLeaf() )
@ -6355,7 +6471,7 @@ namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint()
const double radius, const double radius,
TIDSortedElemSet& foundElems) TIDSortedElemSet& foundElems)
{ {
if ( getBox().IsOut( center, radius )) if ( getBox()->IsOut( center, radius ))
return; return;
if ( isLeaf() ) if ( isLeaf() )
@ -6657,7 +6773,7 @@ void SMESH_ElementSearcherImpl::findOuterBoundary(const SMDS_MeshElement* outerF
* \brief Find elements of given type where the given point is IN or ON. * \brief Find elements of given type where the given point is IN or ON.
* Returns nb of found elements and elements them-selves. * Returns nb of found elements and elements them-selves.
* *
* 'ALL' type means elements of any type excluding nodes, balls and 0D elements * 'ALL' type means elements of any type excluding nodes, balls and 0D elements
*/ */
//======================================================================= //=======================================================================
@ -6734,13 +6850,13 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt& point,
} }
TIDSortedElemSet suspectElems; TIDSortedElemSet suspectElems;
_ebbTree->getElementsNearPoint( point, suspectElems ); _ebbTree->getElementsNearPoint( point, suspectElems );
if ( suspectElems.empty() && _ebbTree->maxSize() > 0 ) if ( suspectElems.empty() && _ebbTree->maxSize() > 0 )
{ {
gp_Pnt boxCenter = 0.5 * ( _ebbTree->getBox().CornerMin() + gp_Pnt boxCenter = 0.5 * ( _ebbTree->getBox()->CornerMin() +
_ebbTree->getBox().CornerMax() ); _ebbTree->getBox()->CornerMax() );
double radius; double radius;
if ( _ebbTree->getBox().IsOut( point.XYZ() )) if ( _ebbTree->getBox()->IsOut( point.XYZ() ))
radius = point.Distance( boxCenter ) - 0.5 * _ebbTree->maxSize(); radius = point.Distance( boxCenter ) - 0.5 * _ebbTree->maxSize();
else else
radius = _ebbTree->maxSize() / pow( 2., _ebbTree->getHeight()) / 2; radius = _ebbTree->maxSize() / pow( 2., _ebbTree->getHeight()) / 2;
@ -7242,7 +7358,7 @@ namespace
POS_ALL = POS_LEFT | POS_RIGHT | POS_VERTEX }; POS_ALL = POS_LEFT | POS_RIGHT | POS_VERTEX };
struct PointPos struct PointPos
{ {
PositionName _name; PositionName _name;
int _index; // index of vertex or segment int _index; // index of vertex or segment
PointPos( PositionName n, int i=-1 ): _name(n), _index(i) {} PointPos( PositionName n, int i=-1 ): _name(n), _index(i) {}
@ -8156,32 +8272,29 @@ private:
//purpose : Return list of group of elements built on the same nodes. //purpose : Return list of group of elements built on the same nodes.
// Search among theElements or in the whole mesh if theElements is empty // Search among theElements or in the whole mesh if theElements is empty
//======================================================================= //=======================================================================
void SMESH_MeshEditor::FindEqualElements(set<const SMDS_MeshElement*> & theElements,
TListOfListOfElementsID & theGroupsOfElementsID) void SMESH_MeshEditor::FindEqualElements(TIDSortedElemSet & theElements,
TListOfListOfElementsID & theGroupsOfElementsID)
{ {
myLastCreatedElems.Clear(); myLastCreatedElems.Clear();
myLastCreatedNodes.Clear(); myLastCreatedNodes.Clear();
typedef set<const SMDS_MeshElement*> TElemsSet;
typedef map< SortableElement, int > TMapOfNodeSet; typedef map< SortableElement, int > TMapOfNodeSet;
typedef list<int> TGroupOfElems; typedef list<int> TGroupOfElems;
TElemsSet elems;
if ( theElements.empty() ) if ( theElements.empty() )
{ // get all elements in the mesh { // get all elements in the mesh
SMDS_ElemIteratorPtr eIt = GetMeshDS()->elementsIterator(); SMDS_ElemIteratorPtr eIt = GetMeshDS()->elementsIterator();
while ( eIt->more() ) while ( eIt->more() )
elems.insert( elems.end(), eIt->next()); theElements.insert( theElements.end(), eIt->next());
} }
else
elems = theElements;
vector< TGroupOfElems > arrayOfGroups; vector< TGroupOfElems > arrayOfGroups;
TGroupOfElems groupOfElems; TGroupOfElems groupOfElems;
TMapOfNodeSet mapOfNodeSet; TMapOfNodeSet mapOfNodeSet;
TElemsSet::iterator elemIt = elems.begin(); TIDSortedElemSet::iterator elemIt = theElements.begin();
for ( int i = 0, j=0; elemIt != elems.end(); ++elemIt, ++j ) { for ( int i = 0, j=0; elemIt != theElements.end(); ++elemIt, ++j ) {
const SMDS_MeshElement* curElem = *elemIt; const SMDS_MeshElement* curElem = *elemIt;
SortableElement SE(curElem); SortableElement SE(curElem);
int ind = -1; int ind = -1;
@ -8254,8 +8367,8 @@ void SMESH_MeshEditor::MergeElements(TListOfListOfElementsID & theGroupsOfElemen
void SMESH_MeshEditor::MergeEqualElements() void SMESH_MeshEditor::MergeEqualElements()
{ {
set<const SMDS_MeshElement*> aMeshElements; /* empty input - TIDSortedElemSet aMeshElements; /* empty input ==
to merge equal elements in the whole mesh */ to merge equal elements in the whole mesh */
TListOfListOfElementsID aGroupsOfElementsID; TListOfListOfElementsID aGroupsOfElementsID;
FindEqualElements(aMeshElements, aGroupsOfElementsID); FindEqualElements(aMeshElements, aGroupsOfElementsID);
MergeElements(aGroupsOfElementsID); MergeElements(aGroupsOfElementsID);
@ -11779,8 +11892,11 @@ void SMESH_MeshEditor::CreateHoleSkin(double radius,
groupDS = group->GetGroupDS(); groupDS = group->GetGroupDS();
if ( !groupDS || groupDS->IsEmpty() ) continue; if ( !groupDS || groupDS->IsEmpty() ) continue;
std::string grpName = group->GetName(); std::string grpName = group->GetName();
//MESSAGE("grpName=" << grpName);
if (grpName == groupName) if (grpName == groupName)
break; break;
else
groupDS = 0;
} }
bool isNodeGroup = false; bool isNodeGroup = false;
@ -11794,6 +11910,7 @@ void SMESH_MeshEditor::CreateHoleSkin(double radius,
if (nodesCoords.size() > 0) if (nodesCoords.size() > 0)
isNodeCoords = true; // a list o nodes given by their coordinates isNodeCoords = true; // a list o nodes given by their coordinates
//MESSAGE("---" << isNodeGroup << " " << isNodeCoords);
// --- define groups to build // --- define groups to build

View File

@ -116,6 +116,7 @@ public:
const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; } const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; }
const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; } const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; }
void CrearLastCreated();
SMESH_ComputeErrorPtr & GetError() { return myError; } SMESH_ComputeErrorPtr & GetError() { return myError; }
@ -139,6 +140,12 @@ public:
// Remove a node or an element. // Remove a node or an element.
// Modify a compute state of sub-meshes which become empty // Modify a compute state of sub-meshes which become empty
void Create0DElementsOnAllNodes( const TIDSortedElemSet& elements,
TIDSortedElemSet& all0DElems);
// Create 0D elements on all nodes of the given object except those
// nodes on which a 0D element already exists. \a all0DElems returns
// all 0D elements found or created on nodes of \a elements
bool InverseDiag (const SMDS_MeshElement * theTria1, bool InverseDiag (const SMDS_MeshElement * theTria1,
const SMDS_MeshElement * theTria2 ); const SMDS_MeshElement * theTria2 );
// Replace two neighbour triangles with ones built on the same 4 nodes // Replace two neighbour triangles with ones built on the same 4 nodes
@ -350,15 +357,6 @@ public:
SMESH_Mesh* theTargetMesh=0); SMESH_Mesh* theTargetMesh=0);
// Move or copy theElements applying theTrsf to their nodes // Move or copy theElements applying theTrsf to their nodes
typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
void FindCoincidentNodes (TIDSortedNodeSet & theNodes,
const double theTolerance,
TListOfListOfNodes & theGroupsOfNodes);
// Return list of group of nodes close to each other within theTolerance.
// Search among theNodes or in the whole mesh if theNodes is empty.
/*! /*!
* \brief Return SMESH_NodeSearcher. The caller is responsible for deleteing it * \brief Return SMESH_NodeSearcher. The caller is responsible for deleteing it
*/ */
@ -369,6 +367,33 @@ public:
*/ */
SMESH_ElementSearcher* GetElementSearcher(); SMESH_ElementSearcher* GetElementSearcher();
SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt ); SMESH_ElementSearcher* GetElementSearcher( SMDS_ElemIteratorPtr elemIt );
typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes;
void FindCoincidentNodes (TIDSortedNodeSet & theNodes,
const double theTolerance,
TListOfListOfNodes & theGroupsOfNodes);
// Return list of group of nodes close to each other within theTolerance.
// Search among theNodes or in the whole mesh if theNodes is empty.
void MergeNodes (TListOfListOfNodes & theNodeGroups);
// In each group, the cdr of nodes are substituted by the first one
// in all elements.
typedef std::list< std::list< int > > TListOfListOfElementsID;
void FindEqualElements(TIDSortedElemSet & theElements,
TListOfListOfElementsID & theGroupsOfElementsID);
// Return list of group of elements build on the same nodes.
// Search among theElements or in the whole mesh if theElements is empty.
void MergeElements(TListOfListOfElementsID & theGroupsOfElementsID);
// In each group remove all but first of elements.
void MergeEqualElements();
// Remove all but one of elements built on the same nodes.
// Return nb of successfully merged groups.
/*! /*!
* \brief Return true if the point is IN or ON of the element * \brief Return true if the point is IN or ON of the element
*/ */
@ -382,24 +407,6 @@ public:
// Split face, defined by <faceNodes>, into several faces by repeating nodes. // Split face, defined by <faceNodes>, into several faces by repeating nodes.
// Is used by MergeNodes() // Is used by MergeNodes()
void MergeNodes (TListOfListOfNodes & theNodeGroups);
// In each group, the cdr of nodes are substituted by the first one
// in all elements.
typedef std::list< std::list< int > > TListOfListOfElementsID;
void FindEqualElements(std::set<const SMDS_MeshElement*> & theElements,
TListOfListOfElementsID & theGroupsOfElementsID);
// Return list of group of elements build on the same nodes.
// Search among theElements or in the whole mesh if theElements is empty.
void MergeElements(TListOfListOfElementsID & theGroupsOfElementsID);
// In each group remove all but first of elements.
void MergeEqualElements();
// Remove all but one of elements built on the same nodes.
// Return nb of successfully merged groups.
static bool CheckFreeBorderNodes(const SMDS_MeshNode* theNode1, static bool CheckFreeBorderNodes(const SMDS_MeshNode* theNode1,
const SMDS_MeshNode* theNode2, const SMDS_MeshNode* theNode2,
const SMDS_MeshNode* theNode3 = 0); const SMDS_MeshNode* theNode3 = 0);

View File

@ -283,6 +283,18 @@ void SMESH_MesherHelper::SetSubShape(const TopoDS_Shape& aSh)
myDegenShapeIds.insert( meshDS->ShapeToIndex( v.Current() )); myDegenShapeIds.insert( meshDS->ShapeToIndex( v.Current() ));
} }
} }
if ( !myDegenShapeIds.empty() && !myParIndex ) {
if ( surface->IsUPeriodic() || surface->IsUClosed() ) {
myParIndex |= U_periodic;
myPar1[0] = surf.FirstUParameter();
myPar2[0] = surf.LastUParameter();
}
else if ( surface->IsVPeriodic() || surface->IsVClosed() ) {
myParIndex |= V_periodic;
myPar1[1] = surf.FirstVParameter();
myPar2[1] = surf.LastVParameter();
}
}
} }
} }
} }
@ -329,7 +341,7 @@ bool SMESH_MesherHelper::IsMedium(const SMDS_MeshNode* node,
TopoDS_Shape SMESH_MesherHelper::GetSubShapeByNode(const SMDS_MeshNode* node, TopoDS_Shape SMESH_MesherHelper::GetSubShapeByNode(const SMDS_MeshNode* node,
const SMESHDS_Mesh* meshDS) const SMESHDS_Mesh* meshDS)
{ {
int shapeID = node->getshapeId(); int shapeID = node ? node->getshapeId() : 0;
if ( 0 < shapeID && shapeID <= meshDS->MaxShapeIndex() ) if ( 0 < shapeID && shapeID <= meshDS->MaxShapeIndex() )
return meshDS->IndexToShape( shapeID ); return meshDS->IndexToShape( shapeID );
else else
@ -3428,7 +3440,7 @@ namespace { // Structures used by FixQuadraticElements()
*/ */
//======================================================================= //=======================================================================
void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error, void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& compError,
bool volumeOnly) bool volumeOnly)
{ {
// setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion // setenv NO_FixQuadraticElements to know if FixQuadraticElements() is guilty of bad conversion
@ -3462,7 +3474,8 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
#endif #endif
SMESH_MesherHelper h(*myMesh); SMESH_MesherHelper h(*myMesh);
h.SetSubShape( s.Current() ); h.SetSubShape( s.Current() );
h.FixQuadraticElements( error, false ); h.ToFixNodeParameters(true);
h.FixQuadraticElements( compError, false );
} }
} }
// fix nodes on geom faces // fix nodes on geom faces
@ -3473,12 +3486,12 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
MSG("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key())); MSG("FIX FACE " << nbfaces-- << " #" << GetMeshDS()->ShapeToIndex(fIt.Key()));
SMESH_MesherHelper h(*myMesh); SMESH_MesherHelper h(*myMesh);
h.SetSubShape( fIt.Key() ); h.SetSubShape( fIt.Key() );
h.FixQuadraticElements( error, true);
h.ToFixNodeParameters(true); h.ToFixNodeParameters(true);
h.FixQuadraticElements( compError, true);
} }
//perf_print_all_meters(1); //perf_print_all_meters(1);
if ( error && error->myName == EDITERR_NO_MEDIUM_ON_GEOM ) if ( compError && compError->myName == EDITERR_NO_MEDIUM_ON_GEOM )
error->myComment = "during conversion to quadratic, " compError->myComment = "during conversion to quadratic, "
"some medium nodes were not placed on geometry to avoid distorting elements"; "some medium nodes were not placed on geometry to avoid distorting elements";
return; return;
} }
@ -3521,7 +3534,7 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
// Issue 0020982 // Issue 0020982
// Move medium nodes to the link middle for elements whose corner nodes // Move medium nodes to the link middle for elements whose corner nodes
// are out of geometrical boundary to fix distorted elements. // are out of geometrical boundary to fix distorted elements.
force3DOutOfBoundary( *this, error ); force3DOutOfBoundary( *this, compError );
if ( elemType == SMDSAbs_Volume ) if ( elemType == SMDSAbs_Volume )
{ {
@ -3595,7 +3608,9 @@ void SMESH_MesherHelper::FixQuadraticElements(SMESH_ComputeErrorPtr& error,
QLink link( face->GetNode(iN), face->GetNode((iN+1)%nbN), face->GetNode(iN+nbN) ); QLink link( face->GetNode(iN), face->GetNode((iN+1)%nbN), face->GetNode(iN+nbN) );
pLink = links.insert( link ).first; pLink = links.insert( link ).first;
faceLinks[ iN ] = & *pLink; faceLinks[ iN ] = & *pLink;
if ( !isCurved ) if ( !isCurved &&
link.node1()->GetPosition()->GetTypeOfPosition() < 2 &&
link.node2()->GetPosition()->GetTypeOfPosition() < 2 )
isCurved = !link.IsStraight(); isCurved = !link.IsStraight();
} }
// store QFace // store QFace

View File

@ -178,6 +178,21 @@ const SMDS_MeshNode* SMESH_ProxyMesh::GetProxyNode( const SMDS_MeshNode* node )
return proxy; return proxy;
} }
//================================================================================
/*!
* \brief Returns number of proxy sub-meshes
*/
//================================================================================
int SMESH_ProxyMesh::NbProxySubMeshes() const
{
int nb = 0;
for ( size_t i = 0; i < _subMeshes.size(); ++i )
nb += bool( _subMeshes[i] );
return nb;
}
namespace namespace
{ {
//================================================================================ //================================================================================
@ -329,7 +344,7 @@ SMESH_ProxyMesh::SubMesh* SMESH_ProxyMesh::getProxySubMesh(int index)
if ( int(_subMeshes.size()) <= index ) if ( int(_subMeshes.size()) <= index )
_subMeshes.resize( index+1, 0 ); _subMeshes.resize( index+1, 0 );
if ( !_subMeshes[index] ) if ( !_subMeshes[index] )
_subMeshes[index] = new SubMesh( index ); _subMeshes[index] = newSubmesh( index );
return _subMeshes[index]; return _subMeshes[index];
} }
@ -408,24 +423,24 @@ void SMESH_ProxyMesh::takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh )
//================================================================================ //================================================================================
/*! /*!
* \brief Removes tmp faces from the _mesh * \brief Removes tmp elements from the _mesh
*/ */
//================================================================================ //================================================================================
void SMESH_ProxyMesh::removeTmpElement( const SMDS_MeshElement* face ) void SMESH_ProxyMesh::removeTmpElement( const SMDS_MeshElement* elem )
{ {
if ( face && face->GetID() > 0 ) if ( elem && elem->GetID() > 0 )
{ {
set< const SMDS_MeshElement* >::iterator i = _elemsInMesh.find( face ); set< const SMDS_MeshElement* >::iterator i = _elemsInMesh.find( elem );
if ( i != _elemsInMesh.end() ) if ( i != _elemsInMesh.end() )
{ {
GetMeshDS()->RemoveFreeElement( face, 0 ); GetMeshDS()->RemoveFreeElement( elem, 0 );
_elemsInMesh.erase( i ); _elemsInMesh.erase( i );
} }
} }
else else
{ {
delete face; delete elem;
} }
} }
@ -435,9 +450,9 @@ void SMESH_ProxyMesh::removeTmpElement( const SMDS_MeshElement* face )
*/ */
//================================================================================ //================================================================================
void SMESH_ProxyMesh::storeTmpElement( const SMDS_MeshElement* face ) void SMESH_ProxyMesh::storeTmpElement( const SMDS_MeshElement* elem )
{ {
_elemsInMesh.insert( face ); _elemsInMesh.insert( elem );
} }
//================================================================================ //================================================================================
@ -499,18 +514,20 @@ void SMESH_ProxyMesh::SubMesh::Clear()
//================================================================================ //================================================================================
/*! /*!
* \brief Return number of elements in a proxy submesh * \brief Return number of elements in a proxy sub-mesh. The method is meaningful
* for a sub-mesh containing tmp faces.
*/ */
//================================================================================ //================================================================================
int SMESH_ProxyMesh::SubMesh::NbElements() const int SMESH_ProxyMesh::SubMesh::NbElements() const
{ {
return _elements.size(); return _uvPtStructVec.empty() ? _elements.size() : _uvPtStructVec.size() - 1;
} }
//================================================================================ //================================================================================
/*! /*!
* \brief Return elements of a proxy submesh * \brief Return elements of a proxy sub-mesh. The method is meaningful
* for a sub-mesh containing tmp faces.
*/ */
//================================================================================ //================================================================================
@ -520,6 +537,39 @@ SMDS_ElemIteratorPtr SMESH_ProxyMesh::SubMesh::GetElements() const
( new SMDS_ElementVectorIterator( _elements.begin(), _elements.end() )); ( new SMDS_ElementVectorIterator( _elements.begin(), _elements.end() ));
} }
//================================================================================
/*!
* \brief Return number of nodes in a proxy sub-mesh. The method is meaningful
* for a sub-mesh containing nodes of 2D viscous layer.
*/
//================================================================================
int SMESH_ProxyMesh::SubMesh::NbNodes() const
{
return _uvPtStructVec.size();
}
//================================================================================
/*!
* \brief Return nodes of a proxy sub-mesh. The method is meaningful
* for a sub-mesh containing nodes of 2D viscous layer.
*/
//================================================================================
SMDS_NodeIteratorPtr SMESH_ProxyMesh::SubMesh::GetNodes() const
{
if ( !_uvPtStructVec.empty() )
return SMDS_NodeIteratorPtr ( new SMDS_SetIterator
< SMDS_pNode,
UVPtStructVec::const_iterator,
UVPtStruct::NodeAccessor >
( _uvPtStructVec.begin(), _uvPtStructVec.end() ));
return SMDS_NodeIteratorPtr
( new SMDS_SetIterator< SMDS_pNode, std::vector< SMDS_pElement >::const_iterator>
( _elements.begin(), _elements.end() ));
}
//================================================================================ //================================================================================
/*! /*!
* \brief Store an element * \brief Store an element

View File

@ -28,6 +28,7 @@
#include "SMDS_MeshElement.hxx" #include "SMDS_MeshElement.hxx"
#include "SMESHDS_SubMesh.hxx" #include "SMESHDS_SubMesh.hxx"
#include "SMESH_TypeDefs.hxx"
#include <TopoDS_Shape.hxx> #include <TopoDS_Shape.hxx>
@ -40,7 +41,8 @@ class SMESHDS_Mesh;
class SMESH_Mesh; class SMESH_Mesh;
/*! /*!
* \brief Container of mesh faces substituting other faces in the input mesh of 3D algorithm * \brief Container of xD mesh elements substituting other ones in the
* input mesh of an (x+1)D algorithm
*/ */
class SMESH_EXPORT SMESH_ProxyMesh class SMESH_EXPORT SMESH_ProxyMesh
{ {
@ -54,32 +56,35 @@ public:
/*! /*!
* \brief Proxy sub-mesh * \brief Proxy sub-mesh
*/ */
class SubMesh : public SMESHDS_SubMesh class SMESH_EXPORT SubMesh : public SMESHDS_SubMesh
{ {
public: public:
const TN2NMap* GetNodeNodeMap() const { return _n2n; } const TN2NMap* GetNodeNodeMap() const { return _n2n; }
const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const; const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* n ) const;
virtual void AddElement(const SMDS_MeshElement * e); const UVPtStructVec& GetUVPtStructVec() const { return _uvPtStructVec; }
virtual int NbElements() const; virtual void AddElement(const SMDS_MeshElement * e);
virtual int NbElements() const;
virtual int NbNodes() const;
virtual SMDS_ElemIteratorPtr GetElements() const; virtual SMDS_ElemIteratorPtr GetElements() const;
virtual void Clear(); virtual SMDS_NodeIteratorPtr GetNodes() const;
virtual bool Contains(const SMDS_MeshElement * ME) const; virtual void Clear();
virtual bool Contains(const SMDS_MeshElement * ME) const;
template< class ITERATOR > template< class ITERATOR >
void ChangeElements( ITERATOR it, ITERATOR end ) void ChangeElements( ITERATOR it, ITERATOR end )
{ {
// change SubMesh contents without deleting tmp faces // change SubMesh contents without deleting tmp elements
// for which the caller is responsible // for which the caller is responsible
_elements.clear(); _elements.assign( it, end );
while ( it != end ) _elements.push_back( *it++ );
} }
SubMesh(int index=0):SMESHDS_SubMesh(0,index),_n2n(0) {} SubMesh(int index=0):SMESHDS_SubMesh(0,index),_n2n(0) {}
~SubMesh() { Clear(); } virtual ~SubMesh() { Clear(); }
private: protected:
std::vector<const SMDS_MeshElement *> _elements; std::vector<const SMDS_MeshElement *> _elements;
TN2NMap* _n2n; TN2NMap* _n2n;
UVPtStructVec _uvPtStructVec; // for SubMesh of EDGE
friend class SMESH_ProxyMesh; friend class SMESH_ProxyMesh;
}; };
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
@ -90,40 +95,45 @@ public:
SMESH_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; } SMESH_ProxyMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
virtual ~SMESH_ProxyMesh(); virtual ~SMESH_ProxyMesh();
// Returns the submesh of a face; it can be a proxy sub-mesh // Returns the submesh of a shape; it can be a proxy sub-mesh
const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& face) const; const SMESHDS_SubMesh* GetSubMesh(const TopoDS_Shape& shape) const;
// Returns the proxy sub-mesh of a face; it can be NULL // Returns the proxy sub-mesh of a shape; it can be NULL
const SubMesh* GetProxySubMesh(const TopoDS_Shape& face) const; const SubMesh* GetProxySubMesh(const TopoDS_Shape& shape) const;
// Returns the proxy node of a node; the input node is returned if no proxy exists // Returns the proxy node of a node; the input node is returned if no proxy exists
const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const; const SMDS_MeshNode* GetProxyNode( const SMDS_MeshNode* node ) const;
// Returns iterator on all faces of the mesh taking into account substitutions // Returns number of proxy sub-meshes
int NbProxySubMeshes() const;
// Returns iterator on all faces of the mesh taking into account substitutions.
// To be used in case of mesh without shape // To be used in case of mesh without shape
SMDS_ElemIteratorPtr GetFaces() const; SMDS_ElemIteratorPtr GetFaces() const;
// Returns iterator on all faces on the face taking into account substitutions // Returns iterator on all faces on the face taking into account substitutions
SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const; SMDS_ElemIteratorPtr GetFaces(const TopoDS_Shape& face) const;
// Return total nb of faces taking into account substitutions // Return total nb of faces taking into account substitutions
int NbFaces() const; int NbFaces() const;
bool IsTemporary(const SMDS_MeshElement* elem ) const; bool IsTemporary(const SMDS_MeshElement* elem ) const;
const SMESH_Mesh* GetMesh() const { return _mesh; } SMESH_Mesh* GetMesh() const { return const_cast<SMESH_Mesh*>( _mesh ); }
SMESHDS_Mesh* GetMeshDS() const; SMESHDS_Mesh* GetMeshDS() const;
//-------------------------------------------------------------------------------- //--------------------------------------------------------------------------------
// Interface for descendants // Interface for descendants
protected: protected:
void setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; } void setMesh(const SMESH_Mesh& mesh) { _mesh = &mesh; }
int shapeIndex(const TopoDS_Shape& shape) const; int shapeIndex(const TopoDS_Shape& shape) const;
virtual SubMesh* newSubmesh(int index=0) const { return new SubMesh(index); }
// returns a proxy sub-mesh; zero index is for the case of mesh w/o shape // returns a proxy sub-mesh; zero index is for the case of mesh w/o shape
SubMesh* findProxySubMesh(int shapeIndex=0) const; SubMesh* findProxySubMesh(int shapeIndex=0) const;
@ -135,21 +145,21 @@ public:
SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape()); SubMesh* getProxySubMesh(const TopoDS_Shape& shape=TopoDS_Shape());
// move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found // move proxy sub-mesh from other proxy mesh to this, returns true if sub-mesh found
bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh ); bool takeProxySubMesh( const TopoDS_Shape& shape, SMESH_ProxyMesh* proxyMesh );
// move tmp elements residing the _mesh from other proxy mesh to this // move tmp elements residing the _mesh from other proxy mesh to this
void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh ); void takeTmpElemsInMesh( SMESH_ProxyMesh* proxyMesh );
// removes tmp faces from the _mesh // removes tmp element from the _mesh
void removeTmpElement( const SMDS_MeshElement* face ); void removeTmpElement( const SMDS_MeshElement* elem );
// stores tmp element residing the _mesh // stores tmp element residing the _mesh
void storeTmpElement( const SMDS_MeshElement* face ); void storeTmpElement( const SMDS_MeshElement* elem );
// store node-node correspondence // store node-node correspondence
void setNode2Node(const SMDS_MeshNode* srcNode, void setNode2Node(const SMDS_MeshNode* srcNode,
const SMDS_MeshNode* proxyNode, const SMDS_MeshNode* proxyNode,
const SubMesh* subMesh); const SubMesh* subMesh);
// types of elements needed to implement NbFaces() and GetFaces(); // types of elements needed to implement NbFaces() and GetFaces();
// if _allowedTypes is empty, only elements from _subMeshes are returned, // if _allowedTypes is empty, only elements from _subMeshes are returned,

View File

@ -149,6 +149,17 @@ SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS()
*/ */
//============================================================================= //=============================================================================
const SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS() const
{
return ((SMESH_subMesh*) this )->GetSubMeshDS();
}
//=============================================================================
/*!
*
*/
//=============================================================================
SMESHDS_SubMesh* SMESH_subMesh::CreateSubMeshDS() SMESHDS_SubMesh* SMESH_subMesh::CreateSubMeshDS()
{ {
if ( !GetSubMeshDS() ) { if ( !GetSubMeshDS() ) {
@ -1122,7 +1133,7 @@ bool SMESH_subMesh::IsConform(const SMESH_Algo* theAlgo)
*/ */
//============================================================================= //=============================================================================
void SMESH_subMesh::setAlgoState(int state) void SMESH_subMesh::setAlgoState(algo_state state)
{ {
_algoState = state; _algoState = state;
} }
@ -1258,7 +1269,19 @@ static void cleanSubMesh( SMESH_subMesh * subMesh )
bool SMESH_subMesh::ComputeStateEngine(int event) bool SMESH_subMesh::ComputeStateEngine(int event)
{ {
_computeError.reset(); switch ( event ) {
case MODIF_ALGO_STATE:
case COMPUTE:
//case COMPUTE_CANCELED:
case CLEAN:
//case SUBMESH_COMPUTED:
//case SUBMESH_RESTORED:
//case SUBMESH_LOADED:
//case MESH_ENTITY_REMOVED:
//case CHECK_COMPUTE_STATE:
_computeError.reset(); break;
default:;
}
//MESSAGE("SMESH_subMesh::ComputeStateEngine"); //MESSAGE("SMESH_subMesh::ComputeStateEngine");
//SCRUTE(_computeState); //SCRUTE(_computeState);
@ -2066,7 +2089,8 @@ void SMESH_subMesh::SetEventListener(EventListener* listener,
*/ */
//================================================================================ //================================================================================
void SMESH_subMesh::setEventListener(EventListener* listener, EventListenerData* data) void SMESH_subMesh::setEventListener(EventListener* listener,
EventListenerData* data)
{ {
map< EventListener*, EventListenerData* >::iterator l_d = map< EventListener*, EventListenerData* >::iterator l_d =
_eventListeners.find( listener ); _eventListeners.find( listener );
@ -2076,8 +2100,21 @@ void SMESH_subMesh::setEventListener(EventListener* listener, EventListenerData*
delete curData; delete curData;
l_d->second = data; l_d->second = data;
} }
else else
{
for ( l_d = _eventListeners.begin(); l_d != _eventListeners.end(); ++l_d )
if ( listener->GetName() == l_d->first->GetName() )
{
EventListenerData* curData = l_d->second;
if ( curData && curData != data && curData->IsDeletable() )
delete curData;
if ( l_d->first->IsDeletable() )
delete l_d->first;
_eventListeners.erase( l_d );
break;
}
_eventListeners.insert( make_pair( listener, data )); _eventListeners.insert( make_pair( listener, data ));
}
} }
//================================================================================ //================================================================================
@ -2128,16 +2165,18 @@ void SMESH_subMesh::notifyListenersOnEvent( const int event,
SMESH_Hypothesis* hyp) SMESH_Hypothesis* hyp)
{ {
map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin(); map< EventListener*, EventListenerData* >::iterator l_d = _eventListeners.begin();
for ( ; l_d != _eventListeners.end(); ++l_d ) for ( ; l_d != _eventListeners.end(); )
{ {
std::pair< EventListener*, EventListenerData* > li_da = *l_d; /* copy to enable removal std::pair< EventListener*, EventListenerData* > li_da = *l_d++; /* copy to enable removal
of a listener from of a listener from
_eventListeners by _eventListeners by
its ProcessEvent() */ its ProcessEvent() */
if ( li_da.first->myBusySM.insert( this ).second ) if ( li_da.first->myBusySM.insert( this ).second )
{ {
const size_t nbListenersBefore = _eventListeners.size();
li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp ); li_da.first->ProcessEvent( event, eventType, this, li_da.second, hyp );
li_da.first->myBusySM.erase( this ); if ( nbListenersBefore == _eventListeners.size() )
li_da.first->myBusySM.erase( this ); // a listener hopefully not removed
} }
} }
} }
@ -2164,6 +2203,9 @@ void SMESH_subMesh::DeleteEventListener(EventListener* listener)
delete l_d->second; delete l_d->second;
} }
_eventListeners.erase( l_d ); _eventListeners.erase( l_d );
if ( l_d->first && !l_d->first->IsDeletable() )
l_d->first->myBusySM.erase( this );
} }
} }

View File

@ -59,15 +59,18 @@ typedef boost::shared_ptr< SMDS_Iterator<SMESH_subMesh*> > SMESH_subMeshIterator
class SMESH_EXPORT SMESH_subMesh class SMESH_EXPORT SMESH_subMesh
{ {
public: public:
SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, SMESH_subMesh(int Id,
SMESH_Mesh * father,
SMESHDS_Mesh * meshDS,
const TopoDS_Shape & aSubShape); const TopoDS_Shape & aSubShape);
virtual ~ SMESH_subMesh(); virtual ~ SMESH_subMesh();
int GetId() const; int GetId() const; // == meshDS->ShapeToIndex( aSubShape )
SMESH_Mesh* GetFather() { return _father; } SMESH_Mesh* GetFather() { return _father; }
SMESHDS_SubMesh * GetSubMeshDS(); SMESHDS_SubMesh * GetSubMeshDS();
const SMESHDS_SubMesh * GetSubMeshDS() const;
SMESHDS_SubMesh* CreateSubMeshDS(); SMESHDS_SubMesh* CreateSubMeshDS();
// Explicit SMESHDS_SubMesh creation method, required for persistence mechanism // Explicit SMESHDS_SubMesh creation method, required for persistence mechanism
@ -206,9 +209,9 @@ public:
SMESH_Hypothesis::Hypothesis_Status SMESH_Hypothesis::Hypothesis_Status
SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp); SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp);
int GetAlgoState() const { return _algoState; } algo_state GetAlgoState() const { return _algoState; }
int GetComputeState() const { return _computeState; }; compute_state GetComputeState() const { return _computeState; };
SMESH_ComputeErrorPtr& GetComputeError() { return _computeError; } SMESH_ComputeErrorPtr& GetComputeError() { return _computeError; }
void DumpAlgoState(bool isMain); void DumpAlgoState(bool isMain);
@ -272,7 +275,7 @@ protected:
void updateSubMeshState(const compute_state theState); void updateSubMeshState(const compute_state theState);
void cleanDependants(); void cleanDependants();
void cleanDependsOn(); void cleanDependsOn();
void setAlgoState(int state); void setAlgoState(algo_state state);
/*! /*!
* \brief Return a shape containing all sub-shapes of the MainShape that can be * \brief Return a shape containing all sub-shapes of the MainShape that can be
@ -311,8 +314,8 @@ protected:
std::map < int, SMESH_subMesh * >_mapDepend; std::map < int, SMESH_subMesh * >_mapDepend;
bool _dependenceAnalysed; bool _dependenceAnalysed;
int _algoState; algo_state _algoState;
int _computeState; compute_state _computeState;
SMESH_ComputeErrorPtr _computeError; SMESH_ComputeErrorPtr _computeError;
// allow algo->Compute() if a subshape of lower dim is meshed but // allow algo->Compute() if a subshape of lower dim is meshed but

View File

@ -823,7 +823,7 @@ static void removeFromContainers (map<int,SMESHDS_SubMesh*>& theSubMeshes,
// Element should belong to only one sub-mesh // Element should belong to only one sub-mesh
if ( !theSubMeshes.empty() ) if ( !theSubMeshes.empty() )
{ {
SMESHDS_Mesh* mesh = theSubMeshes.begin()->second->getParent(); SMESHDS_Mesh* mesh = theSubMeshes.begin()->second->GetParent();
list<const SMDS_MeshElement *>::iterator elIt = theElems.begin(); list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
if ( isNode ) { if ( isNode ) {
for ( ; elIt != theElems.end(); ++elIt ) for ( ; elIt != theElems.end(); ++elIt )

View File

@ -73,7 +73,8 @@ class SMESHDS_EXPORT SMESHDS_SubMesh
int getSize(); int getSize();
void compactList(); void compactList();
inline SMESHDS_Mesh *getParent() {return myParent; }; SMESHDS_Mesh *GetParent() { return myParent; }
int GetID() const { return myIndex; }
private: private:
SMESHDS_Mesh * myParent; SMESHDS_Mesh * myParent;

View File

@ -39,26 +39,27 @@
#define SMESHFILTERSSELECTION_EXPORT #define SMESHFILTERSSELECTION_EXPORT
#endif #endif
enum MeshObjectType { namespace SMESH{
HYPOTHESIS, enum MeshObjectType {
ALGORITHM, HYPOTHESIS,
MESH, ALGORITHM,
SUBMESH, MESH,
MESHorSUBMESH, SUBMESH,
SUBMESH_VERTEX, MESHorSUBMESH,
SUBMESH_EDGE, SUBMESH_VERTEX,
SUBMESH_FACE, SUBMESH_EDGE,
SUBMESH_SOLID, SUBMESH_FACE,
SUBMESH_COMPOUND, SUBMESH_SOLID,
GROUP, SUBMESH_COMPOUND,
GROUP_NODE, GROUP,
GROUP_EDGE, GROUP_NODE,
GROUP_FACE, GROUP_EDGE,
GROUP_VOLUME, GROUP_FACE,
GROUP_0D, GROUP_VOLUME,
GROUP_BALL, GROUP_0D,
COMPONENT, GROUP_BALL,
IDSOURCE COMPONENT,
IDSOURCE
};
}; };
#endif #endif

View File

@ -30,7 +30,7 @@
#include <SALOMEconfig.h> #include <SALOMEconfig.h>
#include CORBA_CLIENT_HEADER(SMESH_Gen) #include CORBA_CLIENT_HEADER(SMESH_Gen)
SMESH_TypeFilter::SMESH_TypeFilter (MeshObjectType theType) SMESH_TypeFilter::SMESH_TypeFilter (SMESH::MeshObjectType theType)
{ {
myType = theType; myType = theType;
} }
@ -88,7 +88,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
switch (myType) switch (myType)
{ {
case HYPOTHESIS: case SMESH::HYPOTHESIS:
{ {
if (aLevel == 2 && (objFather->Tag() == SMESH::Tag_HypothesisRoot)) if (aLevel == 2 && (objFather->Tag() == SMESH::Tag_HypothesisRoot))
// hypo definition // hypo definition
@ -101,7 +101,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
Ok = true; Ok = true;
break; break;
} }
case ALGORITHM: case SMESH::ALGORITHM:
{ {
if (aLevel == 2 && (objFather->Tag() == SMESH::Tag_AlgorithmsRoot)) if (aLevel == 2 && (objFather->Tag() == SMESH::Tag_AlgorithmsRoot))
// algo definition // algo definition
@ -114,13 +114,13 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
Ok = true; Ok = true;
break; break;
} }
case MESH: case SMESH::MESH:
{ {
if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot)) if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot))
Ok = true; Ok = true;
break; break;
} }
case SUBMESH: case SMESH::SUBMESH:
{ {
// see SMESH_Gen_i.cxx for tag numbers // see SMESH_Gen_i.cxx for tag numbers
if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstSubMesh && if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstSubMesh &&
@ -128,7 +128,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
Ok = true; Ok = true;
break; break;
} }
case MESHorSUBMESH: case SMESH::MESHorSUBMESH:
{ {
if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot)) if (aLevel == 1 && (obj->Tag() >= SMESH::Tag_FirstMeshRoot))
Ok = true; // mesh Ok = true; // mesh
@ -137,82 +137,82 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
Ok = true; Ok = true;
break; break;
} }
case SUBMESH_VERTEX: // Label "SubMeshes on vertexes" case SMESH::SUBMESH_VERTEX: // Label "SubMeshes on vertexes"
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnVertex)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnVertex))
Ok = true; Ok = true;
break; break;
} }
case SUBMESH_EDGE: case SMESH::SUBMESH_EDGE:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnEdge)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnEdge))
Ok = true; Ok = true;
break; break;
} }
case SUBMESH_FACE: case SMESH::SUBMESH_FACE:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnFace)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnFace))
Ok = true; Ok = true;
break; break;
} }
case SUBMESH_SOLID: case SMESH::SUBMESH_SOLID:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnSolid)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnSolid))
Ok = true; Ok = true;
break; break;
} }
case SUBMESH_COMPOUND: case SMESH::SUBMESH_COMPOUND:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnCompound)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_SubMeshOnCompound))
Ok = true; Ok = true;
break; break;
} }
case GROUP: case SMESH::GROUP:
{ {
if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstGroup)) if (aLevel == 3 && (objFather->Tag() >= SMESH::Tag_FirstGroup))
Ok = true; Ok = true;
break; break;
} }
case GROUP_NODE: case SMESH::GROUP_NODE:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_NodeGroups)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_NodeGroups))
Ok = true; Ok = true;
break; break;
} }
case GROUP_EDGE: case SMESH::GROUP_EDGE:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_EdgeGroups)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_EdgeGroups))
Ok = true; Ok = true;
break; break;
} }
case GROUP_FACE: case SMESH::GROUP_FACE:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_FaceGroups)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_FaceGroups))
Ok = true; Ok = true;
break; break;
} }
case GROUP_VOLUME: case SMESH::GROUP_VOLUME:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_VolumeGroups)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_VolumeGroups))
Ok = true; Ok = true;
break; break;
} }
case GROUP_0D: case SMESH::GROUP_0D:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_0DElementsGroups)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_0DElementsGroups))
Ok = true; Ok = true;
break; break;
} }
case GROUP_BALL: case SMESH::GROUP_BALL:
{ {
if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_BallElementsGroups)) if (aLevel == 3 && (objFather->Tag() == SMESH::Tag_BallElementsGroups))
Ok = true; Ok = true;
break; break;
} }
case IDSOURCE: case SMESH::IDSOURCE:
{ {
Ok = ( SMESH_TypeFilter(MESHorSUBMESH).isOk( theDataOwner ) || Ok = ( SMESH_TypeFilter(SMESH::MESHorSUBMESH).isOk( theDataOwner ) ||
SMESH_TypeFilter(GROUP) .isOk( theDataOwner )); SMESH_TypeFilter(SMESH::GROUP) .isOk( theDataOwner ));
break; break;
} }
} }
@ -220,7 +220,7 @@ bool SMESH_TypeFilter::isOk (const SUIT_DataOwner* theDataOwner) const
return Ok; return Ok;
} }
MeshObjectType SMESH_TypeFilter::type() const SMESH::MeshObjectType SMESH_TypeFilter::type() const
{ {
return myType; return myType;
} }

View File

@ -34,14 +34,14 @@ class SUIT_DataOwner;
class SMESHFILTERSSELECTION_EXPORT SMESH_TypeFilter : public SUIT_SelectionFilter class SMESHFILTERSSELECTION_EXPORT SMESH_TypeFilter : public SUIT_SelectionFilter
{ {
public: public:
SMESH_TypeFilter (MeshObjectType theType); SMESH_TypeFilter (SMESH::MeshObjectType theType);
~SMESH_TypeFilter(); ~SMESH_TypeFilter();
virtual bool isOk (const SUIT_DataOwner*) const; virtual bool isOk (const SUIT_DataOwner*) const;
MeshObjectType type() const; SMESH::MeshObjectType type() const;
protected: protected:
MeshObjectType myType; SMESH::MeshObjectType myType;
}; };
#endif #endif

View File

@ -97,6 +97,7 @@ salomeinclude_HEADERS = \
SMESHGUI_PreviewDlg.h \ SMESHGUI_PreviewDlg.h \
SMESHGUI_ReorientFacesDlg.h \ SMESHGUI_ReorientFacesDlg.h \
SMESHGUI_PropertiesDlg.h \ SMESHGUI_PropertiesDlg.h \
SMESHGUI_Add0DElemsOnAllNodesDlg.h \
SMESH_SMESHGUI.hxx SMESH_SMESHGUI.hxx
# Libraries targets # Libraries targets
@ -173,7 +174,8 @@ dist_libSMESH_la_SOURCES = \
SMESHGUI_FileValidator.cxx \ SMESHGUI_FileValidator.cxx \
SMESHGUI_PreviewDlg.cxx \ SMESHGUI_PreviewDlg.cxx \
SMESHGUI_ReorientFacesDlg.cxx \ SMESHGUI_ReorientFacesDlg.cxx \
SMESHGUI_PropertiesDlg.cxx SMESHGUI_PropertiesDlg.cxx \
SMESHGUI_Add0DElemsOnAllNodesDlg.cxx
MOC_FILES = \ MOC_FILES = \
SMESHGUI_moc.cxx \ SMESHGUI_moc.cxx \
@ -233,7 +235,8 @@ MOC_FILES = \
SMESHGUI_MeshOrderOp_moc.cxx \ SMESHGUI_MeshOrderOp_moc.cxx \
SMESHGUI_PreviewDlg_moc.cxx \ SMESHGUI_PreviewDlg_moc.cxx \
SMESHGUI_ReorientFacesDlg_moc.cxx \ SMESHGUI_ReorientFacesDlg_moc.cxx \
SMESHGUI_PropertiesDlg_moc.cxx SMESHGUI_PropertiesDlg_moc.cxx \
SMESHGUI_Add0DElemsOnAllNodesDlg_moc.cxx
nodist_libSMESH_la_SOURCES= \ nodist_libSMESH_la_SOURCES= \
$(MOC_FILES) $(MOC_FILES)

View File

@ -27,18 +27,21 @@
#undef HAVE_FINITE // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined #undef HAVE_FINITE // VSR: avoid compilation warning on Linux : "HAVE_FINITE" redefined
#endif #endif
#include "Python.h" #include "Python.h"
// SMESH includes // SMESH includes
#include "SMESHGUI.h" #include "SMESHGUI.h"
#include "SMESHGUI_Add0DElemsOnAllNodesDlg.h"
#include "SMESHGUI_AddMeshElementDlg.h" #include "SMESHGUI_AddMeshElementDlg.h"
#include "SMESHGUI_AddQuadraticElementDlg.h" #include "SMESHGUI_AddQuadraticElementDlg.h"
#include "SMESHGUI_BuildCompoundDlg.h" #include "SMESHGUI_BuildCompoundDlg.h"
#include "SMESHGUI_ClippingDlg.h" #include "SMESHGUI_ClippingDlg.h"
#include "SMESHGUI_ComputeDlg.h" #include "SMESHGUI_ComputeDlg.h"
#include "SMESHGUI_ConvToQuadOp.h" #include "SMESHGUI_ConvToQuadOp.h"
#include "SMESHGUI_CopyMeshDlg.h"
#include "SMESHGUI_CreatePolyhedralVolumeDlg.h" #include "SMESHGUI_CreatePolyhedralVolumeDlg.h"
#include "SMESHGUI_DeleteGroupDlg.h" #include "SMESHGUI_DeleteGroupDlg.h"
#include "SMESHGUI_Displayer.h" #include "SMESHGUI_Displayer.h"
#include "SMESHGUI_MergeDlg.h" #include "SMESHGUI_DuplicateNodesDlg.h"
#include "SMESHGUI_ExtrusionAlongPathDlg.h" #include "SMESHGUI_ExtrusionAlongPathDlg.h"
#include "SMESHGUI_ExtrusionDlg.h" #include "SMESHGUI_ExtrusionDlg.h"
#include "SMESHGUI_FileInfoDlg.h" #include "SMESHGUI_FileInfoDlg.h"
@ -53,6 +56,7 @@
#include "SMESHGUI_Make2DFrom3DOp.h" #include "SMESHGUI_Make2DFrom3DOp.h"
#include "SMESHGUI_MakeNodeAtPointDlg.h" #include "SMESHGUI_MakeNodeAtPointDlg.h"
#include "SMESHGUI_Measurements.h" #include "SMESHGUI_Measurements.h"
#include "SMESHGUI_MergeDlg.h"
#include "SMESHGUI_MeshInfo.h" #include "SMESHGUI_MeshInfo.h"
#include "SMESHGUI_MeshOp.h" #include "SMESHGUI_MeshOp.h"
#include "SMESHGUI_MeshOrderOp.h" #include "SMESHGUI_MeshOrderOp.h"
@ -64,61 +68,59 @@
#include "SMESHGUI_RemoveElementsDlg.h" #include "SMESHGUI_RemoveElementsDlg.h"
#include "SMESHGUI_RemoveNodesDlg.h" #include "SMESHGUI_RemoveNodesDlg.h"
#include "SMESHGUI_RenumberingDlg.h" #include "SMESHGUI_RenumberingDlg.h"
#include "SMESHGUI_ReorientFacesDlg.h"
#include "SMESHGUI_RevolutionDlg.h" #include "SMESHGUI_RevolutionDlg.h"
#include "SMESHGUI_RotationDlg.h" #include "SMESHGUI_RotationDlg.h"
#include "SMESHGUI_ScaleDlg.h"
#include "SMESHGUI_Selection.h" #include "SMESHGUI_Selection.h"
#include "SMESHGUI_SewingDlg.h" #include "SMESHGUI_SewingDlg.h"
#include "SMESHGUI_SingleEditDlg.h" #include "SMESHGUI_SingleEditDlg.h"
#include "SMESHGUI_SmoothingDlg.h" #include "SMESHGUI_SmoothingDlg.h"
#include "SMESHGUI_SymmetryDlg.h" #include "SMESHGUI_SymmetryDlg.h"
#include "SMESHGUI_TranslationDlg.h" #include "SMESHGUI_TranslationDlg.h"
#include "SMESHGUI_ScaleDlg.h"
#include "SMESHGUI_TransparencyDlg.h" #include "SMESHGUI_TransparencyDlg.h"
#include "SMESHGUI_DuplicateNodesDlg.h"
#include "SMESHGUI_CopyMeshDlg.h"
#include "SMESHGUI_ReorientFacesDlg.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_MeshUtils.h"
#include "SMESHGUI_GroupUtils.h"
#include "SMESHGUI_FilterUtils.h" #include "SMESHGUI_FilterUtils.h"
#include "SMESHGUI_PatternUtils.h" #include "SMESHGUI_GroupUtils.h"
#include "SMESHGUI_VTKUtils.h"
#include "SMESHGUI_HypothesesUtils.h" #include "SMESHGUI_HypothesesUtils.h"
#include "SMESHGUI_MeshUtils.h"
#include "SMESHGUI_PatternUtils.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_VTKUtils.h"
#include <SMESH_version.h> #include <SMESH_version.h>
#include <SMESH_Client.hxx>
#include <SMESH_Actor.h>
#include <SMESH_ScalarBarActor.h>
#include <SMESH_ActorUtils.h>
#include <SMESH_TypeFilter.hxx>
#include "SMESH_ControlsDef.hxx" #include "SMESH_ControlsDef.hxx"
#include <SMESH_Actor.h>
#include <SMESH_ActorUtils.h>
#include <SMESH_Client.hxx>
#include <SMESH_ScalarBarActor.h>
#include <SMESH_TypeFilter.hxx>
// SALOME GUI includes // SALOME GUI includes
#include <SalomeApp_Tools.h>
#include <SalomeApp_Study.h>
#include <SalomeApp_Application.h> #include <SalomeApp_Application.h>
#include <SalomeApp_CheckFileDlg.h> #include <SalomeApp_CheckFileDlg.h>
#include <SalomeApp_DataObject.h> #include <SalomeApp_DataObject.h>
#include <SalomeApp_Study.h>
#include <SalomeApp_Tools.h>
#include <LightApp_DataOwner.h> #include <LightApp_DataOwner.h>
#include <LightApp_NameDlg.h>
#include <LightApp_Preferences.h> #include <LightApp_Preferences.h>
#include <LightApp_SelectionMgr.h> #include <LightApp_SelectionMgr.h>
#include <LightApp_UpdateFlags.h> #include <LightApp_UpdateFlags.h>
#include <LightApp_NameDlg.h>
#include <SVTK_ViewWindow.h>
#include <SVTK_ViewModel.h>
#include <SVTK_ViewManager.h> #include <SVTK_ViewManager.h>
#include <SVTK_ViewModel.h>
#include <SVTK_ViewWindow.h>
#include <VTKViewer_Algorithm.h> #include <VTKViewer_Algorithm.h>
#include <SUIT_MessageBox.h>
#include <SUIT_ResourceMgr.h>
#include <SUIT_FileDlg.h>
#include <SUIT_Desktop.h> #include <SUIT_Desktop.h>
#include <SUIT_FileDlg.h>
#include <SUIT_MessageBox.h>
#include <SUIT_OverrideCursor.h> #include <SUIT_OverrideCursor.h>
#include <SUIT_ResourceMgr.h>
#include <SUIT_Session.h> #include <SUIT_Session.h>
#include <QtxPopupMgr.h> #include <QtxPopupMgr.h>
@ -148,25 +150,28 @@
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>
// VTK includes // VTK includes
#include <vtkCamera.h>
#include <vtkRenderer.h>
#include <vtkPlane.h>
#include <vtkCallbackCommand.h> #include <vtkCallbackCommand.h>
#include <vtkCamera.h>
#include <vtkLookupTable.h> #include <vtkLookupTable.h>
#include <vtkPlane.h>
#include <vtkRenderer.h>
// SALOME KERNEL includes // SALOME KERNEL includes
#include <SALOMEDS_Study.hxx>
#include <SALOMEDSClient_StudyBuilder.hxx>
#include <SALOMEDSClient_SComponent.hxx>
#include <SALOMEDSClient_ClientFactory.hxx> #include <SALOMEDSClient_ClientFactory.hxx>
#include <SALOMEDSClient_IParameters.hxx> #include <SALOMEDSClient_IParameters.hxx>
#include <SALOMEDSClient_SComponent.hxx>
#include <SALOMEDSClient_StudyBuilder.hxx>
#include <SALOMEDS_Study.hxx>
// OCCT includes // OCCT includes
#include <Standard_ErrorHandler.hxx> #include <Standard_ErrorHandler.hxx>
#include <NCollection_DataMap.hxx> #include <NCollection_DataMap.hxx>
#include <Basics_Utils.hxx>
//To disable automatic genericobj management, the following line should be commented. //To disable automatic genericobj management, the following line should be commented.
//Otherwise, it should be uncommented. Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx //Otherwise, it should be uncommented.
//Refer to KERNEL_SRC/src/SALOMEDSImpl/SALOMEDSImpl_AttributeIOR.cxx
#define WITHGENERICOBJ #define WITHGENERICOBJ
//namespace{ //namespace{
@ -193,7 +198,7 @@
std::string myExtension; std::string myExtension;
if ( theCommandID == 113 ) { if ( theCommandID == 113 ) {
filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.med)" ); filter.append( QObject::tr( "MED_FILES_FILTER" ) + " (*.*med)" );
filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" ); filter.append( QObject::tr( "ALL_FILES_FILTER" ) + " (*)" );
} }
else if ( theCommandID == 112 ) { else if ( theCommandID == 112 ) {
@ -203,7 +208,7 @@
filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" ); filter.append( QObject::tr( "DAT_FILES_FILTER" ) + " (*.dat)" );
} }
else if ( theCommandID == 115 ) { else if ( theCommandID == 115 ) {
filter.append( QObject::tr( "STL_ASCII_FILES_FILTER" ) + " (*.stl)" ); filter.append( QObject::tr( "STL_FILES_FILTER" ) + " (*.stl)" );
} }
else if ( theCommandID == 116 ) { else if ( theCommandID == 116 ) {
filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" ); filter.append( QObject::tr( "CGNS_FILES_FILTER" ) + " (*.cgns)" );
@ -221,10 +226,28 @@
if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() ) if ( SUIT_FileDlg::getLastVisitedPath().isEmpty() )
anInitialPath = QDir::currentPath(); anInitialPath = QDir::currentPath();
QStringList filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(), QStringList filenames;
anInitialPath, bool toCreateGroups = true;
filter,
QObject::tr( "SMESH_IMPORT_MESH" ) ); // if ( theCommandID == 118 ) { // GMF
// SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
// ( SMESHGUI::desktop(), true, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true );
// fd->setWindowTitle( QObject::tr( "SMESH_IMPORT_MESH" ) );
// fd->setNameFilters( filter );
// fd->SetChecked( true );
// if ( fd->exec() )
// filenames << fd->selectedFile();
// toCreateGroups = fd->IsChecked();
// delete fd;
// }
// else
{
filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(),
anInitialPath,
filter,
QObject::tr( "SMESH_IMPORT_MESH" ) );
}
if ( filenames.count() > 0 ) { if ( filenames.count() > 0 ) {
SUIT_OverrideCursor wc; SUIT_OverrideCursor wc;
_PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
@ -303,7 +326,9 @@
// GMF format // GMF format
SMESH::ComputeError_var res; SMESH::ComputeError_var res;
aMeshes->length( 1 ); aMeshes->length( 1 );
aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toLatin1().constData(), res.out() ); aMeshes[0] = theComponentMesh->CreateMeshesFromGMF( filename.toLatin1().constData(),
toCreateGroups,
res.out() );
if ( res->code != SMESH::DRS_OK ) { if ( res->code != SMESH::DRS_OK ) {
errors.append( QString( "%1 :\n\t%2" ).arg( filename ). errors.append( QString( "%1 :\n\t%2" ).arg( filename ).
arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res->code ).toLatin1().data() ) ) ); arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res->code ).toLatin1().data() ) ) );
@ -593,11 +618,37 @@
else if ( isGMF ) else if ( isGMF )
aFilter = QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" + aFilter = QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)" +
";;" + QObject::tr( "GMF_BINARY_FILES_FILTER" ) + " (*.meshb)"; ";;" + QObject::tr( "GMF_BINARY_FILES_FILTER" ) + " (*.meshb)";
if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath(); if ( anInitialPath.isEmpty() ) anInitialPath = SUIT_FileDlg::getLastVisitedPath();
aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(), aFilename = SUIT_FileDlg::getFileName(SMESHGUI::desktop(),
anInitialPath + QString("/") + aMeshName, anInitialPath + QString("/") + aMeshName,
aFilter, aTitle, false); aFilter, aTitle, false);
} }
// else if ( isGMF )// Export to GMF
// {
// SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
// ( SMESHGUI::desktop(), false, QObject::tr("SMESH_REQUIRED_GROUPS"), true, true );
// QStringList filters;
// filters << QObject::tr( "GMF_ASCII_FILES_FILTER" ) + " (*.mesh)"
// << QObject::tr( "GMF_BINARY_FILES_FILTER" ) + " (*.meshb)";
// fd->setWindowTitle( aTitle );
// fd->setNameFilters( filters );
// if ( !aMeshOrGroup->_is_equivalent( aMesh ))
// toCreateGroups = false;
// else
// toCreateGroups = ( aMesh->NbGroups() > 0 );
// fd->SetChecked( true );
// if ( !anInitialPath.isEmpty() )
// fd->setDirectory( anInitialPath );
// fd->selectFile(aMeshName);
// if ( fd->exec() )
// aFilename = fd->selectedFile();
// toCreateGroups = fd->IsChecked();
// delete fd;
// }
else if ( isCGNS )// Export to CGNS else if ( isCGNS )// Export to CGNS
{ {
SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true ); SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
@ -843,7 +894,8 @@
} }
else if ( isGMF ) else if ( isGMF )
{ {
aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data() ); toCreateGroups = true;
aMesh->ExportGMF( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups );
} }
} }
catch (const SALOME::SALOME_Exception& S_ex){ catch (const SALOME::SALOME_Exception& S_ex){
@ -1575,7 +1627,7 @@
bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO, bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO,
MeshObjectType theType, SMESH::MeshObjectType theType,
const QString theInTypeName, const QString theInTypeName,
QString & theOutTypeName) QString & theOutTypeName)
{ {
@ -1607,11 +1659,11 @@
QString aTypeName; QString aTypeName;
if ( if (
CheckOIType ( theIO, HYPOTHESIS, "Hypothesis", aTypeName ) || CheckOIType ( theIO, SMESH::HYPOTHESIS, "Hypothesis", aTypeName ) ||
CheckOIType ( theIO, ALGORITHM, "Algorithm", aTypeName ) || CheckOIType ( theIO, SMESH::ALGORITHM, "Algorithm", aTypeName ) ||
CheckOIType ( theIO, MESH, "Mesh", aTypeName ) || CheckOIType ( theIO, SMESH::MESH, "Mesh", aTypeName ) ||
CheckOIType ( theIO, SUBMESH, "SubMesh", aTypeName ) || CheckOIType ( theIO, SMESH::SUBMESH, "SubMesh", aTypeName ) ||
CheckOIType ( theIO, GROUP, "Group", aTypeName ) CheckOIType ( theIO, SMESH::GROUP, "Group", aTypeName )
) )
return aTypeName; return aTypeName;
@ -3018,7 +3070,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
if(checkLock(aStudy)) break; if(checkLock(aStudy)) break;
if ( vtkwnd ) { if ( vtkwnd ) {
EmitSignalDeactivateDialog(); EmitSignalDeactivateDialog();
SMDSAbs_EntityType type; SMDSAbs_EntityType type = SMDSEntity_Last;
switch (theCommandID) { switch (theCommandID) {
case 4034: case 4034:
@ -3036,13 +3088,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
case 4039: case 4039:
type = SMDSEntity_Quad_Penta; break; type = SMDSEntity_Quad_Penta; break;
case 4040: case 4040:
type = SMDSEntity_Quad_Hexa; type = SMDSEntity_Quad_Hexa; break;
case 4140: case 4140:
type = SMDSEntity_TriQuad_Hexa; type = SMDSEntity_TriQuad_Hexa; break;
break; default: break;
default:;
} }
( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show(); if ( type != SMDSEntity_Last )
( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show();
} }
else { else {
SUIT_MessageBox::warning(SMESHGUI::desktop(), SUIT_MessageBox::warning(SMESHGUI::desktop(),
@ -3293,6 +3345,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID )
break; break;
} }
case 4070: // 0D_ON_ALL_NODES
startOperation( 4070 );
break;
case 5105: // Library of selection filters case 5105: // Library of selection filters
{ {
static QList<int> aTypes; static QList<int> aTypes;
@ -3493,12 +3549,8 @@ void SMESHGUI::createPopupItem( const int id,
const QString& theRule, const QString& theRule,
const int pId ) const int pId )
{ {
int parentId = pId;
if( pId!=-1 )
parentId = popupMgr()->actionId( action( pId ) );
if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) ) if( !popupMgr()->contains( popupMgr()->actionId( action( id ) ) ) )
popupMgr()->insert( action( id ), parentId, 0 ); popupMgr()->insert( action( id ), pId, 0 );
QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality(); QString lc = "$"; // VSR : instead of QtxPopupSelection::defEquality();
QString dc = "selcount"; // VSR : insetad of QtxPopupSelection::defSelCountParam() QString dc = "selcount"; // VSR : insetad of QtxPopupSelection::defSelCountParam()
@ -3549,13 +3601,13 @@ void SMESHGUI::initialize( CAM_Application* app )
createSMESHAction( 142, "CGNS"); createSMESHAction( 142, "CGNS");
createSMESHAction( 144, "SAUV"); createSMESHAction( 144, "SAUV");
createSMESHAction( 146, "GMF" ); createSMESHAction( 146, "GMF" );
createSMESHAction( 124, "EXPORT_DAT" ); createSMESHAction( 124, "DAT" );
createSMESHAction( 125, "EXPORT_MED" ); createSMESHAction( 125, "MED" );
createSMESHAction( 126, "EXPORT_UNV" ); createSMESHAction( 126, "UNV" );
createSMESHAction( 141, "EXPORT_STL" ); createSMESHAction( 141, "STL" );
createSMESHAction( 143, "EXPORT_CGNS"); createSMESHAction( 143, "CGNS");
createSMESHAction( 145, "EXPORT_SAUV"); createSMESHAction( 145, "SAUV");
createSMESHAction( 147, "EXPORT_GMF" ); createSMESHAction( 147, "GMF" );
createSMESHAction( 150, "FILE_INFO" ); createSMESHAction( 150, "FILE_INFO" );
createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete ); createSMESHAction( 33, "DELETE", "ICON_DELETE", Qt::Key_Delete );
createSMESHAction( 5105, "SEL_FILTER_LIB" ); createSMESHAction( 5105, "SEL_FILTER_LIB" );
@ -3647,6 +3699,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createSMESHAction( 4067, "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" ); createSMESHAction( 4067, "MESH_THROU_POINT","ICON_DLG_MOVE_NODE" );
createSMESHAction( 4068, "SCALE", "ICON_DLG_MESH_SCALE" ); createSMESHAction( 4068, "SCALE", "ICON_DLG_MESH_SCALE" );
createSMESHAction( 4069, "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" ); createSMESHAction( 4069, "DUPLICATE_NODES", "ICON_SMESH_DUPLICATE_NODES" );
createSMESHAction( 4070, "0D_ON_ALL_NODES", "ICON_0D_ON_ALL_NODES" );
createSMESHAction( 407, "INV", "ICON_DLG_MESH_DIAGONAL" ); createSMESHAction( 407, "INV", "ICON_DLG_MESH_DIAGONAL" );
createSMESHAction( 408, "UNION2", "ICON_UNION2TRI" ); createSMESHAction( 408, "UNION2", "ICON_UNION2TRI" );
createSMESHAction( 409, "ORIENT", "ICON_DLG_MESH_ORIENTATION" ); createSMESHAction( 409, "ORIENT", "ICON_DLG_MESH_ORIENTATION" );
@ -3809,6 +3862,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createMenu( 4000, addId, -1 ); createMenu( 4000, addId, -1 );
createMenu( 4009, addId, -1 ); createMenu( 4009, addId, -1 );
createMenu( 4070, addId, -1 );
createMenu( 4008, addId, -1 ); createMenu( 4008, addId, -1 );
createMenu( 4010, addId, -1 ); createMenu( 4010, addId, -1 );
createMenu( 4021, addId, -1 ); createMenu( 4021, addId, -1 );
@ -3934,6 +3988,7 @@ void SMESHGUI::initialize( CAM_Application* app )
createTool( 4000, addRemTb ); createTool( 4000, addRemTb );
createTool( 4009, addRemTb ); createTool( 4009, addRemTb );
createTool( 4070, addRemTb );
createTool( 4008, addRemTb ); createTool( 4008, addRemTb );
createTool( 4010, addRemTb ); createTool( 4010, addRemTb );
createTool( 4021, addRemTb ); createTool( 4021, addRemTb );
@ -3999,17 +4054,17 @@ void SMESHGUI::initialize( CAM_Application* app )
QString OB = "'ObjectBrowser'", QString OB = "'ObjectBrowser'",
View = "'" + SVTK_Viewer::Type() + "'", View = "'" + SVTK_Viewer::Type() + "'",
pat = "'%1'", pat = "'%1'",
mesh = pat.arg( SMESHGUI_Selection::typeName( MESH ) ), mesh = pat.arg( SMESHGUI_Selection::typeName( SMESH::MESH ) ),
group = pat.arg( SMESHGUI_Selection::typeName( GROUP ) ), group = pat.arg( SMESHGUI_Selection::typeName( SMESH::GROUP ) ),
hypo = pat.arg( SMESHGUI_Selection::typeName( HYPOTHESIS ) ), hypo = pat.arg( SMESHGUI_Selection::typeName( SMESH::HYPOTHESIS ) ),
algo = pat.arg( SMESHGUI_Selection::typeName( ALGORITHM ) ), algo = pat.arg( SMESHGUI_Selection::typeName( SMESH::ALGORITHM ) ),
elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ). elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ).
arg( SMESHGUI_Selection::typeName( SUBMESH_VERTEX ) ). arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_VERTEX ) ).
arg( SMESHGUI_Selection::typeName( SUBMESH_EDGE ) ). arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_EDGE ) ).
arg( SMESHGUI_Selection::typeName( SUBMESH_FACE ) ). arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_FACE ) ).
arg( SMESHGUI_Selection::typeName( SUBMESH_SOLID ) ). arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_SOLID ) ).
arg( SMESHGUI_Selection::typeName( SUBMESH_COMPOUND ) ). arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH_COMPOUND ) ).
arg( SMESHGUI_Selection::typeName( SUBMESH ) ), arg( SMESHGUI_Selection::typeName( SMESH::SUBMESH ) ),
subMesh = elems, subMesh = elems,
mesh_part = mesh + " " + subMesh + " " + group, mesh_part = mesh + " " + subMesh + " " + group,
mesh_group = mesh + " " + group, mesh_group = mesh + " " + group,
@ -4065,14 +4120,16 @@ void SMESHGUI::initialize( CAM_Application* app )
QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc ); QString multiple_non_empty = QString( " && %1>0 && numberOfNodes>0" ).arg( dc );
QString only_one_2D = only_one_non_empty + " && dim>1"; QString only_one_2D = only_one_non_empty + " && dim>1";
createPopupItem( 125, OB, mesh_group, multiple_non_empty ); // EXPORT_MED int anId = popupMgr()->insert( tr( "MEN_EXPORT" ), -1, -1 ); // EXPORT submenu
createPopupItem( 126, OB, mesh_group, only_one_non_empty ); // EXPORT_UNV createPopupItem( 125, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_MED
createPopupItem( 141, OB, mesh_group, only_one_2D ); // EXPORT_STL createPopupItem( 126, OB, mesh_group, only_one_non_empty, anId ); // EXPORT_UNV
createPopupItem( 141, OB, mesh_group, only_one_2D, anId ); // EXPORT_STL
#ifdef WITH_CGNS #ifdef WITH_CGNS
createPopupItem( 143, OB, mesh_group, multiple_non_empty ); // EXPORT_CGNS createPopupItem( 143, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_CGNS
#endif #endif
createPopupItem( 145, OB, mesh_group, multiple_non_empty ); // EXPORT_SAUV createPopupItem( 145, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_SAUV
createPopupItem( 147, OB, mesh_group, multiple_non_empty ); // EXPORT_GMF createPopupItem( 147, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_GMF
createPopupItem( 124, OB, mesh_group, multiple_non_empty, anId ); // EXPORT_DAT
createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE createPopupItem( 33, OB, mesh_part + " " + hyp_alg ); // DELETE
createPopupItem( 813, OB, group ); // DEL_GROUP with contents createPopupItem( 813, OB, group ); // DEL_GROUP with contents
popupMgr()->insert( separator(), -1, 0 ); popupMgr()->insert( separator(), -1, 0 );
@ -4092,7 +4149,6 @@ void SMESHGUI::initialize( CAM_Application* app )
createPopupItem( 1137, OB + " " + View, mesh, "&& isAutoColor" ); // DISABLE_AUTO_COLOR createPopupItem( 1137, OB + " " + View, mesh, "&& isAutoColor" ); // DISABLE_AUTO_COLOR
popupMgr()->insert( separator(), -1, 0 ); popupMgr()->insert( separator(), -1, 0 );
int anId;
QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" ); QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" );
QString aType = QString( "%1type in {%2}" ).arg( lc ); QString aType = QString( "%1type in {%2}" ).arg( lc );
aType = aType.arg( mesh_part ); aType = aType.arg( mesh_part );
@ -4752,7 +4808,7 @@ void SMESHGUI::createPreferences()
int previewGroup = addPreference( tr( "SMESH_PREF_GROUP_PREVIEW" ), genTab ); int previewGroup = addPreference( tr( "SMESH_PREF_GROUP_PREVIEW" ), genTab );
setPreferenceProperty( previewGroup, "columns", 2 ); setPreferenceProperty( previewGroup, "columns", 2 );
int chunkSize = addPreference( tr( "PREF_PREVIEW_CHUNK_SIZE" ), previewGroup, LightApp_Preferences::IntSpin, "SMESH", "preview_actor_chunk_size" ); int chunkSize = addPreference( tr( "PREF_PREVIEW_CHUNK_SIZE" ), previewGroup, LightApp_Preferences::IntSpin, "SMESH", "preview_actor_chunk_size" );
setPreferenceProperty( chunkSize, "min", 0 ); setPreferenceProperty( chunkSize, "min", 1 );
setPreferenceProperty( chunkSize, "max", 1000 ); setPreferenceProperty( chunkSize, "max", 1000 );
setPreferenceProperty( chunkSize, "step", 50 ); setPreferenceProperty( chunkSize, "step", 50 );
@ -5131,9 +5187,12 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const
case 904: // Find element case 904: // Find element
op = new SMESHGUI_FindElemByPointOp(); op = new SMESHGUI_FindElemByPointOp();
break; break;
case 4067: // make mesh pass through point case 4067: // Make mesh pass through point
op = new SMESHGUI_MakeNodeAtPointOp(); op = new SMESHGUI_MakeNodeAtPointOp();
break; break;
case 4070: // Create 0D elements on all nodes
op = new SMESHGUI_Add0DElemsOnAllNodesOp();
break;
default: default:
break; break;
} }
@ -5215,9 +5274,9 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList<SALOMEDS::Color>& theReser
return aSColor; return aSColor;
} }
const char gSeparator = '_'; // character used to separate parameter names const char* gSeparator = "_"; // character used to separate parameter names
const char gDigitsSep = ':'; // character used to separate numeric parameter values (color = r:g:b) const char* gDigitsSep = ":"; // character used to separate numeric parameter values (color = r:g:b)
const char gPathSep = '|'; // character used to separate paths const char* gPathSep = "|"; // character used to separate paths
/*! /*!
* \brief Store visual parameters * \brief Store visual parameters
@ -5227,6 +5286,9 @@ const char gPathSep = '|'; // character used to separate paths
*/ */
void SMESHGUI::storeVisualParameters (int savePoint) void SMESHGUI::storeVisualParameters (int savePoint)
{ {
// localizing
Kernel_Utils::Localizer loc;
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy()); SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
if (!appStudy || !appStudy->studyDS()) if (!appStudy || !appStudy->studyDS())
return; return;
@ -5367,9 +5429,11 @@ void SMESHGUI::storeVisualParameters (int savePoint)
// Displayed entities // Displayed entities
unsigned int aMode = aSmeshActor->GetEntityMode(); unsigned int aMode = aSmeshActor->GetEntityMode();
bool isE = aMode & SMESH_Actor::eEdges; bool isE = aMode & SMESH_Actor::eEdges;
bool isF = aMode & SMESH_Actor::eFaces; bool isF = aMode & SMESH_Actor::eFaces;
bool isV = aMode & SMESH_Actor::eVolumes; bool isV = aMode & SMESH_Actor::eVolumes;
bool is0d = aMode & SMESH_Actor::e0DElements;
bool isB = aMode & SMESH_Actor::eBallElem;
QString modeStr ("e"); QString modeStr ("e");
modeStr += gDigitsSep; modeStr += QString::number(isE); modeStr += gDigitsSep; modeStr += QString::number(isE);
@ -5377,53 +5441,92 @@ void SMESHGUI::storeVisualParameters (int savePoint)
modeStr += gDigitsSep; modeStr += QString::number(isF); modeStr += gDigitsSep; modeStr += QString::number(isF);
modeStr += gDigitsSep; modeStr += "v"; modeStr += gDigitsSep; modeStr += "v";
modeStr += gDigitsSep; modeStr += QString::number(isV); modeStr += gDigitsSep; modeStr += QString::number(isV);
modeStr += gDigitsSep; modeStr += "0d";
modeStr += gDigitsSep; modeStr += QString::number(is0d);
modeStr += gDigitsSep; modeStr += "b";
modeStr += gDigitsSep; modeStr += QString::number(isB);
param = vtkParam + "Entities"; param = vtkParam + "Entities";
ip->setParameter(entry, param, modeStr.toLatin1().data()); ip->setParameter(entry, param, modeStr.toLatin1().data());
// Colors (surface:edge:) // Colors
vtkFloatingPointType r, g, b; vtkFloatingPointType r, g, b;
int delta; int delta;
aSmeshActor->GetSufaceColor(r, g, b, delta); aSmeshActor->GetSufaceColor(r, g, b, delta);
QString colorStr ("surface"); QStringList colorStr;
colorStr += gDigitsSep; colorStr += QString::number(r); colorStr << "surface";
colorStr += gDigitsSep; colorStr += QString::number(g); colorStr << QString::number(r);
colorStr += gDigitsSep; colorStr += QString::number(b); colorStr << QString::number(g);
colorStr << QString::number(b);
colorStr += gDigitsSep; colorStr += "backsurface"; colorStr << "backsurface";
colorStr += gDigitsSep; colorStr += QString::number(delta); colorStr << QString::number(delta);
aSmeshActor->GetVolumeColor(r, g, b, delta);
colorStr << "volume";
colorStr << QString::number(r);
colorStr << QString::number(g);
colorStr << QString::number(b);
colorStr << QString::number(delta);
aSmeshActor->GetEdgeColor(r, g, b); aSmeshActor->GetEdgeColor(r, g, b);
colorStr += gDigitsSep; colorStr += "edge"; colorStr << "edge";
colorStr += gDigitsSep; colorStr += QString::number(r); colorStr << QString::number(r);
colorStr += gDigitsSep; colorStr += QString::number(g); colorStr << QString::number(g);
colorStr += gDigitsSep; colorStr += QString::number(b); colorStr << QString::number(b);
aSmeshActor->GetNodeColor(r, g, b); aSmeshActor->GetNodeColor(r, g, b);
colorStr += gDigitsSep; colorStr += "node"; colorStr << "node";
colorStr += gDigitsSep; colorStr += QString::number(r); colorStr << QString::number(r);
colorStr += gDigitsSep; colorStr += QString::number(g); colorStr << QString::number(g);
colorStr += gDigitsSep; colorStr += QString::number(b); colorStr << QString::number(b);
aSmeshActor->GetOutlineColor(r, g, b); aSmeshActor->GetOutlineColor(r, g, b);
colorStr += gDigitsSep; colorStr += "outline"; colorStr << "outline";
colorStr += gDigitsSep; colorStr += QString::number(r); colorStr << QString::number(r);
colorStr += gDigitsSep; colorStr += QString::number(g); colorStr << QString::number(g);
colorStr += gDigitsSep; colorStr += QString::number(b); colorStr << QString::number(b);
aSmeshActor->Get0DColor(r, g, b);
colorStr << "elem0d";
colorStr << QString::number(r);
colorStr << QString::number(g);
colorStr << QString::number(b);
aSmeshActor->GetBallColor(r, g, b);
colorStr << "ball";
colorStr << QString::number(r);
colorStr << QString::number(g);
colorStr << QString::number(b);
aSmeshActor->GetFacesOrientationColor(r, g, b);
colorStr << "orientation";
colorStr << QString::number(r);
colorStr << QString::number(g);
colorStr << QString::number(b);
param = vtkParam + "Colors"; param = vtkParam + "Colors";
ip->setParameter(entry, param, colorStr.toLatin1().data()); ip->setParameter(entry, param, qPrintable(colorStr.join(gDigitsSep)));
// Sizes of lines and points // Sizes
QString sizeStr ("line"); QStringList sizeStr;
sizeStr += gDigitsSep; sizeStr += QString::number((int)aSmeshActor->GetLineWidth()); sizeStr << "line";
sizeStr += gDigitsSep; sizeStr += "shrink"; sizeStr << QString::number((int)aSmeshActor->GetLineWidth());
sizeStr += gDigitsSep; sizeStr += QString::number(aSmeshActor->GetShrinkFactor()); sizeStr << "outline";
sizeStr << QString::number((int)aSmeshActor->GetOutlineWidth());
sizeStr << "elem0d";
sizeStr << QString::number((int)aSmeshActor->Get0DSize());
sizeStr << "ball";
sizeStr << QString::number((int)aSmeshActor->GetBallSize());
sizeStr << "shrink";
sizeStr << QString::number(aSmeshActor->GetShrinkFactor());
sizeStr << "orientation";
sizeStr << QString::number(aSmeshActor->GetFacesOrientationScale());
sizeStr << QString::number(aSmeshActor->GetFacesOrientation3DVectors());
param = vtkParam + "Sizes"; param = vtkParam + "Sizes";
ip->setParameter(entry, param, sizeStr.toLatin1().data()); ip->setParameter(entry, param, qPrintable(sizeStr.join(gDigitsSep)));
// Point marker // Point marker
QString markerStr; QString markerStr;
@ -5509,6 +5612,9 @@ typedef std::map<int, TPlaneInfoList> TPlaneInfoMap;
*/ */
void SMESHGUI::restoreVisualParameters (int savePoint) void SMESHGUI::restoreVisualParameters (int savePoint)
{ {
// localizing
Kernel_Utils::Localizer loc;
SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy()); SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>(application()->activeStudy());
if (!appStudy || !appStudy->studyDS()) if (!appStudy || !appStudy->studyDS())
return; return;
@ -5745,95 +5851,279 @@ void SMESHGUI::restoreVisualParameters (int savePoint)
// Displayed entities // Displayed entities
else if (paramNameStr == "Entities") { else if (paramNameStr == "Entities") {
QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts); QStringList mode = val.split(gDigitsSep, QString::SkipEmptyParts);
if (mode.count() == 6) { int aEntityMode = SMESH_Actor::eAllEntity;
if (mode[0] != "e" || mode[2] != "f" || mode[4] != "v") { for ( int i = 0; i < mode.count(); i+=2 ) {
MESSAGE("Invalid order of data in Entities, must be: " if ( i < mode.count()-1 ) {
"e:0/1:f:0/1:v:0/1"); QString type = mode[i];
} bool val = mode[i+1].toInt();
else { if ( type == "e" && !val )
unsigned int aMode = aSmeshActor->GetEntityMode(); aEntityMode = aEntityMode & ~SMESH_Actor::eEdges;
unsigned int aNewMode = else if ( type == "f" && !val )
(int(SMESH_Actor::eEdges ) * mode[1].toInt()) | aEntityMode = aEntityMode & ~SMESH_Actor::eFaces;
(int(SMESH_Actor::eFaces ) * mode[3].toInt()) | else if ( type == "v" && !val )
(int(SMESH_Actor::eVolumes) * mode[5].toInt()); aEntityMode = aEntityMode & ~SMESH_Actor::eVolumes;
if (aNewMode != aMode) else if ( type == "0d" && !val )
aSmeshActor->SetEntityMode(aNewMode); aEntityMode = aEntityMode & ~SMESH_Actor::e0DElements;
else if ( type == "b" && !val )
aEntityMode = aEntityMode & ~SMESH_Actor::eBallElem;
} }
} }
aSmeshActor->SetEntityMode( aEntityMode );
} }
// Colors // Colors
else if (paramNameStr == "Colors") { else if (paramNameStr == "Colors") {
QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts); QStringList colors = val.split(gDigitsSep, QString::SkipEmptyParts);
if (colors.count() == 16 || colors.count() == 18 ) { QColor nodeColor;
if (colors[0] != "surface" || colors[4] != "backsurface" || QColor edgeColor;
(colors[8] != "edge" && colors[6] != "edge" ) || (colors[12] != "node" && colors[10] != "node") || QColor faceColor;
(colors.count() == 18 && colors[14] != "outline")) { QColor volumeColor;
MESSAGE("Invalid order of data in Colors, must be: " QColor elem0dColor;
"surface:r:g:b:backsurface:r:g:b:edge:r:g:b:node:r:g:b or surface:r:g:b:backsurface:delta:edge:r:g:b:node:r:g:b:outline:r:g:b"); QColor ballColor;
QColor outlineColor;
QColor orientationColor;
int deltaF;
int deltaV;
QColor c;
double r, g, b;
bool bOk;
// below lines are required to get default values for delta coefficients
// of backface color for faces and color of reversed volumes
SMESH::GetColor( "SMESH", "fill_color", c, deltaF, "0,170,255|-100" );
SMESH::GetColor( "SMESH", "volume_color", c, deltaV, "255,0,170|-100" );
for ( int i = 0; i < colors.count(); i++ ) {
QString type = colors[i];
if ( type == "surface" ) {
// face color is set by 3 values r:g:b, where
// - r,g,b - is rgb color components
if ( i+1 >= colors.count() ) break; // format error
r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+3 >= colors.count() ) break; // format error
b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
faceColor.setRgbF( r, g, b );
i += 3;
} }
else { else if ( type == "backsurface" ) {
int delta = 0; // backface color can be defined in several ways
float er,eg,eb; // - in old versions, it is set as rgb triple r:g:b - this was is unsupported now
float nr,ng,nb; // - in latest versions, it is set as delta coefficient
vtkFloatingPointType otr,otg,otb; bool rgbOk = false, deltaOk;
//Old case backsurface color is independent if ( i+1 >= colors.count() ) break; // format error
if( colors.count() == 16 ) { r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
QColor ffc; int delta = colors[i+1].toInt( &deltaOk );
SMESH::GetColor( "SMESH", "fill_color", ffc, delta, "0,170,255|-100" ) ; i++; // shift index
er = colors[9].toFloat(); if ( i+1 < colors.count() ) // index is shifted to 1
eg = colors[10].toFloat(); g = colors[i+1].toDouble( &rgbOk );
eb = colors[11].toFloat(); if ( rgbOk ) i++; // shift index
if ( rgbOk && i+1 < colors.count() ) // index is shifted to 2
nr = colors[13].toFloat(); b = colors[i+1].toDouble( &rgbOk );
ng = colors[14].toFloat(); if ( rgbOk ) i++;
nb = colors[15].toFloat(); // - as currently there's no way to set directly backsurface color as it was before,
SMESH::GetColor("SMESH", "outline_color", otr, otg, otb, QColor( 0, 70, 0 ) ); // we ignore old dump where r,g,b triple was set
} else { // - also we check that delta parameter is set properly
//New case backsurface color depends on surface color if ( !rgbOk && deltaOk )
delta = colors[5].toInt(); deltaF = delta;
}
er = colors[7].toFloat(); else if ( type == "volume" ) {
eg = colors[8].toFloat(); // volume color is set by 4 values r:g:b:delta, where
eb = colors[9].toFloat(); // - r,g,b - is a normal volume rgb color components
// - delta - is a reversed volume color delta coefficient
nr = colors[11].toFloat(); if ( i+1 >= colors.count() ) break; // format error
ng = colors[12].toFloat(); r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
nb = colors[13].toFloat(); if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
otr = colors[15].toFloat(); if ( i+3 >= colors.count() ) break; // format error
otg = colors[16].toFloat(); b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
otb = colors[17].toFloat(); if ( i+4 >= colors.count() ) break; // format error
} int delta = colors[i+4].toInt( &bOk );
aSmeshActor->SetSufaceColor(colors[1].toFloat(), colors[2].toFloat(), colors[3].toFloat(), delta); if ( !bOk ) break; // format error
aSmeshActor->SetEdgeColor(er,eg,eb); volumeColor.setRgbF( r, g, b );
aSmeshActor->SetNodeColor(nr,ng,nb); deltaV = delta;
aSmeshActor->SetOutlineColor(otr,otg,otb); i += 4;
}
else if ( type == "edge" ) {
// edge color is set by 3 values r:g:b, where
// - r,g,b - is rgb color components
if ( i+1 >= colors.count() ) break; // format error
r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+3 >= colors.count() ) break; // format error
b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
edgeColor.setRgbF( r, g, b );
i += 3;
}
else if ( type == "node" ) {
// node color is set by 3 values r:g:b, where
// - r,g,b - is rgb color components
if ( i+1 >= colors.count() ) break; // format error
r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+3 >= colors.count() ) break; // format error
b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
nodeColor.setRgbF( r, g, b );
i += 3;
}
else if ( type == "elem0d" ) {
// 0d element color is set by 3 values r:g:b, where
// - r,g,b - is rgb color components
if ( i+1 >= colors.count() ) break; // format error
r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+3 >= colors.count() ) break; // format error
b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
elem0dColor.setRgbF( r, g, b );
i += 3;
}
else if ( type == "ball" ) {
// ball color is set by 3 values r:g:b, where
// - r,g,b - is rgb color components
if ( i+1 >= colors.count() ) break; // format error
r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+3 >= colors.count() ) break; // format error
b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
ballColor.setRgbF( r, g, b );
i += 3;
}
else if ( type == "outline" ) {
// outline color is set by 3 values r:g:b, where
// - r,g,b - is rgb color components
if ( i+1 >= colors.count() ) break; // format error
r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+3 >= colors.count() ) break; // format error
b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
outlineColor.setRgbF( r, g, b );
i += 3;
}
else if ( type == "orientation" ) {
// orientation color is set by 3 values r:g:b, where
// - r,g,b - is rgb color components
if ( i+1 >= colors.count() ) break; // format error
r = colors[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= colors.count() ) break; // format error
g = colors[i+2].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+3 >= colors.count() ) break; // format error
b = colors[i+3].toDouble( &bOk ); if ( !bOk ) break; // format error
orientationColor.setRgbF( r, g, b );
i += 3;
} }
} }
// node color
if ( nodeColor.isValid() )
aSmeshActor->SetNodeColor( nodeColor.redF(), nodeColor.greenF(), nodeColor.blueF() );
// edge color
if ( edgeColor.isValid() )
aSmeshActor->SetEdgeColor( edgeColor.redF(), edgeColor.greenF(), edgeColor.blueF() );
// face color
if ( faceColor.isValid() )
aSmeshActor->SetSufaceColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
// volume color
if ( volumeColor.isValid() )
aSmeshActor->SetVolumeColor( volumeColor.redF(), volumeColor.greenF(), volumeColor.blueF(), deltaV );
else if ( faceColor.isValid() ) // backward compatibility (no separate color for volumes)
aSmeshActor->SetVolumeColor( faceColor.redF(), faceColor.greenF(), faceColor.blueF(), deltaF );
// 0d element color
if ( elem0dColor.isValid() )
aSmeshActor->Set0DColor( elem0dColor.redF(), elem0dColor.greenF(), elem0dColor.blueF() );
// ball color
if ( ballColor.isValid() )
aSmeshActor->SetBallColor( ballColor.redF(), ballColor.greenF(), ballColor.blueF() );
// outline color
if ( outlineColor.isValid() )
aSmeshActor->SetOutlineColor( outlineColor.redF(), outlineColor.greenF(), outlineColor.blueF() );
// orientation color
if ( orientationColor.isValid() )
aSmeshActor->SetFacesOrientationColor( orientationColor.redF(), orientationColor.greenF(), orientationColor.blueF() );
} }
// Sizes of lines and points // Sizes
else if (paramNameStr == "Sizes") { else if (paramNameStr == "Sizes") {
QStringList sizes = val.split(gDigitsSep, QString::SkipEmptyParts); QStringList sizes = val.split(gDigitsSep, QString::SkipEmptyParts);
if (sizes.count() == 4) { bool bOk;
if (sizes[0] != "line" || sizes[2] != "shrink") { int lineWidth = -1;
MESSAGE("Invalid order of data in Sizes, must be: " int outlineWidth = -1;
"line:int:shrink:float"); int elem0dSize = -1;
int ballSize = -1;
double shrinkSize = -1;
double orientationSize = -1;
bool orientation3d = false;
for ( int i = 0; i < sizes.count(); i++ ) {
QString type = sizes[i];
if ( type == "line" ) {
// line (wireframe) width is given as single integer value
if ( i+1 >= sizes.count() ) break; // format error
int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
lineWidth = v;
i++;
} }
else { if ( type == "outline" ) {
aSmeshActor->SetLineWidth(sizes[1].toInt()); // outline width is given as single integer value
aSmeshActor->SetShrinkFactor(sizes[3].toFloat()); if ( i+1 >= sizes.count() ) break; // format error
int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
outlineWidth = v;
i++;
}
else if ( type == "elem0d" ) {
// 0d element size is given as single integer value
if ( i+1 >= sizes.count() ) break; // format error
int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
elem0dSize = v;
i++;
}
else if ( type == "ball" ) {
// ball size is given as single integer value
if ( i+1 >= sizes.count() ) break; // format error
int v = sizes[i+1].toInt( &bOk ); if ( !bOk ) break; // format error
ballSize = v;
i++;
}
else if ( type == "shrink" ) {
// shrink factor is given as single floating point value
if ( i+1 >= sizes.count() ) break; // format error
double v = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
shrinkSize = v;
i++;
}
else if ( type == "orientation" ) {
// orientation vectors are specified by two values size:3d, where
// - size - is a floating point value specifying scale factor
// - 3d - is a boolean
if ( i+1 >= sizes.count() ) break; // format error
double v1 = sizes[i+1].toDouble( &bOk ); if ( !bOk ) break; // format error
if ( i+2 >= sizes.count() ) break; // format error
int v2 = sizes[i+2].toInt( &bOk ); if ( !bOk ) break; // format error
orientationSize = v1;
orientation3d = (bool)v2;
i += 2;
} }
} }
else if (sizes.count() == 6) { // just to support old format // line (wireframe) width
if (sizes[0] != "line" || sizes[2] != "node" || sizes[4] != "shrink") { if ( lineWidth > 0 )
MESSAGE("Invalid order of data in Sizes, must be: " aSmeshActor->SetLineWidth( lineWidth );
"line:int:node:int:shrink:float"); // outline width
} if ( outlineWidth > 0 )
else { aSmeshActor->SetOutlineWidth( outlineWidth );
aSmeshActor->SetLineWidth(sizes[1].toInt()); else if ( lineWidth > 0 ) // backward compatibility (no separate width for outlines)
//aSmeshActor->SetNodeSize(sizes[3].toInt()); // made obsolete aSmeshActor->SetOutlineWidth( lineWidth );
aSmeshActor->SetShrinkFactor(sizes[5].toFloat()); // 0d element size
} if ( elem0dSize > 0 )
aSmeshActor->Set0DSize( elem0dSize );
// ball size
if ( ballSize > 0 )
aSmeshActor->SetBallSize( ballSize );
// shrink factor
if ( shrinkSize > 0 )
aSmeshActor->SetShrinkFactor( shrinkSize );
// orientation vectors
if ( orientationSize > 0 ) {
aSmeshActor->SetFacesOrientationScale( orientationSize );
aSmeshActor->SetFacesOrientation3DVectors( orientation3d );
} }
} }
// Point marker // Point marker
@ -6166,11 +6456,11 @@ bool SMESHGUI::renameAllowed( const QString& entry) const {
// check type to prevent renaming of inappropriate objects // check type to prevent renaming of inappropriate objects
int aType = SMESHGUI_Selection::type(qPrintable(entry), SMESH::GetActiveStudyDocument()); int aType = SMESHGUI_Selection::type(qPrintable(entry), SMESH::GetActiveStudyDocument());
if (aType == MESH || aType == GROUP || if (aType == SMESH::MESH || aType == SMESH::GROUP ||
aType == SUBMESH || aType == SUBMESH_COMPOUND || aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND ||
aType == SUBMESH_SOLID || aType == SUBMESH_FACE || aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE ||
aType == SUBMESH_EDGE || aType == SUBMESH_VERTEX || aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX ||
aType == HYPOTHESIS || aType == ALGORITHM) aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM)
return true; return true;
return false; return false;
@ -6213,11 +6503,11 @@ bool SMESHGUI::renameObject( const QString& entry, const QString& name) {
aName = anAttr; aName = anAttr;
// check type to prevent renaming of inappropriate objects // check type to prevent renaming of inappropriate objects
int aType = SMESHGUI_Selection::type( qPrintable(entry), SMESH::GetActiveStudyDocument() ); int aType = SMESHGUI_Selection::type( qPrintable(entry), SMESH::GetActiveStudyDocument() );
if (aType == MESH || aType == GROUP || if (aType == SMESH::MESH || aType == SMESH::GROUP ||
aType == SUBMESH || aType == SUBMESH_COMPOUND || aType == SMESH::SUBMESH || aType == SMESH::SUBMESH_COMPOUND ||
aType == SUBMESH_SOLID || aType == SUBMESH_FACE || aType == SMESH::SUBMESH_SOLID || aType == SMESH::SUBMESH_FACE ||
aType == SUBMESH_EDGE || aType == SUBMESH_VERTEX || aType == SMESH::SUBMESH_EDGE || aType == SMESH::SUBMESH_VERTEX ||
aType == HYPOTHESIS || aType == ALGORITHM) { aType == SMESH::HYPOTHESIS || aType == SMESH::ALGORITHM) {
if ( !name.isEmpty() ) { if ( !name.isEmpty() ) {
SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qPrintable(name) ); SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), qPrintable(name) );

View File

@ -0,0 +1,495 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESHGUI : GUI for SMESH component
// File : SMESHGUI_Add0DElemsOnAllNodesDlg.cxx
// Created : Fri Oct 19 15:51:24 2012
// Author : Edward AGAPOV (eap)
#include "SMESHGUI_Add0DElemsOnAllNodesDlg.h"
#include "SMESHGUI.h"
#include "SMESHGUI_FilterDlg.h"
#include "SMESHGUI_MeshUtils.h"
#include "SMESHGUI_Utils.h"
#include "SMESHGUI_VTKUtils.h"
#include "SMESH_LogicalFilter.hxx"
#include "SMESH_TypeFilter.hxx"
#include <LightApp_SelectionMgr.h>
#include <SALOME_ListIO.hxx>
#include <SUIT_MessageBox.h>
#include <SVTK_Selector.h>
#include <SalomeApp_Tools.h>
// Qt includes
#include <QButtonGroup>
#include <QCheckBox>
#include <QComboBox>
#include <QFrame>
#include <QGridLayout>
#include <QGroupBox>
#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QRadioButton>
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(SMESH_Mesh)
#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
#define SPACING 6
#define MARGIN 11
enum { SEL_OBJECT, SEL_ELEMENTS, SEL_NODES };
//================================================================================
/*!
* \brief Dialog Constructor
*/
//================================================================================
SMESHGUI_Add0DElemsOnAllNodesDlg::SMESHGUI_Add0DElemsOnAllNodesDlg()
: SMESHGUI_Dialog( 0, false, true ),
myIDValidator( this )
{
setWindowTitle( tr( "CAPTION" ) );
// Seletction type radio buttons
QGroupBox* selTypeGrBox = new QGroupBox( mainFrame() );
//
QRadioButton* objBtn = new QRadioButton( tr( "SMESH_SUBMESH_GROUP"),selTypeGrBox );
QRadioButton* elemBtn = new QRadioButton( tr( "SMESH_ELEMENTS" ),selTypeGrBox );
QRadioButton* nodeBtn = new QRadioButton( tr( "SMESH_NODES" ),selTypeGrBox );
//
QHBoxLayout* selTypeLay = new QHBoxLayout( selTypeGrBox );
selTypeLay->setMargin(MARGIN);
selTypeLay->setSpacing(SPACING);
selTypeLay->addWidget( objBtn );
selTypeLay->addWidget( elemBtn );
selTypeLay->addWidget( nodeBtn );
objBtn->setChecked(true);
//
mySelTypeBtnGrp = new QButtonGroup( mainFrame() );
mySelTypeBtnGrp->addButton( objBtn , SEL_OBJECT );
mySelTypeBtnGrp->addButton( elemBtn, SEL_ELEMENTS );
mySelTypeBtnGrp->addButton( nodeBtn, SEL_NODES );
// Label, Select Btn, LineEdit, Filter Btn
setObjectPixmap( "SMESH", tr( "ICON_SELECT" ) );
createObject( tr( "SMESH_NAME" ), mainFrame(), 0 );
myFilterBtn = new QPushButton( tr( "SMESH_BUT_FILTER" ), mainFrame() );
// List of groups
myGroupBox = new QGroupBox( tr( "SMESH_ADD_TO_GROUP" ), mainFrame() );
myGroupBox->setCheckable( true );
myGroupLabel = new QLabel( tr( "SMESH_GROUP" ), myGroupBox );
myGroupListCmBox = new QComboBox( myGroupBox );
myGroupListCmBox->setEditable( true );
myGroupListCmBox->setInsertPolicy( QComboBox::NoInsert );
QHBoxLayout* groupsLayout = new QHBoxLayout( myGroupBox );
groupsLayout->setSpacing(SPACING);
groupsLayout->setMargin(MARGIN);
groupsLayout->addWidget( myGroupLabel );
groupsLayout->addWidget( myGroupListCmBox, 1 );
// Main layout
QGridLayout* aLay = new QGridLayout( mainFrame() );
aLay->setMargin(MARGIN);
aLay->setSpacing(SPACING);
//
aLay->addWidget( selTypeGrBox, 0, 0, 1, 5 );
//
aLay->addWidget( objectWg( 0, Label ), 1, 0 );
aLay->addWidget( objectWg( 0, Btn ), 1, 1 );
aLay->addWidget( objectWg( 0, Control), 1, 2, 1, 2 );
aLay->addWidget( myFilterBtn, 1, 4 );
//
aLay->addWidget( myGroupBox, 2, 0, 1, 5 );
// Signals
connect( myGroupBox, SIGNAL( toggled( bool )), SLOT( onGroupChecked() ));
connect( mySelTypeBtnGrp, SIGNAL( buttonClicked(int) ), SLOT( onSelTypeChange(int)));
onSelTypeChange( SEL_OBJECT );
}
//================================================================================
/*!
* \brief SLOT to enable/disable groups
*/
//================================================================================
void SMESHGUI_Add0DElemsOnAllNodesDlg::onGroupChecked( bool on )
{
myGroupLabel->setEnabled( on );
myGroupListCmBox->setEnabled( on );
}
//================================================================================
/*!
* \brief SLOT to enable/disable groups
*/
//================================================================================
void SMESHGUI_Add0DElemsOnAllNodesDlg::onSelTypeChange( int selType )
{
setNameIndication( 0, selType == SEL_OBJECT ? OneName : ListOfNames );
setReadOnly ( 0, selType == SEL_OBJECT );
QLabel* label = qobject_cast< QLabel* >( objectWg(0, Label ));
switch( selType ) {
case SEL_OBJECT: label->setText( tr("SMESH_NAME")); break;
case SEL_ELEMENTS: label->setText( tr("ELEMENT_IDS")); break;
case SEL_NODES: label->setText( tr("NODE_IDS")); break;
default:;
}
QLineEdit* lineEdit = qobject_cast< QLineEdit* >( objectWg(0, Control ));
lineEdit->setText("");
lineEdit->setValidator( selType == SEL_OBJECT ? 0 : & myIDValidator );
myFilterBtn->setEnabled( selType != SEL_OBJECT );
emit selTypeChanged( selType );
}
//================================================================================
/*!
* \brief Return type of selected object: [SEL_OBJECT, SEL_ELEMENTS, SEL_NODES]
*/
//================================================================================
int SMESHGUI_Add0DElemsOnAllNodesDlg::getSelectionType() const
{
return mySelTypeBtnGrp->checkedId();
}
//================================================================================
/*!
* \brief Checks consistency of data
*/
//================================================================================
bool SMESHGUI_Add0DElemsOnAllNodesDlg::isValid()
{
if( myGroupBox->isChecked() && myGroupListCmBox->currentText().isEmpty() ) {
SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), tr( "GROUP_NAME_IS_EMPTY" ) );
return false;
}
return true;
}
//================================================================================
/*!
* \brief Operation Constructor
*/
//================================================================================
SMESHGUI_Add0DElemsOnAllNodesOp::SMESHGUI_Add0DElemsOnAllNodesOp()
:SMESHGUI_SelectionOp(),
myDlg( new SMESHGUI_Add0DElemsOnAllNodesDlg ),
myFilterDlg( 0 )
{
myHelpFileName = "adding_nodes_and_elements_page.html#adding_0delems_on_all_nodes_anchor";
connect( myDlg, SIGNAL( selTypeChanged(int) ), SLOT( onSelTypeChange(int)));
connect( myDlg->myFilterBtn, SIGNAL( clicked()), SLOT( onSetFilter() ));
}
//================================================================================
/*!
* \brief Destructor
*/
//================================================================================
SMESHGUI_Add0DElemsOnAllNodesOp::~SMESHGUI_Add0DElemsOnAllNodesOp()
{
if ( myFilterDlg ) {
myFilterDlg->setParent( 0 );
delete myFilterDlg;
myFilterDlg = 0;
}
}
//================================================================================
/*!
* \brief Start
*/
//================================================================================
void SMESHGUI_Add0DElemsOnAllNodesOp::startOperation()
{
SMESHGUI_SelectionOp::startOperation();
myDlg->myGroupBox->setChecked( false );
myDlg->activateObject( 0 );
myDlg->show();
selectionDone();
}
//================================================================================
/*!
* \brief Treat changed selection
*/
//================================================================================
void SMESHGUI_Add0DElemsOnAllNodesOp::selectionDone()
{
if (myFilterDlg && myFilterDlg->isVisible()) return; // filter dgl active
if (!myDlg->myGroupBox->isEnabled()) return; // inactive
myIO.Nullify();
myDlg->setObjectText( 0, "");
SALOME_ListIO aList;
selectionMgr()->selectedObjects( aList );
if ( aList.Extent() == 1 )
myIO = aList.First();
else
return;
QString ids;
switch ( myDlg->getSelectionType() ) {
case SEL_OBJECT:
SMESHGUI_SelectionOp::selectionDone();
break;
case SEL_ELEMENTS:
SMESH::GetNameOfSelectedElements( selector(), myIO, ids );
myDlg->setObjectText( 0, ids );
break;
case SEL_NODES:
SMESH::GetNameOfSelectedNodes( selector(), myIO, ids );
myDlg->setObjectText( 0, ids );
break;
default:;
}
// fill the list of existing groups
myDlg->myGroupListCmBox->clear();
myDlg->myGroupListCmBox->addItem( QString() );
if ( !myIO.IsNull() && myIO->hasEntry()) {
_PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
_PTR(SObject) meshSO = aStudy->FindObjectID( myIO->getEntry() );
_PTR(SObject) group0DRoot;
if ( meshSO->FindSubObject( SMESH::Tag_0DElementsGroups, group0DRoot ))
{
_PTR(ChildIterator) group0DIter = aStudy->NewChildIterator( group0DRoot );
for ( ; group0DIter->More(); group0DIter->Next() )
{
_PTR(SObject) groupSO = group0DIter->Value();
std::string groupName = groupSO->GetName();
if ( !groupName.empty() )
myDlg->myGroupListCmBox->addItem( groupName.c_str() );
}
}
}
}
//================================================================================
/*!
* \brief Return a filter of objects
*/
//================================================================================
SUIT_SelectionFilter* SMESHGUI_Add0DElemsOnAllNodesOp::createFilter( const int ) const
{
if ( myDlg->getSelectionType() == SEL_OBJECT )
{
// Create a filter of objects: any IDSource except the group of 0D elements
QList<SUIT_SelectionFilter*> filters;
filters.push_back( new SMESH_TypeFilter( SMESH::GROUP_0D ));
SMESH_LogicalFilter* not0DGroup = new SMESH_LogicalFilter( filters,
SMESH_LogicalFilter::LO_NOT,
/*takeOwnership=*/true);
filters[0] = not0DGroup;
filters.push_back( new SMESH_TypeFilter( SMESH::IDSOURCE ));
return new SMESH_LogicalFilter( filters,
SMESH_LogicalFilter::LO_AND,
/*takeOwnership=*/true);
}
return 0;
}
//================================================================================
/*!
* \brief Makes its main job
*/
//================================================================================
bool SMESHGUI_Add0DElemsOnAllNodesOp::onApply()
{
if ( !myDlg->isValid() )
return false;
// get a mesh
SMESH::SMESH_IDSource_var meshObject;
SMESH::SMESH_Mesh_var mesh;
if ( !myIO.IsNull() )
{
CORBA::Object_var obj = SMESH::IObjectToObject( myIO );
meshObject = SMESH::SMESH_IDSource::_narrow( obj );
if ( !meshObject->_is_nil() )
mesh = meshObject->GetMesh();
}
if ( mesh->_is_nil() )
{
SUIT_MessageBox::warning( myDlg, tr( "SMESH_WRN_WARNING" ), tr( "SMESH_BAD_SELECTION" ) );
return false;
}
try {
SMESH::SMESH_MeshEditor_var editor = mesh->GetMeshEditor();
// make SMESH_IDSource holding IDs of selected elements
if ( myDlg->getSelectionType() != SEL_OBJECT )
{
QString elemIDs = myDlg->objectText( 0 );
QStringList idList = elemIDs.split( " ", QString::SkipEmptyParts );
if ( idList.count() == 0 )
{
SUIT_MessageBox::warning( myDlg, tr( "SMESH_WRN_WARNING" ), tr( "SMESH_BAD_SELECTION" ) );
return false;
}
SMESH::long_array_var idArray = new SMESH::long_array;
idArray->length( idList.count() );
QStringList::iterator idIt = idList.begin();
for ( int i = 0; idIt != idList.end(); ++idIt, ++i )
idArray[i] = idIt->toLong();
SMESH::ElementType elemType =
myDlg->getSelectionType() == SEL_NODES ? SMESH::NODE : SMESH::ALL;
meshObject = editor->MakeIDSource( idArray, elemType );
}
// Create 0D elements
int prevNb0D = mesh->Nb0DElements();
QString groupName = myDlg->myGroupListCmBox->currentText();
SMESH::SMESH_IDSource_var newObj =
editor->Create0DElementsOnAllNodes( meshObject, groupName.toLatin1().data() );
int newNb0D = mesh->Nb0DElements() - prevNb0D;
SUIT_MessageBox::information( myDlg, tr( "SMESH_INFORMATION" ),
tr( "NB_NEW_0D" ).arg( newNb0D ),
SUIT_MessageBox::Ok, SUIT_MessageBox::Ok);
}
catch ( const SALOME::SALOME_Exception& S_ex ) {
SalomeApp_Tools::QtCatchCorbaException( S_ex );
return false;
}
catch (...) {
return false;
}
// clear selection
if ( myDlg->getSelectionType() == SEL_OBJECT )
{
SALOME_ListIO aList;
selectionMgr()->setSelectedObjects( aList, /*append=*/false );
}
else
{
selector()->ClearIndex();
}
selectionDone();
SMESH::UpdateView();
SMESHGUI::Modified();
if ( myDlg->myGroupBox->isChecked() )
SMESHGUI::GetSMESHGUI()->updateObjBrowser();
return true;
}
//================================================================================
/*!
* \brief Sets selection mode
*/
//================================================================================
void SMESHGUI_Add0DElemsOnAllNodesOp::onSelTypeChange(int selType)
{
switch ( selType ) {
case SEL_OBJECT: setSelectionMode( ActorSelection ); break;
case SEL_ELEMENTS: setSelectionMode( CellSelection ); break;
case SEL_NODES: setSelectionMode( NodeSelection ); break;
}
if ( selType != SEL_OBJECT )
connect( myDlg, SIGNAL( objectChanged( int, const QStringList& )),
this, SLOT ( onTextChanged( int, const QStringList& )));
else
disconnect( myDlg, SIGNAL( objectChanged( int, const QStringList& )),
this, SLOT ( onTextChanged( int, const QStringList& )));
selectionDone();
}
//================================================================================
/*!
* \brief Install
*
*
*/
//================================================================================
void SMESHGUI_Add0DElemsOnAllNodesOp::onSetFilter()
{
SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO( myIO );
if ( mesh->_is_nil()) {
SUIT_MessageBox::critical( myDlg, tr("SMESH_ERROR"), tr("NO_MESH_SELECTED"));
return;
}
QList<int> types;
if ( myDlg->getSelectionType() == SEL_NODES ) {
types.push_back( SMESH::NODE );
}
else if ( myDlg->getSelectionType() == SEL_ELEMENTS ) {
types.push_back( SMESH::EDGE );
types.push_back( SMESH::FACE );
types.push_back( SMESH::VOLUME );
}
else
return;
if ( !myFilterDlg )
myFilterDlg = new SMESHGUI_FilterDlg( getSMESHGUI(), SMESH::ALL );
myFilterDlg->Init( types );
myFilterDlg->SetSelection();
myFilterDlg->SetMesh( mesh );
myFilterDlg->SetSourceWg( myDlg->objectWg( 0, LightApp_Dialog::Control ));
myFilterDlg->show();
}

View File

@ -0,0 +1,110 @@
// Copyright (C) 2007-2012 CEA/DEN, EDF R&D, OPEN CASCADE
//
// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
//
// SMESH SMESHGUI : GUI for SMESH component
#ifndef SMESHGUI_ADD0DELEMSONALLNODESDLG_H
#define SMESHGUI_ADD0DELEMSONALLNODESDLG_H
#include "SMESH_SMESHGUI.hxx"
#include "SMESHGUI_SelectionOp.h"
#include "SMESHGUI_Dialog.h"
#include "SMESHGUI_IdValidator.h"
class SMESHGUI_FilterDlg;
class SMESHGUI_Add0DElemsOnAllNodesOp;
class QButtonGroup;
class QPushButton;
class QGroupBox;
class QLabel;
class QComboBox;
//---------------------------------------------------------------------------------
/*!
* \brief Dialog creating 0D elements on all nodes of given elements
*/
class SMESHGUI_EXPORT SMESHGUI_Add0DElemsOnAllNodesDlg : public SMESHGUI_Dialog
{
Q_OBJECT
public:
SMESHGUI_Add0DElemsOnAllNodesDlg();
int getSelectionType() const;
bool isValid();
signals:
void selTypeChanged( int selType );
private slots:
void onGroupChecked ( bool on );
void onSelTypeChange( int selType );
private:
friend class SMESHGUI_Add0DElemsOnAllNodesOp;
QButtonGroup* mySelTypeBtnGrp;
QPushButton* myFilterBtn;
QGroupBox* myGroupBox;
QLabel* myGroupLabel;
QComboBox* myGroupListCmBox;
SMESHGUI_IdValidator myIDValidator;
};
//---------------------------------------------------------------------------------
/*!
* \brief Operation creating 0D elements on all nodes of given elements
*/
class SMESHGUI_EXPORT SMESHGUI_Add0DElemsOnAllNodesOp : public SMESHGUI_SelectionOp
{
Q_OBJECT
public:
SMESHGUI_Add0DElemsOnAllNodesOp();
~SMESHGUI_Add0DElemsOnAllNodesOp();
virtual LightApp_Dialog* dlg() const { return myDlg; }
protected:
virtual void startOperation();
virtual void selectionDone();
virtual SUIT_SelectionFilter* createFilter( const int ) const;
protected slots:
virtual bool onApply();
void onSelTypeChange(int);
void onSetFilter();
private:
SMESHGUI_Add0DElemsOnAllNodesDlg* myDlg;
SMESHGUI_FilterDlg* myFilterDlg;
Handle(SALOME_InteractiveObject) myIO;
//SUIT_SelectionFilter* myObjectFilter;
};
#endif

View File

@ -343,7 +343,8 @@ SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theMo
SelectButtonC1A1 = new QPushButton(GroupC1); SelectButtonC1A1 = new QPushButton(GroupC1);
SelectButtonC1A1->setIcon(image1); SelectButtonC1A1->setIcon(image1);
LineEditC1A1 = new QLineEdit(GroupC1); LineEditC1A1 = new QLineEdit(GroupC1);
LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, myIsPoly ? 1000 : myNbNodes)); LineEditC1A1->setValidator
(new SMESHGUI_IdValidator(this, ( myIsPoly || myNbNodes == 1 ) ? 1000 : myNbNodes));
Reverse = (myElementType == SMDSAbs_Face || myElementType == SMDSAbs_Volume ) ? new QCheckBox(tr("SMESH_REVERSE"), GroupC1) : 0; Reverse = (myElementType == SMDSAbs_Face || myElementType == SMDSAbs_Volume ) ? new QCheckBox(tr("SMESH_REVERSE"), GroupC1) : 0;
@ -439,21 +440,21 @@ void SMESHGUI_AddMeshElementDlg::Init()
myActor = 0; myActor = 0;
/* signals and slots connections */ /* signals and slots connections */
connect(buttonOk, SIGNAL(clicked()), SLOT(ClickOnOk())); connect(buttonOk, SIGNAL(clicked()), SLOT(ClickOnOk()));
connect(buttonCancel, SIGNAL(clicked()), SLOT(ClickOnCancel())); connect(buttonCancel, SIGNAL(clicked()), SLOT(ClickOnCancel()));
connect(buttonApply, SIGNAL(clicked()), SLOT(ClickOnApply())); connect(buttonApply, SIGNAL(clicked()), SLOT(ClickOnApply()));
connect(buttonHelp, SIGNAL(clicked()), SLOT(ClickOnHelp())); connect(buttonHelp, SIGNAL(clicked()), SLOT(ClickOnHelp()));
connect(SelectButtonC1A1, SIGNAL(clicked()), SLOT(SetEditCurrentArgument())); connect(SelectButtonC1A1,SIGNAL(clicked()), SLOT(SetEditCurrentArgument()));
connect(LineEditC1A1, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&))); connect(LineEditC1A1, SIGNAL(textChanged(const QString&)), SLOT(onTextChange(const QString&)));
connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), SLOT(DeactivateActiveDialog())); connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()),SLOT(DeactivateActiveDialog()));
connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(SelectionIntoArgument()));
/* to close dialog if study frame change */ /* to close dialog if study frame change */
connect(mySMESHGUI, SIGNAL (SignalStudyFrameChanged()), SLOT(ClickOnCancel())); connect(mySMESHGUI, SIGNAL(SignalStudyFrameChanged()), SLOT(ClickOnCancel()));
connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), SLOT(ClickOnCancel())); connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(ClickOnCancel()));
if (Reverse) if (Reverse)
connect(Reverse, SIGNAL(stateChanged(int)), SLOT(CheckBox(int))); connect(Reverse, SIGNAL(stateChanged(int)), SLOT(CheckBox(int)));
// set selection mode // set selection mode
SMESH::SetPointRepresentation(true); SMESH::SetPointRepresentation(true);
@ -477,9 +478,9 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
if (myNbOkNodes && !mySMESHGUI->isActiveStudyLocked()) { if (myNbOkNodes && !mySMESHGUI->isActiveStudyLocked()) {
myBusy = true; myBusy = true;
SMESH::long_array_var anArrayOfIndices = new SMESH::long_array;
anArrayOfIndices->length(myNbNodes);
QStringList aListId = myEditCurrentArgument->text().split(" ", QString::SkipEmptyParts); QStringList aListId = myEditCurrentArgument->text().split(" ", QString::SkipEmptyParts);
SMESH::long_array_var anArrayOfIndices = new SMESH::long_array;
anArrayOfIndices->length(aListId.count());
const std::vector<int>& revIndex = SMDS_MeshCell::reverseSmdsOrder( myGeomType ); const std::vector<int>& revIndex = SMDS_MeshCell::reverseSmdsOrder( myGeomType );
if ( Reverse && Reverse->isChecked() && !revIndex.empty() ) if ( Reverse && Reverse->isChecked() && !revIndex.empty() )
for (int i = 0; i < aListId.count(); i++) for (int i = 0; i < aListId.count(); i++)
@ -515,28 +516,38 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
} }
} }
long anElemId = -1;
SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
SMESH::long_array_var anIdList = new SMESH::long_array;
anIdList->length( 1 );
anIdList[0] = -1;
switch (myElementType) { switch (myElementType) {
case SMDSAbs_0DElement: case SMDSAbs_0DElement:
anElemId = aMeshEditor->Add0DElement(anArrayOfIndices[0]); break; anIdList->length( anArrayOfIndices->length() );
for ( size_t i = 0; i < anArrayOfIndices->length(); ++i )
anIdList[i] = aMeshEditor->Add0DElement(anArrayOfIndices[i]);
break;
case SMDSAbs_Ball: case SMDSAbs_Ball:
if ( myGeomType == SMDSEntity_Ball ) if ( myGeomType == SMDSEntity_Ball ) {
anElemId = aMeshEditor->AddBall(anArrayOfIndices[0], anIdList->length( anArrayOfIndices->length() );
DiameterSpinBox->GetValue()); break; for ( size_t i = 0; i < anArrayOfIndices->length(); ++i )
anIdList[i] = aMeshEditor->AddBall(anArrayOfIndices[i],
DiameterSpinBox->GetValue());
}
break;
case SMDSAbs_Edge: case SMDSAbs_Edge:
anElemId = aMeshEditor->AddEdge(anArrayOfIndices.inout()); break; anIdList[0] = aMeshEditor->AddEdge(anArrayOfIndices.inout()); break;
case SMDSAbs_Face: case SMDSAbs_Face:
if ( myIsPoly ) if ( myIsPoly )
anElemId = aMeshEditor->AddPolygonalFace(anArrayOfIndices.inout()); anIdList[0] = aMeshEditor->AddPolygonalFace(anArrayOfIndices.inout());
else else
anElemId = aMeshEditor->AddFace(anArrayOfIndices.inout()); anIdList[0] = aMeshEditor->AddFace(anArrayOfIndices.inout());
break; break;
default: default:
anElemId = aMeshEditor->AddVolume(anArrayOfIndices.inout()); break; anIdList[0] = aMeshEditor->AddVolume(anArrayOfIndices.inout()); break;
} }
if ( anElemId != -1 && addToGroup && !aGroupName.isEmpty() ) { if ( anIdList[0] > 0 && addToGroup && !aGroupName.isEmpty() ) {
SMESH::SMESH_Group_var aGroupUsed; SMESH::SMESH_Group_var aGroupUsed;
if ( aGroup->_is_nil() ) { if ( aGroup->_is_nil() ) {
// create new group // create new group
@ -559,12 +570,8 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply()
aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup ); aGroupUsed = SMESH::SMESH_Group::_narrow( aGroup );
} }
if ( !aGroupUsed->_is_nil() ) { if ( !aGroupUsed->_is_nil() )
SMESH::long_array_var anIdList = new SMESH::long_array;
anIdList->length( 1 );
anIdList[0] = anElemId;
aGroupUsed->Add( anIdList.inout() ); aGroupUsed->Add( anIdList.inout() );
}
} }
SALOME_ListIO aList; aList.Append( myActor->getIO() ); SALOME_ListIO aList; aList.Append( myActor->getIO() );
@ -676,7 +683,7 @@ void SMESHGUI_AddMeshElementDlg::onTextChange (const QString& theNewText)
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->highlight( myActor->getIO(), true, true ); aViewWindow->highlight( myActor->getIO(), true, true );
myNbOkNodes = ( allOk && myNbNodes == aListId.count() ); myNbOkNodes = ( allOk && ( myNbNodes == aListId.count() || myNbNodes == 1 ));
if (myIsPoly) if (myIsPoly)
{ {
@ -766,7 +773,7 @@ void SMESHGUI_AddMeshElementDlg::SelectionIntoArgument()
myBusy = false; myBusy = false;
if (myIsPoly && myElementType == SMDSAbs_Face && nbNodes >= 3 ) { if (myIsPoly && myElementType == SMDSAbs_Face && nbNodes >= 3 ) {
myNbNodes = nbNodes; myNbNodes = nbNodes;
} else if (myNbNodes != nbNodes) { } else if (myNbNodes != nbNodes && myNbNodes != 1) {
return; return;
} }

View File

@ -206,7 +206,7 @@ void SMESHGUI_BuildCompoundDlg::Init()
myMesh = SMESH::SMESH_Mesh::_nil(); myMesh = SMESH::SMESH_Mesh::_nil();
myMeshFilter = new SMESH_TypeFilter (MESH); myMeshFilter = new SMESH_TypeFilter (SMESH::MESH);
myMeshArray = new SMESH::mesh_array(); myMeshArray = new SMESH::mesh_array();

View File

@ -742,14 +742,8 @@ void SMESHGUI_ClippingDlg::updateActorItem( QListWidgetItem* theItem,
if( anItem->checkState() == Qt::Checked ) if( anItem->checkState() == Qt::Checked )
aNbChecked++; aNbChecked++;
Qt::CheckState aCheckState = Qt::Unchecked;
if( aNbChecked == aNbItems )
aCheckState = Qt::Checked;
else if( aNbChecked > 0 )
aCheckState = Qt::PartiallyChecked;
bool anIsBlocked = SelectAllCheckBox->blockSignals( true ); bool anIsBlocked = SelectAllCheckBox->blockSignals( true );
SelectAllCheckBox->setCheckState( aCheckState ); SelectAllCheckBox->setCheckState( aNbChecked == aNbItems ? Qt::Checked : Qt::Unchecked);
SelectAllCheckBox->blockSignals( anIsBlocked ); SelectAllCheckBox->blockSignals( anIsBlocked );
} }

View File

@ -193,7 +193,7 @@ void SMESHGUI_ConvToQuadOp::selectionDone()
SUIT_SelectionFilter* SMESHGUI_ConvToQuadOp::createFilter( const int theId ) const SUIT_SelectionFilter* SMESHGUI_ConvToQuadOp::createFilter( const int theId ) const
{ {
if ( theId == 0 ) if ( theId == 0 )
return new SMESH_TypeFilter( MESHorSUBMESH ); return new SMESH_TypeFilter( SMESH::MESHorSUBMESH );
else else
return 0; return 0;
} }

View File

@ -219,7 +219,7 @@ SMESHGUI_CopyMeshDlg::SMESHGUI_CopyMeshDlg( SMESHGUI* theModule )
mySMESHGUI->SetActiveDialogBox((QDialog*)this); mySMESHGUI->SetActiveDialogBox((QDialog*)this);
// Selection filter // Selection filter
myIdSourceFilter = new SMESH_TypeFilter( IDSOURCE ); myIdSourceFilter = new SMESH_TypeFilter( SMESH::IDSOURCE );
myHelpFileName = "copy_mesh_page.html"; myHelpFileName = "copy_mesh_page.html";

View File

@ -176,7 +176,7 @@ void SMESHGUI_DeleteGroupDlg::Init ()
connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose())); connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
// set selection mode // set selection mode
mySelectionMgr->installFilter(new SMESH_TypeFilter(GROUP)); mySelectionMgr->installFilter(new SMESH_TypeFilter(SMESH::GROUP));
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
onSelectionDone(); onSelectionDone();
@ -210,7 +210,7 @@ bool SMESHGUI_DeleteGroupDlg::onApply()
QList<SMESH::SMESH_GroupBase_var>::iterator anIter; QList<SMESH::SMESH_GroupBase_var>::iterator anIter;
for (anIter = myListGrp.begin(); anIter != myListGrp.end(); ++anIter) { for (anIter = myListGrp.begin(); anIter != myListGrp.end(); ++anIter) {
SMESH::SMESH_Mesh_ptr aMesh = (*anIter)->GetMesh(); SMESH::SMESH_Mesh_var aMesh = (*anIter)->GetMesh();
if (!aMesh->_is_nil()) if (!aMesh->_is_nil())
aMesh->RemoveGroupWithContents(*anIter); aMesh->RemoveGroupWithContents(*anIter);
} }
@ -218,6 +218,12 @@ bool SMESHGUI_DeleteGroupDlg::onApply()
myListBox->clear(); myListBox->clear();
myListGrp.clear(); myListGrp.clear();
mySelectionMgr->clearSelected(); mySelectionMgr->clearSelected();
/** Erase graphical objects **/
SALOME_ListIteratorOfListIO anIterIO (myListGrpIO);
for ( ; anIterIO.More(); anIterIO.Next())
SMESH::RemoveVisualObjectWithActors( anIterIO.Value()->getEntry(), /*fromAllViews=*/true );
SMESH::UpdateView(); SMESH::UpdateView();
SMESHGUI::Modified(); SMESHGUI::Modified();
mySMESHGUI->updateObjBrowser(true); mySMESHGUI->updateObjBrowser(true);
@ -285,6 +291,7 @@ void SMESHGUI_DeleteGroupDlg::onSelectionDone()
return; return;
myListGrp.clear(); myListGrp.clear();
myListGrpIO.Clear();
QStringList aNames; QStringList aNames;
SALOME_ListIO aListIO; SALOME_ListIO aListIO;
@ -296,6 +303,7 @@ void SMESHGUI_DeleteGroupDlg::onSelectionDone()
if (!aGroup->_is_nil()) { if (!aGroup->_is_nil()) {
aNames.append(aGroup->GetName()); aNames.append(aGroup->GetName());
myListGrp.append(aGroup); myListGrp.append(aGroup);
myListGrpIO.Append( anIter.Value() );
} }
} }
@ -323,7 +331,7 @@ void SMESHGUI_DeleteGroupDlg::enterEvent (QEvent*)
setEnabled(true); setEnabled(true);
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(new SMESH_TypeFilter (GROUP)); mySelectionMgr->installFilter(new SMESH_TypeFilter (SMESH::GROUP));
} }
//================================================================================= //=================================================================================

View File

@ -29,6 +29,8 @@
// SMESH includes // SMESH includes
#include "SMESH_SMESHGUI.hxx" #include "SMESH_SMESHGUI.hxx"
#include <SALOME_ListIO.hxx>
// Qt includes // Qt includes
#include <QDialog> #include <QDialog>
@ -86,6 +88,7 @@ private:
SMESHGUI* mySMESHGUI; SMESHGUI* mySMESHGUI;
LightApp_SelectionMgr* mySelectionMgr; LightApp_SelectionMgr* mySelectionMgr;
SALOME_ListIO myListGrpIO;
QList<SMESH::SMESH_GroupBase_var> myListGrp; QList<SMESH::SMESH_GroupBase_var> myListGrp;
bool myBlockSelection; bool myBlockSelection;

View File

@ -46,9 +46,9 @@ SMESHGUI_Dialog::SMESHGUI_Dialog( QWidget* parent, const bool modal,
: LightApp_Dialog( parent == 0 ? desktop() : parent, "", modal, allowResize, flags ) : LightApp_Dialog( parent == 0 ? desktop() : parent, "", modal, allowResize, flags )
{ {
int pr = prefix( "SMESH" ); int pr = prefix( "SMESH" );
typeName( pr + MESH ) = tr( "DLG_MESH" ); typeName( pr + SMESH::MESH ) = tr( "DLG_MESH" );
typeName( pr + HYPOTHESIS ) = tr( "DLG_HYPO" ); typeName( pr + SMESH::HYPOTHESIS ) = tr( "DLG_HYPO" );
typeName( pr + ALGORITHM ) = tr( "DLG_ALGO" ); typeName( pr + SMESH::ALGORITHM ) = tr( "DLG_ALGO" );
setButtonText(1, tr("SMESH_BUT_APPLY_AND_CLOSE")); //rename OK to Apply and Close setButtonText(1, tr("SMESH_BUT_APPLY_AND_CLOSE")); //rename OK to Apply and Close
if ( flags & Close ) if ( flags & Close )
setButtonPosition( Right, Close ); setButtonPosition( Right, Close );

View File

@ -249,7 +249,7 @@ void SMESHGUI_DuplicateNodesDlg::Init()
myGroups3.clear(); myGroups3.clear();
// Set selection mode // Set selection mode
mySelectionMgr->installFilter(new SMESH_TypeFilter(GROUP)); mySelectionMgr->installFilter(new SMESH_TypeFilter(SMESH::GROUP));
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
@ -571,7 +571,7 @@ void SMESHGUI_DuplicateNodesDlg::enterEvent (QEvent*)
// Set selection mode // Set selection mode
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(new SMESH_TypeFilter (GROUP)); mySelectionMgr->installFilter(new SMESH_TypeFilter (SMESH::GROUP));
} }
} }

View File

@ -323,16 +323,16 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod
mySMESHGUI->SetActiveDialogBox(this); mySMESHGUI->SetActiveDialogBox(this);
// Costruction of the logical filter for the elements: mesh/sub-mesh/group // Costruction of the logical filter for the elements: mesh/sub-mesh/group
SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (SMESH::MESHorSUBMESH);
SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (SMESH::GROUP);
QList<SUIT_SelectionFilter*> aListOfFilters; QList<SUIT_SelectionFilter*> aListOfFilters;
if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);
if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter); if (aSmeshGroupFilter) aListOfFilters.append(aSmeshGroupFilter);
myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR); myElementsFilter = new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR);
//myPathMeshFilter = new SMESH_TypeFilter (MESH); //myPathMeshFilter = new SMESH_TypeFilter (SMESH::MESH);
myPathMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH); myPathMeshFilter = new SMESH_TypeFilter(SMESH::MESHorSUBMESH);
myHelpFileName = "extrusion_along_path_page.html"; myHelpFileName = "extrusion_along_path_page.html";
@ -978,8 +978,8 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(NodeSelection); aViewWindow->SetSelectionMode(NodeSelection);
SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH); SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter(SMESH::MESHorSUBMESH);
SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter(GROUP); SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter(SMESH::GROUP);
SMESH_NumberFilter* aVertexFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, SMESH_NumberFilter* aVertexFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE,
-1, TopAbs_VERTEX); -1, TopAbs_VERTEX);
QList<SUIT_SelectionFilter*> aListOfFilters; QList<SUIT_SelectionFilter*> aListOfFilters;

View File

@ -91,6 +91,7 @@
SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule) SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
: SMESHGUI_PreviewDlg( theModule ), : SMESHGUI_PreviewDlg( theModule ),
mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
myEditCurrentArgument(0),
myFilterDlg( 0 ), myFilterDlg( 0 ),
mySelectedObject(SMESH::SMESH_IDSource::_nil()) mySelectedObject(SMESH::SMESH_IDSource::_nil())
{ {
@ -281,19 +282,19 @@ SMESHGUI_ExtrusionDlg::SMESHGUI_ExtrusionDlg (SMESHGUI* theModule)
// Costruction of the logical filter for the elements: mesh/sub-mesh/group // Costruction of the logical filter for the elements: mesh/sub-mesh/group
QList<SUIT_SelectionFilter*> aListOfFilters; QList<SUIT_SelectionFilter*> aListOfFilters;
aListOfFilters.append(new SMESH_TypeFilter (MESH)); aListOfFilters.append(new SMESH_TypeFilter (SMESH::MESH));
aListOfFilters.append(new SMESH_TypeFilter (SUBMESH_VERTEX)); aListOfFilters.append(new SMESH_TypeFilter (SMESH::SUBMESH_VERTEX));
aListOfFilters.append(new SMESH_TypeFilter (GROUP_NODE)); aListOfFilters.append(new SMESH_TypeFilter (SMESH::GROUP_NODE));
myMeshOrSubMeshOrGroupFilter0D = myMeshOrSubMeshOrGroupFilter0D =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true); new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
aListOfFilters[0] = new SMESH_TypeFilter (MESH); aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_EDGE); aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_EDGE);
aListOfFilters[2] = new SMESH_TypeFilter (GROUP_EDGE); aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_EDGE);
myMeshOrSubMeshOrGroupFilter1D = myMeshOrSubMeshOrGroupFilter1D =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true); new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);
aListOfFilters[0] = new SMESH_TypeFilter (MESH); aListOfFilters[0] = new SMESH_TypeFilter (SMESH::MESH);
aListOfFilters[1] = new SMESH_TypeFilter (SUBMESH_FACE); aListOfFilters[1] = new SMESH_TypeFilter (SMESH::SUBMESH_FACE);
aListOfFilters[2] = new SMESH_TypeFilter (GROUP_FACE); aListOfFilters[2] = new SMESH_TypeFilter (SMESH::GROUP_FACE);
myMeshOrSubMeshOrGroupFilter2D = myMeshOrSubMeshOrGroupFilter2D =
new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true); new SMESH_LogicalFilter (aListOfFilters, SMESH_LogicalFilter::LO_OR, /*takeOwnership=*/true);

View File

@ -1002,6 +1002,17 @@ void SMESHGUI_FilterTable::Init (const QList<int>& theTypes)
myLibDlg = 0; myLibDlg = 0;
} }
else
{
QList<int>::const_iterator typeIt = theTypes.begin();
for ( ; typeIt != theTypes.end(); ++typeIt ) {
if ( !myTables[ *typeIt ] ) {
Table* aTable = createTable(mySwitchTableGrp, *typeIt);
myTables[ *typeIt ] = aTable;
((QVBoxLayout*)mySwitchTableGrp->layout())->addWidget(myTables[ *typeIt ]);
}
}
}
// Hide buttons of entity types if necessary // Hide buttons of entity types if necessary
const QMap<int, QString>& aSupportedTypes = getSupportedTypes(); const QMap<int, QString>& aSupportedTypes = getSupportedTypes();
@ -1743,6 +1754,7 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con
aTable->blockSignals( isSignalsBlocked ); aTable->blockSignals( isSignalsBlocked );
} }
// set Compare and enable/desable Threshold
if ((aType == SMESH::NODE && (aCriterionType == SMESH::FT_FreeNodes || if ((aType == SMESH::NODE && (aCriterionType == SMESH::FT_FreeNodes ||
aCriterionType == SMESH::FT_EqualNodes )) || aCriterionType == SMESH::FT_EqualNodes )) ||
(aType == SMESH::EDGE && (aCriterionType == SMESH::FT_FreeBorders || (aType == SMESH::EDGE && (aCriterionType == SMESH::FT_FreeBorders ||
@ -1970,6 +1982,7 @@ const QMap<int, QString>& SMESHGUI_FilterTable::getSupportedTypes() const
if (aTypes.isEmpty()) if (aTypes.isEmpty())
{ {
aTypes[ SMESH::NODE ] = tr("NODES"); aTypes[ SMESH::NODE ] = tr("NODES");
aTypes[ SMESH::ELEM0D ] = tr("ELEM0D");
aTypes[ SMESH::BALL ] = tr("BALLS"); aTypes[ SMESH::BALL ] = tr("BALLS");
aTypes[ SMESH::EDGE ] = tr("EDGES"); aTypes[ SMESH::EDGE ] = tr("EDGES");
aTypes[ SMESH::FACE ] = tr("FACES"); aTypes[ SMESH::FACE ] = tr("FACES");
@ -2106,6 +2119,20 @@ const QMap<int, QString>& SMESHGUI_FilterTable::getCriteria (const int theType)
} }
return aCriteria; return aCriteria;
} }
else if (theType == SMESH::ELEM0D)
{
static QMap<int, QString> aCriteria;
if (aCriteria.isEmpty())
{
aCriteria[ SMESH::FT_RangeOfIds ] = tr("RANGE_OF_IDS");
aCriteria[ SMESH::FT_BelongToGeom ] = tr("BELONG_TO_GEOM");
aCriteria[ SMESH::FT_BelongToPlane ] = tr("BELONG_TO_PLANE");
aCriteria[ SMESH::FT_BelongToCylinder ] = tr("BELONG_TO_CYLINDER");
aCriteria[ SMESH::FT_BelongToGenSurface ] = tr("BELONG_TO_GENSURFACE");
aCriteria[ SMESH::FT_GroupColor ] = tr("GROUP_COLOR");
}
return aCriteria;
}
else // SMESH::ALL else // SMESH::ALL
{ {
static QMap<int, QString> aCriteria; static QMap<int, QString> aCriteria;
@ -2673,6 +2700,8 @@ void SMESHGUI_FilterDlg::Init (const QList<int>& theTypes, const bool setInViewe
{ {
int aType = theTypes.first(); int aType = theTypes.first();
if (aType == SMESH::NODE ) setWindowTitle(tr("NODES_TLT")); if (aType == SMESH::NODE ) setWindowTitle(tr("NODES_TLT"));
else if (aType == SMESH::ELEM0D) setWindowTitle(tr("ELEM0D_TLT"));
else if (aType == SMESH::BALL ) setWindowTitle(tr("BALL_TLT"));
else if (aType == SMESH::EDGE ) setWindowTitle(tr("EDGES_TLT")); else if (aType == SMESH::EDGE ) setWindowTitle(tr("EDGES_TLT"));
else if (aType == SMESH::FACE ) setWindowTitle(tr("FACES_TLT")); else if (aType == SMESH::FACE ) setWindowTitle(tr("FACES_TLT"));
else if (aType == SMESH::VOLUME) setWindowTitle(tr("VOLUMES_TLT")); else if (aType == SMESH::VOLUME) setWindowTitle(tr("VOLUMES_TLT"));
@ -2879,6 +2908,8 @@ Selection_Mode SMESHGUI_FilterDlg::getSelMode (const int theType) const
switch (theType) switch (theType)
{ {
case SMESH::NODE : return NodeSelection; case SMESH::NODE : return NodeSelection;
case SMESH::ELEM0D : return Elem0DSelection;
case SMESH::BALL : return BallSelection;
case SMESH::EDGE : return EdgeSelection; case SMESH::EDGE : return EdgeSelection;
case SMESH::FACE : return FaceSelection; case SMESH::FACE : return FaceSelection;
case SMESH::VOLUME : return VolumeSelection; case SMESH::VOLUME : return VolumeSelection;

View File

@ -242,8 +242,8 @@ SMESHGUI_FindElemByPointOp::SMESHGUI_FindElemByPointOp()
myHelpFileName = "find_element_by_point_page.html"; myHelpFileName = "find_element_by_point_page.html";
QList<SUIT_SelectionFilter*> filters; QList<SUIT_SelectionFilter*> filters;
filters.append( new SMESH_TypeFilter( MESH ) ); filters.append( new SMESH_TypeFilter( SMESH::MESH ) );
filters.append( new SMESH_TypeFilter( GROUP ) ); filters.append( new SMESH_TypeFilter( SMESH::GROUP ) );
myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR ); myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR );
myPreview = new SMESH::MeshPreviewStruct(); myPreview = new SMESH::MeshPreviewStruct();

View File

@ -103,15 +103,16 @@
enum grpSelectionMode { enum grpSelectionMode {
grpNoSelection = -1, grpNoSelection = -1,
grpNodeSelection = 0, grpNodeSelection = 0,
grpBallSelection = 1, grp0DSelection = 1,
grpEdgeSelection = 2, grpBallSelection = 2,
grpFaceSelection = 3, grpEdgeSelection = 3,
grpVolumeSelection = 4, grpFaceSelection = 4,
grpSubMeshSelection = 5, grpVolumeSelection = 5,
grpGroupSelection = 6, grpSubMeshSelection = 6,
grpMeshSelection = 7, grpGroupSelection = 7,
grpGeomSelection = 8, grpMeshSelection = 8,
grpAllSelection = 9, grpGeomSelection = 9,
grpAllSelection = 10,
}; };
//================================================================================= //=================================================================================
@ -214,6 +215,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
QStringList types; QStringList types;
types.append( tr( "MESH_NODE" ) ); types.append( tr( "MESH_NODE" ) );
types.append( tr( "SMESH_ELEM0D" ) );
types.append( tr( "SMESH_BALL_ELEM" ) ); types.append( tr( "SMESH_BALL_ELEM" ) );
types.append( tr( "SMESH_EDGE" ) ); types.append( tr( "SMESH_EDGE" ) );
types.append( tr( "SMESH_FACE" ) ); types.append( tr( "SMESH_FACE" ) );
@ -444,7 +446,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create)
mySMESHGUI->SetState(800); mySMESHGUI->SetState(800);
mySelectionMode = grpNoSelection; mySelectionMode = grpNoSelection;
myMeshFilter = new SMESH_TypeFilter(MESH); myMeshFilter = new SMESH_TypeFilter(SMESH::MESH);
mySubMeshFilter = new SMESH_LogicalFilter(QList<SUIT_SelectionFilter*>(), mySubMeshFilter = new SMESH_LogicalFilter(QList<SUIT_SelectionFilter*>(),
SMESH_LogicalFilter::LO_OR, SMESH_LogicalFilter::LO_OR,
/*takeOwnership=*/true); /*takeOwnership=*/true);
@ -521,6 +523,22 @@ QString SMESHGUI_GroupDlg::GetDefaultName(const QString& theOperation)
return aName; return aName;
} }
void SMESHGUI_GroupDlg::setDefaultName() const
{
QString aResName;
_PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
int i=1;
QString aPrefix ="Group_";
_PTR(SObject) anObj;
do
{
aResName = aPrefix + QString::number( i++ );
anObj = aStudy->FindObject( aResName.toLatin1().data() );
}
while ( anObj );
myName->setText(aResName);
}
//================================================================================= //=================================================================================
// function : Init() // function : Init()
// purpose : // purpose :
@ -543,6 +561,8 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_Mesh_ptr theMesh)
SetAppropriateActor(); SetAppropriateActor();
setDefaultGroupColor(); setDefaultGroupColor();
setDefaultName();
SALOME_ListIO aList; SALOME_ListIO aList;
mySelectionMgr->selectedObjects( aList ); mySelectionMgr->selectedObjects( aList );
@ -583,11 +603,12 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup,
int aType = 0; int aType = 0;
switch(theGroup->GetType()) { switch(theGroup->GetType()) {
case SMESH::NODE: aType = 0; break; case SMESH::NODE: aType = grpNodeSelection; break;
case SMESH::BALL: aType = 1; break; case SMESH::ELEM0D: aType = grp0DSelection; break;
case SMESH::EDGE: aType = 2; break; case SMESH::BALL: aType = grpBallSelection; break;
case SMESH::FACE: aType = 3; break; case SMESH::EDGE: aType = grpEdgeSelection; break;
case SMESH::VOLUME: aType = 4; break; case SMESH::FACE: aType = grpFaceSelection; break;
case SMESH::VOLUME: aType = grpVolumeSelection; break;
} }
myTypeGroup->button(aType)->setChecked(true); myTypeGroup->button(aType)->setChecked(true);
@ -807,6 +828,9 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
case grpBallSelection: case grpBallSelection:
if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : BallSelection); if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : BallSelection);
break; break;
case grp0DSelection:
if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : Elem0DSelection);
break;
case grpFaceSelection: case grpFaceSelection:
if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : FaceSelection); if ( aViewWindow ) aViewWindow->SetSelectionMode(isSelectAll ? ActorSelection : FaceSelection);
break; break;
@ -817,15 +841,15 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
SMESH_TypeFilter* f = 0; SMESH_TypeFilter* f = 0;
switch (myTypeId) { switch (myTypeId) {
case grpNodeSelection: f = new SMESH_TypeFilter(SUBMESH); break; case grpNodeSelection: f = new SMESH_TypeFilter(SMESH::SUBMESH); break;
case grpEdgeSelection: f = new SMESH_TypeFilter(SUBMESH_EDGE); break; case grpEdgeSelection: f = new SMESH_TypeFilter(SMESH::SUBMESH_EDGE); break;
case grpFaceSelection: f = new SMESH_TypeFilter(SUBMESH_FACE); break; case grpFaceSelection: f = new SMESH_TypeFilter(SMESH::SUBMESH_FACE); break;
case grpVolumeSelection: f = new SMESH_TypeFilter(SUBMESH_SOLID); break; case grpVolumeSelection: f = new SMESH_TypeFilter(SMESH::SUBMESH_SOLID); break;
default: f = new SMESH_TypeFilter(SUBMESH); default: f = new SMESH_TypeFilter(SMESH::SUBMESH);
} }
QList<SUIT_SelectionFilter*> filtList; QList<SUIT_SelectionFilter*> filtList;
filtList.append( f ); filtList.append( f );
filtList.append( new SMESH_TypeFilter(SUBMESH_COMPOUND)); filtList.append( new SMESH_TypeFilter(SMESH::SUBMESH_COMPOUND));
mySubMeshFilter->setFilters( filtList ); mySubMeshFilter->setFilters( filtList );
mySelectionMgr->installFilter( mySubMeshFilter ); mySelectionMgr->installFilter( mySubMeshFilter );
@ -837,12 +861,13 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
SMESH_TypeFilter* f = 0; SMESH_TypeFilter* f = 0;
switch (myTypeId) { switch (myTypeId) {
case grpNodeSelection: f = new SMESH_TypeFilter(GROUP_NODE); break; case grpNodeSelection: f = new SMESH_TypeFilter(SMESH::GROUP_NODE); break;
case grpBallSelection: f = new SMESH_TypeFilter(GROUP_BALL); break; case grp0DSelection: f = new SMESH_TypeFilter(SMESH::GROUP_0D); break;
case grpEdgeSelection: f = new SMESH_TypeFilter(GROUP_EDGE); break; case grpBallSelection: f = new SMESH_TypeFilter(SMESH::GROUP_BALL); break;
case grpFaceSelection: f = new SMESH_TypeFilter(GROUP_FACE); break; case grpEdgeSelection: f = new SMESH_TypeFilter(SMESH::GROUP_EDGE); break;
case grpVolumeSelection: f = new SMESH_TypeFilter(GROUP_VOLUME); break; case grpFaceSelection: f = new SMESH_TypeFilter(SMESH::GROUP_FACE); break;
default: f = new SMESH_TypeFilter(GROUP); case grpVolumeSelection: f = new SMESH_TypeFilter(SMESH::GROUP_VOLUME); break;
default: f = new SMESH_TypeFilter(SMESH::GROUP);
} }
QList<SUIT_SelectionFilter*> filtList; QList<SUIT_SelectionFilter*> filtList;
filtList.append( f ); filtList.append( f );
@ -883,10 +908,11 @@ bool SMESHGUI_GroupDlg::onApply()
SMESH::ElementType aType = SMESH::ALL; SMESH::ElementType aType = SMESH::ALL;
switch (myTypeId) { switch (myTypeId) {
case grpNodeSelection: aType = SMESH::NODE; break; case grpNodeSelection: aType = SMESH::NODE; break;
case grpBallSelection: aType = SMESH::BALL; break; case grp0DSelection: aType = SMESH::ELEM0D; break;
case grpEdgeSelection: aType = SMESH::EDGE; break; case grpBallSelection: aType = SMESH::BALL; break;
case grpFaceSelection: aType = SMESH::FACE; break; case grpEdgeSelection: aType = SMESH::EDGE; break;
case grpFaceSelection: aType = SMESH::FACE; break;
case grpVolumeSelection: aType = SMESH::VOLUME; break; case grpVolumeSelection: aType = SMESH::VOLUME; break;
} }
@ -1112,7 +1138,7 @@ bool SMESHGUI_GroupDlg::onApply()
SMESH::setFileType ( aMeshGroupSO, "COULEURGROUP" ); SMESH::setFileType ( aMeshGroupSO, "COULEURGROUP" );
/* init for the next operation */ /* init for the next operation */
myName->setText( "" ); setDefaultName();
myElements->clear(); myElements->clear();
myGroup = SMESH::SMESH_Group::_nil(); myGroup = SMESH::SMESH_Group::_nil();
myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil(); myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil();
@ -1126,21 +1152,22 @@ bool SMESHGUI_GroupDlg::onApply()
if ( aMeshGroupSO ) if ( aMeshGroupSO )
if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) { if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) {
anActor->setName(myName->text().toLatin1().data()); anActor->setName(myName->text().toLatin1().data());
QColor c; QColor c;
int delta; int delta;
switch ( myTypeId ) { switch ( myTypeId ) {
case grpNodeSelection: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break; case grpNodeSelection: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break;
case grp0DSelection: anActor->Set0DColor ( aColor.R, aColor.G, aColor.B ); break;
case grpBallSelection: anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break; case grpBallSelection: anActor->SetBallColor( aColor.R, aColor.G, aColor.B ); break;
case grpEdgeSelection: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break; case grpEdgeSelection: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break;
case grpVolumeSelection: case grpVolumeSelection:
SMESH::GetColor("SMESH", "volume_color", c , delta, "255,0,170|-100"); SMESH::GetColor("SMESH", "volume_color", c , delta, "255,0,170|-100");
anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break; anActor->SetVolumeColor( aColor.R, aColor.G, aColor.B, delta ); break;
break; break;
case grpFaceSelection: case grpFaceSelection:
default: default:
SMESH::GetColor("SMESH", "fill_color", c , delta, "0,170,255|-100"); SMESH::GetColor("SMESH", "fill_color", c , delta, "0,170,255|-100");
anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta ); break; anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B, delta ); break;
break; break;
} }
} }
} }
@ -1673,10 +1700,11 @@ void SMESHGUI_GroupDlg::setFilters()
SMESH::ElementType aType = SMESH::ALL; SMESH::ElementType aType = SMESH::ALL;
switch ( myTypeId ) switch ( myTypeId )
{ {
case grpNodeSelection: aType = SMESH::NODE; break; case grpNodeSelection: aType = SMESH::NODE; break;
case grpBallSelection: aType = SMESH::BALL; break; case grp0DSelection: aType = SMESH::ELEM0D; break;
case grpEdgeSelection: aType = SMESH::EDGE; break; case grpBallSelection: aType = SMESH::BALL; break;
case grpFaceSelection: aType = SMESH::FACE; break; case grpEdgeSelection: aType = SMESH::EDGE; break;
case grpFaceSelection: aType = SMESH::FACE; break;
case grpVolumeSelection: aType = SMESH::VOLUME; break; case grpVolumeSelection: aType = SMESH::VOLUME; break;
default: return; default: return;
} }
@ -1765,6 +1793,10 @@ void SMESHGUI_GroupDlg::onAdd()
aType = SMESH::BALL; aType = SMESH::BALL;
mySelector->SetSelectionMode(BallSelection); mySelector->SetSelectionMode(BallSelection);
break; break;
case grp0DSelection:
aType = SMESH::ELEM0D;
mySelector->SetSelectionMode(Elem0DSelection);
break;
case grpEdgeSelection: case grpEdgeSelection:
aType = SMESH::EDGE; aType = SMESH::EDGE;
mySelector->SetSelectionMode(EdgeSelection); mySelector->SetSelectionMode(EdgeSelection);
@ -2004,10 +2036,11 @@ void SMESHGUI_GroupDlg::onRemove()
SMESH::ElementType aType = SMESH::ALL; SMESH::ElementType aType = SMESH::ALL;
switch(myTypeId) { switch(myTypeId) {
case grpNodeSelection: aType = SMESH::NODE; break; case grpNodeSelection: aType = SMESH::NODE; break;
case grpBallSelection: aType = SMESH::BALL; break; case grp0DSelection: aType = SMESH::ELEM0D; break;
case grpEdgeSelection: aType = SMESH::EDGE; break; case grpBallSelection: aType = SMESH::BALL; break;
case grpFaceSelection: aType = SMESH::FACE; break; case grpEdgeSelection: aType = SMESH::EDGE; break;
case grpFaceSelection: aType = SMESH::FACE; break;
case grpVolumeSelection: aType = SMESH::VOLUME; break; case grpVolumeSelection: aType = SMESH::VOLUME; break;
} }
@ -2565,11 +2598,12 @@ void SMESHGUI_GroupDlg::setShowEntityMode()
if (!myStoredShownEntity) if (!myStoredShownEntity)
myStoredShownEntity = actor->GetEntityMode(); myStoredShownEntity = actor->GetEntityMode();
switch ( myTypeId ) { switch ( myTypeId ) {
case grpNodeSelection: restoreShowEntityMode(); break; case grpNodeSelection: restoreShowEntityMode(); break;
case grpBallSelection: actor->SetEntityMode( SMESH_Actor::eBallElem ); break; case grp0DSelection: actor->SetEntityMode( SMESH_Actor::e0DElements ); break;
case grpEdgeSelection: actor->SetEntityMode( SMESH_Actor::eEdges ); break; case grpBallSelection: actor->SetEntityMode( SMESH_Actor::eBallElem ); break;
case grpFaceSelection: actor->SetEntityMode( SMESH_Actor::eFaces ); break; case grpEdgeSelection: actor->SetEntityMode( SMESH_Actor::eEdges ); break;
case grpVolumeSelection: actor->SetEntityMode( SMESH_Actor::eVolumes ); break; case grpFaceSelection: actor->SetEntityMode( SMESH_Actor::eFaces ); break;
case grpVolumeSelection: actor->SetEntityMode( SMESH_Actor::eVolumes ); break;
} }
} }
} }

View File

@ -141,7 +141,7 @@ private:
void setGroupQColor( const QColor& ); void setGroupQColor( const QColor& );
QColor getGroupQColor() const; QColor getGroupQColor() const;
void setDefaultName() const;
void setDefaultGroupColor(); void setDefaultGroupColor();
void setIsApplyAndClose( const bool theFlag ); void setIsApplyAndClose( const bool theFlag );

View File

@ -419,7 +419,7 @@ SUIT_SelectionFilter* SMESHGUI_GroupOnShapeOp::createFilter( const int theId ) c
if ( theId == _ELEM_GEOM || theId == _NODE_GEOM ) if ( theId == _ELEM_GEOM || theId == _NODE_GEOM )
return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true ); return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true );
else if ( theId == _MESH ) else if ( theId == _MESH )
return new SMESH_TypeFilter( MESH ); return new SMESH_TypeFilter( SMESH::MESH );
else else
return ( SUIT_SelectionFilter*) 0; return ( SUIT_SelectionFilter*) 0;
} }

View File

@ -233,7 +233,7 @@ void SMESHGUI_GroupOpDlg::Init()
// set selection mode // set selection mode
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(new SMESH_TypeFilter (GROUP)); mySelectionMgr->installFilter(new SMESH_TypeFilter (SMESH::GROUP));
} }
/*! /*!
@ -464,7 +464,7 @@ void SMESHGUI_GroupOpDlg::enterEvent(QEvent*)
setEnabled(true); setEnabled(true);
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(new SMESH_TypeFilter (GROUP)); mySelectionMgr->installFilter(new SMESH_TypeFilter (SMESH::GROUP));
} }
/*! /*!

View File

@ -572,6 +572,8 @@ QString SMESHGUI_GenericHypothesisCreator::helpPage() const
aHelpFileName = "a2d_meshing_hypo_page.html#hypo_quad_params_anchor"; aHelpFileName = "a2d_meshing_hypo_page.html#hypo_quad_params_anchor";
else if ( aHypType == "ViscousLayers") else if ( aHypType == "ViscousLayers")
aHelpFileName = "additional_hypo_page.html#viscous_layers_anchor"; aHelpFileName = "additional_hypo_page.html#viscous_layers_anchor";
else if ( aHypType == "ViscousLayers2D")
aHelpFileName = "additional_hypo_page.html#viscous_layers_anchor";
else if ( aHypType == "ImportSource1D" || aHypType == "ImportSource2D") else if ( aHypType == "ImportSource1D" || aHypType == "ImportSource2D")
aHelpFileName = "import_algos_page.html"; aHelpFileName = "import_algos_page.html";
return aHelpFileName; return aHelpFileName;

View File

@ -78,14 +78,17 @@ signals:
protected: protected:
struct StdParam struct StdParam
{ {
QString myName; QString myName;
QVariant myValue; QVariant myValue;
bool isVariable; bool isVariable;
QString myText; QString myText;
StdParam(){ QByteArray myTextAsBytes;
StdParam() {
isVariable = false; isVariable = false;
} }
const char* text() const { return myText.toLatin1().constData(); } const char* text() const {
((QByteArray&) myTextAsBytes) = myText.toLatin1(); return myTextAsBytes.constData();
}
}; };
typedef QList<StdParam> ListOfStdParams; typedef QList<StdParam> ListOfStdParams;

View File

@ -74,7 +74,7 @@
#endif #endif
#ifdef _DEBUG_ #ifdef _DEBUG_
static int MYDEBUG = 0; static int MYDEBUG = 1;
#else #else
static int MYDEBUG = 0; static int MYDEBUG = 0;
#endif #endif
@ -420,13 +420,13 @@ namespace SMESH
LibHandle libHandle = LoadLib( aClientLibName.toLatin1().data() ); LibHandle libHandle = LoadLib( aClientLibName.toLatin1().data() );
if (!libHandle) { if (!libHandle) {
// report any error, if occured // report any error, if occured
if ( MYDEBUG ) { {
#ifdef WIN32 #ifdef WIN32
const char* anError = "Can't load client meshers plugin library"; const char* anError = "Can't load client meshers plugin library";
#else #else
const char* anError = dlerror(); const char* anError = dlerror();
#endif #endif
MESSAGE(anError); INFOS(anError); // always display this kind of error !
} }
} }
else { else {

View File

@ -217,8 +217,8 @@ void SMESHGUI_Make2DFrom3DDlg::onGroupChecked()
SMESHGUI_Make2DFrom3DOp::SMESHGUI_Make2DFrom3DOp() SMESHGUI_Make2DFrom3DOp::SMESHGUI_Make2DFrom3DOp()
: SMESHGUI_SelectionOp(), : SMESHGUI_SelectionOp(),
myMeshFilter(MESH), myMeshFilter(SMESH::MESH),
myGroupFilter(GROUP) myGroupFilter(SMESH::GROUP)
{ {
} }

View File

@ -190,8 +190,8 @@ SMESHGUI_MinDistance::SMESHGUI_MinDistance( QWidget* parent )
connect( mySecondTgt, SIGNAL( textEdited( QString ) ), this, SLOT( secondEdited() ) ); connect( mySecondTgt, SIGNAL( textEdited( QString ) ), this, SLOT( secondEdited() ) );
QList<SUIT_SelectionFilter*> filters; QList<SUIT_SelectionFilter*> filters;
filters.append( new SMESH_TypeFilter( MESHorSUBMESH ) ); filters.append( new SMESH_TypeFilter( SMESH::MESHorSUBMESH ) );
filters.append( new SMESH_TypeFilter( GROUP ) ); filters.append( new SMESH_TypeFilter( SMESH::GROUP ) );
myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR ); myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR );
mySecondTgt->setEnabled( mySecond->checkedId() != OriginTgt ); mySecondTgt->setEnabled( mySecond->checkedId() != OriginTgt );
@ -706,8 +706,8 @@ SMESHGUI_BoundingBox::SMESHGUI_BoundingBox( QWidget* parent )
connect( mySource, SIGNAL( textEdited( QString ) ), this, SLOT( sourceEdited() ) ); connect( mySource, SIGNAL( textEdited( QString ) ), this, SLOT( sourceEdited() ) );
QList<SUIT_SelectionFilter*> filters; QList<SUIT_SelectionFilter*> filters;
filters.append( new SMESH_TypeFilter( MESHorSUBMESH ) ); filters.append( new SMESH_TypeFilter( SMESH::MESHorSUBMESH ) );
filters.append( new SMESH_TypeFilter( GROUP ) ); filters.append( new SMESH_TypeFilter( SMESH::GROUP ) );
myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR ); myFilter = new SMESH_LogicalFilter( filters, SMESH_LogicalFilter::LO_OR );
clear(); clear();

View File

@ -1291,8 +1291,8 @@ void SMESHGUI_MergeDlg::onTypeChanged (int id)
SMESH::UpdateView(); SMESH::UpdateView();
// Costruction of the logical filter // Costruction of the logical filter
SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH); SMESH_TypeFilter* aMeshOrSubMeshFilter = new SMESH_TypeFilter (SMESH::MESHorSUBMESH);
SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (GROUP); SMESH_TypeFilter* aSmeshGroupFilter = new SMESH_TypeFilter (SMESH::GROUP);
QList<SUIT_SelectionFilter*> aListOfFilters; QList<SUIT_SelectionFilter*> aListOfFilters;
if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter); if (aMeshOrSubMeshFilter) aListOfFilters.append(aMeshOrSubMeshFilter);

View File

@ -34,6 +34,7 @@
#include "SMDS_BallElement.hxx" #include "SMDS_BallElement.hxx"
#include "SMDS_EdgePosition.hxx" #include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx" #include "SMDS_FacePosition.hxx"
#include "SMESH_ControlsDef.hxx"
#include <LightApp_SelectionMgr.h> #include <LightApp_SelectionMgr.h>
#include <SUIT_OverrideCursor.h> #include <SUIT_OverrideCursor.h>
@ -886,6 +887,9 @@ void SMESHGUI_SimpleElemInfo::information( const QList<long>& ids )
if ( actor() ) { if ( actor() ) {
int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 ); int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 );
int cprecision = -1;
if ( SMESHGUI::resourceMgr()->booleanValue( "SMESH", "use_precision", false ) )
cprecision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "controls_precision", -1 );
foreach ( long id, ids ) { foreach ( long id, ids ) {
if ( !isElements() ) { if ( !isElements() ) {
// //
@ -934,6 +938,7 @@ void SMESHGUI_SimpleElemInfo::information( const QList<long>& ids )
// show element info // show element info
// //
const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindElement( id ); const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindElement( id );
SMESH::Controls::NumericalFunctorPtr afunctor;
if ( !e ) return; if ( !e ) return;
// element ID && type // element ID && type
@ -1040,6 +1045,84 @@ void SMESHGUI_SimpleElemInfo::information( const QList<long>& ids )
myInfo->append( QString( "<b>%1</b>" ).arg( tr( "FREE_NODE" ) ).arg( id ) ); myInfo->append( QString( "<b>%1</b>" ).arg( tr( "FREE_NODE" ) ).arg( id ) );
} }
} }
// separator
myInfo->append( "" );
//controls
myInfo->append( QString( "<b>%1:</b>" ).arg( tr( "MEN_CTRL" ) ) );
//Length
if ( e->GetType() == SMDSAbs_Edge ) {
afunctor.reset( new SMESH::Controls::Length() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "LENGTH_EDGES" ) ).arg( afunctor->GetValue( id ) ) );
}
if( e->GetType() == SMDSAbs_Face ) {
//Area
afunctor.reset( new SMESH::Controls::Area() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "AREA_ELEMENTS" ) ).arg( afunctor->GetValue( id ) ) );
//Taper
afunctor.reset( new SMESH::Controls::Taper() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "MEN_TAPER" ) ).arg( afunctor->GetValue( id ) ) );
//AspectRatio2D
afunctor.reset( new SMESH::Controls::AspectRatio() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "ASPECTRATIO_ELEMENTS" ) ).arg( afunctor->GetValue( id ) ) );
//Minimum angle
afunctor.reset( new SMESH::Controls::MinimumAngle() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "MINIMUMANGLE_ELEMENTS" ) ).arg( afunctor->GetValue( id ) ) );
//Wraping angle
afunctor.reset( new SMESH::Controls::Warping() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "STB_WARP" ) ).arg( afunctor->GetValue( id ) ) );
//Skew
afunctor.reset( new SMESH::Controls::Skew() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "TOP_SKEW" ) ).arg( afunctor->GetValue( id ) ) );
//ElemDiam2D
afunctor.reset( new SMESH::Controls::MaxElementLength2D() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "MAX_ELEMENT_LENGTH_2D" ) ).arg( afunctor->GetValue( id ) ) );
}
if( e->GetType() == SMDSAbs_Volume ) {
//AspectRatio3D
afunctor.reset( new SMESH::Controls::AspectRatio3D() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "ASPECTRATIO_3D_ELEMENTS" ) ).arg( afunctor->GetValue( id ) ) );
//Volume
afunctor.reset( new SMESH::Controls::Volume() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "MEN_VOLUME_3D" ) ).arg( afunctor->GetValue( id ) ) );
//ElementDiameter3D
afunctor.reset( new SMESH::Controls::Volume() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
myInfo->append( QString( "- <b>%1:</b> %2" ).arg( tr( "MAX_ELEMENT_LENGTH_3D" ) ).arg( afunctor->GetValue( id ) ) );
}
/*
if( e->GetType() >= SMDSAbs_Edge && e->GetType() <= SMDSAbs_Volume ) {
// separator
myInfo->append( "" );
//shapeID
int shapeID = e->getshapeId();
if ( shapeID > 0 ) {
QString shapeType;
switch ( actor()->GetObject()->GetMesh()->FindElement( shapeID )->GetType() ) {
case SMDS_TOP_EDGE: shapeType = tr( "EDGE" ); break;
case SMDS_TOP_FACE: shapeType = tr( "FACE" ); break;
case SMDS_TOP_VERTEX: shapeType = tr( "VERTEX" ); break;
default: shapeType = tr( "SOLID" );
}
myInfo->append( QString( "<b>%1:</b> %2 #%3" ).arg( tr( "Position" ) ).arg( shapeType ).arg( shapeID ) );
}
}
*/
} }
// separator // separator
if ( ids.count() > 1 ) { if ( ids.count() > 1 ) {
@ -1123,6 +1206,9 @@ void SMESHGUI_TreeElemInfo::information( const QList<long>& ids )
if ( actor() ) { if ( actor() ) {
int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 ); int precision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "length_precision", 6 );
int cprecision = -1;
if ( SMESHGUI::resourceMgr()->booleanValue( "SMESH", "use_precision", false ) )
cprecision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "controls_precision", -1 );
foreach ( long id, ids ) { foreach ( long id, ids ) {
if ( !isElements() ) { if ( !isElements() ) {
// //
@ -1226,6 +1312,7 @@ void SMESHGUI_TreeElemInfo::information( const QList<long>& ids )
// show element info // show element info
// //
const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindElement( id ); const SMDS_MeshElement* e = actor()->GetObject()->GetMesh()->FindElement( id );
SMESH::Controls::NumericalFunctorPtr afunctor;
if ( !e ) return; if ( !e ) return;
// element ID && type // element ID && type
@ -1373,6 +1460,105 @@ void SMESHGUI_TreeElemInfo::information( const QList<long>& ids )
} }
} }
} }
//Controls
QTreeWidgetItem* cntrItem = createItem( elemItem, Bold );
cntrItem->setText( 0, tr( "MEN_CTRL" ) );
//Length
if( e->GetType()==SMDSAbs_Edge){
afunctor.reset( new SMESH::Controls::Length() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
QTreeWidgetItem* lenItem = createItem( cntrItem, Bold );
lenItem->setText( 0, tr( "LENGTH_EDGES" ) );
lenItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
}
if( e->GetType() == SMDSAbs_Face ) {
//Area
afunctor.reset( new SMESH::Controls::Area() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
QTreeWidgetItem* areaItem = createItem( cntrItem, Bold );
areaItem->setText( 0, tr( "AREA_ELEMENTS" ) );
areaItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue(id) ) );
//Taper
afunctor.reset( new SMESH::Controls::Taper() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
QTreeWidgetItem* taperlItem = createItem( cntrItem, Bold );
taperlItem->setText( 0, tr( "MEN_TAPER" ) );
taperlItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
//AspectRatio2D
afunctor.reset( new SMESH::Controls::AspectRatio() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
QTreeWidgetItem* ratlItem = createItem( cntrItem, Bold );
ratlItem->setText( 0, tr( "ASPECTRATIO_ELEMENTS" ));
ratlItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
//Minimum angle
afunctor.reset( new SMESH::Controls::MinimumAngle() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
QTreeWidgetItem* minanglItem = createItem( cntrItem, Bold );
minanglItem->setText( 0, tr( "MINIMUMANGLE_ELEMENTS" ) );
minanglItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
//Wraping angle
afunctor.reset( new SMESH::Controls::Warping() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
QTreeWidgetItem* warpItem = createItem( cntrItem, Bold );
warpItem->setText( 0, tr( "STB_WARP" ));
warpItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
//Skew
afunctor.reset( new SMESH::Controls::Skew() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
afunctor->SetPrecision( cprecision );
QTreeWidgetItem* skewItem = createItem( cntrItem, Bold );
skewItem->setText( 0, tr( "TOP_SKEW" ) );
skewItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
//ElemDiam2D
afunctor.reset( new SMESH::Controls::MaxElementLength2D() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
QTreeWidgetItem* diamItem = createItem( cntrItem, Bold );
diamItem->setText( 0, tr( "MAX_ELEMENT_LENGTH_2D" ));
diamItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
}
if( e->GetType() == SMDSAbs_Volume ) {
//AspectRatio3D
afunctor.reset( new SMESH::Controls::AspectRatio3D() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
QTreeWidgetItem* ratlItem3 = createItem( cntrItem, Bold );
ratlItem3->setText( 0, tr( "ASPECTRATIO_3D_ELEMENTS" ) );
ratlItem3->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
//Volume
afunctor.reset( new SMESH::Controls::Volume() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
QTreeWidgetItem* volItem = createItem( cntrItem, Bold );
volItem->setText( 0, tr( "MEN_VOLUME_3D" ) );
volItem->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
//ElementDiameter3D
afunctor.reset( new SMESH::Controls::MaxElementLength3D() );
afunctor->SetMesh( actor()->GetObject()->GetMesh() );
QTreeWidgetItem* diam3Item = createItem( cntrItem, Bold );
diam3Item->setText( 0, tr( "MAX_ELEMENT_LENGTH_3D" ) );
diam3Item->setText( 1, QString( "%1" ).arg( afunctor->GetValue( id ) ) );
}
/*
if( e->GetType() >= SMDSAbs_Edge && e->GetType() <= SMDSAbs_Volume ) {
//shapeID
int shapeID = e->getshapeId();
if ( shapeID > 0 ) {
QTreeWidgetItem* shItem = createItem( elemItem, Bold );
QString shapeType;
switch ( actor()->GetObject()->GetMesh()->FindElement( shapeID )->GetType() ) {
case SMDS_TOP_EDGE: shapeType = tr( "EDGE" ); break;
case SMDS_TOP_FACE: shapeType = tr( "FACE" ); break;
case SMDS_TOP_VERTEX: shapeType = tr( "VERTEX" ); break;
default: shapeType = tr( "SOLID" );
}
shItem->setText( 0, tr( "Position" ) );
shItem->setText( 1, QString( "%1 #%2" ).arg(shapeType).arg( shapeID ) );
}
}
*/
} }
} }
} }

View File

@ -297,9 +297,9 @@ SUIT_SelectionFilter* SMESHGUI_MeshOp::createFilter( const int theId ) const
return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true ); return new GEOM_SelectionFilter( (SalomeApp_Study*)study(), true );
} }
else if ( theId == SMESHGUI_MeshDlg::Obj && !myToCreate ) else if ( theId == SMESHGUI_MeshDlg::Obj && !myToCreate )
return new SMESH_TypeFilter( MESHorSUBMESH ); return new SMESH_TypeFilter( SMESH::MESHorSUBMESH );
else if ( theId == SMESHGUI_MeshDlg::Mesh ) else if ( theId == SMESHGUI_MeshDlg::Mesh )
return new SMESH_TypeFilter( MESH ); return new SMESH_TypeFilter( SMESH::MESH );
else else
return 0; return 0;
} }
@ -1965,10 +1965,9 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim )
//================================================================================ //================================================================================
/*! /*!
* \brief Reads parameters of edited mesh and assigns them to the dialog * \brief Reads parameters of an edited mesh and assigns them to the dialog
* *
* Reads parameters of edited mesh and assigns them to the dialog (called when * Called when mesh is edited only.
* mesh is edited only)
*/ */
//================================================================================ //================================================================================
void SMESHGUI_MeshOp::readMesh() void SMESHGUI_MeshOp::readMesh()
@ -2005,8 +2004,8 @@ void SMESHGUI_MeshOp::readMesh()
// Get hypotheses and algorithms assigned to the mesh/sub-mesh // Get hypotheses and algorithms assigned to the mesh/sub-mesh
QStringList anExisting; QStringList anExisting;
const int aDim = ( myIsOnGeometry ) ? SMESH::DIM_0D : SMESH::DIM_3D; const int lastDim = ( myIsOnGeometry ) ? SMESH::DIM_0D : SMESH::DIM_3D;
for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) for ( int dim = SMESH::DIM_3D; dim >= lastDim; --dim )
{ {
// get algorithm // get algorithm
existingHyps( dim, Algo, pObj, anExisting, myObjHyps[ dim ][ Algo ] ); existingHyps( dim, Algo, pObj, anExisting, myObjHyps[ dim ][ Algo ] );
@ -2030,7 +2029,7 @@ void SMESHGUI_MeshOp::readMesh()
// get hypotheses // get hypotheses
bool hypWithoutAlgo = false; bool hypWithoutAlgo = false;
for ( int dim = aDim; dim <= SMESH::DIM_3D; dim++ ) for ( int dim = SMESH::DIM_3D; dim >= lastDim; --dim )
{ {
for ( int hypType = MainHyp; hypType <= AddHyp; hypType++ ) for ( int hypType = MainHyp; hypType <= AddHyp; hypType++ )
{ {

View File

@ -225,7 +225,7 @@ QWidget* SMESHGUI_MultiEditDlg::createMainFrame (QWidget* theParent, const bool
myComboBoxFunctor->addItem(tr("ASPECTRATIO_ELEMENTS")); myComboBoxFunctor->addItem(tr("ASPECTRATIO_ELEMENTS"));
myComboBoxFunctor->addItem(tr("MINIMUMANGLE_ELEMENTS")); myComboBoxFunctor->addItem(tr("MINIMUMANGLE_ELEMENTS"));
myComboBoxFunctor->addItem(tr("SKEW_ELEMENTS")); myComboBoxFunctor->addItem(tr("SKEW_ELEMENTS"));
myComboBoxFunctor->addItem(tr("AREA_ELEMENTS")); //myComboBoxFunctor->addItem(tr("AREA_ELEMENTS"));
//myComboBoxFunctor->addItem(tr("LENGTH2D_EDGES")); // for existing elements only //myComboBoxFunctor->addItem(tr("LENGTH2D_EDGES")); // for existing elements only
//myComboBoxFunctor->addItem(tr("MULTI2D_BORDERS")); // for existing elements only //myComboBoxFunctor->addItem(tr("MULTI2D_BORDERS")); // for existing elements only
myComboBoxFunctor->setCurrentIndex(0); myComboBoxFunctor->setCurrentIndex(0);
@ -362,6 +362,8 @@ SMESH::NumericalFunctor_ptr SMESHGUI_MultiEditDlg::getNumericalFunctor()
aNF = aFilterMgr->CreateLength2D(); aNF = aFilterMgr->CreateLength2D();
else if (myComboBoxFunctor->currentText() == tr("MULTI2D_BORDERS")) else if (myComboBoxFunctor->currentText() == tr("MULTI2D_BORDERS"))
aNF = aFilterMgr->CreateMultiConnection2D(); aNF = aFilterMgr->CreateMultiConnection2D();
else if (myComboBoxFunctor->currentText() == tr("MIN_DIAG_ELEMENTS"))
aNF = aFilterMgr->CreateMaxElementLength2D();
else; else;
return aNF._retn(); return aNF._retn();
@ -998,12 +1000,12 @@ void SMESHGUI_MultiEditDlg::setSelectionMode()
if (mySubmeshChk->isChecked()) { if (mySubmeshChk->isChecked()) {
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(new SMESH_TypeFilter(SUBMESH)); mySelectionMgr->installFilter(new SMESH_TypeFilter(SMESH::SUBMESH));
} }
else if (myGroupChk->isChecked()) { else if (myGroupChk->isChecked()) {
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
aViewWindow->SetSelectionMode(ActorSelection); aViewWindow->SetSelectionMode(ActorSelection);
mySelectionMgr->installFilter(new SMESH_TypeFilter(GROUP)); mySelectionMgr->installFilter(new SMESH_TypeFilter(SMESH::GROUP));
} }
if (entityType()) { if (entityType()) {
@ -1153,7 +1155,8 @@ SMESHGUI_UnionOfTrianglesDlg
{ {
setWindowTitle(tr("CAPTION")); setWindowTitle(tr("CAPTION"));
myComboBoxFunctor->setEnabled(true); myComboBoxFunctor->setEnabled(true);
myComboBoxFunctor->addItem(tr("AREA_ELEMENTS"));
myComboBoxFunctor->addItem(tr("WARP_ELEMENTS")); // for quadrangles only myComboBoxFunctor->addItem(tr("WARP_ELEMENTS")); // for quadrangles only
myComboBoxFunctor->addItem(tr("TAPER_ELEMENTS")); // for quadrangles only myComboBoxFunctor->addItem(tr("TAPER_ELEMENTS")); // for quadrangles only
@ -1240,6 +1243,8 @@ SMESHGUI_CuttingOfQuadsDlg
myCriterionGrp->show(); myCriterionGrp->show();
myChoiceWidget->show(); myChoiceWidget->show();
myComboBoxFunctor->insertItem(0, tr("MIN_DIAG_ELEMENTS"));
myComboBoxFunctor->setCurrentIndex(0);
myComboBoxFunctor->setEnabled(false); myComboBoxFunctor->setEnabled(false);
connect(myPreviewChk, SIGNAL(stateChanged(int)), this, SLOT(onPreviewChk())); connect(myPreviewChk, SIGNAL(stateChanged(int)), this, SLOT(onPreviewChk()));

View File

@ -621,8 +621,8 @@ void SMESHGUI_PropertiesDlg::showControls( int elements, bool nodes )
// node controls are supposed to be shown if at least any element type is present // node controls are supposed to be shown if at least any element type is present
// or if there are only nodes // or if there are only nodes
myNodeGrp->setVisible( nodes || elements & SMESH_Actor::eAllEntity ); myNodeGrp->setVisible( nodes || elements & SMESH_Actor::eAllEntity );
// edge controls are shown only if there are edges // edge/wireframe controls are needed for edges, faces and volumes
myEdgeGrp->setVisible( elements & SMESH_Actor::eEdges ); myEdgeGrp->setVisible( elements & ( SMESH_Actor::eEdges | SMESH_Actor::eFaces | SMESH_Actor::eVolumes ) );
// face controls are shown only if there are faces // face controls are shown only if there are faces
myFaceGrp->setVisible( elements & SMESH_Actor::eFaces ); myFaceGrp->setVisible( elements & SMESH_Actor::eFaces );
// volume controls are shown only if there are volumes // volume controls are shown only if there are volumes

View File

@ -372,16 +372,16 @@ void SMESHGUI_RemoveElementsDlg::SelectionIntoArgument()
myActor = SMESH::FindActorByEntry(anIO->getEntry()); myActor = SMESH::FindActorByEntry(anIO->getEntry());
if (myActor) { if (myActor) {
// get selected nodes // get selected elements
QString aString = ""; QString aString = "";
int nbElems = SMESH::GetNameOfSelectedElements(mySelector,anIO,aString); int nbElems = SMESH::GetNameOfSelectedElements(mySelector,anIO,aString);
if (nbElems > 0) { if (nbElems > 0) {
myBusy = true; myBusy = true;
myEditCurrentArgument->setText(aString); myEditCurrentArgument->setText(aString);
myBusy = false; myBusy = false;
// OK // OK
myNbOkElements = nbElems; myNbOkElements = nbElems;
} // if (nbElems > 0) } // if (nbElems > 0)
} // if (myActor) } // if (myActor)

View File

@ -182,7 +182,7 @@ void SMESHGUI_RenumberingDlg::Init()
myMesh = SMESH::SMESH_Mesh::_nil(); myMesh = SMESH::SMESH_Mesh::_nil();
myMeshFilter = new SMESH_TypeFilter (MESH); myMeshFilter = new SMESH_TypeFilter (SMESH::MESH);
/* signals and slots connections */ /* signals and slots connections */
connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk())); connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));

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