Merge from V6_main 13/12/2012
@ -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 \
|
||||||
|
78
doc/salome/gui/SMESH/CMakeLists.txt
Normal 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}
|
||||||
|
)
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 37 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 26 KiB |
BIN
doc/salome/gui/SMESH/images/dlg_0D_on_all_nodes.png
Normal file
After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 24 KiB |
@ -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.
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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".
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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 );
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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 \
|
||||||
|
@ -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
After Width: | Height: | Size: 322 B |
BIN
resources/mesh_0D_on_all_nodes.png
Normal file
After Width: | Height: | Size: 579 B |
@ -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);
|
||||||
|
@ -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;
|
||||||
|
66
src/DriverGMF/DriverGMF.cxx
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
46
src/DriverGMF/DriverGMF.hxx
Normal 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
|
@ -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] );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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() );
|
||||||
|
@ -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 ) {
|
||||||
|
@ -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 = \
|
||||||
|
@ -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;
|
||||||
|
@ -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>
|
||||||
|
@ -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 ) {
|
||||||
|
@ -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);
|
|
||||||
// }
|
|
||||||
|
@ -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())
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
@ -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++;
|
||||||
@ -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() )
|
||||||
@ -6737,10 +6853,10 @@ SMESH_ElementSearcherImpl::FindClosestTo( const gp_Pnt& point,
|
|||||||
|
|
||||||
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;
|
||||||
@ -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
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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 );
|
||||||
@ -2077,7 +2101,20 @@ void SMESH_subMesh::setEventListener(EventListener* listener, EventListenerData*
|
|||||||
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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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 )
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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) );
|
||||||
|
|
||||||
|
495
src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.cxx
Normal 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();
|
||||||
|
}
|
110
src/SMESHGUI/SMESHGUI_Add0DElemsOnAllNodesDlg.h
Normal 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
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
|
||||||
|
@ -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 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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";
|
||||||
|
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
//=================================================================================
|
//=================================================================================
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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 );
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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();
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 );
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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();
|
||||||
|
@ -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);
|
||||||
|
@ -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 ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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++ )
|
||||||
{
|
{
|
||||||
|
@ -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()) {
|
||||||
@ -1154,6 +1156,7 @@ 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()));
|
||||||
|
@ -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
|
||||||
|
@ -372,7 +372,7 @@ 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) {
|
||||||
|
@ -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()));
|
||||||
|