ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \
-I ${GUI_ROOT_DIR}/adm_local/unix/config_files \
-I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \
- -I ${MED_ROOT_DIR}/adm_local/unix/config_files \
-I ${GEOM_ROOT_DIR}/adm_local/unix/config_files
else !SMESH_ENABLE_GUI
ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \
-I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \
- -I ${MED_ROOT_DIR}/adm_local/unix/config_files \
-I ${GEOM_ROOT_DIR}/adm_local/unix/config_files
endif
# exit
#fi
-########################################################################
-# Test if the MED_ROOT_DIR is set correctly
-
-if test ! -d "${MED_ROOT_DIR}"; then
- echo "failed : MED_ROOT_DIR variable is not correct !"
- exit
-fi
-
########################################################################
# Test if the GEOM_ROOT_DIR is set correctly
aclocal -I adm_local/unix/config_files \
-I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \
-I ${GUI_ROOT_DIR}/adm_local/unix/config_files \
- -I ${MED_ROOT_DIR}/adm_local/unix/config_files \
-I ${GEOM_ROOT_DIR}/adm_local/unix/config_files || exit 1
else
aclocal -I adm_local/unix/config_files \
-I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \
- -I ${MED_ROOT_DIR}/adm_local/unix/config_files \
-I ${GEOM_ROOT_DIR}/adm_local/unix/config_files || exit 1
fi
CHECK_GEOM
-echo
-echo ---------------------------------------------
-echo Testing Med
-echo ---------------------------------------------
-echo
-
-CHECK_MED
-
CHECK_PLATFORM
echo
echo Configure
if test "${gui_ok}" = "yes"; then
- variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok cgns_ok tbb_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok qwt_ok Kernel_ok Geom_ok Med_ok gui_ok"
+ variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok cgns_ok tbb_ok med3_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok qwt_ok Kernel_ok Geom_ok gui_ok"
elif test "${SalomeGUI_need}" != "no"; then
- variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok cgns_ok tbb_ok med3_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok Med_ok gui_ok"
+ variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok cgns_ok tbb_ok med3_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok gui_ok"
else
- variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok cgns_ok tbb_ok med3_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok Med_ok"
+ variables="cc_ok fortran_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok vtk_ok hdf5_ok cgns_ok tbb_ok med3_ok omniORB_ok occ_ok doxygen_ok graphviz_ok sphinx_ok Kernel_ok Geom_ok"
fi
for var in $variables
doc/salome/tui/static/header.html \
src/Makefile \
src/Controls/Makefile \
+ src/MEDWrapper/Makefile \
+ src/MEDWrapper/Base/Makefile \
+ src/MEDWrapper/Factory/Makefile \
+ src/MEDWrapper/V2_2/Makefile \
src/Driver/Makefile \
src/DriverDAT/Makefile \
src/DriverMED/Makefile \
src/Tools/YamsPlug/Makefile \
src/Tools/YamsPlug/doc/Makefile \
src/Tools/YamsPlug/doc/conf.py \
+ src/Tools/MGCleanerPlug/Makefile \
+ src/Tools/MGCleanerPlug/doc/Makefile \
+ src/Tools/MGCleanerPlug/doc/conf.py \
src/Tools/padder/Makefile \
src/Tools/padder/meshjob/Makefile \
src/Tools/padder/meshjob/idl/Makefile \
# create a mesh
tetra = smesh.Mesh(box, "MeshBox")
-
-algo1D = tetra.Segment()
-algo1D.NumberOfSegments(7)
-
-algo2D = tetra.Triangle()
-algo2D.MaxElementArea(800.)
-
-algo3D = tetra.Tetrahedron()
-algo3D.MaxElementVolume(900.)
+tetra.Segment().NumberOfSegments(7)
+tetra.Triangle()
+tetra.Tetrahedron()
# compute the mesh
tetra.Compute()
# export the mesh in a MED file
-tetra.ExportMED("/tmp/meshMED.med", 0)
+import tempfile
+medFile = tempfile.NamedTemporaryFile(suffix=".med").name
+tetra.ExportMED( medFile, 0 )
# export a group in a MED file
face = geompy.SubShapeAll( box, geompy.ShapeType["FACE"])[0] # a box side
group = tetra.GroupOnGeom( face, "face group" ) # group of 2D elements on the <face>
-tetra.ExportMED("/tmp/groupMED.med", meshPart=group)
+tetra.ExportMED( medFile, meshPart=group )
+
+# ========================
+# autoDimension parameter
+# ========================
+
+face = geompy.MakeFaceHW( 10, 10, 1, "rectangle" )
+mesh2D = smesh.Mesh( face, "mesh2D" )
+mesh2D.AutomaticHexahedralization(0)
+
+import MEDLoader, os
+
+# exported mesh is in 2D space because it is a planar mesh lying
+# on XOY plane, and autoDimension=True by default
+mesh2D.ExportMED( medFile )
+medMesh = MEDLoader.MEDLoader.ReadUMeshFromFile(medFile,mesh2D.GetName(),0)
+print "autoDimension==True, exported mesh is in %sD"%medMesh.getSpaceDimension()
+
+# exported mesh is in 3D space, same as in Mesh module,
+# thanks to autoDimension=False
+mesh2D.ExportMED( medFile, autoDimension=False )
+medMesh = MEDLoader.MEDLoader.ReadUMeshFromFile(medFile,mesh2D.GetName(),0)
+print "autoDimension==False, exported mesh is in %sD"%medMesh.getSpaceDimension()
+
+os.remove( medFile )
geompy.addToStudy( shape, "shape" )
geompy.addToStudyInFather( shape, face1, "face1")
+# 3D Viscous layers
mesh = smesh.Mesh(shape, "CFD")
mesh.MakeGroup("Tetras",SMESH.VOLUME,SMESH.FT_ElemGeomType,"=",SMESH.Geom_TETRA)
mesh.MakeGroup("Pyras",SMESH.VOLUME,SMESH.FT_ElemGeomType,"=",SMESH.Geom_PYRAMID)
mesh.MakeGroup("Prims",SMESH.VOLUME,SMESH.FT_ElemGeomType,"=",SMESH.Geom_PENTA)
+
+# 2D Viscous layers
+
+# 3 edges of the 4 edges of face1
+edgeIds = geompy.SubShapeAllIDs( face1, geompy.ShapeType["EDGE"])[:-1]
+
+mesh = smesh.Mesh(face1,"VicsousLayers2D")
+mesh.Segment().NumberOfSegments( 5 )
+
+# viscous layers should be created on 1 edge, as we set 3 edges to ignore
+vlHyp = mesh.Triangle().ViscousLayers2D( 2, 3, 1.5, edgeIds, isEdgesToIgnore=True )
+
+mesh.Compute()
+
+# viscous layers should be created on 3 edges, as we pass isEdgesToIgnore=False
+vlHyp.SetEdges( edgeIds, False )
+
+mesh.Compute()
-# Duplicate nodes
+# Duplicate nodes or/and elements
import salome
salome.salome_init()
+
import GEOM
from salome.geom import geomBuilder
geompy = geomBuilder.New(salome.myStudy)
-import SMESH, SALOMEDS
+import SMESH
from salome.smesh import smeshBuilder
smesh = smeshBuilder.New(salome.myStudy)
# Compute mesh
mesh.Compute()
-# Without the duplication of border elements
+# Duplicate nodes only
# Nodes to duplicate
nodes1 = mesh.CreateEmptyGroup( SMESH.NODE, 'nodes1' )
print "Edges : ", mesh.NbEdges()
print "Quadrangles : ", mesh.NbQuadrangles()
-# With the duplication of border elements
+# Duplicate nodes and border elements
# Edges to duplicate
edges = mesh.CreateEmptyGroup( SMESH.EDGE, 'edges' )
print "Edges : ", mesh.NbEdges()
print "Quadrangles : ", mesh.NbQuadrangles()
+
+# Duplicate elements only
+
+# Duplicate all faces and make a group of new faces.
+# If a mesh is given to DoubleElements(), all elements of the greatest dimension are duplicated
+newFacesGroup = mesh.DoubleElements( mesh, "newFacesGroup" )
+
+# Duplicate edges contained in the group "edges" and add new edges to this group
+mesh.DoubleElements( edges, edges.GetName() )
+
+# Duplicate two first edges of the mesh
+mesh.DoubleElements([ 1, 2 ])
+
# Update object browser
if salome.sg.hasDesktop():
salome.sg.updateObjBrowser(0)
@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(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(DOC_LD_LIBRARY_PATH "${CMAKE_INSTALL_PREFIX}/lib/salome:${MED_ROOT_DIR}/lib/salome:${GEOM_ROOT_DIR}/lib/salome:${KERNEL_ROOT_DIR}/lib/salome")
+ SET(DOC_PYTHONPATH "${CMAKE_INSTALL_PREFIX}/bin/salome:${CMAKE_INSTALL_PREFIX}/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(DOC_LD_LIBRARY_PATH "${CMAKE_INSTALL_PREFIX}/lib/salome:${GEOM_ROOT_DIR}/lib/salome:${KERNEL_ROOT_DIR}/lib/salome")
SET(SCR "export PYTHONPATH=${DOC_PYTHONPATH}:\${PYTHONPATH}
export LD_LIBRARY_PATH=${DOC_LD_LIBRARY_PATH}:\${LD_LIBRARY_PATH}
export SMESH_MeshersList=${DOC_SMESH_MeshersList}
guidocdir = $(docdir)/gui/SMESH
guidoc_DATA = images/head.png
-DOC_PYTHONPATH=$(prefix)/bin/salome:$(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(MED_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(GEOM_ROOT_DIR)/bin/salome:$(GEOM_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(KERNEL_ROOT_DIR)/bin/salome:$(KERNEL_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(OMNIORB_ROOT)/lib/python$(PYTHON_VERSION)/site-packages:$(OMNIORB_ROOT)/lib64/python$(PYTHON_VERSION)/site-packages
-DOC_LD_LIBRARY_PATH=$(prefix)/lib/salome:$(MED_ROOT_DIR)/lib/salome:$(GEOM_ROOT_DIR)/lib/salome:$(KERNEL_ROOT_DIR)/lib/salome
+DOC_PYTHONPATH=$(prefix)/bin/salome:$(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(GEOM_ROOT_DIR)/bin/salome:$(GEOM_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(KERNEL_ROOT_DIR)/bin/salome:$(KERNEL_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(OMNIORB_ROOT)/lib/python$(PYTHON_VERSION)/site-packages:$(OMNIORB_ROOT)/lib64/python$(PYTHON_VERSION)/site-packages
+DOC_LD_LIBRARY_PATH=$(prefix)/lib/salome:$(GEOM_ROOT_DIR)/lib/salome:$(KERNEL_ROOT_DIR)/lib/salome
DOC_SMESH_MeshersList=StdMeshers
tmp1/smeshBuilder.py: $(top_srcdir)/src/SMESH_SWIG/StdMeshersBuilder.py $(srcdir)/collect_mesh_methods.py
case $${filen} in \
dummy ) ;; \
$(DESTDIR)$(guidocdir)/yams ) ;; \
+ $(DESTDIR)$(guidocdir)/MGCleaner ) ;; \
$(DESTDIR)$(guidocdir)/head.png ) ;; \
* ) echo "removing $${filen}" && rm -rf $${filen} ;; \
esac ; \
\anchor max_element_area_anchor
<h2>Max Element Area</h2>
-<b>Max Element Area</b> hypothesis is applied for meshing of 2D faces
+<b>Max Element Area</b> hypothesis is applied for meshing of faces
composing your geometrical object. Definition of this hypothesis
-consists of setting the <b>maximum area</b> of meshing elements (depending on
-the chosen meshing algorithm it can be <b>triangles</b> or <b>quadrangles</b>),
-which will compose the mesh of these 2D faces.
+consists of setting the <b>maximum area</b> of mesh elements,
+which will compose the mesh of these faces.
\image html a-maxelarea.png
\anchor length_from_edges_anchor
<h2>Length from Edges</h2>
-<b>Length from edges</b> hypothesis builds 2D mesh segments having a
-length calculated as an average edge length for a given wire.
+<b>Length from edges</b> hypothesis builds 2D mesh elements having a
+maximum linear size calculated as an average segment length for a wire
+of a given face.
<b>See Also</b> a sample TUI Script of a
\ref tui_length_from_edges "Length from Edges" hypothesis operation.
<b>Quadrangle parameters</b> is a hypothesis for Quadrangle (Mapping).
<b>Base vertex</b> parameter allows using Quadrangle (Mapping)
-algorithm for meshing of triangular faces. In this case it is
+algorithm for meshing of trilateral faces. In this case it is
necessary to select the vertex, which will be used as the fourth edge
(degenerated).
<i>This type corresponds to <b>Quadrangle Preference</b>
additional hypothesis, which is obsolete now.</i></li>
<li><b>Quadrangle preference (reversed)</b> works in the same way and
-with the same restriction as <b>Quadrangle preference</b>, but
- the transition area is located along the coarser meshed sides.</li>
+ with the same restriction as <b>Quadrangle preference</b>, but
+ the transition area is located along the coarser meshed sides.</li>
<li><b>Reduced</b> type forces building only quadrangles and the transition
between the sides is made gradually, layer by layer. This type has
a limitation on the number of segments: one pair of opposite sides must have
the same number of segments, the other pair must have an even difference
- between the numbers of segments on the sides.</li>
+ between the numbers of segments on the sides. In addition, number
+ of rows of faces between sides with different discretization
+ should be enough for the transition. At the fastest transition
+ pattern, three segments become one (see the image below), hence
+ the least number of face rows needed to reduce from Nmax segments
+ to Nmin segments is log<sub>3</sub>( Nmax / Nmin ). The number of
+ face rows is equal to number of segments on each of equally
+ discretized sides.
+\image html reduce_three_to_one.png "The fastest transition pattern: 3 to 1"
+</li>
</ul>
<b>See Also</b> a sample TUI Script of a
\b Hypotheses represent boundary conditions which will be taken into
account at calculations of meshes or sub-meshes basing on geometrical
objects. These hypotheses allow you to manage the level of detail of
-the resulting meshes or submeshes: when applying different hypotheses
-with different parameters you can preset the quantity of meshing
+the resulting meshes or sub-meshes: when applying different hypotheses
+with different parameters you can preset the quantity or size of
elements which will compose your mesh. So, it will be possible to
generate a coarse or a more refined mesh or sub-mesh.
-In \b MESH there are the following Basic Hypotheses (to introduce
-them, you operate numerical values):
+In \b MESH there are the following Basic Hypotheses:
<ul>
<li>\subpage a1d_meshing_hypo_page "1D Hypotheses" (for meshing of
<b>edges</b>):</li>
The choice of a hypothesis depends on:
<ul>
-<li>the geometrical object (shape) which will be meshed</li>
<li>the algorithm, which will be selected for meshing of this geometrical object (shape)</li>
+<li>the geometrical object (shape) which will be meshed</li>
</ul>
-
*/
<h2>Viscous Layers and Viscous Layers 2D</h2>
<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
+hypotheses can be used together with either 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
<li><b>Total thickness</b> - gives the total thickness of element 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 element height
-from the mesh boundary inwards.</li>
-<li><b>Faces (Edges) without layers</b> - defines geometrical faces
- (or edges in 2D) on which element layers should not be
- constructed. By default the element layers are not constructed on
- geometrical faces shared by solids (and edges shared by faces in 2D).
+ from the mesh boundary inwards.</li>
+<li><b>Specified Edges are</b> - defines how the shapes specified by
+ the next parameter are used.
+<li><b>Faces without layers</b> and <b>Edges with/without layers</b> -
+ in the 3D case it defines geometrical faces on which element layers
+ should not be constructed; in the 2D case it defines geometrical edges
+ on which element layers either should be or should not be
+ constructed, depending on the value of the previous parameter
+ (<b>Specified Edges are</b>).
\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
+ and edges, just hide the mesh to avoid this. 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).
+ preview chunk size" preference (in Preferences/Mesh/General tab).<br>
+
+ Whatever shapes are specified by this
+ parameter, the element layers are not constructed on geometrical
+ faces shared by several solids in 3D case and edges shared by
+ several faces in 2D case. In other words the element layers can be
+ constructed on boundary faces and edges, and are not constructed on
+ internal faces and edges. There is an exception to this rule in 2D
+ case: if "Viscous Layers 2D" hypothesis is assigned to a sub-mesh,
+ the element layers can be constructed on boundary edges of the shape
+ of this sub-mesh.
+ \image html viscous_layers_on_submesh.png 2D viscous layers constructed on boundary edges of a sub-mesh on a disk face.
+
</li>
</ul>
--- /dev/null
+/*!
+
+\page arranging_study_objects_page Arranging objects in study
+
+If sub-meshes or groups container item has more than one child sub-object, then there is a possibility to sort these children in ascending order.
+
+To use sort functionality select "Sort children" popup menu item for the parent object.
+
+\image html smesh_sort.png "Sorting of sub-objects"
+
+*/
\image html image124.gif "Example of a quadrangular 2D mesh"
-<li>For meshing of 3D entities (<b>volume objects</b>):</li>
+<li>For meshing of 3D entities (<b>solid objects</b>):</li>
<ul>
-<li>Hexahedron meshing algorithm (i,j,k) - 6-sided Volumes are split into
+<li>Hexahedron meshing algorithm (i,j,k) - 6-sided Solids are split into
hexahedral (cubic) elements.</li>
<li>\subpage cartesian_algo_page</li>
-- internal parts of Volumes are split into hexahedral elements forming a
+- internal parts of Solids are split into hexahedral elements forming a
Cartesian grid; polyhedra and other types of elements are generated
where the geometrical boundary intersects Cartesian cells.</li>
</ul>
<em>"Result mesh with order SubMesh_3, SubMesh_2, SubMesh_1 "</em></center>
As we can see, each mesh computation has a different number of result
-elements and a different mesh discretisation on the shared edges (the edges
+elements and a different mesh discretization on the shared edges (the edges
that are shared between <b>Face_1</b>, <b>Face_2</b> and <b>Face_3</b>)
Additionally, submesh priority (the order of applied algorithms) can
/*!
-\page double_nodes_page Duplicate Nodes
+\page double_nodes_page Duplicate Nodes or/and Elements
-\n This operation allows to duplicate nodes of your mesh, which can be
-useful to emulate a crack in the model.
-Duplication consists in replacement of an existing mesh element by another one.
-Lower level elements of the duplicated ones are cloned automatically.
+\n This operation allows to duplicate nodes or/and elements of your mesh.
+Duplication of nodes can be useful to emulate a crack in the model.
+Duplication consists in creation of mesh element "equal" to existing ones.
-<em>To duplicate nodes:</em>
+<em>To duplicate nodes or/and elements:</em>
<ol>
-<li>From the \b Modification menu choose \b Transformation -> \b Duplicate
-\b Nodes item or click <em>"Duplicate Nodes"</em> button in the toolbar.
+<li>From the \b Modification menu choose \b Transformation -> <b> Duplicate
+ Nodes or/and Elements </b> item or click <em>"Duplicate Nodes or/and
+ Elements"</em> button in the toolbar.
<br>
-\image html duplicate_nodes.png "Duplicate Nodes button"
+\image html duplicate_nodes.png "Duplicate Nodes or/and Elements button"
</li>
-<li>Check in the dialog box one of two radio buttons corresponding to
-the type of nodes duplication operation you would like to perform.</li>
-<li>Fill the other fields available in the dialog box (depends on the chosen
- operation mode).</li>
-<li>Click the \b Apply or <b>Apply and Close</b> button to perform the operation of nodes
- duplication.</li>
+<li>Check in the dialog box one of three radio buttons corresponding to
+ the type of duplication operation you would like to perform.</li>
+<li>Fill the other fields available in the dialog box (depending on
+ the chosen operation mode).</li>
+<li>Click the \b Apply or <b>Apply and Close</b> button to perform the
+ operation of duplication.</li>
</ol>
-\n "Duplicate Nodes" dialog has two working modes:
+\n "Duplicate Nodes or/and Elements" dialog has three working modes:
<ul>
-<li>\ref mode_without_elem_anchor "Without the duplication of border elements"</li>
-<li>\ref mode_with_elem_anchor "With the duplication of border elements"</li>
+<li>\ref mode_without_elem_anchor "Duplicate nodes only"</li>
+<li>\ref mode_with_elem_anchor "Duplicate nodes and border elements"</li>
+<li>\ref mode_elem_only_anchor "Duplicate elements only"</li>
</ul>
<br>
\anchor mode_without_elem_anchor
-<h2>Without duplication of border elements</h2>
+<h2>Duplicate nodes only</h2>
In this mode the dialog looks like:
Parameters to be defined in this mode:
<ul>
-<li><b>Group of nodes to duplicate</b> (<em>mandatory</em>): these nodes will be duplicated.</li>
-<li><b>Group of elements to replace nodes with new ones</b> (<em>optional</em>): the duplicated nodes
- will be associated with these elements.</li>
-<li><b>Construct group with newly created nodes</b> option (<em>checked by default</em>):
- if checked - the group with just created nodes will be built.</li>
+<li><b>Group of nodes to duplicate</b> (<em>mandatory</em>): these
+ nodes will be duplicated.</li>
+<li><b>Group of elements to replace nodes with new ones</b>
+ (<em>optional</em>): the new nodes will replace the nodes to
+ duplicate within these elements.</li>
+<li><b>Construct group with newly created nodes</b> option
+ (<em>checked by default</em>): if checked - the group with just
+ created nodes will be built.</li>
</ul>
+A schema below explains the crack emulation using the node duplication.
+\image html crack_emulation_double_nodes.png "Crack emulation"
+This schema shows a virtual crack in a 2D mesh created using this duplication
+mode. In this schema:
+- Black balls are <b>nodes to duplicate</b>.
+- Red balls are <b>new nodes</b>.
+- <b>Elements to replace nodes with new ones</b> are marked with green.
+
+Note that in reality <b>nodes to duplicate</b> coincide with <b>new nodes</b>.
+
<br>
\anchor mode_with_elem_anchor
-<h2>With duplication of border elements</h2>
+<h2>Duplicate nodes and border elements</h2>
In this mode the dialog looks like:
Parameters to be defined in this mode:
<ul>
-<li><b>Group of elements to duplicate</b> (<em>mandatory</em>): these elements will be duplicated.</li>
-<li><b>Group of nodes at not to duplicate</b> (<em>optional</em>): group of nodes at crack bottom
- which will not be duplicated.</li>
-<li><b>Group of elements to replace nodes with new ones</b> (<em>mandatory</em>): the duplicated nodes
- will be associated with these elements.</li>
-<li><b>Construct group with newly created elements</b> option (<em>checked by default</em>):
- if checked - the group of just created elements will be built.</li>
-<li><b>Construct group with newly created nodes</b> option (<em>checked by default</em>):
- if checked - the group of just created nodes will be built.</li>
+<li><b>Group of elements to duplicate</b> (<em>mandatory</em>): these
+ elements will be duplicated.</li>
+<li><b>Group of nodes not to duplicate</b> (<em>optional</em>):
+ group of nodes at crack bottom which will not be duplicated.</li>
+<li><b>Group of elements to replace nodes with new ones</b>
+ (<em>mandatory</em>): the new nodes will replace the nodes to
+ duplicate within these elements.</li>
+<li><b>Construct group with newly created elements</b> option
+ (<em>checked by default</em>): if checked - the group of just created
+ elements will be built.</li>
+<li><b>Construct group with newly created nodes</b> option
+ (<em>checked by default</em>): if checked - the group of just
+ created nodes will be built.</li>
+</ul>
+
+A schema below explains the crack emulation using the node duplication
+with border elements.
+\image html crack_emulation_double_nodes_with_elems.png "Crack emulation"
+This schema shows a virtual crack in a 2D mesh created using this duplication
+mode. In this schema:
+- Black segments are <b>elements to duplicate</b> (edges in 2D case).
+- Black balls (except the lowest one) are nodes of <b>elements to
+ duplicate</b> that are duplicated.
+- The lowest black ball is a <b>node not to duplicate</b>.
+- Red balls are <b>creates nodes</b>.
+- Red segments are <b>created elements</b> (edges).
+- <b>Elements to replace nodes with new ones</b> are marked with green.
+
+Note that in reality <b>nodes to duplicate</b> coincide with <b>new nodes</b>.
+<br>
+In a 3D case, where <b>elements to duplicate</b> are faces, the edges
+located at the "crack" (if any) are cloned automatically.
+
+<br>
+\anchor mode_elem_only_anchor
+<h2>Duplicate elements only</h2>
+
+This mode just duplicates given elements, i.e. creates new elements on
+the same nodes as the given elements.
+<br>
+In this mode the dialog looks like:
+
+\image html duplicate03.png
+
+Parameters to be defined in this mode:
+<ul>
+<li><b>Group of elements to duplicate</b> (<em>mandatory</em>): these
+ elements will be duplicated.</li>
+<li><b>Construct group with newly created elements</b> option
+ (<em>checked by default</em>): if checked - the group of just created
+ elements will be built. A name of the created group starts from
+ "DoubleElements".</li>
</ul>
-<br><b>See Also</b> a sample TUI Script of a \ref tui_duplicate_nodes "Duplicate nodes" operation.
+<br><b>See Also</b> a sample TUI Script of a
+ \ref tui_duplicate_nodes "Duplicate nodes or/and elements" operation.
*/
\page importing_exporting_meshes_page Importing and exporting meshes
-\n In MESH there is a functionality allowing importation/exportation
+\n In MESH there is a functionality allowing import/export
of meshes from/to \b MED, \b UNV (I-DEAS 10), \b DAT (simple ascii format), \b STL,
-\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.
+\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>
<ol>
<li>From the \b File menu choose the \b Import item, from its sub-menu
-select the corresponding format (MED, UNV, STL, GMF and CGNS) of the file containing
-your mesh.</li>
+ select the corresponding format (MED, UNV, STL, GMF and CGNS) of the
+ file containing your mesh.</li>
<li>In the standard <b>Search File</b> dialog box find the file for
-importation. It is possible to select multiple files to be imported all at once. </li>
+ import. It is possible to select multiple files to be imported all at
+ once. </li>
<li>Click the \b OK button.</li>
</ol>
<em>To export a mesh or a group:</em>
<ol>
-<li>Select the object you wish to export.</li>
-<li>From the \b File menu choose the \b Export item, from its sub-menu
-select the format (MED, UNV, DAT, STL, GMF and CGNS) of the file which will
-contain your exported mesh.</li>
-<li>In the standard <b>Search File</b> select a location for the
-exported file and enter its name.</li>
-<li>Click the \b OK button.</li>
+ <li>Select the object you wish to export.</li>
+ <li>From the \b File menu choose the \b Export item, from its sub-menu
+ select the format (MED, UNV, DAT, STL, GMF and CGNS) of the file which will
+ contain your exported mesh.</li>
+ <li>In the standard <b>Search File</b> select a location for the
+ exported file and enter its name.</li>
+ <li>Click the \b OK button.</li>
</ol>
\image html meshexportmesh.png
+At export to MED and SAUV format files additional parameters are available.
+<ul>
+ <li><b>Automatically create groups</b> check-box specifies whether to
+ create groups of all mesh entities of available dimensions or
+ not. If checked, the created groups have names like "Group_On_All_Nodes",
+ "Group_On_All_Faces" etc.</li>
+ <li><b>Automatically define space dimension</b> check-box specifies
+ whether to define space dimension for export by mesh configuration
+ or not. Usually the mesh is exported as a mesh in 3D space, just as
+ it is in Mesh module. The mesh can be exported as a mesh in lower
+ dimension in following cases, provided that this check-box is
+ checked.
+ <ul>
+ <li> 1D: if all mesh nodes lie on OX coordinate axis. </li>
+ <li> 2D: if all mesh nodes lie on XOY coordinate plane. </li>
+ </ul>
+ </li>
+</ul>
<br><b>See Also</b> a sample TUI Script of an \ref tui_export_mesh "Export Mesh" operation.
*/
\subpage using_notebook_mesh_page "Salome notebook".</li>
</ul>
+The possibility to sort the created sub-meshes or groups is detailed on
+\subpage arranging_study_objects_page section.
+
Mesh module preferences are described in the \subpage mesh_preferences_page section of SALOME Mesh Help.
Almost all mesh module functionalities are accessible via
The <b>Mesh Information</b> dialog box provides three tab pages:
- <b>\ref advanced_mesh_infos_anchor "Base Info"</b> - to show base
-information about the selected mesh object
+information about the selected mesh object.
- <b>\ref mesh_element_info_anchor "Element Info"</b> - to show
detailed information about the selected mesh node or element.
- <b>\ref mesh_addition_info_anchor "Additional Info"</b> - to show additional information available
for the selected mesh, sub-mesh or group object.
+- <b>\ref mesh_quality_info_anchor "Quality Info"</b> - to show
+overall quality information about the selected mesh, sub-mesh or group object.
\anchor advanced_mesh_infos_anchor
<h2>Base Information</h2>
the "Automatic nodes compute limit" set via the "Mesh information"
preferences (zero value means no limit).
+\anchor mesh_quality_info_anchor
+<h2>Quality Information</h2>
+
+The <b>Quality Info</b> tab page of the dialog box provides overal
+mesh quality controls information on the selected object - mesh,
+sub-mesh or mesh group:
+- Name;
+- Nodes information:
+ - Number of the free nodes;
+ - Number of double nodes;
+- Edges information:
+ - Number of double edges;
+- Faces information:
+ - Number of double faces;
+ - Number of over-constrained faces;
+ - Aspect Ratio histogram;
+- Volume information:
+ - Number of double volumes;
+ - Number of over-constrained volumes;
+ - Aspect Ratio 3D histogram.
+
+<center>\image html ctrlinfo.png
+<em>"Quality Info" page</em></center>
+
+\note User can set "Double nodes tolerance" in the dialog for local change
+ or via the "Quality controls" in Mesh preferences.
+
+\note For the perfomance reason, all quality control values for the big meshes are
+computed only by demand. For this, the user should press the "compute"
+button (see picture). Also, values are automatically computed if the number of the
+nodes / elements does not exceed the "Automatic controls compute limit" set
+via the "Mesh information" preferences (zero value means no limit).
+
The button \b "Dump" allows printing the information displayed in the
dialog box to a .txt file.
\image html pref21.png
-<ul>
-<li><b>Automatic Update</b></li>
-<ul>
-<li>If you toggle <b>Automatic Update</b> checkbox, the model in your
-viewer automatically updated whenever you make changes in it.</li>
-<li><b>Size limit (elements)</b> - allows to specify the maximum
-number of elements in the resulting mesh for which the automatic updating
-of the presentation is performed. This option affects only
-<b>Compute</b> operation. Zero value means "no limit". Default value
-is 500 000 mesh elements.
-</ul>
-<li><b>Quality Controls</b></li>
-<ul>
-<li>If you toggle <b>Display entity</b>, both faces and edges of an
-object will be displayed in the viewer by default.</li>
-<li>If you toggle <b>Use precision</b> checkbox, you can display numbers in
-<b>Quality Control</b> diagrams at the necessary level of precision.</li>
-<li><b>Number of digits after point</b> - defines precision for <b>Quality Controls</b>. By default, numbers in <b>Quality Control</b>
-diagrams are presented as integers.</li>
-<li><b>Double nodes tolerance</b> defines the maximal distance between two
-mesh nodes, at which they are considered coincident by <b>Double nodes</b>
-quality control.
-</ul>
-<li><b>Display mode</b> - allows to set Wireframe, Shading, Nodes or Shrink
-presentation mode as default.</li>
-<li><b>Representation of the 2D quadratic elements</b></li>
-<ul>
-<li><b>Representation of the 2D quadratic elements</b> combobox - allows
-to select lines or arcs for representation of quadratic elements.</li>
-<li><b>Maximum Angle</b> - maximum deviation angle used by the
-application to build arcs. </li>
-</ul>
-<li><b>Mesh export</b></li>
-<ul>
-<li>If you toggle <b>Automatically create groups for MED export</b> checkbox,
-this operation will be carried out automatically.</li>
-<li>If you toggle <b>Automatic renumbering</b> checkbox, the exported
-mesh will be renumbered automatically</li>
-</ul>
-<li><b>Mesh computation</b></li>
-<ul>
-<li><b>Show a computation result notification</b> combobox allows to
-select the notification mode about a mesh computation result.
-There are 3 possible modes:</li>
-<ul>
-<li><b>Never</b> - do not show the result dialog at all;</li>
-<li><b>Errors only</b> - the result dialog will be shown if there were
-some errors during a mesh computation;</li>
-<li><b>Always</b> - show the result dialog after each mesh
-computation. This is a default mode.</li>
-</ul></ul>
-<li><b>Mesh information</b></li>
-<ul>
-<li><b>Mesh element information</b></li> - Change the way mesh element
-information is shown:
-<ul>
-<li><b>Simple</b> - as a plain text</li>
-<li><b>Tree</b> - in a tree-like form</li>
-</ul>
-<li><b>Automatic nodes compute limit</b></li> - allows to define the size limit for the
-mesh groups for which the number of underlying nodes is calculated
-automatically. If the group size exceeds the value set in the preferences,
-the user will have to press \em Compute button explicitly. Zero value
-means "no limit". By default the value is set to 100 000 mesh elements.
-</li>
-<li><b>Show details on groups in element information tab</b> - when
-this option is switched off (default), only the names of groups, to which the node
-or element belongs, are shown in the \ref mesh_element_info_anchor "Info Tab"
-tab of "Mesh Information" dialog box. If this option is
-switched on, the detailed information on groups is shown.</li>
-<li><b>Dump base information</b> - allows to dump base mesh information to the
-file, see \ref mesh_infos_page.</li>
-<li><b>Dump element information</b> - allows to dump element information to the
-file, see \ref mesh_infos_page.</li>
-<li><b>Dump additional information</b> - allows to dump additional mesh
-information to the file, see \ref mesh_infos_page.</li>
-</ul>
-<li><b>Automatic Parameters</b></li>
-<ul>
-<li><b>Ratio Bounding Box Diagonal / Max Size</b> - this parameter is
-used for automatic meshing: ratio between the bounding box of the
-meshed object and the Max Size of segments.</li>
-<li><b>Default Number of Segments</b> - allows defining the default
-number of segments on each edge</li>
-</li></ul>
-<li><b>Mesh loading</b></li>
-<ul>
-<li>If <b>No mesh loading from study file at hypothesis modification</b>
- checkbox is on, the mesh data will not be loaded from the study file
- when a hypothesis is modified. This allows saving time by omitting
- loading data of a large mesh that is planned to be recomputed with other parameters.</li>
-</ul>
-<li><b>Input fields precision</b></li>
-<ul>
-<li><b>Length precision</b> - allows to adjust input precision of coordinates and dimensions.</li>
-<li><b>Angular precision</b> - allows to adjust input precision of angles.</li>
-<li><b>Length tolerance precision</b> - allows to adjust input precision of tolerance of coordinates and dimensions.</li>
-<li><b>Parametric precision</b> - allows to adjust input precision of parametric values.</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>
-</ul>
-<li><b>Preview</b></li>
-<ul>
-<li><b>Sub-shapes preview chunk size</b> - allows to limit the number
-of previewed 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>
-<ul>
-<li><b>Historical python dump</b> checkbox allows switching between
- \a Historical and \a Snapshot dump mode. In \a
- Historical mode, Python Dump script includes all commands
- performed by SMESH engine. In \a Snapshot mode, the commands
- relating to objects removed from the Study as well as the commands
- not influencing the current state of meshes are excluded from the script.</li>
-</ul>
-</ul>
+- <b>Automatic Update</b>
+ - If you toggle <b>Automatic Update</b> checkbox, the model in your
+ viewer automatically updated when you make changes in it, depending on
+ values of additional preferences specified below.
+ - <b>Size limit (elements)</b> - allows to specify the maximum
+ number of elements in the resulting mesh for which the automatic updating
+ of the presentation is performed. This option affects only
+ <b>Compute</b> operation. Zero value means "no limit". Default value
+ is 500 000 mesh elements.
+ - <b>Incremental limit check</b> - when this control is switched on,
+ check for mesh size limit will be applied not to total number of
+ elements in resulting mesh, but iteratively to each entity types
+ in the following order: 0D elements, edges, faces, volumes, balls;
+ at each step number of entities of given type will be added to the
+ total number of elements computed at previous step - if resulting
+ number of elements does not exceed size limit, the entities of
+ this type will be shown, otherwise user will be warned that some
+ entities are not shown.
+
+- <b>Quality Controls</b>
+ - If you toggle <b>Display entity</b>, both faces and edges of an
+ object will be displayed in the viewer by default.
+ - If you toggle <b>Use precision</b> checkbox, you can display numbers in
+ <b>Quality Control</b> diagrams at the necessary level of precision.
+ - <b>Number of digits after point</b> - defines precision for
+ <b>Quality Controls</b>. By default, numbers in <b>Quality Control</b>
+ diagrams are presented as integers.
+ - <b>Double nodes tolerance</b> defines the maximal distance between two
+ mesh nodes, at which they are considered coincident by <b>Double nodes</b>
+ quality control.
+
+- <b>Display mode</b> - allows to set Wireframe, Shading, Nodes or Shrink
+ presentation mode as default.
+
+- <b>Representation of the 2D quadratic elements</b>
+ - <b>Representation of the 2D quadratic elements</b> combobox - allows
+ to select lines or arcs for representation of quadratic elements.
+ - <b>Maximum Angle</b> - maximum deviation angle used by the
+ application to build arcs.
+
+- <b>Mesh export</b>
+ - If you toggle <b>Automatically create groups for MED export</b> checkbox,
+ this operation will be carried out automatically.
+
+- <b>Mesh computation</b>
+ - <b>Show a computation result notification</b> combobox allows to
+ select the notification mode about a mesh computation result.
+ There are 3 possible modes:
+ - <b>Never</b> - do not show the result dialog at all;
+ - <b>Errors only</b> - the result dialog will be shown if there were
+ some errors during a mesh computation;
+ - <b>Always</b> - show the result dialog after each mesh
+ computation. This is a default mode.
+
+- <b>Mesh information</b>
+ - <b>Mesh element information</b> - change the way mesh element
+ information is shown:
+ - <b>Simple</b> - as a plain text
+ - <b>Tree</b> - in a tree-like form
+ - <b>Automatic nodes compute limit</b> - allows to define the size limit for the
+ mesh groups for which the number of underlying nodes is calculated
+ automatically. If the group size exceeds the value set in the preferences,
+ the user will have to press \em Compute button explicitly. Zero value
+ means "no limit". By default the value is set to 100 000 mesh elements.
+ - <b>Automatic controls compute limit</b> - allows to define the size limit for the
+ mesh elements for which the Aspect Ratio histogram is calculated
+ automatically. If the mesh elements size exceeds the value set in the preferences,
+ the user will have to press \em Compute button explicitly. Zero value
+ means "no limit". By default the value is set to 3 000 mesh elements.
+ - <b>Show details on groups in element information tab</b> - when
+ this option is switched off (default), only the names of groups, to which the node
+ or element belongs, are shown in the \ref mesh_element_info_anchor "Info Tab"
+ tab of "Mesh Information" dialog box. If this option is
+ switched on, the detailed information on groups is shown.
+ - <b>Dump base information</b> - allows to dump base mesh information to the
+ file, see \ref mesh_infos_page.
+ - <b>Dump element information</b> - allows to dump element information to the
+ file, see \ref mesh_infos_page.
+ - <b>Dump additional information</b> - allows to dump additional mesh
+ information to the file, see \ref mesh_infos_page.
+ - <b>Dump controls information</b> - allows to dump quality mesh
+ information to the file, see \ref mesh_infos_page.
+
+- <b>Automatic Parameters</b>
+ - <b>Ratio Bounding Box Diagonal / Max Size</b> - this parameter is
+ used for automatic meshing: ratio between the bounding box of the
+ meshed object and the Max Size of segments.
+ - <b>Default Number of Segments</b> - allows defining the default
+ number of segments on each edge.
+
+- <b>Mesh loading</b>
+ - If <b>No mesh loading from study file at hypothesis modification</b>
+ checkbox is on, the mesh data will not be loaded from the study file
+ when a hypothesis is modified. This allows saving time by omitting
+ loading data of a large mesh that is planned to be recomputed with other parameters.
+
+- <b>Input fields precision</b>
+ - <b>Length precision</b> - allows to adjust input precision of coordinates and dimensions.
+ - <b>Angular precision</b> - allows to adjust input precision of angles.
+ - <b>Length tolerance precision</b> - allows to adjust input precision of tolerance of coordinates and dimensions.
+ - <b>Parametric precision</b> - allows to adjust input precision of parametric values.
+ - <b>Area precision</b> - allows to adjust input precision of mesh element area.
+ - <b>Volume precision</b> - allows to adjust input precision of mesh element volume.
+
+- <b>Preview</b>
+ - <b>Sub-shapes preview chunk size</b> - allows to limit the number
+ of previewed sub-shapes shown in the hypotheses creation dialog boxes,
+ for example "Reverse Edges" parameter of \ref number_of_segments_anchor "Number of segments" hypothesis.
+
+- <b>Python Dump</b>
+ - <b>Historical python dump</b> checkbox allows switching between
+ \a Historical and \a Snapshot dump mode:
+ - In \a Historical mode, Python Dump script includes all commands
+ performed by SMESH engine.
+ - In \a Snapshot mode, the commands relating to objects removed
+ from the Study as well as the commands not influencing the
+ current state of meshes are excluded from the script.
<h2>Mesh Preferences</h2>
\image html pref22.png
-<ul>
-<li><b>Nodes</b></li>
-<ul>
-<li><b>Color</b> - allows to select the color of nodes. Click on the
-colored line to access to the <b>Select Color</b> dialog box.</li>
-<li><b>Type of marker</b> - allows to define the shape of nodes.</li>
-<li><b>Scale of marker</b> - allows to define the size of nodes.</li>
-</ul>
-<li><b>Elements</b></li>
-<ul>
-<li><b>Surface color</b> - allows to select the surface color of elements
-(seen in Shading mode). Click on the colored line to access to the <b>Select Color</b> dialog box.</li>
-<li><b>Back surface color</b> - allows to select the interior surface color
-of elements. Use the slider to select the color generated basing on
-the <b>Surface color</b> by changing its brightness and saturation.</li>
-<li><b>Outline color</b> - allows to select the color of element
-borders. Click on the colored line to access to the <b>Select Color</b> dialog box.</li>
-<li><b>Wireframe color</b> - allows to select the color of borders of
-elements in the wireframe mode. Click on the colored line to access to the <b>Select Color</b> dialog box.</li>
-<li><b>Width</b> - allows to define the width of lines (edges and borders of elements).</li>
-<li><b>Shrink coef.</b> - allows to define relative space of elements
-compared to gaps between them in shrink mode.</li>
-</ul>
-<li><b>Orientation of Faces</b> - allows to define the behavior of
-<b>Orientation of faces</b> functionality</li>
-<ul>
-<li> \b Color - allows to define the color of orientation vertors;</li>
-<li> \b Scale - allows to define the size of orientation vectors;</li>
-<li> <b> 3D Vector </b> checkbox allows to choose between 2D planar
-and 3D vectors.</li>
-</ul>
-</ul>
+- <b>Nodes</b>
+ - <b>Color</b> - allows to select the color of nodes. Click on the
+ colored line to access to the <b>Select Color</b> dialog box.
+ - <b>Type of marker</b> - allows to define the shape of nodes.
+ - <b>Scale of marker</b> - allows to define the size of nodes.
+
+- <b>Elements</b>
+ - <b>Surface color</b> - allows to select the surface color of 2D elements
+ (seen in Shading mode). Click on the colored line to access to the
+ <b>Select Color</b> dialog box.
+ - <b>Back surface color</b> - allows to select the back surface color
+ of 2D elements. This is useful to differ 2d elements with
+ reversed orientation. Use the slider to select the color generated basing on
+ the <b>Surface color</b> by changing its brightness and saturation.
+ - <b>Volume color</b> - allows to select the surface color of 3D elements
+ (seen in Shading mode).
+ - <b>Reversed volume color</b> - allows to select the surface color
+ of reversed 3D elements. Use the slider to select the color generated basing on
+ the <b>Volume color</b> by changing its brightness and saturation.
+ - <b>0D elements</b> - allows to choose color of 0D mesh elements.
+ - <b>Balls</b> - allows to choose color of discrete mesh elements (balls).
+ - <b>Outline color</b> - allows to select the color of element
+ borders.
+ - <b>Wireframe color</b> - allows to select the color of borders of
+ elements in the wireframe mode.
+ - <b>Size of 0D elements</b> - specifies default size of 0D elements.
+ - <b>Size of ball elements</b> - specifies default size of discrete
+ elements (balls).
+ - <b>Line width</b> - allows to define the width of 1D elements (edges).
+ - <b>Outline width</b> - allows to define the width of borders of
+ 2D and 3D elements (shown in the Shading mode).
+ - <b>Shrink coef.</b> - allows to define relative space of elements
+ compared to gaps between them in shrink mode.
+
+- <b>Groups</b> allows to define groups default properties:
+ - <b>Names color</b> - specifies color of group names to be used in
+ 3D viewer.
+ - <b>Default color</b> - specifies default group color.
+
+- <b>Numbering</b> allows to define properties of numbering functionality:
+ - <b>Nodes</b> - specifies text properties of nodes numbering
+ (font family, size, attributes, color).
+ - <b>Elements</b> - same for elements.
+
+- <b>Orientation of Faces</b> - allows to define the behavior of
+ <b>Orientation of faces</b> functionality:
+ - \b Color - allows to define the color of orientation vertors;
+ - \b Scale - allows to define the size of orientation vectors;
+ - <b>3D Vector</b> checkbox allows to choose between 2D planar
+ and 3D vectors.
<br><h2>Selection Preferences</h2>
\image html pref23.png
-<ul>
-<li><b>Selection</b> - performed with mouse-indexing (preselection)
-and left-clicking on an object, whose appearance changes as defined in
-the <b>Preferences</b>.</li>
-<ul>
-<li><b>Object Color</b> - allows to select the color of mesh (edges and
-borders of meshes) of the selected entity. Click on the colored line
-to access to the <b>Select Color</b> dialog
-box.</li>
-<li><b>Element color</b> - allows to select the color of surface of selected
-elements (seen in Shading mode). Click on the colored line to access
-to the <b>Select Color</b> dialog box.</li>
-</ul>
-<li><b>Preselection</b> - performed with mouse-indexing on an object,
-whose appearance changes as defined in the <b>Preferences</b>.</li>
-<ul>
-<li><b>Highlight Color</b> - allows to select the color of mesh (edges and
-borders of meshes) of the entity . Click on the colored line to access
-to the <b>Select Color</b> dialog box.</li>
-</ul>
-<li><b>Precision</b> - in this menu you can set the value of precision
-used for <b>Nodes</b>, <b>Elements</b> and <b>Objects</b>.</li>
-</ul>
+- <b>Selection</b> - performed with mouse-indexing (preselection)
+ and left-clicking on an object, whose appearance changes as defined in
+ the <b>Preferences</b>.
+ - <b>Object Color</b> - allows to select the color of mesh (edges and
+ borders of meshes) of the selected entity. Click on the colored line
+ to access to the <b>Select Color</b> dialog box.
+ - <b>Element color</b> - allows to select the color of surface of selected
+ elements (seen in Shading mode). Click on the colored line to access
+ to the <b>Select Color</b> dialog box.
+
+- <b>Preselection</b> - performed with mouse-indexing on an object,
+ whose appearance changes as defined in the <b>Preferences</b>.
+ - <b>Highlight Color</b> - allows to select the color of mesh (edges and
+ borders of meshes) of the entity . Click on the colored line to access
+ to the <b>Select Color</b> dialog box.
+
+- <b>Precision</b> - in this menu you can set the value of precision
+ used for <b>Nodes</b>, <b>Elements</b> and <b>Objects</b>.
<br><h2>Scalar Bar Preferences</h2>
\image html pref24.png
-<ul>
-<li><b>Font</b> - in this menu you can set type, face and color for
-the font of <b>Title</b> and <b>Labels</b>.</li>
-<li><b>Colors & Labels</b> - in this menu you can set the <b>number of
-colors</b> and the <b>number of labels</b> in use.</li>
-<li><b>Orientation</b> - here you can choose between vertical and
-horizontal orientation of the <b>Scalar Bar</b></li>.
-<li><b>Origin & Size Vertical & Horizontal</b> - allows to define
-placement (<b>X</b> and <b>Y</b>) and lookout (<b>Width</b> and
-<b>Height</b>) of Scalar Bars</li>
-<ul>
-<li><b>X</b>: abscissa of the point of origin (from the left
-side)</li>
-<li><b>Y</b>: ordinate of the origin of the bar (from the bottom)</li>
-</ul>
-<li><b>Distribution</b> in this menu you can Show/Hide distribution histogram of the values of the <b>Scalar Bar</b> and specify the <b>Coloring Type</b> of the histogram</li>
-<ul>
-<li><b>Multicolor</b> the histogram is colored as <b>Scalar Bar</b></li>
-<li><b>Monocolor</b> the histogram is colored as selected with <b>Distribution color</b> selector</li>
-</ul>
-</ul>
+- <b>Font</b> - in this menu you can set type, face and color for
+ the font of <b>Title</b> and <b>Labels</b>.
+
+- <b>Colors & Labels</b> - in this menu you can set the <b>number of
+ colors</b> and the <b>number of labels</b> in use.
+
+- <b>Orientation</b> - here you can choose between vertical and
+ horizontal orientation of the <b>Scalar Bar</b>
+
+- <b>Origin & Size Vertical & Horizontal</b> - allows to define
+ placement (<b>X</b> and <b>Y</b>) and lookout (<b>Width</b> and
+ <b>Height</b>) of Scalar Bars.
+ - <b>X</b>: abscissa of the point of origin (from the left
+ side)
+ - <b>Y</b>: ordinate of the origin of the bar (from the bottom)
+
+- <b>Distribution</b> in this menu you can Show/Hide distribution
+ histogram of the values of the <b>Scalar Bar</b> and specify the
+ <b>Coloring Type</b> of the histogram:
+ - <b>Multicolor</b> the histogram is colored as <b>Scalar Bar</b>
+ - <b>Monocolor</b> the histogram is colored as selected with
+ <b>Distribution color</b> selector
*/
elements.</li>
<li>\subpage symmetry_page "Mirror" the mesh
through a point or a vector of symmetry.</li>
-<li>\subpage double_nodes_page "Duplicate nodes" to emulate a crack in the model.</li>
+<li>\subpage double_nodes_page "Duplicate nodes or/and
+ Elements". Duplication of nodes can be useful to emulate a crack in the model.</li>
<li>Unite meshes by \subpage sewing_meshes_page "sewing" free borders,
conform free borders, border to side or side elements.</li>
<li>\subpage merging_nodes_page "Merge Nodes", considered coincident
<br>
\anchor tui_editing_mesh
-<h2>Editing of a mesh</h2>
+<h2>Editing a mesh</h2>
\tui_script{creating_meshes_ex04.py}
<br>
\n Triangles are transformed into prisms, and quadrangles into hexahedrons.
\n The flat elements are stored in groups of volumes.
These groups are named according to the position of the group in the list:
-the group j_n_p is the group of the flat elements that are built between the group #n and the group #p in the list.
-If there is no shared faces between the group #n and the group #p in the list, the group j_n_p is not created.
+the group j_n_p is the group of the flat elements that are built between the group \#n and the group \#p in the list.
+If there is no shared faces between the group \#n and the group \#p in the list, the group j_n_p is not created.
All the flat elements are gathered into the group named "joints3D" (or "joints2D" in 2D situation).
The flat element of the multiple junctions between the simple junction are stored in a group named "jointsMultiples".
<br>
\anchor tui_duplicate_nodes
-<h3>Duplicate nodes</h3>
+<h3>Duplicate nodes or/and elements</h3>
\tui_script{transforming_meshes_ex11.py}
<br>
libSalomeIDLSMESH_la_CPPFLAGS = \
-I$(top_builddir)/idl \
$(CORBA_CXXFLAGS) $(CORBA_INCLUDES) \
- $(KERNEL_CXXFLAGS) $(MED_CXXFLAGS) \
- $(GEOM_CXXFLAGS)
+ $(KERNEL_CXXFLAGS) $(GEOM_CXXFLAGS)
libSalomeIDLSMESH_la_LDFLAGS = -no-undefined -version-info=0:0:0
libSalomeIDLSMESH_la_LIBADD = \
@CORBA_LIBS@ \
- $(MED_LDFLAGS) -lSalomeIDLMED \
$(GEOM_LDFLAGS) -lSalomeIDLGEOM \
$(KERNEL_LDFLAGS) -lSalomeIDLKernel
@OMNIORB_IDLPYFLAGS@ \
-I$(top_builddir)/idl/salome \
-I$(KERNEL_ROOT_DIR)/idl/salome \
- -I$(MED_ROOT_DIR)/idl/salome \
-I$(GEOM_ROOT_DIR)/idl/salome
IDLCXXFLAGS = \
@IDLCXXFLAGS@ \
-I$(top_builddir)/idl/salome \
-I$(KERNEL_ROOT_DIR)/idl/salome \
- -I$(MED_ROOT_DIR)/idl/salome \
-I$(GEOM_ROOT_DIR)/idl/salome
IDLPYFLAGS = \
@IDLPYFLAGS@ \
-I$(KERNEL_ROOT_DIR)/idl/salome \
- -I$(MED_ROOT_DIR)/idl/salome \
-I$(GEOM_ROOT_DIR)/idl/salome
# potential problem on parallel make on the following - multiple outputs
@for dep in $^ dummy; do \
if [ $$dep != "dummy" ]; then \
echo Building dependencies for $$dep; \
- $(CPP) $(C_DEPEND_FLAG) -x c -I$(srcdir) -I$(KERNEL_ROOT_DIR)/idl/salome -I$(MED_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome $$dep 2>/dev/null | \
+ $(CPP) $(C_DEPEND_FLAG) -x c -I$(srcdir) -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome $$dep 2>/dev/null | \
sed 's/\.o/\SK.cc/' >>$@; \
fi; \
done ;
void SetIgnoreEdges(in SMESH::long_array edgeIDs) raises (SALOME::SALOME_Exception);
SMESH::long_array GetIgnoreEdges();
+ /*!
+ * Set edges either to exclude from treatment or to make the Viscous Layers on.
+ */
+ void SetEdges(in SMESH::long_array edgeIDs,
+ in boolean toIgnore) raises (SALOME::SALOME_Exception);
+ SMESH::long_array GetEdges();
+ boolean GetIsToIgnoreEdges();
+
/*!
* Set total thickness of layers of prisms
*/
boolean IsGridBySpacing(in short axis);
/*!
- * Set coordinates of nodes along an axis (counterd from zero)
+ * Set coordinates of nodes along an axis (countered from zero)
*/
void SetGrid(in SMESH::double_array coords,
in short axis) raises (SALOME::SALOME_Exception);
{
double GetValue( in long theElementId );
- Histogram GetHistogram( in short nbIntervals, in boolean isLogarithmic );
-
+ Histogram GetHistogram ( in short nbIntervals, in boolean isLogarithmic );
+ Histogram GetLocalHistogram( in short nbIntervals, in boolean isLogarithmic,
+ in SMESH::SMESH_IDSource obj );
/*!
* Set precision for calculation. It is a position after point which is
* used to functor value after calculation.
/*!
* Predicates are intended for verification of criteria,
- * must return bool value by mesh id
+ * they return bool value by mesh id
*/
interface Predicate: Functor
{
boolean IsSatisfy( in long thEntityId );
+ long NbSatisfying( in SMESH::SMESH_IDSource obj );
};
/*!
module SMESH
{
+ typedef sequence<SALOMEDS::SObject> sobject_list;
typedef sequence<GEOM::GEOM_Object> object_array;
typedef sequence<SMESH_Mesh> mesh_array;
* \brief Get names of meshes defined in file with the specified name.
*/
string_array GetMeshNames(in string theFileName);
+
+ /*!
+ * \brief Moves objects to the specified position
+ *
+ * This function is used in the drag-n-drop functionality.
+ *
+ * \param what objects being moved
+ * \param where parent object where objects are moved to
+ * \param row position in the parent object's children list at which objects are moved
+ */
+ void Move( in sobject_list what,
+ in SALOMEDS::SObject where,
+ in long row );
};
};
#include "SALOME_Exception.idl"
#include "SALOME_GenericObj.idl"
#include "GEOM_Gen.idl"
-#include "MED.idl"
module SMESH
{
double_array coords;
long_array indexes;
};
+ typedef sequence<log_block> log_array;
struct PointStruct { double x;
double y;
typedef sequence<PointStruct> nodes_array;
- struct DirStruct { PointStruct PS ; } ; // analog to Occ Direction
+ struct DirStruct { PointStruct PS ; } ; // analog to OCCT gp_Vec
struct AxisStruct { double x;
double y;
double vx;
double vy;
double vz; } ;
-
/*!
* Node location on a shape
*/
FACE,
VOLUME,
ELEM0D,
- BALL
+ BALL,
+ NB_ELEMENT_TYPES
};
typedef sequence<ElementType> array_of_ElementType ;
/*!
- * Enumeration for element geometry type, like in SMDS
+ * Enumeration for element geometry type, like SMDSAbs_GeometryType in SMDSAbs_ElementType.hxx
*/
enum GeometryType
{
ORDER_QUADRATIC /*! entities of 2nd order */
};
-
/*!
* Enumeration of entity type used in mesh info array,
* it should be synchronised with enum SMDSAbs_EntityType
Entity_Last
};
-
/*!
* Enumeration for hypothesis status (used by AddHypothesis() and RemoveHypothesis() methods)
*/
};
/*!
- * Enumeration for DriverMED read status (used by ImportMEDFile() method)
+ * Enumeration for mesh read status (used by SMESH_Gen::CreateMeshesFrom*() methods)
*/
enum DriverMED_ReadStatus // in the order of severity
{
DRS_OK,
- DRS_EMPTY, // a MED file contains no mesh with the given name
+ DRS_EMPTY, // a file contains no mesh with the given name
DRS_WARN_RENUMBER, // a MED file has overlapped ranges of element numbers,
// so the numbers from the file are ignored
DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data
};
/*!
- * Enumeration for DriverMED (used by Perform() method)
+ * Enumeration for ExportToMED*()
*/
- enum MED_VERSION // in the order of severity
+ enum MED_VERSION
{
MED_V2_1,
MED_V2_2
};
- typedef sequence<log_block> log_array;
-
+ /*!
+ * \brief A structure containing information about MED file
+ */
+ struct MedFileInfo
+ {
+ string fileName; //!< name of file
+ long fileSize; //!< size of file
+ long major, minor, release; //!< MED file version
+ };
/*!
* Auxilary flags for advanced extrusion.
long_array GetIDs();
/*!
- * Returns statistic of mesh elements
- * @return array of number enityties by index of EntityType
+ * Returns number of mesh elements of each \a EntityType
+ * @return array of number of elements per \a EntityType
*/
long_array GetMeshInfo();
+ /*!
+ * Returns number of mesh elements of each \a ElementType
+ * @return array of number of elements per \a ElementType
+ */
+ long_array GetNbElementsByType();
+
/*!
* Returns types of elements it contains.
* It's empty if the SMESH_IDSource contains no IDs
boolean HasDuplicatedGroupNamesMED();
/*!
- * Export Mesh to different MED Formats
+ * Export Mesh to a MED Format file
* @params
* - file : name of the MED file
* - auto_groups : boolean parameter for creating/not creating
- * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ;
- * the typical use is auto_groups=false.
+ * the groups Group_On_All_Nodes, Group_On_All_Faces, ... ;
+ * the typical use is auto_groups=false.
* - version : define the version of format of MED file, that will be created
* - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists
+ * - autoDimension: if @c True (default), a space dimension of a MED mesh can be either
+ * - 1D if all mesh nodes lie on OX coordinate axis, or
+ * - 2D if all mesh nodes lie on XOY coordinate plane, or
+ * - 3D in the rest cases.
+ *
+ * If @a autoDimension is @c False, the space dimension is always 3.
*/
void ExportToMEDX( in string file,
in boolean auto_groups,
in MED_VERSION version,
- in boolean overwrite ) raises (SALOME::SALOME_Exception);
+ in boolean overwrite,
+ in boolean autoDimension ) raises (SALOME::SALOME_Exception);
/*!
* Export a part of Mesh into a MED file
* - file : name of the MED file
* - version : define the version of format of MED file, that will be created
* - overwrite : boolean parameter for overwriting/not overwriting the file, if it exists
+ * - autoDimension: if @c True, a space dimension for export is defined by mesh
+ * configuration; for example a planar mesh lying on XOY plane
+ * will be exported as a mesh in 2D space.
+ * If @a autoDimension == @c False, the space dimension is 3.
*/
void ExportPartToMED( in SMESH_IDSource meshPart,
in string file,
in boolean auto_groups,
in MED_VERSION version,
- in boolean overwrite ) raises (SALOME::SALOME_Exception);
+ in boolean overwrite,
+ in boolean autoDimension ) raises (SALOME::SALOME_Exception);
/*!
- * Export Mesh to different MED Formats
+ * Export Mesh to a MED Format file
* Works, just the same as ExportToMEDX, with overwrite parameter equal to true.
* The method is kept in order to support old functionality
*/
void ExportPartToSTL( in SMESH_IDSource meshPart,
in string file,
in boolean isascii ) raises (SALOME::SALOME_Exception);
-
/*!
- * Get MED Mesh
+ * Return computation progress [0.,1]
*/
- SALOME_MED::MESH GetMEDMesh()
- raises (SALOME::SALOME_Exception);
+ double GetComputeProgress();
/*!
* Get informations about mesh contents
double_array BaryCenter(in long id);
/*! Gets information about imported MED file */
- SALOME_MED::MedFileInfo GetMEDFileInfo();
+ MedFileInfo GetMEDFileInfo();
/*!
* Sets list of notebook variables used for Mesh operations separated by ":" symbol
* Get the internal Id
*/
long GetId();
-
- /*!
- * Get MED subMesh
- */
- SALOME_MED::FAMILY GetFamily()
- raises (SALOME::SALOME_Exception);
};
};
boolean ChangeElemNodes(in long ide, in long_array newIDs)
raises (SALOME::SALOME_Exception);
+ /*!
+ * \brief Duplicates given elements, i.e. creates new elements based on the
+ * same nodes as the given ones.
+ * \param theElements - container of elements to duplicate.
+ * \param theGroupName - a name of group to contain the generated elements.
+ * If a group with such a name already exists, the new elements
+ * are added to the existng group, else a new group is created.
+ * If \a theGroupName is empty, new elements are not added
+ * in any group.
+ * \return a group where the new elements are added. NULL if theGroupName == "".
+ * \sa DoubleNode()
+ */
+ SMESH_Group DoubleElements( in SMESH_IDSource theElements,
+ in string theGroupName )
+ raises (SALOME::SALOME_Exception);
+
/*!
* \brief Creates a hole in a mesh by doubling the nodes of some particular elements
* \param theNodes - identifiers of nodes to be doubled
* \param theModifiedElems - identifiers of elements to be updated by the new (doubled)
* nodes. If list of element identifiers is empty then nodes are doubled but
* they not assigned to elements
- * \return TRUE if operation has been completed successfully, FALSE otherwise
+ * \return TRUE if operation has been completed successfully, FALSE otherwise
* \sa DoubleNode(), DoubleNodeGroup(), DoubleNodeGroups()
*/
boolean DoubleNodes( in long_array theNodes, in long_array theModifiedElems )
mesh_sew_sideelements.png \
mesh_merge_nodes.png \
mesh_merge_elements.png \
- select1.png \
+ select1.png \
+ open.png \
StdMeshers.xml \
mesh_pattern.png \
mesh_pentahedron.png \
mesh_tree_mesh_partial.png \
mesh_extractGroup.png \
mesh_precompute.png \
- mesh_2d_from_3d.png \
- mesh_free_faces.png \
- scale.png \
- scale_along_axes.png \
+ mesh_2d_from_3d.png \
+ mesh_free_faces.png \
+ scale.png \
+ scale_along_axes.png \
split_into_tetra.png \
mesh_duplicate_nodes.png \
mesh_duplicate_nodes_with_elem.png \
+ mesh_duplicate_elem_only.png \
mesh_bounding_box.png \
mesh_hypo_viscous_layers.png \
mesh_tree_hypo_viscous_layers.png \
<parameter name="distribution_color" value="0, 85, 0" />
<parameter name="DisplayMode" value="true" />
<parameter name="auto_update" value="true" />
+ <parameter name="incremental_limit" value="false" />
<parameter name="update_limit" value="500000" />
<parameter name="display_entity" value="true" />
<parameter name="display_mode" value="1" />
<parameter name="mesh_elem_info" value="1"/>
<parameter name="elem_info_grp_details" value="false"/>
<parameter name="info_groups_nodes_limit" value="100000"/>
+ <parameter name="info_controls_limit" value="3000"/>
<parameter name="info_dump_base" value="true" />
<parameter name="info_dump_elem" value="true" />
<parameter name="info_dump_add" value="true" />
+ <parameter name="info_dump_ctrl" value="true" />
<parameter name="segmentation" value="10"/>
<parameter name="nb_segments_per_edge" value="15"/>
<parameter name="forget_mesh_on_hyp_modif" value="true"/>
<parameter name="sub_menu" value="%1 module"/>
<parameter name="User's Guide" value="%SMESH_ROOT_DIR%/share/doc/salome/gui/SMESH/index.html"/>
<parameter name="Plug-ins/Yams plugin User's Guide" value="%SMESH_ROOT_DIR%/share/doc/salome/gui/SMESH/yams/index.html"/>
+ <parameter name="Plug-ins/MGCleaner plugin User's Guide" value="%SMESH_ROOT_DIR%/share/doc/salome/gui/SMESH/MGCleaner/index.html"/>
<parameter name="Developer's Guide" value="%SMESH_ROOT_DIR%/share/doc/salome/tui/SMESH/index.html"/>
</section>
<section name="resources">
<algo>MEFISTO_2D=Triangle(algo=smeshBuilder.MEFISTO)</algo>
<hypo>LengthFromEdges=LengthFromEdges()</hypo>
<hypo>MaxElementArea=MaxElementArea(SetMaxElementArea())</hypo>
- <hypo>ViscousLayers2D=ViscousLayers2D(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetIgnoreEdges())</hypo>
+ <hypo>ViscousLayers2D=ViscousLayers2D(SetTotalThickness(),SetNumberLayers(),SetStretchFactor(),SetEdges(1),SetEdges(2))</hypo>
</python-wrap>
</algorithm>
bool ElemEntityType::IsSatisfy( long theId )
{
if ( !myMesh ) return false;
+ if ( myType == SMDSAbs_Node )
+ return myMesh->FindNode( theId );
const SMDS_MeshElement* anElem = myMesh->FindElement( theId );
return ( anElem &&
- myEntityType == anElem->GetEntityType() &&
- ( myType == SMDSAbs_Edge || myType == SMDSAbs_Face || myType == SMDSAbs_Volume ));
+ myEntityType == anElem->GetEntityType() );
}
void ElemEntityType::SetType( SMDSAbs_ElementType theType )
};
void SetMeshId(int theMeshId);
- void SetFile(const std::string& theFileName);
+ virtual void SetFile(const std::string& theFileName);
virtual void SetMeshName(const std::string& theMeshName);
virtual std::string GetMeshName() const;
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+
+// Declarations needed for usage of DriverMED
+
+#include <boost/shared_ptr.hpp>
+
+class DriverMED_Family;
+typedef boost::shared_ptr<DriverMED_Family> DriverMED_FamilyPtr;
// File : DriverMED_Family.cxx
// Author : Julia DOROVSKIKH
// Module : SMESH
-// $Header$
//
#include "DriverMED_Family.h"
#include "MED_Factory.hxx"
// File : DriverMED_Family.hxx
// Author : Julia DOROVSKIKH
// Module : SMESH
-// $Header$
//
#ifndef _INCLUDE_DRIVERMED_FAMILY
#define _INCLUDE_DRIVERMED_FAMILY
#include "SMESH_DriverMED.hxx"
+#include "DriverMED.hxx"
#include "SMDS_Mesh.hxx"
#include "SMESHDS_GroupBase.hxx"
#define REST_BALL_FAMILY -5
#define FIRST_ELEM_FAMILY -6
-class DriverMED_Family;
-typedef boost::shared_ptr<DriverMED_Family> DriverMED_FamilyPtr;
typedef std::list<DriverMED_FamilyPtr > DriverMED_FamilyPtrList;
typedef std::map<int,SMESHDS_SubMesh* > SMESHDS_SubMeshPtrMap;
typedef std::list<SMESHDS_GroupBase* > SMESHDS_GroupBasePtrList;
using namespace MED;
using namespace std;
+typedef std::map<int, DriverMED_FamilyPtr> TID2FamilyMap;
+
+namespace DriverMED
+{
+ bool buildMeshGrille(const MED::PWrapper& theWrapper,
+ const MED::PMeshInfo& theMeshInfo,
+ SMESHDS_Mesh* theMesh,
+ const TID2FamilyMap& myFamilies);
+ /*!
+ * \brief Ensure aFamily has a required ID
+ * \param aFamily - a family to check
+ * \param anID - an ID aFamily should have
+ * \param myFamilies - a map of the family ID to the Family
+ * \retval bool - true if successful
+ */
+ bool checkFamilyID(DriverMED_FamilyPtr & aFamily,
+ int anID,
+ const TID2FamilyMap& myFamilies);
+}
+
void
DriverMED_R_SMESHDS_Mesh
::SetMeshName(string theMeshName)
}
if (aMeshInfo->GetType() == MED::eSTRUCTURE){
- /*bool aRes = */buildMeshGrille(aMed,aMeshInfo);
+ /*bool aRes = */DriverMED::buildMeshGrille(aMed,aMeshInfo,myMesh,myFamilies);
continue;
}
// Save reference to this node from its family
TInt aFamNum = aNodeInfo->GetFamNum(iElem);
- if ( checkFamilyID ( aFamily, aFamNum ))
+ if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies ))
{
aFamily->AddElement(aNode);
aFamily->SetType(SMDSAbs_Node);
// Save reference to this element from its family
TInt aFamNum = aBallInfo->GetFamNum(iBall);
- if ( checkFamilyID ( aFamily, aFamNum ))
+ if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies ))
{
aFamily->AddElement(anElement);
aFamily->SetType( SMDSAbs_Ball );
if(aResult < DRS_WARN_RENUMBER)
aResult = DRS_WARN_RENUMBER;
}
- if ( checkFamilyID ( aFamily, aFamNum ))
+ if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies ))
{
// Save reference to this element from its family
aFamily->AddElement(anElement);
if (aResult < DRS_WARN_RENUMBER)
aResult = DRS_WARN_RENUMBER;
}
- if ( checkFamilyID ( aFamily, aFamNum )) {
+ if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies )) {
// Save reference to this element from its family
aFamily->AddElement(anElement);
aFamily->SetType(anElement->GetType());
if (aResult < DRS_WARN_RENUMBER)
aResult = DRS_WARN_RENUMBER;
}
- if ( checkFamilyID ( aFamily, aFamNum )) {
+ if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies )) {
// Save reference to this element from its family
myFamilies[aFamNum]->AddElement(anElement);
myFamilies[aFamNum]->SetType(anElement->GetType());
* \param anID - an ID aFamily should have
* \retval bool - true if successful
*/
-bool DriverMED_R_SMESHDS_Mesh::checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const
+bool DriverMED::checkFamilyID(DriverMED_FamilyPtr & aFamily,
+ int anID,
+ const TID2FamilyMap& myFamilies)
{
if ( !aFamily || aFamily->GetId() != anID ) {
map<int, DriverMED_FamilyPtr>::const_iterator i_fam = myFamilies.find(anID);
return ( aFamily->GetId() == anID );
}
-
-/*! \brief Reading the structured mesh and convert to non structured (by filling of smesh structure for non structured mesh)
+/*!
+ * \brief Reading the structured mesh and convert to non structured
+ * (by filling of smesh structure for non structured mesh)
* \param theWrapper - PWrapper const pointer
* \param theMeshInfo - PMeshInfo const pointer
+ * \param myFamilies - a map of the family ID to the Family
* \return TRUE, if successfully. Else FALSE
*/
-bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper,
- const MED::PMeshInfo& theMeshInfo)
+bool DriverMED::buildMeshGrille(const MED::PWrapper& theWrapper,
+ const MED::PMeshInfo& theMeshInfo,
+ SMESHDS_Mesh* myMesh,
+ const TID2FamilyMap& myFamilies)
{
bool res = true;
if((aGrilleInfo->myFamNumNode).size() > 0){
TInt aFamNum = aGrilleInfo->GetFamNumNode(iNode);
- if ( checkFamilyID ( aFamily, aFamNum ))
+ if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies ))
{
aFamily->AddElement(aNode);
aFamily->SetType(SMDSAbs_Node);
}
if((aGrilleInfo->myFamNum).size() > 0){
TInt aFamNum = aGrilleInfo->GetFamNum(iCell);
- if ( checkFamilyID ( aFamily, aFamNum )){
+ if ( DriverMED::checkFamilyID ( aFamily, aFamNum, myFamilies )){
aFamily->AddElement(anElement);
aFamily->SetType(anElement->GetType());
}
#include "SMESH_DriverMED.hxx"
+#include "DriverMED.hxx"
#include "Driver_SMESHDS_Mesh.h"
-#include "DriverMED_Family.h"
+#include "SMDSAbs_ElementType.hxx"
#include <list>
+#include <map>
class SMESHDS_Mesh;
class SMESHDS_Group;
std::list<std::string> GetMeshNames(Status& theStatus);
void SetMeshName(std::string theMeshName);
- private:
- /*!
- * \brief Ensure aFamily has required ID
- * \param aFamily - a family to check
- * \param anID - an ID aFamily should have
- * \retval bool - true if successful
- */
- bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const;
-
- bool buildMeshGrille(const MED::PWrapper& theWrapper,
- const MED::PMeshInfo& theMeshInfo);
-
private:
std::string myMeshName;
std::map<int, DriverMED_FamilyPtr> myFamilies;
// File : DriverMED_W_SMESHDS_Mesh.cxx
// Module : SMESH
//
-#include <sstream>
#include "DriverMED_W_SMESHDS_Mesh.h"
-#include "DriverMED_Family.h"
-#include "SMESHDS_Mesh.hxx"
+#include "DriverMED_Family.h"
+#include "MED_Factory.hxx"
+#include "MED_Utilities.hxx"
#include "SMDS_MeshElement.hxx"
#include "SMDS_MeshNode.hxx"
#include "SMDS_PolyhedralVolumeOfNodes.hxx"
+#include "SMESHDS_Mesh.hxx"
-#include "utilities.h"
+#include <utilities.h>
-#include "MED_Utilities.hxx"
#define _EDF_NODE_IDS_
//#define _ELEMENTS_BY_DIM_
DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh():
+ myMedVersion(MED::eV2_2),
myAllSubMeshes (false),
myDoGroupOfNodes (false),
myDoGroupOfEdges (false),
myDoGroupOfFaces (false),
myDoGroupOfVolumes (false),
myDoGroupOf0DElems(false),
- myDoGroupOfBalls(false)
+ myDoGroupOfBalls(false),
+ myAutoDimension(true)
{}
void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName,
- MED::EVersion theId)
+ MED::EVersion theId)
{
- myMed = CrWrapper(theFileName,theId);
Driver_SMESHDS_Mesh::SetFile(theFileName);
+ myMedVersion = theId;
}
void DriverMED_W_SMESHDS_Mesh::SetFile(const std::string& theFileName)
{
- return SetFile(theFileName,MED::eV2_2);
+ Driver_SMESHDS_Mesh::SetFile(theFileName);
}
string DriverMED_W_SMESHDS_Mesh::GetVersionString(const MED::EVersion theVersion, int theNbDigits)
myDoGroupOfVolumes = true;
}
-namespace{
+namespace
+{
typedef double (SMDS_MeshNode::* TGetCoord)() const;
typedef const char* TName;
typedef const char* TUnit;
}
// Mesh dimension definition
- TInt aSpaceDimension;
+ TInt aSpaceDimension = 3;
TCoordHelperPtr aCoordHelperPtr;
{
bool anIsXDimension = false;
bool anIsYDimension = false;
bool anIsZDimension = false;
+ if ( myAutoDimension )
{
SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator();
double aBounds[6];
if ( myMesh->NbVolumes() > 0 )
aMeshDimension = 3;
+ MED::PWrapper myMed = CrWrapper(myFile,myMedVersion);
PMeshInfo aMeshInfo = myMed->CrMeshInfo(aMeshDimension,aSpaceDimension,aMeshName);
MESSAGE("Add - aMeshName : "<<aMeshName<<"; "<<aMeshInfo->GetName());
myMed->SetMeshInfo(aMeshInfo);
#include "SMESH_DriverMED.hxx"
#include "Driver_SMESHDS_Mesh.h"
-#include "MED_Factory.hxx"
+#include "MED_Common.hxx"
#include <string>
#include <list>
virtual void SetFile(const std::string& theFileName);
void SetFile(const std::string& theFileName, MED::EVersion theId);
+ void SetAutoDimension(bool toFindOutDimension) { myAutoDimension = toFindOutDimension; }
static std::string GetVersionString(const MED::EVersion theVersion, int theNbDigits=2);
/*! sets file name; only for usage with Add(), not Write()
private:
- MED::PWrapper myMed;
+ MED::EVersion myMedVersion;
std::list<SMESHDS_GroupBase*> myGroups;
bool myAllSubMeshes;
std::map<int,SMESHDS_SubMesh*> mySubMeshes;
bool myDoGroupOfVolumes;
bool myDoGroupOf0DElems;
bool myDoGroupOfBalls;
+ bool myAutoDimension;
};
-
#endif
-
# header files
salomeinclude_HEADERS = \
+ DriverMED.hxx \
DriverMED_R_SMESHDS_Mesh.h \
DriverMED_W_SMESHDS_Mesh.h \
DriverMED_Family.h \
# additionnal information to compil and link file
libMeshDriverMED_la_CPPFLAGS = \
- $(MED_CXXFLAGS) \
@HDF5_INCLUDES@ \
$(KERNEL_CXXFLAGS) \
$(CAS_CPPFLAGS) \
$(VTK_INCLUDES) \
$(BOOST_CPPFLAGS) \
+ -I$(srcdir)/../MEDWrapper/Base \
+ -I$(srcdir)/../MEDWrapper/Factory \
-I$(srcdir)/../Driver \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHUtils \
libMeshDriverMED_la_LDFLAGS = \
$(BOOST_LIBS) \
../Driver/libMeshDriver.la \
- $(MED_LDFLAGS) -lMEDWrapper -lMEDWrapperBase -lMEDWrapper_V2_2
+ ../MEDWrapper/Factory/libMEDWrapper.la \
+ ../MEDWrapper/Base/libMEDWrapperBase.la \
+ ../MEDWrapper/V2_2/libMEDWrapper_V2_2.la \
$(BOOST_LIB_SYSTEM)
MED_Test_CPPFLAGS = \
-lOpUtil \
-lSALOMELocalTrace \
-lSALOMEBasics \
- $(MED_LDFLAGS) \
- -lMEDWrapper \
- -lMEDWrapperBase \
- -lMEDWrapper_V2_2
+ ../MEDWrapper/Factory/libMEDWrapper.la \
+ ../MEDWrapper/Base/libMEDWrapperBase.la \
+ ../MEDWrapper/V2_2/libMEDWrapper_V2_2.la \
$(BOOST_LIB_SYSTEM)
--- /dev/null
+# Copyright (C) 2012-2013 CEA/DEN, EDF R&D
+#
+# 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_DIRECTORIES(
+ ${HDF5_INCLUDE_DIRS}
+ ${BOOST_INCLUDE_DIRS}
+)
+
+IF(MED_ENABLE_KERNEL)
+ INCLUDE_DIRECTORIES(${KERNEL_ROOT_DIR}/include/salome)
+ELSE(MED_ENABLE_KERNEL)
+ INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/adm_local_without_kernel)
+ENDIF(MED_ENABLE_KERNEL)
+
+SET(MEDWrapperBase_SOURCES
+ MED_Structures.cxx
+ MED_Wrapper.cxx
+ MED_Algorithm.cxx
+ MED_GaussUtils.cxx
+ MED_CoordUtils.cxx
+ MED_Utilities.cxx
+ MED_GaussDef.cxx
+ )
+
+ADD_LIBRARY(MEDWrapperBase SHARED ${MEDWrapperBase_SOURCES})
+SET_TARGET_PROPERTIES(MEDWrapperBase PROPERTIES COMPILE_FLAGS "-D${MACHINE} ${HDF5_DEFINITIONS} ${BOOST_DEFINITIONS} ${PLATFORM_DEFINITIONS}")
+TARGET_LINK_LIBRARIES(MEDWrapperBase ${BOOST_LIB_THREAD} ${BOOST_LIB_DATE_TIME})
+INSTALL(TARGETS MEDWrapperBase DESTINATION ${MED_salomelib_LIBS})
+
+FILE(GLOB MEDWrapperBase_HEADERS_HXX "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx")
+INSTALL(FILES ${MEDWrapperBase_HEADERS_HXX} DESTINATION ${MED_salomeinclude_HEADERS})
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#include "MED_Algorithm.hxx"
+#include "MED_Wrapper.hxx"
+
+#include "MED_Utilities.hxx"
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+static int MYVALUEDEBUG = 0;
+#else
+// static int MYDEBUG = 0;
+// static int MYVALUEDEBUG = 0;
+#endif
+
+namespace MED
+{
+ //---------------------------------------------------------------
+ TEntity2TGeom2ElemInfo
+ GetEntity2TGeom2ElemInfo(const PWrapper& theWrapper,
+ const PMeshInfo& theMeshInfo,
+ const MED::TEntityInfo& theEntityInfo)
+ {
+ MSG(MYDEBUG,"GetElemsByEntity(...)");
+ TEntity2TGeom2ElemInfo anEntity2TGeom2ElemInfo;
+ MED::TEntityInfo::const_iterator anIter = theEntityInfo.begin();
+ PElemInfo anElemInfo;
+ TErr anErr;
+ for(; anIter != theEntityInfo.end(); anIter++){
+ const EEntiteMaillage& anEntity = anIter->first;
+ const TGeom2Size& aGeom2Size = anIter->second;
+ TGeom2ElemInfo& aGeom2ElemInfo = anEntity2TGeom2ElemInfo[anEntity];
+
+ if(anEntity == eNOEUD){
+ aGeom2ElemInfo[ePOINT1] = theWrapper->GetPElemInfo(theMeshInfo);
+ continue;
+ }
+
+ TGeom2Size::const_iterator anIter2 = aGeom2Size.begin();
+ for(; anIter2 != aGeom2Size.end(); anIter2++){
+ const EGeometrieElement& aGeom = anIter2->first;
+ aGeom2ElemInfo[aGeom] = theWrapper->GetPElemInfo(theMeshInfo,anEntity,aGeom,MED::eNOD,&anErr);
+ }
+ }
+ ADDMSG(MYDEBUG,"\n");
+ return anEntity2TGeom2ElemInfo;
+ }
+
+
+ //---------------------------------------------------------------
+ TFamilyInfoSet
+ GetFamilyInfoSet(const PWrapper& theWrapper,
+ const PMeshInfo& theMeshInfo)
+ {
+ MSG(MYDEBUG,"GetFamilies(...)");
+ TErr anErr;
+ TFamilyInfoSet aFamilyInfoSet;
+ TInt aNbFam = theWrapper->GetNbFamilies(*theMeshInfo);
+ INITMSG(MYDEBUG,"GetNbFamilies() = "<<aNbFam<<"\n");
+ for(TInt iFam = 1; iFam <= aNbFam; iFam++){
+ PFamilyInfo aFamilyInfo = theWrapper->GetPFamilyInfo(theMeshInfo,iFam,&anErr);
+ if(anErr >= 0)
+ aFamilyInfoSet.insert(aFamilyInfo);
+ }
+ ADDMSG(MYDEBUG,"\n");
+ return aFamilyInfoSet;
+ }
+
+
+ //---------------------------------------------------------------
+ TGroupInfo
+ GetGroupInfo(const TFamilyInfoSet& theFamilyInfoSet)
+ {
+ MSG(MYDEBUG,"GetFamiliesByGroup(...)");
+ TGroupInfo aGroup;
+ TFamilyInfoSet::const_iterator anIter = theFamilyInfoSet.begin();
+ for(; anIter != theFamilyInfoSet.end(); anIter++){
+ const PFamilyInfo& aFamilyInfo = *anIter;
+ TInt aNbGroup = aFamilyInfo->GetNbGroup();
+ for(TInt iGroup = 0; iGroup < aNbGroup; iGroup++){
+ aGroup[aFamilyInfo->GetGroupName(iGroup)].insert(aFamilyInfo);
+ }
+ }
+
+#ifdef _DEBUG_
+ if(MYDEBUG){
+ TGroupInfo::const_iterator anIter = aGroup.begin();
+ for(; anIter != aGroup.end(); anIter++){
+ const std::string& aName = anIter->first;
+ INITMSG(MYDEBUG,"aGroupName = '"<<aName<<"'\n");
+ const TFamilyInfoSet& aFamilyInfoSet = anIter->second;
+ TFamilyInfoSet::const_iterator anFamIter = aFamilyInfoSet.begin();
+ for(; anFamIter != aFamilyInfoSet.end(); anFamIter++){
+ const PFamilyInfo& aFamilyInfo = *anFamIter;
+ INITMSG(MYDEBUG,"aFamilyName = '"<<aFamilyInfo->GetName()<<"'\n");
+ }
+ }
+ ADDMSG(MYDEBUG,"\n");
+ }
+#endif
+
+ return aGroup;
+ }
+
+
+ //---------------------------------------------------------------
+ TFieldInfo2TimeStampInfoSet
+ GetFieldInfo2TimeStampInfoSet(const PWrapper& theWrapper,
+ const PMeshInfo& theMeshInfo,
+ const MED::TEntityInfo& theEntityInfo)
+ {
+ MSG(MYDEBUG,"GetFieldsByEntity(...)");
+ TFieldInfo2TimeStampInfoSet aFieldInfo2TimeStampInfoSet;
+ TInt aNbFields = theWrapper->GetNbFields();
+ INITMSG(MYDEBUG,"GetNbFields() = "<<aNbFields<<"\n");
+ for(TInt iField = 1; iField <= aNbFields; iField++){
+ PFieldInfo aFieldInfo = theWrapper->GetPFieldInfo(theMeshInfo,iField);
+ INITMSG(MYDEBUG,"aFieldName = '"<<aFieldInfo->GetName()<<
+ "'; aNbComp = "<<aFieldInfo->GetNbComp()<<"; ");
+ TGeom2Size aGeom2Size;
+ EEntiteMaillage anEntity = EEntiteMaillage(-1);
+ TInt aNbTimeStamps = theWrapper->GetNbTimeStamps(aFieldInfo,theEntityInfo,anEntity,aGeom2Size);
+ ADDMSG(MYDEBUG,"anEntity = "<<anEntity<<"; GetNbTimeStamps = "<<aNbTimeStamps<<"\n");
+ for(TInt iTimeStamp = 1; iTimeStamp <= aNbTimeStamps; iTimeStamp++){
+ PTimeStampInfo aTimeStamp =
+ theWrapper->GetPTimeStampInfo(aFieldInfo,anEntity,aGeom2Size,iTimeStamp);
+ aFieldInfo2TimeStampInfoSet[aFieldInfo].insert(aTimeStamp);
+ INITMSG(MYDEBUG,
+ "aDt = "<<aTimeStamp->GetDt()<<
+ ", Unit = \'"<<aTimeStamp->GetUnitDt()<<"\n");
+ }
+ }
+ ADDMSG(MYDEBUG,"\n");
+ return aFieldInfo2TimeStampInfoSet;
+ }
+
+
+ //---------------------------------------------------------------
+ TEntite2TFieldInfo2TimeStampInfoSet
+ GetEntite2TFieldInfo2TimeStampInfoSet(const TFieldInfo2TimeStampInfoSet& theFieldInfo2TimeStampInfoSet)
+ {
+ TEntite2TFieldInfo2TimeStampInfoSet anEntite2TFieldInfo2TimeStampInfoSet;
+ TFieldInfo2TimeStampInfoSet::const_iterator anIter = theFieldInfo2TimeStampInfoSet.begin();
+ for(; anIter != theFieldInfo2TimeStampInfoSet.end(); anIter++){
+ const TTimeStampInfoSet& aTimeStampInfoSet = anIter->second;
+ //const PFieldInfo& aFieldInfo = anIter->first;
+ if(aTimeStampInfoSet.empty())
+ continue;
+ const PTimeStampInfo& aTimeStampInfo = *aTimeStampInfoSet.begin();
+ anEntite2TFieldInfo2TimeStampInfoSet[ConvertEntity(aTimeStampInfo->GetEntity())].insert(*anIter);
+ }
+ return anEntite2TFieldInfo2TimeStampInfoSet;
+ }
+
+
+ //---------------------------------------------------------------
+ bool
+ operator<(const TFamilyTSize& theLeft, const TFamilyTSize& theRight)
+ {
+ const MED::PFamilyInfo& aLeftInfo = boost::get<0>(theLeft);
+ const MED::PFamilyInfo& aRightInfo = boost::get<0>(theRight);
+ return aLeftInfo->GetId() < aRightInfo->GetId();
+ }
+
+
+ //---------------------------------------------------------------
+ TEntity2FamilySet
+ GetEntity2FamilySet(const PWrapper& theWrapper,
+ const TEntity2TGeom2ElemInfo& theEntity2TGeom2ElemInfo,
+ const TFamilyInfoSet& theFamilyInfoSet)
+ {
+ MSG(MYDEBUG,"GetFamiliesByEntity(...)");
+ TEntity2FamilySet anEntity2FamilySet;
+
+ typedef std::map<TInt,PFamilyInfo> TId2Family;
+ TId2Family anId2Family;
+ TFamilyInfoSet::const_iterator anIter = theFamilyInfoSet.begin();
+ for(; anIter != theFamilyInfoSet.end(); anIter++){
+ const PFamilyInfo& aFamilyInfo = *anIter;
+ anId2Family.insert(TId2Family::value_type(aFamilyInfo->GetId(),aFamilyInfo));
+ }
+
+ if(!anId2Family.empty()){
+ typedef std::map<TInt,TInt> TFamilyID2Size;
+ typedef std::map<EEntiteMaillage,TFamilyID2Size> TEntity2FamilyID;
+ TEntity2FamilyID anEntity2FamilyID;
+
+ if(!theEntity2TGeom2ElemInfo.empty()){
+ TEntity2TGeom2ElemInfo::const_iterator anIter = theEntity2TGeom2ElemInfo.begin();
+ for(; anIter != theEntity2TGeom2ElemInfo.end(); anIter++){
+ const EEntiteMaillage& anEntity = anIter->first;
+ TFamilyID2Size& aFamilyID2Size = anEntity2FamilyID[anEntity];
+ const TGeom2ElemInfo& aGeom2ElemInfo = anIter->second;
+ TGeom2ElemInfo::const_iterator aGeom2ElemInfoIter = aGeom2ElemInfo.begin();
+ for(; aGeom2ElemInfoIter != aGeom2ElemInfo.end(); aGeom2ElemInfoIter++){
+ const PElemInfo& aElemInfo = aGeom2ElemInfoIter->second;
+ if(TInt aNbElem = aElemInfo->GetNbElem()){
+ for(TInt i = 0; i < aNbElem; i++){
+ aFamilyID2Size[aElemInfo->GetFamNum(i)] += 1;
+ }
+ }
+ }
+ }
+ }
+
+ if(!anEntity2FamilyID.empty()){
+ TEntity2FamilyID::const_iterator anIter = anEntity2FamilyID.begin();
+ for(; anIter != anEntity2FamilyID.end(); anIter++){
+ const EEntiteMaillage& anEntity = anIter->first;
+ INITMSG(MYDEBUG,"anEntity = "<<anEntity<<":\n");
+ const TFamilyID2Size& aFamilyID2Size = anIter->second;
+ TFamilyID2Size::const_iterator anIter2 = aFamilyID2Size.begin();
+ for(; anIter2 != aFamilyID2Size.end(); anIter2++){
+ TInt anId = anIter2->first;
+ TInt aSize = anIter2->second;
+ TId2Family::const_iterator anIter3 = anId2Family.find(anId);
+ if(anIter3 != anId2Family.end()){
+ const PFamilyInfo& aFamilyInfo = anIter3->second;
+ anEntity2FamilySet[anEntity].insert(TFamilyTSize(aFamilyInfo,aSize));
+ INITMSG(MYDEBUG,
+ "aFamilyName = '"<<aFamilyInfo->GetName()<<
+ "' anId = "<<aFamilyInfo->GetId()<<"\n");
+ }
+ }
+ }
+ }
+ }
+ ADDMSG(MYDEBUG,"\n");
+ return anEntity2FamilySet;
+ }
+
+
+ //---------------------------------------------------------------
+ TKey2Gauss
+ GetKey2Gauss(const PWrapper& theWrapper,
+ TErr* theErr,
+ EModeSwitch theMode)
+ {
+ INITMSG(MYDEBUG,"GetKey2Gauss - theMode = "<<theMode<<std::endl);
+ TKey2Gauss aKey2Gauss;
+ TInt aNbGauss = theWrapper->GetNbGauss(theErr);
+ for(TInt anId = 1; anId <= aNbGauss; anId++){
+ TGaussInfo::TInfo aPreInfo = theWrapper->GetGaussPreInfo(anId);
+ PGaussInfo anInfo = theWrapper->CrGaussInfo(aPreInfo,theMode);
+ theWrapper->GetGaussInfo(anId,anInfo,theErr);
+ TGaussInfo::TKey aKey = boost::get<0>(aPreInfo);
+ aKey2Gauss[aKey] = anInfo;
+
+#ifdef _DEBUG_
+ const EGeometrieElement& aGeom = boost::get<0>(aKey);
+ const std::string& aName = boost::get<1>(aKey);
+ INITMSG(MYDEBUG,
+ "- aGeom = "<<aGeom<<
+ "; aName = '"<<aName<<"'"<<
+ std::endl);
+#endif
+
+ }
+ return aKey2Gauss;
+ }
+
+
+ //---------------------------------------------------------------
+ PProfileInfo
+ GetProfileInfo(const PWrapper& theWrapper,
+ const std::string& theProfileName,
+ TErr* theErr,
+ EModeProfil theMode)
+ {
+ PProfileInfo anInfo;
+ TInt aNbProfiles = theWrapper->GetNbProfiles(theErr);
+ for(TInt anId = 1; anId <= aNbProfiles; anId++){
+ TProfileInfo::TInfo aPreInfo = theWrapper->GetProfilePreInfo(anId);
+ const std::string& aName = boost::get<0>(aPreInfo);
+ if(aName == theProfileName)
+ return theWrapper->GetPProfileInfo(anId,theMode,theErr);
+ }
+ return anInfo;
+ }
+
+
+ //---------------------------------------------------------------
+ TMKey2Profile
+ GetMKey2Profile(const PWrapper& theWrapper,
+ TErr* theErr,
+ EModeProfil theMode)
+ {
+ INITMSG(MYDEBUG,"GetMKey2Profile - theMode = "<<theMode<<std::endl);
+ TKey2Profile aKey2Profile;
+ TInt aNbProfiles = theWrapper->GetNbProfiles(theErr);
+ for(TInt anId = 1; anId <= aNbProfiles; anId++){
+ TProfileInfo::TInfo aPreInfo = theWrapper->GetProfilePreInfo(anId);
+ PProfileInfo anInfo = theWrapper->GetPProfileInfo(anId,theMode,theErr);
+ const std::string& aName = boost::get<0>(aPreInfo);
+ aKey2Profile[aName] = anInfo;
+
+#ifdef _DEBUG_
+ INITMSG(MYDEBUG,
+ "- aName = '"<<aName<<"'"<<
+ " : "<<
+ std::endl);
+ TInt aNbElem = anInfo->GetSize();
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetElemNum(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+#endif
+
+ }
+ return TMKey2Profile(theMode,aKey2Profile);
+ }
+
+ //---------------------------------------------------------------
+ EEntiteMaillage
+ GetEntityByFamilyId(PGrilleInfo& theInfo,TInt theId){
+ TElemNum::iterator aNodeFamIter = (theInfo->myFamNumNode).begin();
+ for(;aNodeFamIter != (theInfo->myFamNumNode).end(); aNodeFamIter++){
+ if(theId == *aNodeFamIter)
+ return eNOEUD;
+ }
+ TElemNum::iterator aCellFamIter = (theInfo->myFamNum).begin();
+ for(;aCellFamIter != (theInfo->myFamNum).end(); aCellFamIter++){
+ if(theId == *aCellFamIter)
+ return eMAILLE;
+ }
+ EXCEPTION(std::runtime_error, "GetEntityByFamilyId - fails");
+ return EEntiteMaillage(-1);
+ }
+
+ TFamilyID2NbCells
+ GetFamilyID2NbCells(PGrilleInfo& theInfo){
+ TFamilyID2NbCells aFamily2NbCells;
+ TInt aNbNodes = theInfo->myFamNumNode.size();
+ TInt aNbCells = theInfo->myFamNum.size();
+ for(TInt i=0; i<aNbNodes; i++) aFamily2NbCells[theInfo->GetFamNumNode(i)] = 0;
+ for(TInt i=0; i<aNbCells; i++) aFamily2NbCells[theInfo->GetFamNum(i)] = 0;
+ for(TInt i=0; i<aNbNodes; i++) aFamily2NbCells[theInfo->GetFamNumNode(i)] += 1;
+ for(TInt i=0; i<aNbCells; i++) aFamily2NbCells[theInfo->GetFamNum(i)] += 1;
+ return aFamily2NbCells;
+ }
+
+ EEntiteMaillage ConvertEntity(const EEntiteMaillage& aEntity){
+ switch( aEntity ){
+
+ case eNOEUD_ELEMENT:
+ case eMAILLE: return eMAILLE; //eNOEUD_ELEMENT it is eMAILLE
+
+ case eFACE:
+ case eARETE:
+ case eNOEUD: return aEntity; break;
+ default: return EEntiteMaillage(-1);
+
+ }
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_Algorithm_HeaderFile
+#define MED_Algorithm_HeaderFile
+
+#include "MED_WrapperBase.hxx"
+#include "MED_Structures.hxx"
+
+#include <set>
+
+namespace MED
+{
+ //---------------------------------------------------------------
+ typedef std::map<EGeometrieElement,PElemInfo> TGeom2ElemInfo;
+ typedef std::map<EEntiteMaillage,TGeom2ElemInfo> TEntity2TGeom2ElemInfo;
+
+ //! Get set of TElemInfo by its geometrical type and corresponding MED ENTITY
+ MEDWRAPPER_EXPORT
+ TEntity2TGeom2ElemInfo
+ GetEntity2TGeom2ElemInfo(const PWrapper& theWrapper,
+ const PMeshInfo& theMeshInfo,
+ const MED::TEntityInfo& theEntityInfo);
+
+
+ //---------------------------------------------------------------
+ typedef std::set<PFamilyInfo> TFamilyInfoSet;
+
+ //! Read set of MED FAMILIES for defined MED file
+ MEDWRAPPER_EXPORT
+ TFamilyInfoSet
+ GetFamilyInfoSet(const PWrapper& theWrapper,
+ const PMeshInfo& theMeshInfo);
+
+
+ //---------------------------------------------------------------
+ typedef boost::tuple<PFamilyInfo,TInt> TFamilyTSize;
+
+ bool
+ operator<(const TFamilyTSize& theLeft, const TFamilyTSize& theRight);
+ typedef std::set<TFamilyTSize> TFamilyTSizeSet;
+
+
+ //---------------------------------------------------------------
+ typedef std::map<EEntiteMaillage,TFamilyTSizeSet> TEntity2FamilySet;
+
+ //! Split set of MED FAMILIES by corresponding MED ENTITY
+ MEDWRAPPER_EXPORT
+ TEntity2FamilySet
+ GetEntity2FamilySet(const PWrapper& theWrapper,
+ const TEntity2TGeom2ElemInfo& theEntity2TGeom2ElemInfo,
+ const TFamilyInfoSet& theFamilyInfoSet);
+
+
+ //---------------------------------------------------------------
+ typedef std::map<std::string,TFamilyInfoSet> TGroupInfo;
+
+ //! Split the input set of MED FAMILIES by corresponding MED GROUPS
+ MEDWRAPPER_EXPORT
+ TGroupInfo
+ GetGroupInfo(const TFamilyInfoSet& theFamilyInfoSet);
+
+
+ //---------------------------------------------------------------
+ typedef std::set<PTimeStampInfo> TTimeStampInfoSet;
+ typedef std::map<PFieldInfo,TTimeStampInfoSet> TFieldInfo2TimeStampInfoSet;
+
+ //! Read set of MED TIMESTAMPS groupped by corresponding MED FIELDS
+ MEDWRAPPER_EXPORT
+ TFieldInfo2TimeStampInfoSet
+ GetFieldInfo2TimeStampInfoSet(const PWrapper& theWrapper,
+ const PMeshInfo& theMeshInfo,
+ const MED::TEntityInfo& theEntityInfo);
+
+
+ //---------------------------------------------------------------
+ typedef std::map<EEntiteMaillage,TFieldInfo2TimeStampInfoSet> TEntite2TFieldInfo2TimeStampInfoSet;
+
+ //! Split the input set of MED TIMESTAMPS by corresponding MED FIELDS and MED ENTITIES
+ MEDWRAPPER_EXPORT
+ TEntite2TFieldInfo2TimeStampInfoSet
+ GetEntite2TFieldInfo2TimeStampInfoSet(const TFieldInfo2TimeStampInfoSet& theFieldInfo2TimeStampInfoSet);
+
+
+ //---------------------------------------------------------------
+ typedef std::map<TGaussInfo::TKey,PGaussInfo,TGaussInfo::TLess> TKey2Gauss;
+
+ //! Read set of MED GAUSS
+ MEDWRAPPER_EXPORT
+ TKey2Gauss
+ GetKey2Gauss(const PWrapper& theWrapper,
+ TErr* theErr = NULL,
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+
+ //---------------------------------------------------------------
+ //! Get MED PROFILE by its name
+ MEDWRAPPER_EXPORT
+ PProfileInfo
+ GetProfileInfo(const PWrapper& theWrapper,
+ const std::string& theProfileName,
+ TErr* theErr = NULL,
+ EModeProfil theMode = eCOMPACT);
+
+
+ //---------------------------------------------------------------
+ typedef std::map<TProfileInfo::TKey,PProfileInfo> TKey2Profile;
+ typedef boost::tuple<EModeProfil,TKey2Profile> TMKey2Profile;
+
+ //! Read set of MED PROFILES
+ MEDWRAPPER_EXPORT
+ TMKey2Profile
+ GetMKey2Profile(const PWrapper& theWrapper,
+ TErr* theErr = NULL,
+ EModeProfil theMode = eCOMPACT);
+
+ //---------------------------------------------------------------
+ //! Get Entity for Grille by family id.
+ MEDWRAPPER_EXPORT
+ EEntiteMaillage
+ GetEntityByFamilyId(PGrilleInfo& theInfo,
+ TInt theId);
+
+ typedef std::map<TInt,TInt> TFamilyID2NbCells;
+
+ //! Get Number of cells for theId family, for Grille
+ MEDWRAPPER_EXPORT
+ TFamilyID2NbCells
+ GetFamilyID2NbCells(PGrilleInfo& theInfo);
+
+ //! Convert eNOEUD_ELEMENT to eMAILLE
+ MEDWRAPPER_EXPORT
+ EEntiteMaillage
+ ConvertEntity(const EEntiteMaillage& aEntity);
+
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+
+#ifndef MED_Common_HeaderFile
+#define MED_Common_HeaderFile
+
+#include "MED_WrapperBase.hxx"
+
+#include <string>
+#include <set>
+#include <map>
+
+#include <hdf5.h>
+
+#include <boost/tuple/tuple.hpp>
+
+#include "SALOMEconfig.h"
+
+#include "MED_Vector.hxx"
+#include "MED_SharedPtr.hxx"
+#include "MED_SliceArray.hxx"
+
+#ifdef WIN32
+#pragma warning(disable:4099)
+#endif
+
+namespace MED{
+
+ enum EVersion {eVUnknown = -1, eV2_1, eV2_2};
+
+ typedef enum {eFAUX, eVRAI} EBooleen ;
+ typedef double TFloat;
+#if defined(HAVE_F77INT64)
+ typedef long TInt;
+#else
+ typedef int TInt;
+#endif
+ typedef hid_t TIdt;
+ typedef herr_t TErr;
+
+ typedef enum {eFULL_INTERLACE, eNO_INTERLACE} EModeSwitch;
+
+ typedef enum {eFLOAT64=6, eINT=26} ETypeChamp;
+
+ typedef enum {eNON_STRUCTURE, eSTRUCTURE} EMaillage;
+
+ typedef enum {eCART, eCYL, eSPHER} ERepere;
+
+ typedef enum {eNOD, eDESC} EConnectivite ;
+
+ typedef enum {ePOINT1=1, eSEG2=102, eSEG3=103, eTRIA3=203,
+ eQUAD4=204, eTRIA6=206, eTRIA7=207, eQUAD8=208, eQUAD9=209,eTETRA4=304,
+ ePYRA5=305, ePENTA6=306, eHEXA8=308, eOCTA12=312, eTETRA10=310,
+ ePYRA13=313, ePENTA15=315, eHEXA20=320, eHEXA27=327,
+ ePOLYGONE=400, ePOLYEDRE=500, eNONE=0,
+ eBALL=1101 /*no such a type in med.h, it's just a trick*/,
+ eAllGeoType=-1 } EGeometrieElement;
+
+ typedef enum {eMAILLE, eFACE, eARETE, eNOEUD, eNOEUD_ELEMENT, eSTRUCT_ELEMENT} EEntiteMaillage;
+
+ typedef enum {eNO_PFLMOD, eGLOBAL, eCOMPACT} EModeProfil;
+
+ typedef enum {eGRILLE_CARTESIENNE, eGRILLE_POLAIRE, eGRILLE_STANDARD} EGrilleType;
+
+ typedef enum {eCOOR, eCONN, eNOM, eNUM, eFAM, eCOOR_IND1, eCOOR_IND2, eCOOR_IND3} ETable;
+
+ typedef TVector<TFloat> TFloatVector;
+ typedef TVector<std::string> TStringVector;
+ typedef TVector<TInt> TIntVector;
+ typedef std::set<std::string> TStringSet;
+
+ typedef std::map<EGeometrieElement,TInt> TGeom2Size;
+ typedef std::map<EEntiteMaillage,TGeom2Size> TEntityInfo;
+
+ typedef std::set<EGeometrieElement> TGeomSet;
+ typedef std::map<EEntiteMaillage,TGeomSet> TEntity2GeomSet;
+
+ MEDWRAPPER_EXPORT
+ const TEntity2GeomSet&
+ GetEntity2GeomSet();
+
+ template<EVersion>
+ TInt MEDWRAPPER_EXPORT
+ GetDESCLength();
+
+ template<EVersion>
+ TInt MEDWRAPPER_EXPORT
+ GetIDENTLength();
+
+ template<EVersion>
+ TInt MEDWRAPPER_EXPORT
+ GetNOMLength();
+
+ template<EVersion>
+ TInt MEDWRAPPER_EXPORT
+ GetLNOMLength();
+
+ template<EVersion>
+ TInt MEDWRAPPER_EXPORT
+ GetPNOMLength();
+
+ template<EVersion>
+ void MEDWRAPPER_EXPORT
+ GetVersionRelease(TInt& majeur, TInt& mineur, TInt& release);
+
+ template<EVersion>
+ MEDWRAPPER_EXPORT
+ TInt
+ GetNbConn(EGeometrieElement typmai,
+ EEntiteMaillage typent,
+ TInt mdim);
+
+ MEDWRAPPER_EXPORT
+ TInt
+ GetNbNodes(EGeometrieElement typmai);
+
+ struct TNameInfo;
+ typedef SharedPtr<TNameInfo> PNameInfo;
+
+ struct TMeshInfo;
+ typedef SharedPtr<TMeshInfo> PMeshInfo;
+
+ struct TFamilyInfo;
+ typedef SharedPtr<TFamilyInfo> PFamilyInfo;
+
+ struct TElemInfo;
+ typedef SharedPtr<TElemInfo> PElemInfo;
+
+ struct TNodeInfo;
+ typedef SharedPtr<TNodeInfo> PNodeInfo;
+
+ struct TPolygoneInfo;
+ typedef SharedPtr<TPolygoneInfo> PPolygoneInfo;
+
+ struct TPolyedreInfo;
+ typedef SharedPtr<TPolyedreInfo> PPolyedreInfo;
+
+ struct TCellInfo;
+ typedef SharedPtr<TCellInfo> PCellInfo;
+
+ struct TBallInfo;
+ typedef SharedPtr<TBallInfo> PBallInfo;
+
+ struct TFieldInfo;
+ typedef SharedPtr<TFieldInfo> PFieldInfo;
+
+ struct TTimeStampInfo;
+ typedef SharedPtr<TTimeStampInfo> PTimeStampInfo;
+
+ struct TProfileInfo;
+ typedef SharedPtr<TProfileInfo> PProfileInfo;
+
+ struct TGaussInfo;
+ typedef SharedPtr<TGaussInfo> PGaussInfo;
+
+ class TGrilleInfo;
+ typedef SharedPtr<TGrilleInfo> PGrilleInfo;
+
+ struct TTimeStampValueBase;
+ typedef SharedPtr<TTimeStampValueBase> PTimeStampValueBase;
+
+ struct TWrapper;
+ typedef SharedPtr<TWrapper> PWrapper;
+}
+
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#include "MED_CoordUtils.hxx"
+#include "MED_Utilities.hxx"
+
+namespace MED
+{
+
+ enum ECoordName{eX, eY, eZ, eNone};
+
+ template<ECoordName TCoordId>
+ TFloat
+ GetCoord(const TCCoordSlice& theCoordSlice)
+ {
+ return theCoordSlice[TCoordId];
+ }
+
+ template<>
+ TFloat
+ GetCoord<eNone>(const TCCoordSlice& theCoordSlice)
+ {
+ return 0.0;
+ }
+
+ TGetCoord
+ aXYZGetCoord[3] = {
+ &GetCoord<eX>,
+ &GetCoord<eY>,
+ &GetCoord<eZ>
+ };
+
+ TGetCoord
+ aXYGetCoord[3] = {
+ &GetCoord<eX>,
+ &GetCoord<eY>,
+ &GetCoord<eNone>
+ };
+
+ TGetCoord
+ aYZGetCoord[3] = {
+ &GetCoord<eNone>,
+ &GetCoord<eX>,
+ &GetCoord<eY>
+ };
+
+ TGetCoord
+ aXZGetCoord[3] = {
+ &GetCoord<eX>,
+ &GetCoord<eNone>,
+ &GetCoord<eY>
+ };
+
+
+ TGetCoord
+ aXGetCoord[3] = {
+ &GetCoord<eX>,
+ &GetCoord<eNone>,
+ &GetCoord<eNone>
+ };
+
+ TGetCoord
+ aYGetCoord[3] = {
+ &GetCoord<eNone>,
+ &GetCoord<eX>,
+ &GetCoord<eNone>
+ };
+
+ TGetCoord
+ aZGetCoord[3] = {
+ &GetCoord<eNone>,
+ &GetCoord<eNone>,
+ &GetCoord<eX>
+ };
+
+
+ //---------------------------------------------------------------
+ TCoordHelper
+ ::TCoordHelper(TGetCoord* theGetCoord):
+ myGetCoord(theGetCoord)
+ {}
+
+ TFloat
+ TCoordHelper
+ ::GetCoord(TCCoordSlice& theCoordSlice,
+ TInt theCoordId)
+ {
+ return (*myGetCoord[theCoordId])(theCoordSlice);
+ }
+
+
+ //---------------------------------------------------------------
+ PCoordHelper
+ GetCoordHelper(PNodeInfo theNodeInfo)
+ {
+ PCoordHelper aCoordHelper;
+ {
+ PMeshInfo aMeshInfo = theNodeInfo->GetMeshInfo();
+ TInt aMeshDimension = aMeshInfo->GetDim();
+ bool anIsDimPresent[3] = {false, false, false};
+ for(int iDim = 0; iDim < aMeshDimension; iDim++){
+ // PAL16857(SMESH not conform to the MED convention) ->
+ // 1D - always along X
+ // 2D - always in XOY plane
+ anIsDimPresent[iDim] = iDim < aMeshDimension;
+// std::string aName = theNodeInfo->GetCoordName(iDim);
+// if ( aName.size() > 1 ) // PAL12148, aName has size 8 or 16
+// aName = aName.substr(0,1);
+// if(aName == "x" || aName == "X")
+// anIsDimPresent[eX] = true;
+// else if(aName == "y" || aName == "Y")
+// anIsDimPresent[eY] = true;
+// else if(aName == "z" || aName == "Z")
+// anIsDimPresent[eZ] = true;
+ }
+
+ switch(aMeshDimension){
+ case 3:
+ aCoordHelper.reset(new TCoordHelper(aXYZGetCoord));
+ break;
+ case 2:
+ if(anIsDimPresent[eY] && anIsDimPresent[eZ])
+ aCoordHelper.reset(new TCoordHelper(aYZGetCoord));
+ else if(anIsDimPresent[eX] && anIsDimPresent[eZ])
+ aCoordHelper.reset(new TCoordHelper(aXZGetCoord));
+ else
+ aCoordHelper.reset(new TCoordHelper(aXYGetCoord));
+ break;
+ case 1:
+ if(anIsDimPresent[eY])
+ aCoordHelper.reset(new TCoordHelper(aYGetCoord));
+ else if(anIsDimPresent[eZ])
+ aCoordHelper.reset(new TCoordHelper(aZGetCoord));
+ else
+ aCoordHelper.reset(new TCoordHelper(aXGetCoord));
+ break;
+ }
+ }
+ return aCoordHelper;
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_CoordUtils_HeaderFile
+#define MED_CoordUtils_HeaderFile
+
+#include "MED_WrapperBase.hxx"
+
+#include "MED_Structures.hxx"
+
+namespace MED
+{
+ typedef TFloat (*TGetCoord)(const TCCoordSlice& theCoordSlice);
+
+
+ //---------------------------------------------------------------
+ class MEDWRAPPER_EXPORT TCoordHelper
+ {
+ TGetCoord* myGetCoord;
+
+ public:
+ TCoordHelper(TGetCoord* theGetCoord);
+
+ TFloat
+ GetCoord(TCCoordSlice& theCoordSlice,
+ TInt theCoordId);
+ };
+ typedef SharedPtr<TCoordHelper> PCoordHelper;
+
+
+ //---------------------------------------------------------------
+ MEDWRAPPER_EXPORT
+ PCoordHelper
+ GetCoordHelper(PNodeInfo theNodeInfo);
+
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+// File : MED_GaussDef.hxx
+// Author : Edward AGAPOV (eap)
+//
+#include "MED_GaussDef.hxx"
+#include "MED_Utilities.hxx"
+#include "MED_GaussUtils.hxx"
+
+namespace MED
+{
+ using namespace std;
+ using namespace MED;
+ //---------------------------------------------------------------
+
+ void TGaussDef::add(const double x, const double weight)
+ {
+ if ( dim() != 1 )
+ EXCEPTION( logic_error,"dim() != 1");
+ if ( myWeights.capacity() == myWeights.size() )
+ EXCEPTION( logic_error,"Extra gauss point");
+ myCoords.push_back( x );
+ myWeights.push_back( weight );
+ }
+ void TGaussDef::add(const double x, const double y, const double weight)
+ {
+ if ( dim() != 2 )
+ EXCEPTION( logic_error,"dim() != 2");
+ if ( myWeights.capacity() == myWeights.size() )
+ EXCEPTION( logic_error,"Extra gauss point");
+ myCoords.push_back( x );
+ myCoords.push_back( y );
+ myWeights.push_back( weight );
+ }
+ void TGaussDef::add(const double x, const double y, const double z, const double weight)
+ {
+ if ( dim() != 3 )
+ EXCEPTION( logic_error,"dim() != 3");
+ if ( myWeights.capacity() == myWeights.size() )
+ EXCEPTION( logic_error,"Extra gauss point");
+ myCoords.push_back( x );
+ myCoords.push_back( y );
+ myCoords.push_back( z );
+ myWeights.push_back( weight );
+ }
+ void TGaussDef::setRefCoords(const TShapeFun& aShapeFun)
+ {
+ myRefCoords.reserve( aShapeFun.myRefCoord.size() );
+ myRefCoords.assign( aShapeFun.myRefCoord.begin(),
+ aShapeFun.myRefCoord.end() );
+ }
+
+
+ //---------------------------------------------------------------
+ /*!
+ * \brief Fill definition of gauss points family
+ */
+ //---------------------------------------------------------------
+
+ TGaussDef::TGaussDef(const int geom, const int nbGauss, const int variant)
+ {
+ myType = geom;
+ myCoords .reserve( nbGauss * dim() );
+ myWeights.reserve( nbGauss );
+
+ switch ( geom ) {
+
+ case eSEG2:
+ case eSEG3:
+ if (geom == eSEG2) setRefCoords( TSeg2a() );
+ else setRefCoords( TSeg3a() );
+ switch ( nbGauss ) {
+ case 1: {
+ add( 0.0, 2.0 ); break;
+ }
+ case 2: {
+ const double a = 0.577350269189626;
+ add( a, 1.0 );
+ add( -a, 1.0 ); break;
+ }
+ case 3: {
+ const double a = 0.774596669241;
+ const double P1 = 1./1.8;
+ const double P2 = 1./1.125;
+ add( -a, P1 );
+ add( 0, P2 );
+ add( a, P1 ); break;
+ }
+ case 4: {
+ const double a = 0.339981043584856, b = 0.861136311594053;
+ const double P1 = 0.652145154862546, P2 = 0.347854845137454 ;
+ add( a, P1 );
+ add( -a, P1 );
+ add( b, P2 );
+ add( -b, P2 ); break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for SEG"<<nbGauss);
+ }
+ break;
+
+ case eTRIA3:
+ case eTRIA6:
+ if ( variant == 1 ) {
+ if (geom == eTRIA3) setRefCoords( TTria3b() );
+ else setRefCoords( TTria6b() );
+ switch ( nbGauss ) {
+ case 1: { // FPG1
+ add( 1/3., 1/3., 1/2. ); break;
+ }
+ case 3: { // FPG3
+ // what about COT3 ???
+ add( 1/6., 1/6., 1/6. );
+ add( 2/3., 1/6., 1/6. );
+ add( 1/6., 2/3., 1/6. ); break;
+ }
+ case 4: { // FPG4
+ add( 1/5., 1/5., 25/(24*4.) );
+ add( 3/5., 1/5., 25/(24*4.) );
+ add( 1/5., 3/5., 25/(24*4.) );
+ add( 1/3., 1/3., -27/(24*4.) ); break;
+ }
+ case 6: { // FPG6
+ const double P1 = 0.11169079483905, P2 = 0.0549758718227661;
+ const double a = 0.445948490915965, b = 0.091576213509771;
+ add( b, b, P2 );
+ add( 1-2*b, b, P2 );
+ add( b, 1-2*b, P2 );
+ add( a, 1-2*a, P1 );
+ add( a, a, P1 );
+ add( 1-2*a, a, P1 ); break;
+ }
+ case 7: { // FPG7
+ const double A = 0.470142064105115;
+ const double B = 0.101286507323456;
+ const double P1 = 0.066197076394253;
+ const double P2 = 0.062969590272413;
+ add( 1/3., 1/3., 9/80. );
+ add( A, A, P1 );
+ add( 1-2*A, A, P1 );
+ add( A, 1-2*A, P1 );
+ add( B, B, P2 );
+ add( 1-2*B, B, P2 );
+ add( B, 1-2*B, P2 ); break;
+ }
+ case 12: { // FPG12
+ const double A = 0.063089014491502;
+ const double B = 0.249286745170910;
+ const double C = 0.310352451033785;
+ const double D = 0.053145049844816;
+ const double P1 = 0.025422453185103;
+ const double P2 = 0.058393137863189;
+ const double P3 = 0.041425537809187;
+ add( A, A, P1 );
+ add( 1-2*A, A, P1 );
+ add( A, 1-2*A, P1 );
+ add( B, B, P2 );
+ add( 1-2*B, B, P2 );
+ add( B, 1-2*B, P2 );
+ add( C, D, P3 );
+ add( D, C, P3 );
+ add( 1-C-D, C, P3 );
+ add( 1-C-D, D, P3 );
+ add( C, 1-C-D, P3 );
+ add( D, 1-C-D, P3 ); break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for TRIA, variant 1: "
+ <<nbGauss);
+ }
+ }
+ else if ( variant == 2 ) {
+ if (geom == eTRIA3) setRefCoords( TTria3a() );
+ else setRefCoords( TTria6a() );
+ switch ( nbGauss ) {
+ case 1: {
+ add( -1/3., -1/3., 2. ); break;
+ }
+ case 3: {
+ add( -2/3., 1/3., 2/3. );
+ add( -2/3., -2/3., 2/3. );
+ add( 1/3., -2/3., 2/3. ); break;
+ }
+ case 6: {
+ const double P1 = 0.11169079483905, P2 = 0.0549758718227661;
+ const double A = 0.445948490915965, B = 0.091576213509771;
+ add( 2*B-1, 1-4*B, 4*P2 );
+ add( 2*B-1, 2*B-1, 4*P2 );
+ add( 1-4*B, 2*B-1, 4*P2 );
+ add( 1-4*A, 2*A-1, 4*P1 );
+ add( 2*A-1, 1-4*A, 4*P1 );
+ add( 2*A-1, 2*A-1, 4*P1 ); break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for TRIA, variant 2: "
+ <<nbGauss);
+ }
+ }
+ else if ( variant == 3 ) {
+ if (geom == eTRIA3) setRefCoords( TTria3b() );
+ else setRefCoords( TTria6b() );
+ switch ( nbGauss ) {
+ case 4: {
+ add( 1/3., 1/3., -27/96 );
+ add( 0.2 , 0.2 , 25/96 );
+ add( 0.6 , 0.2 , 25/96 );
+ add( 0.2 , 0.6 , 25/96 ); break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for TRIA, variant 3: "
+ <<nbGauss);
+ }
+ }
+ break;
+
+ case eQUAD4:
+ case eQUAD8:
+ if ( variant == 1 ) {
+ if (geom == eQUAD4) setRefCoords( TQuad4b() );
+ else setRefCoords( TQuad8b() );
+ switch ( nbGauss ) {
+ case 1: { // FPG1
+ add( 0, 0, 4 ); break;
+ }
+ case 4: { // FPG4
+ const double a = 1/sqrt(3.);
+ add( -a, -a, 1 );
+ add( a, -a, 1 );
+ add( a, a, 1 );
+ add( -a, a, 1 ); break;
+ }
+ case 9: { // FPG9
+ const double a = 0.774596669241483;
+ add( -a, -a, 25/81. );
+ add( a, -a, 25/81. );
+ add( a, a, 25/81. );
+ add( -a, a, 25/81. );
+ add( 0., -a, 40/81. );
+ add( a, 0., 40/81. );
+ add( 0., a, 40/81. );
+ add( -a, 0., 40/81. );
+ add( 0., 0., 64/81. ); break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for QUAD, variant 1: "
+ <<nbGauss);
+ }
+ }
+ else if ( variant == 2 ) {
+ if (geom == eQUAD4) setRefCoords( TQuad4a() );
+ else setRefCoords( TQuad8a() );
+ switch ( nbGauss ) {
+ case 4: {
+ const double a = 1/sqrt(3.);
+ add( -a, a, 1 );
+ add( -a, -a, 1 );
+ add( a, -a, 1 );
+ add( a, a, 1 ); break;
+ }
+ case 9: {
+ const double a = 0.774596669241483;
+ add( -a, a, 25/81. );
+ add( -a, -a, 25/81. );
+ add( a, -a, 25/81. );
+ add( a, a, 25/81. );
+ add( -a, 0., 40/81. );
+ add( 0., -a, 40/81. );
+ add( a, 0., 40/81. );
+ add( 0., a, 40/81. );
+ add( 0., 0., 64/81. ); break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for QUAD, variant 1: "
+ <<nbGauss);
+ }
+ }
+ else if ( variant == 3 ) {
+ if (geom == eQUAD4) setRefCoords( TQuad4b() );
+ else setRefCoords( TQuad8b() );
+ switch ( nbGauss ) {
+ case 4: {
+ const double a = 3/sqrt(3.);
+ add( -a, -a, 1 );
+ add( -a, a, 1 );
+ add( a, -a, 1 );
+ add( a, a, 1 ); break;
+ }
+ case 9: {
+ const double a = sqrt(3/5.), c1 = 5/9., c2 = 8/9.;
+ const double c12 = c1*c2, c22 = c2*c2, c1c2 = c1*c2;
+ add( -a, -a, c12 );
+ add( -a, 0., c1c2 );
+ add( -a, a, c12 );
+ add( 0., -a, c1c2 );
+ add( 0., 0., c22 );
+ add( 0., a, c1c2 );
+ add( a, -a, c12 );
+ add( a, 0., c1c2 );
+ add( a, a, c12 ); break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for QUAD, variant 3: "
+ <<nbGauss);
+ }
+ }
+ break;
+
+ case eTETRA4:
+ case eTETRA10:
+ if (geom == eTETRA4) setRefCoords( TTetra4a() );
+ else setRefCoords( TTetra10a() );
+ switch ( nbGauss ) {
+ case 4: { // FPG4
+ const double a = (5 - sqrt(5.))/20., b = (5 + 3*sqrt(5.))/20.;
+ add( a, a, a, 1/24. );
+ add( a, a, b, 1/24. );
+ add( a, b, a, 1/24. );
+ add( b, a, a, 1/24. ); break;
+ }
+ case 5: { // FPG5
+ const double a = 0.25, b = 1/6., c = 0.5;
+ add( a, a, a, -2/15. );
+ add( b, b, b, 3/40. );
+ add( b, b, c, 3/40. );
+ add( b, c, b, 3/40. );
+ add( c, b, b, 3/40. ); break;
+ }
+ case 15: { // FPG15
+ const double a = 0.25;
+ const double b1 = (7 + sqrt(15.))/34., c1 = (13 + 3*sqrt(15.))/34., d = (5 - sqrt(15.))/20.;
+ const double b2 = (7 - sqrt(15.))/34., c2 = (13 - 3*sqrt(15.))/34., e = (5 + sqrt(15.))/20.;
+ const double P1 = (2665 - 14*sqrt(15.))/226800.;
+ const double P2 = (2665 + 14*sqrt(15.))/226800.;
+ add( a, a, a, 8/405.);//_____
+ add( b1, b1, b1, P1 );
+ add( b1, b1, c1, P1 );
+ add( b1, c1, b1, P1 );
+ add( c1, b1, b1, P1 );//_____
+ add( b2, b2, b2, P2 );
+ add( b2, b2, c2, P2 );
+ add( b2, c2, b2, P2 );
+ add( c2, b2, b2, P2 );//_____
+ add( d, d, e, 5/567.);
+ add( d, e, d, 5/567.);
+ add( e, d, d, 5/567.);
+ add( d, e, e, 5/567.);
+ add( e, d, e, 5/567.);
+ add( e, e, d, 5/567.);
+ break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for TETRA: "<<nbGauss);
+ }
+ break;
+
+ case ePYRA5:
+ case ePYRA13:
+ if (geom == ePYRA5) setRefCoords( TPyra5a() );
+ else setRefCoords( TPyra13a() );
+ switch ( nbGauss ) {
+ case 5: { // FPG5
+ const double h1 = 0.1531754163448146;
+ const double h2 = 0.6372983346207416;
+ add( .5, 0., h1, 2/15. );
+ add( 0., .5, h1, 2/15. );
+ add( -.5, 0., h1, 2/15. );
+ add( 0., -.5, h1, 2/15. );
+ add( 0., 0., h2, 2/15. ); break;
+ }
+ case 6: { // FPG6
+ const double p1 = 0.1024890634400000 ;
+ const double p2 = 0.1100000000000000 ;
+ const double p3 = 0.1467104129066667 ;
+ const double a = 0.5702963741068025 ;
+ const double h1 = 0.1666666666666666 ;
+ const double h2 = 0.08063183038464675;
+ const double h3 = 0.6098484849057127 ;
+ add( a, 0., h1, p1 );
+ add( 0., a, h1, p1 );
+ add( -a, 0., h1, p1 );
+ add( 0., -a, h1, p1 );
+ add( 0., 0., h2, p2 );
+ add( 0., 0., h3, p3 ); break;
+ }
+ case 27: { // FPG27
+ const double a1 = 0.788073483;
+ const double b6 = 0.499369002;
+ const double b1 = 0.848418011;
+ const double c8 = 0.478508449;
+ const double c1 = 0.652816472;
+ const double d12 = 0.032303742;
+ const double d1 = 1.106412899;
+ double z = 1/2., fz = b1/2*(1 - z);
+ add( 0., 0., z, a1 ); // 1
+ add( fz, fz, z, b6 ); // 2
+ add( -fz, fz, z, b6 ); // 3
+ add( -fz, -fz, z, b6 ); // 4
+ add( fz, -fz, z, b6 ); // 5
+ z = (1 - b1)/2.;
+ add( 0., 0., z, b6 ); // 6
+ z = (1 + b1)/2.;
+ add( 0., 0., z, b6 ); // 7
+ z = (1 - c1)/2.; fz = c1*(1 - z);
+ add( fz, 0., z, c8 ); // 8
+ add( 0., fz, z, c8 ); // 9
+ add( -fz, 0., z, c8 ); // 10
+ add( 0., -fz, z, c8 ); // 11
+ z = (1 + c1)/2.; fz = c1*(1 - z);
+ add( fz, 0., z, c8 ); // 12
+ add( 0., fz, z, c8 ); // 13
+ add( -fz, 0., z, c8 ); // 14
+ add( 0., -fz, z, c8 ); // 15
+ z = (1 - d1)/2., fz = d1/2*(1 - z);
+ add( fz, fz, z, d12); // 16
+ add( -fz, fz, z, d12); // 17
+ add( -fz, -fz, z, d12); // 18
+ add( fz, -fz, z, d12); // 19
+ z = 1/2.; fz = d1*(1 - z);
+ add( fz, 0., z, d12); // 20
+ add( 0., fz, z, d12); // 21
+ add( -fz, 0., z, d12); // 22
+ add( 0., -fz, z, d12); // 23
+ z = (1 + d1)/2., fz = d1/2*(1 - z);
+ add( fz, fz, z, d12); // 24
+ add( -fz, fz, z, d12); // 25
+ add( -fz, -fz, z, d12); // 26
+ add( fz, -fz, z, d12); // 27
+ break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for PYRA: "<<nbGauss);
+ }
+ break;
+ case ePENTA6:
+ case ePENTA15:
+ if (geom == ePENTA6) setRefCoords( TPenta6a() );
+ else setRefCoords( TPenta15a() );
+ switch ( nbGauss ) {
+ case 6: { // FPG6
+ const double a = sqrt(3.)/3.;
+ add( -a, .5, .5, 1/6. );
+ add( -a, 0., .5, 1/6. );
+ add( -a, .5, 0., 1/6. );
+ add( a, .5, .5, 1/6. );
+ add( a, 0., .5, 1/6. );
+ add( a, .5, 0., 1/6. ); break;
+ }
+ case 8: { // FPG8
+ const double a = 0.577350269189626;
+ add( -a, 1/3., 1/3., -27/96. );
+ add( -a, 0.6, 0.2, 25/96. );
+ add( -a, 0.2, 0.6, 25/96. );
+ add( -a, 0.2, 0.2, 25/96. );
+ add( +a, 1/3., 1/3., -27/96. );
+ add( +a, 0.6, 0.2, 25/96. );
+ add( +a, 0.2, 0.6, 25/96. );
+ add( +a, 0.2, 0.2, 25/96. ); break;
+ }
+ case 21: { // FPG21
+ const double d = sqrt(3/5.), c1 = 5/9., c2 = 8/9.; // d <=> alfa
+ const double a = (6 + sqrt(15.))/21.;
+ const double b = (6 - sqrt(15.))/21.;
+ const double P1 = (155 + sqrt(15.))/2400.;
+ const double P2 = (155 - sqrt(15.))/2400.; //___
+ add( -d, 1/3., 1/3., c1*9/80. );//___
+ add( -d, a, a, c1*P1 );
+ add( -d, 1-2*a, a, c1*P1 );
+ add( -d, a, 1-2*a, c1*P1 );//___
+ add( -d, b, b, c1*P2 );
+ add( -d, 1-2*b, b, c1*P2 );
+ add( -d, b, 1-2*b, c1*P2 );//___
+ add( 0., 1/3., 1/3., c2*9/80. );//___
+ add( 0., a, a, c2*P1 );
+ add( 0., 1-2*a, a, c2*P1 );
+ add( 0., a, 1-2*a, c2*P1 );//___
+ add( 0., b, b, c2*P2 );
+ add( 0., 1-2*b, b, c2*P2 );
+ add( 0., b, 1-2*b, c2*P2 );//___
+ add( d, 1/3., 1/3., c1*9/80. );//___
+ add( d, a, a, c1*P1 );
+ add( d, 1-2*a, a, c1*P1 );
+ add( d, a, 1-2*a, c1*P1 );//___
+ add( d, b, b, c1*P2 );
+ add( d, 1-2*b, b, c1*P2 );
+ add( d, b, 1-2*b, c1*P2 );//___
+ break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for PENTA: " <<nbGauss);
+ }
+ break;
+
+ case eHEXA8:
+ case eHEXA20:
+ if (geom == eHEXA8) setRefCoords( THexa8a() );
+ else setRefCoords( THexa20a() );
+ switch ( nbGauss ) {
+ case 8: { // FPG8
+ const double a = sqrt(3.)/3.;
+ add( -a, -a, -a, 1. );
+ add( -a, -a, a, 1. );
+ add( -a, a, -a, 1. );
+ add( -a, a, a, 1. );
+ add( a, -a, -a, 1. );
+ add( a, -a, a, 1. );
+ add( a, a, -a, 1. );
+ add( a, a, a, 1. ); break;
+ }
+ case 27: { // FPG27
+ const double a = sqrt(3/5.), c1 = 5/9., c2 = 8/9.;
+ const double c12 = c1*c1, c13 = c1*c1*c1;
+ const double c22 = c2*c2, c23 = c2*c2*c2;
+ add( -a, -a, -a, c13 ); // 1
+ add( -a, -a, 0., c12*c2 ); // 2
+ add( -a, -a, a, c13 ); // 3
+ add( -a, 0., -a, c12*c2 ); // 4
+ add( -a, 0., 0., c1*c22 ); // 5
+ add( -a, 0., a, c12*c2 ); // 6
+ add( -a, a, -a, c13 ); // 7
+ add( -a, a, 0., c12*c2 ); // 8
+ add( -a, a, a, c13 ); // 9
+ add( 0., -a, -a, c12*c2 ); // 10
+ add( 0., -a, 0., c1*c22 ); // 11
+ add( 0., -a, a, c12*c2 ); // 12
+ add( 0., 0., -a, c1*c22 ); // 13
+ add( 0., 0., 0., c23 ); // 14
+ add( 0., 0., a, c1*c22 ); // 15
+ add( 0., a, -a, c12*c2 ); // 16
+ add( 0., a, 0., c1*c22 ); // 17
+ add( 0., a, a, c12*c2 ); // 18
+ add( a, -a, -a, c13 ); // 19
+ add( a, -a, 0., c12*c2 ); // 20
+ add( a, -a, a, c13 ); // 21
+ add( a, 0., -a, c12*c2 ); // 22
+ add( a, 0., 0., c1*c22 ); // 23
+ add( a, 0., a, c12*c2 ); // 24
+ add( a, a, -a, c13 ); // 25
+ add( a, a, 0., c12*c2 ); // 26
+ add( a, a, a, c13 ); // 27
+ break;
+ }
+ default:
+ EXCEPTION( logic_error,"Invalid nb of gauss points for PENTA: " <<nbGauss);
+ }
+ break;
+
+ default:
+ EXCEPTION( logic_error,"unexpected EGeometrieElement: "<< geom);
+ }
+
+ if ( myWeights.capacity() != myWeights.size() )
+ EXCEPTION( logic_error,"Not all gauss points defined");
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+// File : MED_GaussDef.hxx
+// Author : Edward AGAPOV (eap)
+//
+#ifndef MED_GaussDef_HeaderFile
+#define MED_GaussDef_HeaderFile
+
+#include "MED_WrapperBase.hxx"
+
+//#include "MED_GaussUtils.hxx" <<<---- avoid dependence on boost
+#include <vector>
+
+namespace MED
+{
+ class TShapeFun;
+ typedef std::vector<double> TDoubleVector;
+ /*!
+ * \brief Description of family of integration points
+ */
+ struct TGaussDef
+ {
+ int myType; //!< element geometry (EGeometrieElement or med_geometrie_element)
+ TDoubleVector myRefCoords; //!< description of reference points
+ TDoubleVector myCoords; //!< coordinates of Gauss points
+ TDoubleVector myWeights; //!< weights, len(weights)==<nb of gauss points>
+
+ /*!
+ * \brief Creates definition of gauss points family
+ * \param geomType - element geometry (EGeometrieElement or med_geometrie_element)
+ * \param nbPoints - nb gauss point
+ * \param variant - [1-3] to choose the variant of definition
+ *
+ * Throws in case of invalid parameters
+ * variant == 1 refers to "Fonctions de forme et points d'integration
+ * des elements finis" v7.4 by J. PELLET, X. DESROCHES, 15/09/05
+ * variant == 2 refers to the same doc v6.4 by J.P. LEFEBVRE, X. DESROCHES, 03/07/03
+ * variant == 3 refers to the same doc v6.4, second variant for 2D elements
+ */
+ MEDWRAPPER_EXPORT TGaussDef(const int geomType, const int nbPoints, const int variant=1);
+
+ MEDWRAPPER_EXPORT int dim() const { return myType/100; }
+ MEDWRAPPER_EXPORT int nbPoints() const { return myWeights.capacity(); }
+
+ private:
+ void add(const double x, const double weight);
+ void add(const double x, const double y, const double weight);
+ void add(const double x, const double y, const double z, const double weight);
+ void setRefCoords(const TShapeFun& aShapeFun);
+ };
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#include "MED_GaussUtils.hxx"
+#include "MED_Utilities.hxx"
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+static int MYVALUEDEBUG = 0;
+#else
+// static int MYDEBUG = 0;
+// static int MYVALUEDEBUG = 0;
+#endif
+
+//#define _DEBUG_REF_COORDS_
+
+namespace MED
+{
+ //---------------------------------------------------------------
+ TGaussCoord
+ ::TGaussCoord():
+ TModeSwitchInfo(eFULL_INTERLACE),
+ myNbElem(0),
+ myNbGauss(0),
+ myDim(0),
+ myGaussStep(0)
+ {
+ }
+
+ void
+ TGaussCoord
+ ::Init(TInt theNbElem,
+ TInt theNbGauss,
+ TInt theDim,
+ EModeSwitch theMode)
+ {
+ myModeSwitch = theMode;
+
+ myNbElem = theNbElem;
+ myNbGauss = theNbGauss;
+ myDim = theDim;
+
+ myGaussStep = myNbGauss*myDim;
+
+ myGaussCoord.resize(theNbElem*myGaussStep);
+ }
+
+
+ TInt
+ TGaussCoord
+ ::GetNbElem() const
+ {
+ return myNbElem;
+ }
+
+ TInt
+ TGaussCoord
+ ::GetNbGauss() const
+ {
+ return myNbGauss;
+ }
+
+ TInt
+ TGaussCoord
+ ::GetDim() const
+ {
+ return myDim;
+ }
+
+ unsigned char*
+ TGaussCoord
+ ::GetValuePtr()
+ {
+ return (unsigned char*)&(myGaussCoord[0]);
+ }
+
+
+ TCCoordSliceArr
+ TGaussCoord
+ ::GetCoordSliceArr(TInt theElemId) const
+ {
+ TCCoordSliceArr aCoordSliceArr(myNbGauss);
+ if(GetModeSwitch() == eFULL_INTERLACE){
+ TInt anId = theElemId*myGaussStep;
+ for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){
+ aCoordSliceArr[anGaussId] =
+ TCCoordSlice(myGaussCoord,std::slice(anId,myDim,1));
+ anId += myDim;
+ }
+ }
+ else{
+ for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){
+ aCoordSliceArr[anGaussId] =
+ TCCoordSlice(myGaussCoord,std::slice(theElemId,myDim,myGaussStep));
+ }
+ }
+ return aCoordSliceArr;
+ }
+
+
+ TCoordSliceArr
+ TGaussCoord
+ ::GetCoordSliceArr(TInt theElemId)
+ {
+ TCoordSliceArr aCoordSliceArr(myNbGauss);
+ if(GetModeSwitch() == eFULL_INTERLACE){
+ TInt anId = theElemId*myGaussStep;
+ for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){
+ aCoordSliceArr[anGaussId] =
+ TCoordSlice(myGaussCoord,std::slice(anId,myDim,1));
+ anId += myDim;
+ }
+ }
+ else{
+ for(TInt anGaussId = 0; anGaussId < myNbGauss; anGaussId++){
+ aCoordSliceArr[anGaussId] =
+ TCoordSlice(myGaussCoord,std::slice(theElemId,myDim,myGaussStep));
+ }
+ }
+ return aCoordSliceArr;
+ }
+
+
+ //---------------------------------------------------------------
+ inline
+ bool
+ IsEqual(TFloat theLeft, TFloat theRight)
+ {
+ static TFloat EPS = 1.0E-3;
+ if(fabs(theLeft) + fabs(theRight) > EPS)
+ return fabs(theLeft-theRight)/(fabs(theLeft)+fabs(theRight)) < EPS;
+ return true;
+ }
+
+
+ //---------------------------------------------------------------
+ class TShapeFun::TFun
+ {
+ TFloatVector myFun;
+ TInt myNbRef;
+
+ public:
+
+ void
+ Init(TInt theNbGauss,
+ TInt theNbRef)
+ {
+ myFun.resize(theNbGauss*theNbRef);
+ myNbRef = theNbRef;
+ }
+
+ TCFloatVecSlice
+ GetFunSlice(TInt theGaussId) const
+ {
+ return TCFloatVecSlice(myFun,std::slice(theGaussId*myNbRef,myNbRef,1));
+ }
+
+ TFloatVecSlice
+ GetFunSlice(TInt theGaussId)
+ {
+ return TFloatVecSlice(myFun,std::slice(theGaussId*myNbRef,myNbRef,1));
+ }
+ };
+
+ //---------------------------------------------------------------
+
+ TShapeFun::TShapeFun(TInt theDim, TInt theNbRef):
+ myRefCoord(theNbRef*theDim),
+ myDim(theDim),
+ myNbRef(theNbRef)
+ {}
+
+ TCCoordSlice
+ TShapeFun::GetCoord(TInt theRefId) const
+ {
+ return TCCoordSlice(myRefCoord,std::slice(theRefId*myDim,myDim,1));
+ }
+
+ TCoordSlice
+ TShapeFun::GetCoord(TInt theRefId)
+ {
+ return TCoordSlice(myRefCoord,std::slice(theRefId*myDim,myDim,1));
+ }
+
+ void
+ TShapeFun::GetFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ TInt aNbRef = theRef.size();
+ TInt aNbGauss = theGauss.size();
+ theFun.Init(aNbGauss,aNbRef);
+ }
+
+ bool
+ TShapeFun::IsSatisfy(const TCCoordSliceArr& theRefCoord) const
+ {
+ TInt aNbRef = theRefCoord.size();
+ TInt aNbRef2 = GetNbRef();
+ INITMSG(MYDEBUG,"TShapeFun::IsSatisfy "<<
+ "- aNbRef("<<aNbRef<<")"<<
+ "; aNbRef2("<<aNbRef2<<")\n");
+ bool anIsSatisfy = (aNbRef == aNbRef2);
+ if(anIsSatisfy){
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ const TCCoordSlice& aCoord2 = theRefCoord[aRefId];
+ TCCoordSlice aCoord = GetCoord(aRefId);
+ TInt aDim = aCoord.size();
+ bool anIsEqual = false;
+ for(TInt anId = 0; anId < aDim; anId++){
+ anIsEqual = IsEqual(aCoord[anId],aCoord2[anId]);
+ if(!anIsEqual){
+ anIsSatisfy = false;
+ break;
+ }
+ }
+ if(!anIsEqual){
+#ifdef _DEBUG_
+ TCCoordSlice aCoord = GetCoord(aRefId);
+ INITMSG(MYDEBUG,aRefId + 1<<": aCoord = {");
+ TInt aDim = aCoord.size();
+ for(TInt anId = 0; anId < aDim; anId++)
+ ADDMSG(MYDEBUG,"\t"<<aCoord[anId]);
+ const TCCoordSlice& aCoord2 = theRefCoord[aRefId];
+ ADDMSG(MYDEBUG,"}\t!=\taCoord2 = {");
+ for(TInt anId = 0; anId < aDim; anId++)
+ ADDMSG(MYDEBUG,"\t"<<aCoord2[anId]);
+ ADDMSG(MYDEBUG,"}\n");
+#endif
+#ifndef _DEBUG_
+ BEGMSG(MYDEBUG,"anIsSatisfy = "<<anIsSatisfy<<"\n");
+ return anIsSatisfy;
+#endif
+ }
+ }
+ }
+
+ BEGMSG(MYDEBUG,"anIsSatisfy = "<<anIsSatisfy<<"\n");
+ return anIsSatisfy;
+ }
+
+ bool
+ TShapeFun::Eval(const TCellInfo& theCellInfo,
+ const TNodeInfo& theNodeInfo,
+ const TElemNum& theElemNum,
+ const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TGaussCoord& theGaussCoord,
+ EModeSwitch theMode)
+ {
+ INITMSG(MYDEBUG,"TShapeFun::Eval"<<std::endl);
+
+ if(IsSatisfy(theRef)){
+ const PMeshInfo& aMeshInfo = theCellInfo.GetMeshInfo();
+ TInt aDim = aMeshInfo->GetDim();
+ TInt aNbGauss = theGauss.size();
+
+ bool anIsSubMesh = !theElemNum.empty();
+ TInt aNbElem;
+ if(anIsSubMesh)
+ aNbElem = theElemNum.size();
+ else
+ aNbElem = theCellInfo.GetNbElem();
+
+ theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode);
+
+ TFun aFun;
+ InitFun(theRef,theGauss,aFun);
+ TInt aConnDim = theCellInfo.GetConnDim();
+
+ INITMSG(MYDEBUG,"aDim = "<<aDim<<
+ "; aNbGauss = "<<aNbGauss<<
+ "; aNbElem = "<<aNbElem<<
+ "; aNbNodes = "<<theNodeInfo.GetNbElem()<<
+ std::endl);
+
+ for(TInt anElemId = 0; anElemId < aNbElem; anElemId++){
+ TInt aCellId = anIsSubMesh? theElemNum[anElemId]-1: anElemId;
+ TCConnSlice aConnSlice = theCellInfo.GetConnSlice(aCellId);
+ TCoordSliceArr aCoordSliceArr = theGaussCoord.GetCoordSliceArr(anElemId);
+
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ TCoordSlice& aGaussCoordSlice = aCoordSliceArr[aGaussId];
+ TCFloatVecSlice aFunSlice = aFun.GetFunSlice(aGaussId);
+
+ for(TInt aConnId = 0; aConnId < aConnDim; aConnId++){
+ TInt aNodeId = aConnSlice[aConnId] - 1;
+ TCCoordSlice aNodeCoordSlice = theNodeInfo.GetCoordSlice(aNodeId);
+
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ aGaussCoordSlice[aDimId] += aNodeCoordSlice[aDimId]*aFunSlice[aConnId];
+ }
+ }
+ }
+ }
+
+#ifdef _DEBUG_
+ {
+ INITMSG(MYVALUEDEBUG,"theGauss: ");
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ TCCoordSlice aCoordSlice = theGauss[aGaussId];
+ ADDMSG(MYVALUEDEBUG,"{");
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ ADDMSG(MYVALUEDEBUG,aCoordSlice[aDimId]<<" ");
+ }
+ ADDMSG(MYVALUEDEBUG,"} ");
+ }
+ ADDMSG(MYVALUEDEBUG,std::endl);
+ }
+ for(TInt anElemId = 0; anElemId < aNbElem; anElemId++){
+ TCCoordSliceArr aCoordSliceArr = theGaussCoord.GetCoordSliceArr(anElemId);
+ INITMSG(MYVALUEDEBUG,"");
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ TCCoordSlice aCoordSlice = aCoordSliceArr[aGaussId];
+ ADDMSG(MYVALUEDEBUG,"{");
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ ADDMSG(MYVALUEDEBUG,aCoordSlice[aDimId]<<" ");
+ }
+ ADDMSG(MYVALUEDEBUG,"} ");
+ }
+ ADDMSG(MYVALUEDEBUG,std::endl);
+ }
+#endif
+ return true;
+ }
+
+ return false;
+ }
+
+
+ //---------------------------------------------------------------
+ TSeg2a::TSeg2a():TShapeFun(1,2)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; break;
+ case 1: aCoord[0] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ TSeg2a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*(1.0 - aCoord[0]);
+ aSlice[1] = 0.5*(1.0 + aCoord[0]);
+ }
+ }
+
+
+ //---------------------------------------------------------------
+ TSeg3a::TSeg3a():TShapeFun(1,3)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; break;
+ case 1: aCoord[0] = 1.0; break;
+ case 2: aCoord[0] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TSeg3a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*(1.0 - aCoord[0])*aCoord[0];
+ aSlice[1] = 0.5*(1.0 + aCoord[0])*aCoord[0];
+ aSlice[2] = (1.0 + aCoord[0])*(1.0 - aCoord[0]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TTria3a::TTria3a():
+ TShapeFun(2,3)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+ }
+ }
+ }
+
+ void
+ TTria3a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*(1.0 + aCoord[1]);
+ aSlice[1] = -0.5*(aCoord[0] + aCoord[1]);
+ aSlice[2] = 0.5*(1.0 + aCoord[0]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TTria6a::TTria6a():TShapeFun(2,6)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+
+ case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+ case 4: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
+ case 5: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TTria6a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*(1.0 + aCoord[1])*aCoord[1];
+ aSlice[1] = 0.5*(aCoord[0] + aCoord[1])*(aCoord[0] + aCoord[1] + 1);
+ aSlice[2] = 0.5*(1.0 + aCoord[0])*aCoord[0];
+
+ aSlice[3] = -1.0*(1.0 + aCoord[1])*(aCoord[0] + aCoord[1]);
+ aSlice[4] = -1.0*(1.0 + aCoord[0])*(aCoord[0] + aCoord[1]);
+ aSlice[5] = (1.0 + aCoord[1])*(1.0 + aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TTria3b::TTria3b():
+ TShapeFun(2,3)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
+ case 1: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
+ case 2: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ TTria3b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 1.0 - aCoord[0] - aCoord[1];
+ aSlice[1] = aCoord[0];
+ aSlice[2] = aCoord[1];
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TTria6b::TTria6b():
+ TShapeFun(2,6)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
+ case 1: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
+ case 2: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
+
+ case 3: aCoord[0] = 0.5; aCoord[1] = 0.0; break;
+ case 4: aCoord[0] = 0.5; aCoord[1] = 0.5; break;
+ case 5: aCoord[0] = 0.0; aCoord[1] = 0.5; break;
+ }
+ }
+ }
+
+ void
+ TTria6b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = (1.0 - aCoord[0] - aCoord[1])*(1.0 - 2.0*aCoord[0] - 2.0*aCoord[1]);
+ aSlice[1] = aCoord[0]*(2.0*aCoord[0] - 1.0);
+ aSlice[2] = aCoord[1]*(2.0*aCoord[1] - 1.0);
+
+ aSlice[3] = 4.0*aCoord[0]*(1.0 - aCoord[0] - aCoord[1]);
+ aSlice[4] = 4.0*aCoord[0]*aCoord[1];
+ aSlice[5] = 4.0*aCoord[1]*(1.0 - aCoord[0] - aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TQuad4a::TQuad4a():
+ TShapeFun(2,4)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ TQuad4a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.25*(1.0 + aCoord[1])*(1.0 - aCoord[0]);
+ aSlice[1] = 0.25*(1.0 - aCoord[1])*(1.0 - aCoord[0]);
+ aSlice[2] = 0.25*(1.0 - aCoord[1])*(1.0 + aCoord[0]);
+ aSlice[3] = 0.25*(1.0 + aCoord[0])*(1.0 + aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TQuad8a::TQuad8a():
+ TShapeFun(2,8)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
+
+ case 4: aCoord[0] = -1.0; aCoord[1] = 0.0; break;
+ case 5: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
+ case 6: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
+ case 7: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ TQuad8a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.25*(1.0 + aCoord[1])*(1.0 - aCoord[0])*(aCoord[1] - aCoord[0] - 1.0);
+ aSlice[1] = 0.25*(1.0 - aCoord[1])*(1.0 - aCoord[0])*(-aCoord[1] - aCoord[0] - 1.0);
+ aSlice[2] = 0.25*(1.0 - aCoord[1])*(1.0 + aCoord[0])*(-aCoord[1] + aCoord[0] - 1.0);
+ aSlice[3] = 0.25*(1.0 + aCoord[1])*(1.0 + aCoord[0])*(aCoord[1] + aCoord[0] - 1.0);
+
+ aSlice[4] = 0.5*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[1]);
+ aSlice[5] = 0.5*(1.0 - aCoord[1])*(1.0 - aCoord[0])*(1.0 + aCoord[0]);
+ aSlice[6] = 0.5*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[1]);
+ aSlice[7] = 0.5*(1.0 + aCoord[1])*(1.0 - aCoord[0])*(1.0 + aCoord[0]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TQuad9a::TQuad9a():
+ TShapeFun(2,9)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
+
+ case 4: aCoord[0] = -1.0; aCoord[1] = 0.0; break;
+ case 5: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
+ case 6: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
+ case 7: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
+
+ case 8: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TQuad9a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] + 1.0)*(aCoord[1] - 1.0);
+ aSlice[1] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] + 1.0)*(aCoord[1] + 1.0);
+ aSlice[2] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] - 1.0)*(aCoord[1] + 1.0);
+ aSlice[3] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] - 1.0)*(aCoord[1] - 1.0);
+
+ aSlice[4] = 0.5*aCoord[0]*(aCoord[0] + 1.0)*(1.0 - aCoord[1]*aCoord[1]);
+ aSlice[5] = 0.5*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] + 1.0);
+ aSlice[6] = 0.5*aCoord[0]*(aCoord[0] - 1.0)*(1.0 - aCoord[1]*aCoord[1]);
+ aSlice[7] = 0.5*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] - 1.0);
+
+ aSlice[8] = (1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1]*aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TQuad4b::TQuad4b():
+ TShapeFun(2,4)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
+ case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ TQuad4b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.25*(1.0 - aCoord[0])*(1.0 - aCoord[1]);
+ aSlice[1] = 0.25*(1.0 + aCoord[0])*(1.0 - aCoord[1]);
+ aSlice[2] = 0.25*(1.0 + aCoord[0])*(1.0 + aCoord[1]);
+ aSlice[3] = 0.25*(1.0 - aCoord[0])*(1.0 + aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TQuad8b::TQuad8b():
+ TShapeFun(2,8)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
+ case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+
+ case 4: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
+ case 6: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
+ case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TQuad8b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.25*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(-1.0 - aCoord[0] - aCoord[1]);
+ aSlice[1] = 0.25*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(-1.0 + aCoord[0] - aCoord[1]);
+ aSlice[2] = 0.25*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(-1.0 + aCoord[0] + aCoord[1]);
+ aSlice[3] = 0.25*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(-1.0 - aCoord[0] + aCoord[1]);
+
+ aSlice[4] = 0.5*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1]);
+ aSlice[5] = 0.5*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0]);
+ aSlice[6] = 0.5*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1]);
+ aSlice[7] = 0.5*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0]);
+
+ //aSlice[4] = 0.5*(1.0 - aCoord[0])*(1.0 - aCoord[0])*(1.0 - aCoord[1]);
+ //aSlice[5] = 0.5*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[1]);
+ //aSlice[6] = 0.5*(1.0 - aCoord[0])*(1.0 - aCoord[0])*(1.0 + aCoord[1]);
+ //aSlice[7] = 0.5*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TQuad9b::TQuad9b():
+ TShapeFun(2,9)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; break;
+ case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; break;
+ case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; break;
+
+ case 4: aCoord[0] = 0.0; aCoord[1] = -1.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; break;
+ case 6: aCoord[0] = 0.0; aCoord[1] = 1.0; break;
+ case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; break;
+
+ case 8: aCoord[0] = 0.0; aCoord[1] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TQuad9b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] - 1.0)*(aCoord[1] - 1.0);
+ aSlice[1] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] + 1.0)*(aCoord[1] - 1.0);
+ aSlice[2] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] + 1.0)*(aCoord[1] + 1.0);
+ aSlice[3] = 0.25*aCoord[0]*aCoord[1]*(aCoord[0] - 1.0)*(aCoord[1] + 1.0);
+
+ aSlice[4] = 0.5*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] - 1.0);
+ aSlice[5] = 0.5*aCoord[0]*(aCoord[0] + 1.0)*(1.0 - aCoord[1]*aCoord[1]);
+ aSlice[6] = 0.5*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] + 1.0);
+ aSlice[7] = 0.5*aCoord[0]*(aCoord[0] - 1.0)*(1.0 - aCoord[1]*aCoord[1]);
+
+ aSlice[8] = (1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1]*aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TTetra4a::TTetra4a():
+ TShapeFun(3,4)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TTetra4a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = aCoord[1];
+ aSlice[1] = aCoord[2];
+ aSlice[2] = 1.0 - aCoord[0] - aCoord[1] - aCoord[2];
+ aSlice[3] = aCoord[0];
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TTetra10a::TTetra10a():
+ TShapeFun(3,10)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+
+ case 4: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 5: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 6: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+
+ case 7: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 8: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TTetra10a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = aCoord[1]*(2.0*aCoord[1] - 1.0);
+ aSlice[1] = aCoord[2]*(2.0*aCoord[2] - 1.0);
+ aSlice[2] = (1.0 - aCoord[0] - aCoord[1] - aCoord[2])*(1.0 - 2.0*aCoord[0] - 2.0*aCoord[1] - 2.0*aCoord[2]);
+ aSlice[3] = aCoord[0]*(2.0*aCoord[0] - 1.0);
+
+ aSlice[4] = 4.0*aCoord[1]*aCoord[2];
+ aSlice[5] = 4.0*aCoord[2]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+ aSlice[6] = 4.0*aCoord[1]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+
+ aSlice[7] = 4.0*aCoord[0]*aCoord[1];
+ aSlice[8] = 4.0*aCoord[0]*aCoord[2];
+ aSlice[9] = 4.0*aCoord[0]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+
+
+ TTetra4b::TTetra4b():
+ TShapeFun(3,4)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TTetra4b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = aCoord[1];
+ aSlice[2] = aCoord[2];
+ aSlice[1] = 1.0 - aCoord[0] - aCoord[1] - aCoord[2];
+ aSlice[3] = aCoord[0];
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TTetra10b::TTetra10b():
+ TShapeFun(3,10)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+
+ case 6: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 5: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 4: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+
+ case 7: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 8: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TTetra10b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = aCoord[1]*(2.0*aCoord[1] - 1.0);
+ aSlice[2] = aCoord[2]*(2.0*aCoord[2] - 1.0);
+ aSlice[1] = (1.0 - aCoord[0] - aCoord[1] - aCoord[2])*(1.0 - 2.0*aCoord[0] - 2.0*aCoord[1] - 2.0*aCoord[2]);
+ aSlice[3] = aCoord[0]*(2.0*aCoord[0] - 1.0);
+
+ aSlice[6] = 4.0*aCoord[1]*aCoord[2];
+ aSlice[5] = 4.0*aCoord[2]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+ aSlice[4] = 4.0*aCoord[1]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+
+ aSlice[7] = 4.0*aCoord[0]*aCoord[1];
+ aSlice[9] = 4.0*aCoord[0]*aCoord[2];
+ aSlice[8] = 4.0*aCoord[0]*(1.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ THexa8a::THexa8a():
+ TShapeFun(3,8)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ case 7: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ THexa8a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[1] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[2] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[3] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]);
+
+ aSlice[4] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[5] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[6] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[7] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]);
+ }
+ }
+
+
+ //---------------------------------------------------------------
+ THexa20a::THexa20a(TInt theDim, TInt theNbRef):
+ TShapeFun(theDim,theNbRef)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 1: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 3: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ case 7: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+
+ case 8: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 9: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
+ case 10: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 11: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
+ case 12: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 13: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 14: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 15: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 16: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 17: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 18: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ case 19: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ THexa20a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+ aSlice[1] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 + aCoord[0] - aCoord[1] - aCoord[2]);
+ aSlice[2] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 + aCoord[0] + aCoord[1] - aCoord[2]);
+ aSlice[3] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 - aCoord[0] + aCoord[1] - aCoord[2]);
+ aSlice[4] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 - aCoord[0] - aCoord[1] + aCoord[2]);
+ aSlice[5] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 + aCoord[0] - aCoord[1] + aCoord[2]);
+ aSlice[6] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 + aCoord[0] + aCoord[1] + aCoord[2]);
+ aSlice[7] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 - aCoord[0] + aCoord[1] + aCoord[2]);
+
+ aSlice[8] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[9] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0])*(1.0 - aCoord[2]);
+ aSlice[10] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[11] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0])*(1.0 - aCoord[2]);
+ aSlice[12] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 - aCoord[0])*(1.0 - aCoord[1]);
+ aSlice[13] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 + aCoord[0])*(1.0 - aCoord[1]);
+ aSlice[14] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 + aCoord[0])*(1.0 + aCoord[1]);
+ aSlice[15] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 - aCoord[0])*(1.0 + aCoord[1]);
+ aSlice[16] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[17] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0])*(1.0 + aCoord[2]);
+ aSlice[18] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[19] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0])*(1.0 + aCoord[2]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ THexa27a::THexa27a():
+ THexa20a(3,27)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 20: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
+ case 21: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 22: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 23: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 24: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 25: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 26: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ THexa27a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.125*aCoord[0]*(aCoord[0] - 1.0)*aCoord[1]*(aCoord[1] - 1.0)*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[1] = 0.125*aCoord[0]*(aCoord[0] + 1.0)*aCoord[1]*(aCoord[1] - 1.0)*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[2] = 0.125*aCoord[0]*(aCoord[0] + 1.0)*aCoord[1]*(aCoord[1] + 1.0)*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[3] = 0.125*aCoord[0]*(aCoord[0] - 1.0)*aCoord[1]*(aCoord[1] + 1.0)*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[4] = 0.125*aCoord[0]*(aCoord[0] + 1.0)*aCoord[1]*(aCoord[1] - 1.0)*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[5] = 0.125*aCoord[0]*(aCoord[0] + 1.0)*aCoord[1]*(aCoord[1] - 1.0)*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[6] = 0.125*aCoord[0]*(aCoord[0] + 1.0)*aCoord[1]*(aCoord[1] + 1.0)*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[7] = 0.125*aCoord[0]*(aCoord[0] - 1.0)*aCoord[1]*(aCoord[1] + 1.0)*aCoord[2]*(aCoord[2] + 1.0);
+
+ aSlice[8] = 0.25*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] - 1.0)*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[9] = 0.25*aCoord[0]*(aCoord[0] + 1.0)*(1.0 - aCoord[1]*aCoord[1])*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[10]= 0.25*aCoord[0]*(aCoord[0] + 1.0)*(1.0 - aCoord[1]*aCoord[1])*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[11]= 0.25*aCoord[0]*(aCoord[0] - 1.0)*(1.0 - aCoord[1]*aCoord[1])*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[12]= 0.25*aCoord[0]*(aCoord[0] - 1.0)*aCoord[1]*(aCoord[1] - 1.0)*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[13]= 0.25*aCoord[0]*(aCoord[0] + 1.0)*aCoord[1]*(aCoord[1] - 1.0)*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[14]= 0.25*aCoord[0]*(aCoord[0] + 1.0)*aCoord[1]*(aCoord[1] + 1.0)*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[15]= 0.25*aCoord[0]*(aCoord[0] - 1.0)*aCoord[1]*(aCoord[1] + 1.0)*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[16]= 0.25*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] - 1.0)*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[17]= 0.25*aCoord[0]*(aCoord[0] + 1.0)*(1.0 - aCoord[1]*aCoord[1])*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[18]= 0.25*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] + 1.0)*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[19]= 0.25*aCoord[0]*(aCoord[0] - 1.0)*(1.0 - aCoord[1]*aCoord[1])*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[20]= 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1]*aCoord[1])*aCoord[2]*(aCoord[2] - 1.0);
+ aSlice[21]= 0.25*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] - 1.0)*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[22]= 0.25*aCoord[0]*(aCoord[0] + 1.0)*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[23]= 0.25*(1.0 - aCoord[0]*aCoord[0])*aCoord[1]*(aCoord[1] + 1.0)*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[24]= 0.25*aCoord[0]*(aCoord[0] - 1.0)*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[2]*aCoord[2]);
+ aSlice[25]= 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1]*aCoord[1])*aCoord[2]*(aCoord[2] + 1.0);
+ aSlice[26]= 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[1]*aCoord[1]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ THexa8b::THexa8b():
+ TShapeFun(3,8)
+ {
+ TInt aNbRef = GetNbRef();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 7: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ case 5: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ THexa8b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[3] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[2] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[1] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]);
+
+ aSlice[4] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[7] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[6] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[5] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ THexa20b::THexa20b(TInt theDim, TInt theNbRef):
+ TShapeFun(theDim,theNbRef)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 2: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 4: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 7: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 6: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ case 5: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+
+ case 11: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = -1.0; break;
+ case 10: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
+ case 9: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = -1.0; break;
+ case 8: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = -1.0; break;
+ case 16: aCoord[0] = -1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 19: aCoord[0] = 1.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 18: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 17: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 15: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 1.0; break;
+ case 14: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 13: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 1.0; break;
+ case 12: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ THexa20b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 - aCoord[0] - aCoord[1] - aCoord[2]);
+ aSlice[3] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 + aCoord[0] - aCoord[1] - aCoord[2]);
+ aSlice[2] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 + aCoord[0] + aCoord[1] - aCoord[2]);
+ aSlice[1] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2])*
+ (-2.0 - aCoord[0] + aCoord[1] - aCoord[2]);
+ aSlice[4] = 0.125*(1.0 - aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 - aCoord[0] - aCoord[1] + aCoord[2]);
+ aSlice[7] = 0.125*(1.0 + aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 + aCoord[0] - aCoord[1] + aCoord[2]);
+ aSlice[6] = 0.125*(1.0 + aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 + aCoord[0] + aCoord[1] + aCoord[2]);
+ aSlice[5] = 0.125*(1.0 - aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2])*
+ (-2.0 - aCoord[0] + aCoord[1] + aCoord[2]);
+
+ aSlice[11] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[10] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0])*(1.0 - aCoord[2]);
+ aSlice[9] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1])*(1.0 - aCoord[2]);
+ aSlice[8] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0])*(1.0 - aCoord[2]);
+ aSlice[16] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 - aCoord[0])*(1.0 - aCoord[1]);
+ aSlice[19] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 + aCoord[0])*(1.0 - aCoord[1]);
+ aSlice[18] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 + aCoord[0])*(1.0 + aCoord[1]);
+ aSlice[17] = 0.25*(1.0 - aCoord[2]*aCoord[2])*(1.0 - aCoord[0])*(1.0 + aCoord[1]);
+ aSlice[15] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 - aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[14] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 + aCoord[0])*(1.0 + aCoord[2]);
+ aSlice[13] = 0.25*(1.0 - aCoord[0]*aCoord[0])*(1.0 + aCoord[1])*(1.0 + aCoord[2]);
+ aSlice[12] = 0.25*(1.0 - aCoord[1]*aCoord[1])*(1.0 - aCoord[0])*(1.0 + aCoord[2]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPenta6a::TPenta6a():
+ TShapeFun(3,6)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TPenta6a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*aCoord[1]*(1.0 - aCoord[0]);
+ aSlice[1] = 0.5*aCoord[2]*(1.0 - aCoord[0]);
+ aSlice[2] = 0.5*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]);
+
+ aSlice[3] = 0.5*aCoord[1]*(aCoord[0] + 1.0);
+ aSlice[4] = 0.5*aCoord[2]*(aCoord[0] + 1.0);
+ aSlice[5] = 0.5*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPenta6b::TPenta6b():
+ TShapeFun(3,6)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TPenta6b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*aCoord[1]*(1.0 - aCoord[0]);
+ aSlice[2] = 0.5*aCoord[2]*(1.0 - aCoord[0]);
+ aSlice[1] = 0.5*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]);
+
+ aSlice[3] = 0.5*aCoord[1]*(aCoord[0] + 1.0);
+ aSlice[5] = 0.5*aCoord[2]*(aCoord[0] + 1.0);
+ aSlice[4] = 0.5*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPenta15a::TPenta15a():
+ TShapeFun(3,15)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+
+ case 6: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 8: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 9: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 10: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 11: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 12: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 13: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 14: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TPenta15a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*aCoord[1]*(1.0 - aCoord[0])*(2.0*aCoord[1] - 2.0 - aCoord[0]);
+ aSlice[1] = 0.5*aCoord[2]*(1.0 - aCoord[0])*(2.0*aCoord[2] - 2.0 - aCoord[0]);
+ aSlice[2] = 0.5*(aCoord[0] - 1.0)*(1.0 - aCoord[1] - aCoord[2])*(aCoord[0] + 2.0*aCoord[1] + 2.0*aCoord[2]);
+
+ aSlice[3] = 0.5*aCoord[1]*(1.0 + aCoord[0])*(2.0*aCoord[1] - 2.0 + aCoord[0]);
+ aSlice[4] = 0.5*aCoord[2]*(1.0 + aCoord[0])*(2.0*aCoord[2] - 2.0 + aCoord[0]);
+ aSlice[5] = 0.5*(-aCoord[0] - 1.0)*(1.0 - aCoord[1] - aCoord[2])*(-aCoord[0] + 2.0*aCoord[1] + 2.0*aCoord[2]);
+
+ aSlice[6] = 2.0*aCoord[1]*aCoord[2]*(1.0 - aCoord[0]);
+ aSlice[7] = 2.0*aCoord[2]*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]);
+ aSlice[8] = 2.0*aCoord[1]*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]);
+
+ aSlice[9] = aCoord[1]*(1.0 - aCoord[0]*aCoord[0]);
+ aSlice[10] = aCoord[2]*(1.0 - aCoord[0]*aCoord[0]);
+ aSlice[11] = (1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]*aCoord[0]);
+
+ aSlice[12] = 2.0*aCoord[1]*aCoord[2]*(1.0 + aCoord[0]);
+ aSlice[13] = 2.0*aCoord[2]*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]);
+ aSlice[14] = 2.0*aCoord[1]*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPenta15b::TPenta15b():
+ TShapeFun(3,15)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = -1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = -0.0; aCoord[2] = 1.0; break;
+ case 1: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 1.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 5: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 4: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+
+ case 8: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 7: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 6: aCoord[0] = -1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 12: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 14: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ case 13: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 11: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 10: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 9: aCoord[0] = 1.0; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ }
+ }
+ }
+
+ void
+ TPenta15b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*aCoord[1]*(1.0 - aCoord[0])*(2.0*aCoord[1] - 2.0 - aCoord[0]);
+ aSlice[2] = 0.5*aCoord[2]*(1.0 - aCoord[0])*(2.0*aCoord[2] - 2.0 - aCoord[0]);
+ aSlice[1] = 0.5*(aCoord[0] - 1.0)*(1.0 - aCoord[1] - aCoord[2])*(aCoord[0] + 2.0*aCoord[1] + 2.0*aCoord[2]);
+
+ aSlice[3] = 0.5*aCoord[1]*(1.0 + aCoord[0])*(2.0*aCoord[1] - 2.0 + aCoord[0]);
+ aSlice[5] = 0.5*aCoord[2]*(1.0 + aCoord[0])*(2.0*aCoord[2] - 2.0 + aCoord[0]);
+ aSlice[4] = 0.5*(-aCoord[0] - 1.0)*(1.0 - aCoord[1] - aCoord[2])*(-aCoord[0] + 2.0*aCoord[1] + 2.0*aCoord[2]);
+
+ aSlice[8] = 2.0*aCoord[1]*aCoord[2]*(1.0 - aCoord[0]);
+ aSlice[7] = 2.0*aCoord[2]*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]);
+ aSlice[6] = 2.0*aCoord[1]*(1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]);
+
+ aSlice[12] = aCoord[1]*(1.0 - aCoord[0]*aCoord[0]);
+ aSlice[14] = aCoord[2]*(1.0 - aCoord[0]*aCoord[0]);
+ aSlice[13] = (1.0 - aCoord[1] - aCoord[2])*(1.0 - aCoord[0]*aCoord[0]);
+
+ aSlice[11] = 2.0*aCoord[1]*aCoord[2]*(1.0 + aCoord[0]);
+ aSlice[10] = 2.0*aCoord[2]*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]);
+ aSlice[9] = 2.0*aCoord[1]*(1.0 - aCoord[1] - aCoord[2])*(1.0 + aCoord[0]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPyra5a::TPyra5a():
+ TShapeFun(3,5)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ TPyra5a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+ // APO & RNV:
+ // Fix for 0019920: EDF 788 VISU: Bad localisation of gauss points for pyramids
+ // Seems shape function for ePYRA5 elements is:
+ // w0 = 0.25*(-X + Y - 1.0)*(-X - Y - 1.0)*(1.0 - Z);
+ // w1 = 0.25*(-X - Y - 1.0)*(+X - Y - 1.0)*(1.0 - Z);
+ // w2 = 0.25*(+X + Y - 1.0)*(+X - Y - 1.0)*(1.0 - Z);
+ // w3 = 0.25*(+X + Y - 1.0)*(-X + Y - 1.0)*(1.0 - Z);
+ // w4 = +Z;
+ aSlice[0] = 0.25*(-aCoord[0] + aCoord[1] - 1.0)*(-aCoord[0] - aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[1] = 0.25*(-aCoord[0] - aCoord[1] - 1.0)*(+aCoord[0] - aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[2] = 0.25*(+aCoord[0] + aCoord[1] - 1.0)*(+aCoord[0] - aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[3] = 0.25*(+aCoord[0] + aCoord[1] - 1.0)*(-aCoord[0] + aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[4] = aCoord[2];
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPyra5b::TPyra5b():
+ TShapeFun(3,5)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+ }
+ }
+ }
+
+ void
+ TPyra5b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+ // APO & RNV:
+ // Fix for 0019920: EDF 788 VISU: Bad localisation of gauss points for pyramids
+ // Seems shape function for ePYRA5 elements is:
+ // w0 = 0.25*(-X + Y - 1.0)*(-X - Y - 1.0)*(1.0 - Z);
+ // w1 = 0.25*(-X - Y - 1.0)*(+X - Y - 1.0)*(1.0 - Z);
+ // w2 = 0.25*(+X + Y - 1.0)*(+X - Y - 1.0)*(1.0 - Z);
+ // w3 = 0.25*(+X + Y - 1.0)*(-X + Y - 1.0)*(1.0 - Z);
+ // w4 = +Z;
+ aSlice[0] = 0.25*(-aCoord[0] + aCoord[1] - 1.0)*(-aCoord[0] - aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[3] = 0.25*(-aCoord[0] - aCoord[1] - 1.0)*(+aCoord[0] - aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[2] = 0.25*(+aCoord[0] + aCoord[1] - 1.0)*(+aCoord[0] - aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[1] = 0.25*(+aCoord[0] + aCoord[1] - 1.0)*(-aCoord[0] + aCoord[1] - 1.0)*(1.0 - aCoord[2]);
+ aSlice[4] = aCoord[2];
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPyra13a::TPyra13a():
+ TShapeFun(3,13)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+
+ case 5: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 6: aCoord[0] = -0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 7: aCoord[0] = -0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
+ case 8: aCoord[0] = 0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
+ case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 10: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 11: aCoord[0] = -0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 12: aCoord[0] = 0.0; aCoord[1] = -0.5; aCoord[2] = 0.5; break;
+ }
+ }
+ }
+
+ void
+ TPyra13a::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[0] - 0.5)/(1.0 - aCoord[2]);
+ aSlice[1] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[1] - 0.5)/(1.0 - aCoord[2]);
+ aSlice[2] = 0.5*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[0] - 0.5)/(1.0 - aCoord[2]);
+ aSlice[3] = 0.5*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[1] - 0.5)/(1.0 - aCoord[2]);
+
+ aSlice[4] = 2.0*aCoord[2]*(aCoord[2] - 0.5);
+
+ aSlice[5] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+ aSlice[6] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+ aSlice[7] = 0.5*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+ aSlice[8] = 0.5*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+
+ aSlice[9] = 0.5*aCoord[2]*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ aSlice[10] = 0.5*aCoord[2]*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ aSlice[11] = 0.5*aCoord[2]*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ aSlice[12] = 0.5*aCoord[2]*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ TPyra13b::TPyra13b():
+ TShapeFun(3,13)
+ {
+ TInt aNbRef = myRefCoord.size();
+ for(TInt aRefId = 0; aRefId < aNbRef; aRefId++){
+ TCoordSlice aCoord = GetCoord(aRefId);
+ switch(aRefId){
+ case 0: aCoord[0] = 1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 3: aCoord[0] = 0.0; aCoord[1] = 1.0; aCoord[2] = 0.0; break;
+ case 2: aCoord[0] = -1.0; aCoord[1] = 0.0; aCoord[2] = 0.0; break;
+ case 1: aCoord[0] = 0.0; aCoord[1] = -1.0; aCoord[2] = 0.0; break;
+ case 4: aCoord[0] = 0.0; aCoord[1] = 0.0; aCoord[2] = 1.0; break;
+
+ case 8: aCoord[0] = 0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 7: aCoord[0] = -0.5; aCoord[1] = 0.5; aCoord[2] = 0.0; break;
+ case 6: aCoord[0] = -0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
+ case 5: aCoord[0] = 0.5; aCoord[1] = -0.5; aCoord[2] = 0.0; break;
+ case 9: aCoord[0] = 0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 12: aCoord[0] = 0.0; aCoord[1] = 0.5; aCoord[2] = 0.5; break;
+ case 11: aCoord[0] = -0.5; aCoord[1] = 0.0; aCoord[2] = 0.5; break;
+ case 10: aCoord[0] = 0.0; aCoord[1] = -0.5; aCoord[2] = 0.5; break;
+ }
+ }
+ }
+
+ void
+ TPyra13b::InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const
+ {
+ GetFun(theRef,theGauss,theFun);
+
+ TInt aNbGauss = theGauss.size();
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ const TCCoordSlice& aCoord = theGauss[aGaussId];
+ TFloatVecSlice aSlice = theFun.GetFunSlice(aGaussId);
+
+ aSlice[0] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[0] - 0.5)/(1.0 - aCoord[2]);
+ aSlice[3] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[1] - 0.5)/(1.0 - aCoord[2]);
+ aSlice[2] = 0.5*(+aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[0] - 0.5)/(1.0 - aCoord[2]);
+ aSlice[1] = 0.5*(+aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[1] - 0.5)/(1.0 - aCoord[2]);
+
+ aSlice[4] = 2.0*aCoord[2]*(aCoord[2] - 0.5);
+
+ aSlice[8] = 0.5*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+ aSlice[7] = 0.5*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*
+ (aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+ aSlice[6] = 0.5*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+ aSlice[5] = 0.5*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*
+ (-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/(1.0 - aCoord[2]);
+
+ aSlice[9] = 0.5*aCoord[2]*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ aSlice[12] = 0.5*aCoord[2]*(-aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ aSlice[11] = 0.5*aCoord[2]*(aCoord[0] - aCoord[1] + aCoord[2] - 1.0)*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ aSlice[10] = 0.5*aCoord[2]*(aCoord[0] + aCoord[1] + aCoord[2] - 1.0)*(-aCoord[0] + aCoord[1] + aCoord[2] - 1.0)/
+ (1.0 - aCoord[2]);
+ }
+ }
+
+
+
+ //---------------------------------------------------------------
+ bool
+ GetGaussCoord3D(const TGaussInfo& theGaussInfo,
+ const TCellInfo& theCellInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum,
+ EModeSwitch theMode)
+ {
+ INITMSG(MYDEBUG,"GetGaussCoord3D\n");
+
+ if(theGaussInfo.myGeom == theCellInfo.myGeom){
+ EGeometrieElement aGeom = theGaussInfo.myGeom;
+
+ TInt aNbRef = theGaussInfo.GetNbRef();
+ TCCoordSliceArr aRefSlice(aNbRef);
+ for(TInt anId = 0; anId < aNbRef; anId++)
+ aRefSlice[anId] = theGaussInfo.GetRefCoordSlice(anId);
+
+ TInt aNbGauss = theGaussInfo.GetNbGauss();
+ TCCoordSliceArr aGaussSlice(aNbGauss);
+ for(TInt anId = 0; anId < aNbGauss; anId++)
+ aGaussSlice[anId] = theGaussInfo.GetGaussCoordSlice(anId);
+
+ switch(aGeom){
+ case eSEG2: {
+ INITMSG(MYDEBUG,"eSEG2"<<std::endl);
+
+ if(TSeg2a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eSEG3: {
+ INITMSG(MYDEBUG,"eSEG3"<<std::endl);
+
+ if(TSeg3a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eTRIA3: {
+ INITMSG(MYDEBUG,"eTRIA3"<<std::endl);
+
+ if(TTria3a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TTria3b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eTRIA6: {
+ INITMSG(MYDEBUG,"eTRIA6"<<std::endl);
+
+ if(TTria6a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TTria6b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eQUAD4: {
+ INITMSG(MYDEBUG,"eQUAD4"<<std::endl);
+
+ if(TQuad4a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TQuad4b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eQUAD8: {
+ INITMSG(MYDEBUG,"eQUAD8"<<std::endl);
+
+ if(TQuad8a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TQuad8b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eQUAD9: {
+ INITMSG(MYDEBUG,"eQUAD9"<<std::endl);
+
+ if(TQuad9a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TQuad9b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eTETRA4: {
+ INITMSG(MYDEBUG,"eTETRA4"<<std::endl);
+
+ if(TTetra4a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TTetra4b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case ePYRA5: {
+ INITMSG(MYDEBUG,"ePYRA5"<<std::endl);
+
+ if(TPyra5a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TPyra5b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case ePENTA6: {
+ INITMSG(MYDEBUG,"ePENTA6"<<std::endl);
+
+ if(TPenta6a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TPenta6b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eHEXA8: {
+ INITMSG(MYDEBUG,"eHEXA8"<<std::endl);
+
+ if(THexa8a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(THexa8b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eTETRA10: {
+ INITMSG(MYDEBUG,"eTETRA10"<<std::endl);
+
+ if(TTetra10a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TTetra10b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case ePYRA13: {
+ INITMSG(MYDEBUG,"ePYRA13"<<std::endl);
+
+ if(TPyra13a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TPyra13b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case ePENTA15: {
+ INITMSG(MYDEBUG,"ePENTA15"<<std::endl);
+
+ if(TPenta15a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(TPenta15b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ case eHEXA20: {
+ INITMSG(MYDEBUG,"eHEXA20"<<std::endl);
+
+ if(THexa20a().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ if(THexa20b().Eval(theCellInfo,theNodeInfo,theElemNum,aRefSlice,aGaussSlice,theGaussCoord,theMode))
+ return true;
+
+ break;
+ }
+ default:
+ INITMSG(MYDEBUG,"eNONE"<<std::endl);
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+ //---------------------------------------------------------------
+ bool
+ GetBaryCenter(const TCellInfo& theCellInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum,
+ EModeSwitch theMode)
+ {
+ INITMSG(MYDEBUG,"GetBaryCenter\n");
+ const PMeshInfo& aMeshInfo = theCellInfo.GetMeshInfo();
+ TInt aDim = aMeshInfo->GetDim();
+ static TInt aNbGauss = 1;
+
+ bool anIsSubMesh = !theElemNum.empty();
+ TInt aNbElem;
+ if(anIsSubMesh)
+ aNbElem = theElemNum.size();
+ else
+ aNbElem = theCellInfo.GetNbElem();
+
+ theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode);
+
+ TInt aConnDim = theCellInfo.GetConnDim();
+
+ INITMSGA(MYDEBUG,0,
+ "- aDim = "<<aDim<<
+ "; aNbGauss = "<<aNbGauss<<
+ "; aNbElem = "<<aNbElem<<
+ "; aNbNodes = "<<theNodeInfo.GetNbElem()<<
+ std::endl);
+
+ for(TInt anElemId = 0; anElemId < aNbElem; anElemId++){
+ TInt aCellId = anIsSubMesh? theElemNum[anElemId]-1: anElemId;
+ TCConnSlice aConnSlice = theCellInfo.GetConnSlice(aCellId);
+ TCoordSliceArr aCoordSliceArr = theGaussCoord.GetCoordSliceArr(anElemId);
+
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ TCoordSlice& aGaussCoordSlice = aCoordSliceArr[aGaussId];
+
+ for(TInt aConnId = 0; aConnId < aConnDim; aConnId++){
+ TInt aNodeId = aConnSlice[aConnId] - 1;
+ TCCoordSlice aNodeCoordSlice = theNodeInfo.GetCoordSlice(aNodeId);
+
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ aGaussCoordSlice[aDimId] += aNodeCoordSlice[aDimId];
+ }
+ }
+
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ aGaussCoordSlice[aDimId] /= aConnDim;
+ }
+ }
+ }
+
+#ifdef _DEBUG_
+ for(TInt anElemId = 0; anElemId < aNbElem; anElemId++){
+ TCoordSliceArr aCoordSliceArr = theGaussCoord.GetCoordSliceArr(anElemId);
+ INITMSG(MYVALUEDEBUG,"");
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ TCoordSlice& aCoordSlice = aCoordSliceArr[aGaussId];
+ ADDMSG(MYVALUEDEBUG,"{");
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ ADDMSG(MYVALUEDEBUG,aCoordSlice[aDimId]<<" ");
+ }
+ ADDMSG(MYVALUEDEBUG,"} ");
+ }
+ ADDMSG(MYVALUEDEBUG,std::endl);
+ }
+#endif
+
+ return true;
+ }
+
+
+ //---------------------------------------------------------------
+ bool
+ GetBaryCenter(const TPolygoneInfo& thePolygoneInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum,
+ EModeSwitch theMode)
+ {
+ INITMSG(MYDEBUG,"GetBaryCenter\n");
+ const PMeshInfo& aMeshInfo = thePolygoneInfo.GetMeshInfo();
+ TInt aDim = aMeshInfo->GetDim();
+ static TInt aNbGauss = 1;
+
+ bool anIsSubMesh = !theElemNum.empty();
+ TInt aNbElem;
+ if(anIsSubMesh)
+ aNbElem = theElemNum.size();
+ else
+ aNbElem = thePolygoneInfo.GetNbElem();
+
+ theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode);
+
+ INITMSGA(MYDEBUG,0,
+ "- aDim = "<<aDim<<
+ "; aNbGauss = "<<aNbGauss<<
+ "; aNbElem = "<<aNbElem<<
+ "; aNbNodes = "<<theNodeInfo.GetNbElem()<<
+ std::endl);
+
+ for(TInt anElemId = 0; anElemId < aNbElem; anElemId++){
+ TInt aCellId = anIsSubMesh? theElemNum[anElemId]-1: anElemId;
+
+ TCoordSliceArr aCoordSliceArr = theGaussCoord.GetCoordSliceArr(anElemId);
+ TCConnSlice aConnSlice = thePolygoneInfo.GetConnSlice(aCellId);
+ TInt aNbConn = thePolygoneInfo.GetNbConn(aCellId);
+ TInt aNbNodes = thePolygoneInfo.GetNbConn(aCellId);
+
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ TCoordSlice& aGaussCoordSlice = aCoordSliceArr[aGaussId];
+
+ for(TInt aConnId = 0; aConnId < aNbConn; aConnId++){
+ TInt aNodeId = aConnSlice[aConnId] - 1;
+ TCCoordSlice aNodeCoordSlice = theNodeInfo.GetCoordSlice(aNodeId);
+
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ aGaussCoordSlice[aDimId] += aNodeCoordSlice[aDimId];
+ }
+ }
+
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ aGaussCoordSlice[aDimId] /= aNbNodes;
+ }
+ }
+ }
+
+ return true;
+ }
+
+
+ //---------------------------------------------------------------
+ bool
+ GetBaryCenter(const TPolyedreInfo& thePolyedreInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum,
+ EModeSwitch theMode)
+ {
+ INITMSG(MYDEBUG,"GetBaryCenter\n");
+ const PMeshInfo& aMeshInfo = thePolyedreInfo.GetMeshInfo();
+ TInt aDim = aMeshInfo->GetDim();
+ static TInt aNbGauss = 1;
+
+ bool anIsSubMesh = !theElemNum.empty();
+ TInt aNbElem;
+ if(anIsSubMesh)
+ aNbElem = theElemNum.size();
+ else
+ aNbElem = thePolyedreInfo.GetNbElem();
+
+ theGaussCoord.Init(aNbElem,aNbGauss,aDim,theMode);
+
+ INITMSGA(MYDEBUG,0,
+ "- aDim = "<<aDim<<
+ "; aNbGauss = "<<aNbGauss<<
+ "; aNbElem = "<<aNbElem<<
+ "; aNbNodes = "<<theNodeInfo.GetNbElem()<<
+ std::endl);
+
+ for(TInt anElemId = 0; anElemId < aNbElem; anElemId++){
+ TInt aCellId = anIsSubMesh? theElemNum[anElemId]-1: anElemId;
+
+ TCoordSliceArr aCoordSliceArr = theGaussCoord.GetCoordSliceArr(anElemId);
+ TCConnSliceArr aConnSliceArr = thePolyedreInfo.GetConnSliceArr(aCellId);
+ TInt aNbFaces = aConnSliceArr.size();
+
+ TInt aNbNodes = thePolyedreInfo.GetNbNodes(aCellId);
+
+ for(TInt aGaussId = 0; aGaussId < aNbGauss; aGaussId++){
+ TCoordSlice& aGaussCoordSlice = aCoordSliceArr[aGaussId];
+
+ for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++){
+ TCConnSlice aConnSlice = aConnSliceArr[aFaceId];
+ TInt aNbConn = aConnSlice.size();
+ for(TInt aConnId = 0; aConnId < aNbConn; aConnId++){
+ TInt aNodeId = aConnSlice[aConnId] - 1;
+ TCCoordSlice aNodeCoordSlice = theNodeInfo.GetCoordSlice(aNodeId);
+
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ aGaussCoordSlice[aDimId] += aNodeCoordSlice[aDimId];
+ }
+ }
+ }
+ for(TInt aDimId = 0; aDimId < aDim; aDimId++){
+ aGaussCoordSlice[aDimId] /= aNbNodes;
+ }
+ }
+ }
+
+ return true;
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_GaussUtils_HeaderFile
+#define MED_GaussUtils_HeaderFile
+
+#include "MED_WrapperBase.hxx"
+
+#include "MED_Structures.hxx"
+
+namespace MED
+{
+ //---------------------------------------------------------------
+ typedef TVector<TCCoordSlice> TCCoordSliceArr;
+ typedef TVector<TCoordSlice> TCoordSliceArr;
+
+ //! Define a helper class to handle Gauss Points coordinates
+ class MEDWRAPPER_EXPORT TGaussCoord:
+ virtual TModeSwitchInfo
+ {
+ TInt myNbElem;
+ TInt myNbGauss;
+ TInt myDim;
+
+ TInt myGaussStep;
+
+ TNodeCoord myGaussCoord;
+
+ public:
+
+ TGaussCoord();
+
+ //! To init the class
+ void
+ Init(TInt theNbElem,
+ TInt theNbGauss,
+ TInt theDim,
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+ TInt
+ GetNbElem() const;
+
+ TInt
+ GetNbGauss() const;
+
+ TInt
+ GetDim() const;
+
+ unsigned char*
+ GetValuePtr();
+
+ //! Get slice of the coordinate that corresponds to defined cell (const version)
+ TCCoordSliceArr
+ GetCoordSliceArr(TInt theElemId) const;
+
+ //! Get slice of the coordinate that corresponds to defined cell
+ TCoordSliceArr
+ GetCoordSliceArr(TInt theElemId);
+ };
+ typedef SharedPtr<TGaussCoord> PGaussCoord;
+
+
+ //---------------------------------------------------------------
+ //! To calculate Gauss Points coordinates
+ MEDWRAPPER_EXPORT
+ bool
+ GetGaussCoord3D(const TGaussInfo& theGaussInfo,
+ const TCellInfo& theCellInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum = TElemNum(),
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+
+ //---------------------------------------------------------------
+ //! To calculate Gauss Points coordinates for defined TCellInfo as its bary center
+ MEDWRAPPER_EXPORT
+ bool
+ GetBaryCenter(const TCellInfo& theCellInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum = TElemNum(),
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+ //! To calculate Gauss Points coordinates for defined TPolygoneInfo as its bary center
+ MEDWRAPPER_EXPORT
+ bool
+ GetBaryCenter(const TPolygoneInfo& thePolygoneInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum = TElemNum(),
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+ //! To calculate Gauss Points coordinates for defined TPolyedreInfo as its bary center
+ MEDWRAPPER_EXPORT
+ bool
+ GetBaryCenter(const TPolyedreInfo& thePolyedreInfo,
+ const TNodeInfo& theNodeInfo,
+ TGaussCoord& theGaussCoord,
+ const TElemNum& theElemNum = TElemNum(),
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+ //---------------------------------------------------------------
+ //! Shape function definitions
+ //---------------------------------------------------------------
+ struct MEDWRAPPER_EXPORT TShapeFun
+ {
+ class TFun;
+
+ TFloatVector myRefCoord;
+ TInt myDim;
+ TInt myNbRef;
+
+ TShapeFun(TInt theDim = 0, TInt theNbRef = 0);
+
+ TInt GetNbRef() const { return myNbRef; }
+
+ TCCoordSlice GetCoord(TInt theRefId) const;
+
+ TCoordSlice GetCoord(TInt theRefId);
+
+ void GetFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ virtual
+ void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const = 0;
+ virtual
+ bool IsSatisfy(const TCCoordSliceArr& theRefCoord) const;
+
+ bool Eval(const TCellInfo& theCellInfo,
+ const TNodeInfo& theNodeInfo,
+ const TElemNum& theElemNum,
+ const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TGaussCoord& theGaussCoord,
+ EModeSwitch theMode);
+ };
+ //---------------------------------------------------------------
+ struct TSeg2a: TShapeFun {
+ TSeg2a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TSeg3a: TShapeFun {
+ TSeg3a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTria3a: TShapeFun {
+ TTria3a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTria6a: TShapeFun {
+ TTria6a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTria3b: TShapeFun {
+ TTria3b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTria6b: TShapeFun {
+ TTria6b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TQuad4a: TShapeFun {
+ TQuad4a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TQuad8a: TShapeFun {
+ TQuad8a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TQuad9a: TShapeFun {
+ TQuad9a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TQuad4b: TShapeFun {
+ TQuad4b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TQuad8b: TShapeFun {
+ TQuad8b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TQuad9b: TShapeFun {
+ TQuad9b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTetra4a: TShapeFun {
+ TTetra4a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTetra10a: TShapeFun {
+ TTetra10a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTetra4b: TShapeFun {
+ TTetra4b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TTetra10b: TShapeFun {
+ TTetra10b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct THexa8a: TShapeFun {
+ THexa8a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct THexa20a: TShapeFun {
+ THexa20a(TInt theDim = 3, TInt theNbRef = 20);
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct THexa27a: THexa20a {
+ THexa27a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct THexa8b: TShapeFun {
+ THexa8b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct THexa20b: TShapeFun {
+ THexa20b(TInt theDim = 3, TInt theNbRef = 20);
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPenta6a: TShapeFun {
+ TPenta6a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPenta6b: TShapeFun {
+ TPenta6b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPenta15a: TShapeFun {
+ TPenta15a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPenta15b: TShapeFun {
+ TPenta15b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPyra5a: TShapeFun {
+ TPyra5a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPyra5b: TShapeFun {
+ TPyra5b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPyra13a: TShapeFun {
+ TPyra13a();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+ struct TPyra13b: TShapeFun {
+ TPyra13b();
+ virtual void InitFun(const TCCoordSliceArr& theRef,
+ const TCCoordSliceArr& theGauss,
+ TFun& theFun) const;
+ };
+ //---------------------------------------------------------------
+
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_SharedPtr_HeaderFile
+#define MED_SharedPtr_HeaderFile
+
+#include <boost/shared_ptr.hpp>
+
+namespace MED
+{
+
+ //! To extend the boost::shared_ptr to support such features automatic dynamic cast
+ /*!
+ All entities of the MEDWrapper package are handled as pointer.
+ This class was introduced to provide correct and flexible memory management
+ for all of the MEDWrapper objects.
+ */
+ template<class T> class SharedPtr: public boost::shared_ptr<T>
+ {
+ public:
+ //! Default constructor
+ SharedPtr() {}
+
+ //! Construct the class by any type of a pointer
+ template<class Y>
+ explicit SharedPtr(Y * p):
+ boost::shared_ptr<T>(p)
+ {}
+
+ //! Construct the class by any specialisation of the class
+ template<class Y>
+ SharedPtr(SharedPtr<Y> const & r):
+ boost::shared_ptr<T>(r,boost::detail::dynamic_cast_tag())
+ {}
+
+ //! Copy-constructor
+ template<class Y>
+ SharedPtr&
+ operator=(SharedPtr<Y> const & r)
+ {
+ boost::shared_ptr<T>(r,boost::detail::dynamic_cast_tag()).swap(*this);
+ return *this;
+ }
+
+ //! Introduce a flexible way to reset the wrapped pointer
+ template<class Y>
+ SharedPtr&
+ operator()(Y * p) // Y must be complete
+ {
+ return operator=<Y>(SharedPtr<Y>(p));
+ }
+
+ //! Introduce a flexible way to reset the wrapped pointer
+ template<class Y>
+ SharedPtr&
+ operator()(SharedPtr<Y> const & r) // Y must be complete
+ {
+ return operator=<Y>(SharedPtr<Y>(r));
+ }
+
+ //! To provide a flexible way to use reference to the wrapped pointer (const version)
+ operator const T& () const
+ {
+ return *(this->get());
+ }
+
+ //! To provide a flexible way to use reference to the wrapped pointer
+ operator T& ()
+ {
+ return *(this->get());
+ }
+ };
+
+}
+
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_SliceArray_HeaderFile
+#define MED_SliceArray_HeaderFile
+
+#ifdef WIN32 // for correctly compiling "valarray" in modules, which are includes this file
+ #undef max
+ #undef min
+#endif
+
+#include <valarray>
+#include <stdexcept>
+
+//#if defined(_DEBUG_)
+# define MED_TCSLICE_CHECK_RANGE
+//#endif
+
+namespace MED
+{
+ //---------------------------------------------------------------
+ //! This class intends to provide an uniform way to handle multy-dimention data (const version)
+ /*!
+ It just contains pointer to real sequence and implement proper calcultion of its indexes.
+ This class deal with constant pointer to the sources data and provide const method to
+ read the them (data).
+ */
+ template<class TValueType>
+ class TCSlice
+ {
+ const TValueType* myCValuePtr; //!< Reference to source multy-dimension data
+ size_t mySourceSize; //!< Size of the source multy-dimension data
+ std::slice mySlice; //!< Defines algorithm of index calculation
+
+ protected:
+ void
+ check_id(size_t theId) const
+ {
+ long int anId = -1;
+ if(theId < mySlice.size()){
+ anId = mySlice.start() + theId*mySlice.stride();
+ if(anId < (long int)mySourceSize)
+ return;
+ }
+ throw std::out_of_range("TCSlice::check_id");
+ }
+
+ //! Calculate internal index to get proper element from the source multy-dimension data
+ size_t
+ calculate_id(size_t theId) const
+ {
+ return mySlice.start() + theId*mySlice.stride();
+ }
+
+ size_t
+ get_id(size_t theId) const
+ {
+#ifdef MED_TCSLICE_CHECK_RANGE
+ check_id(theId);
+#endif
+ return calculate_id(theId);
+ }
+
+ size_t
+ get_id_at(size_t theId) const
+ {
+ check_id(theId);
+ return calculate_id(theId);
+ }
+
+ public:
+ typedef TValueType value_type;
+
+ //! Construct the class from bare pointer
+ TCSlice(const value_type* theValuePtr,
+ size_t theSourceSize,
+ const std::slice& theSlice):
+ myCValuePtr(theValuePtr),
+ mySourceSize(theSourceSize),
+ mySlice(theSlice)
+ {}
+
+ //! Construct the class from corresponding container
+ TCSlice(const TVector<value_type>& theContainer,
+ const std::slice& theSlice):
+ myCValuePtr(&theContainer[0]),
+ mySourceSize(theContainer.size()),
+ mySlice(theSlice)
+ {}
+
+ //! Default constructor (dangerous)
+ TCSlice():
+ myCValuePtr(NULL)
+ {}
+
+ //! Get element by its number (const version)
+ const value_type&
+ operator[](size_t theId) const
+ {
+ return *(myCValuePtr + get_id(theId));
+ }
+
+ const value_type&
+ at(size_t theId) const
+ {
+ return *(myCValuePtr + get_id_at(theId));
+ }
+
+ //! Get range of the order numbers
+ size_t
+ size() const
+ {
+ return mySlice.size();
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ //! This class extend TCSlice functionality for non-constant case
+ template<class TValueType>
+ class TSlice: public TCSlice<TValueType>
+ {
+ TValueType* myValuePtr;
+
+ public:
+ typedef TValueType value_type;
+ typedef TCSlice<TValueType> TSupperClass;
+
+ //! Construct the class from bare pointer
+ TSlice(value_type* theValuePtr,
+ size_t theSourceSize,
+ const std::slice& theSlice):
+ TSupperClass(theValuePtr, theSourceSize, theSlice),
+ myValuePtr(theValuePtr)
+ {}
+
+ //! Construct the class from corresponding container
+ TSlice(TVector<value_type>& theContainer,
+ const std::slice& theSlice):
+ TSupperClass(theContainer, theSlice),
+ myValuePtr(&theContainer[0])
+ {}
+
+ //! Default constructor (dangerous)
+ TSlice():
+ myValuePtr(NULL)
+ {}
+
+ //! Get element by its number
+ value_type&
+ operator[](size_t theId)
+ {
+ return *(myValuePtr + this->get_id(theId));
+ }
+
+ value_type&
+ at(size_t theId)
+ {
+ return *(myValuePtr + this->get_id_at(theId));
+ }
+ };
+
+}
+
+#undef MED_TCSLICE_CHECK_RANGE
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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 : MED_Structure.cxx
+// Author : Eugeny NIKOLAEV
+//
+#include "MED_Structures.hxx"
+#include "MED_Utilities.hxx"
+
+#include <cstring>
+
+using namespace MED;
+
+namespace MED
+{
+ TInt
+ GetNbNodes(EGeometrieElement typmai)
+ {
+ return typmai%100;
+ }
+
+ std::string
+ GetString(TInt theId,
+ TInt theStep,
+ const TString& theString)
+ {
+ const char* aPos = &theString[theId*theStep];
+ TInt aSize = std::min(TInt(strlen(aPos)),theStep);
+ return std::string(aPos,aSize);
+ }
+
+ void
+ SetString(TInt theId,
+ TInt theStep,
+ TString& theString,
+ const std::string& theValue)
+ {
+ TInt aSize = std::min(TInt(theValue.size()+1),theStep);
+ char* aPos = &theString[theId*theStep];
+ strncpy(aPos,theValue.c_str(),aSize);
+ }
+
+ void
+ SetString(TInt theId,
+ TInt theStep,
+ TString& theString,
+ const TString& theValue)
+ {
+ TInt aSize = std::min(TInt(theValue.size()+1),theStep);
+ char* aPos = &theString[theId*theStep];
+ const char* aValue = &theValue[0];
+ strncpy(aPos,aValue,aSize);
+ }
+
+ TInt
+ GetDimGaussCoord(EGeometrieElement theGeom)
+ {
+ return theGeom/100;
+ }
+
+ TInt
+ GetNbRefCoord(EGeometrieElement theGeom)
+ {
+ return (theGeom%100);
+ }
+
+ //---------------------------------------------------------------
+ PFloatTimeStampValue
+ CastToFloatTimeStampValue(const PTimeStampValueBase& theTimeStampValue)
+ {
+ return theTimeStampValue;
+ }
+
+ PIntTimeStampValue
+ CastToIntTimeStampValue(const PTimeStampValueBase& theTimeStampValue)
+ {
+ return theTimeStampValue;
+ }
+}
+
+//---------------------------------------------------------------
+TInt
+TFamilyInfo
+::GetAttrId(TInt theId) const
+{
+ return myAttrId[theId];
+}
+
+TInt
+TFamilyInfo
+::GetAttrVal(TInt theId) const
+{
+ return myAttrVal[theId];
+}
+
+void
+TFamilyInfo
+::SetAttrId(TInt theId,TInt theVal)
+{
+ myAttrId[theId] = theVal;
+}
+
+void
+TFamilyInfo
+::SetAttrVal(TInt theId,TInt theVal)
+{
+ myAttrVal[theId] = theVal;
+}
+
+//---------------------------------------------------------------
+TInt
+TElemInfo
+::GetFamNum(TInt theId) const
+{
+ return (*myFamNum)[theId];
+}
+
+void
+TElemInfo
+::SetFamNum(TInt theId, TInt theVal)
+{
+ (*myFamNum)[theId] = theVal;
+ myIsFamNum = eVRAI;
+}
+
+TInt
+TElemInfo
+::GetElemNum(TInt theId) const
+{
+ return (*myElemNum)[theId];
+}
+
+void
+TElemInfo
+::SetElemNum(TInt theId, TInt theVal)
+{
+ (*myElemNum)[theId] = theVal;
+}
+
+//---------------------------------------------------------------
+TCCoordSlice
+TNodeInfo
+::GetCoordSlice(TInt theId) const
+{
+ TInt aDim = myMeshInfo->GetSpaceDim();
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TCCoordSlice(*myCoord, std::slice(theId*aDim, aDim, 1));
+ else
+ return TCCoordSlice(*myCoord, std::slice(theId, aDim, aDim));
+}
+
+TCoordSlice
+TNodeInfo
+::GetCoordSlice(TInt theId)
+{
+ TInt aDim = myMeshInfo->GetSpaceDim();
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TCoordSlice(*myCoord, std::slice(theId*aDim,aDim,1));
+ else
+ return TCoordSlice(*myCoord, std::slice(theId,aDim,aDim));
+}
+
+//---------------------------------------------------------------
+TCConnSlice
+TCellInfo
+::GetConnSlice(TInt theElemId) const
+{
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TCConnSlice(*myConn, std::slice(GetConnDim()*theElemId, GetNbNodes(myGeom), 1));
+ else
+ return TCConnSlice(*myConn, std::slice(theElemId, GetNbNodes(myGeom), GetConnDim()));
+}
+
+TConnSlice
+TCellInfo
+::GetConnSlice(TInt theElemId)
+{
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TConnSlice(*myConn, std::slice(GetConnDim()*theElemId, GetNbNodes(myGeom), 1));
+ else
+ return TConnSlice(*myConn, std::slice(theElemId, GetNbNodes(myGeom), GetConnDim()));
+}
+
+
+//---------------------------------------------------------------
+TInt
+TPolygoneInfo
+::GetNbConn(TInt theElemId) const
+{
+ return (*myIndex)[theElemId + 1] - (*myIndex)[theElemId];
+}
+
+TCConnSlice
+TPolygoneInfo
+::GetConnSlice(TInt theElemId) const
+{
+ return TCConnSlice(*myConn, std::slice((*myIndex)[theElemId] - 1, GetNbConn(theElemId), 1));
+}
+
+TConnSlice
+TPolygoneInfo
+::GetConnSlice(TInt theElemId)
+{
+ return TConnSlice(*myConn, std::slice((*myIndex)[theElemId] - 1, GetNbConn(theElemId), 1));
+}
+
+
+//---------------------------------------------------------------
+TInt
+TPolyedreInfo
+::GetNbFaces(TInt theElemId) const
+{
+ return (*myIndex)[theElemId+1] - (*myIndex)[theElemId];
+}
+
+TInt
+TPolyedreInfo
+::GetNbNodes(TInt theElemId) const
+{
+ TInt aNbNodes = 0;
+ TInt aNbFaces = GetNbFaces(theElemId);
+ TInt aStartFaceId = (*myIndex)[theElemId] - 1;
+ for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){
+ TInt aCurrentId = (*myFaces)[aStartFaceId];
+ TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId;
+ aNbNodes += aDiff;
+ }
+ return aNbNodes;
+}
+
+TCConnSliceArr
+TPolyedreInfo
+::GetConnSliceArr(TInt theElemId) const
+{
+ TInt aNbFaces = GetNbFaces(theElemId);
+ TCConnSliceArr aConnSliceArr(aNbFaces);
+ TInt aStartFaceId = (*myIndex)[theElemId] - 1;
+ for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){
+ TInt aCurrentId = (*myFaces)[aStartFaceId];
+ TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId;
+ aConnSliceArr[aFaceId] =
+ TCConnSlice(*myConn, std::slice(aCurrentId - 1, aDiff, 1));
+ }
+ return aConnSliceArr;
+}
+
+TConnSliceArr
+TPolyedreInfo
+::GetConnSliceArr(TInt theElemId)
+{
+ TInt aNbFaces = GetNbFaces(theElemId);
+ TConnSliceArr aConnSliceArr(aNbFaces);
+ TInt aStartFaceId = (*myIndex)[theElemId] - 1;
+ for(TInt aFaceId = 0; aFaceId < aNbFaces; aFaceId++, aStartFaceId++){
+ TInt aCurrentId = (*myFaces)[aStartFaceId];
+ TInt aDiff = (*myFaces)[aStartFaceId + 1] - aCurrentId;
+ aConnSliceArr[aFaceId] =
+ TConnSlice(*myConn, std::slice(aCurrentId - 1, aDiff, 1));
+ }
+ return aConnSliceArr;
+}
+
+
+//---------------------------------------------------------------
+TMeshValueBase
+::TMeshValueBase():
+ myNbElem(0),
+ myNbComp(0),
+ myNbGauss(0),
+ myStep(0)
+{}
+
+void
+TMeshValueBase
+::Allocate(TInt theNbElem,
+ TInt theNbGauss,
+ TInt theNbComp,
+ EModeSwitch theMode)
+{
+ myModeSwitch = theMode;
+
+ myNbElem = theNbElem;
+ myNbGauss = theNbGauss;
+ myNbComp = theNbComp;
+
+ myStep = theNbComp*theNbGauss;
+}
+
+size_t
+TMeshValueBase
+::GetSize() const
+{
+ return myNbElem * myStep;
+}
+
+size_t
+TMeshValueBase
+::GetNbVal() const
+{
+ return myNbElem * myNbGauss;
+}
+
+size_t
+TMeshValueBase
+::GetNbGauss() const
+{
+ return myNbGauss;
+}
+
+size_t
+TMeshValueBase
+::GetStep() const
+{
+ return myStep;
+}
+
+
+//---------------------------------------------------------------
+TInt
+TProfileInfo
+::GetElemNum(TInt theId) const
+{
+ return (*myElemNum)[theId];
+}
+
+void
+TProfileInfo
+::SetElemNum(TInt theId,TInt theVal)
+{
+ (*myElemNum)[theId] = theVal;
+}
+
+//---------------------------------------------------------------
+bool
+TGaussInfo::TLess
+::operator()(const TKey& theLeft, const TKey& theRight) const
+{
+ EGeometrieElement aLGeom = boost::get<0>(theLeft);
+ EGeometrieElement aRGeom = boost::get<0>(theRight);
+ if(aLGeom != aRGeom)
+ return aLGeom < aRGeom;
+
+ const std::string& aLStr = boost::get<1>(theLeft);
+ const std::string& aRStr = boost::get<1>(theRight);
+ return aLStr < aRStr;
+}
+
+bool
+TGaussInfo::TLess
+::operator()(const TGaussInfo& theLeft, const TGaussInfo& theRight) const
+{
+ if(!&theLeft)
+ return true;
+
+ if(!&theRight)
+ return false;
+
+ if(theLeft.myGeom != theRight.myGeom)
+ return theLeft.myGeom < theRight.myGeom;
+
+ if(theLeft.myRefCoord != theRight.myRefCoord)
+ return theLeft.myRefCoord < theRight.myRefCoord;
+
+ return theLeft.myGaussCoord < theRight.myGaussCoord;
+}
+
+TCCoordSlice
+TGaussInfo
+::GetRefCoordSlice(TInt theId) const
+{
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TCCoordSlice(myRefCoord,std::slice(theId*GetDim(),GetDim(),1));
+ else
+ return TCCoordSlice(myRefCoord,std::slice(theId,GetDim(),GetDim()));
+}
+
+TCoordSlice
+TGaussInfo
+::GetRefCoordSlice(TInt theId)
+{
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TCoordSlice(myRefCoord,std::slice(theId*GetDim(),GetDim(),1));
+ else
+ return TCoordSlice(myRefCoord,std::slice(theId,GetDim(),GetDim()));
+}
+
+TCCoordSlice
+TGaussInfo
+::GetGaussCoordSlice(TInt theId) const
+{
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TCCoordSlice(myGaussCoord,std::slice(theId*GetDim(),GetDim(),1));
+ else
+ return TCCoordSlice(myGaussCoord,std::slice(theId,GetDim(),GetDim()));
+}
+
+TCoordSlice
+TGaussInfo
+::GetGaussCoordSlice(TInt theId)
+{
+ if(GetModeSwitch() == eFULL_INTERLACE)
+ return TCoordSlice(myGaussCoord,std::slice(theId*GetDim(),GetNbGauss(),1));
+ else
+ return TCoordSlice(myGaussCoord,std::slice(theId,GetNbGauss(),GetDim()));
+}
+
+
+//---------------------------------------------------------------
+TInt
+TTimeStampInfo
+::GetNbGauss(EGeometrieElement theGeom) const
+{
+ TGeom2NbGauss::const_iterator anIter = myGeom2NbGauss.find(theGeom);
+ if(anIter == myGeom2NbGauss.end())
+ return 1;//EXCEPTION(runtime_error,"TTimeStampInfo::GetNbGauss - myGeom2NbGauss.find(theGeom) fails");
+
+ return anIter->second;
+}
+
+
+//---------------------------------------------------------------
+// TGrilleInfo structure methods
+//---------------------------------------------------------------
+const EGrilleType&
+TGrilleInfo
+::GetGrilleType() const
+{
+ return myGrilleType;
+}
+
+EGrilleType
+TGrilleInfo
+::GetGrilleType()
+{
+ return myGrilleType;
+}
+
+void
+TGrilleInfo
+::SetGrilleType(EGrilleType theGrilleType)
+{
+ myGrilleType = theGrilleType;
+}
+
+const
+TIndexes&
+TGrilleInfo
+::GetMapOfIndexes() const
+{
+ return myIndixes;
+}
+
+TIndexes&
+TGrilleInfo
+::GetMapOfIndexes()
+{
+ return myIndixes;
+}
+
+const
+TFloatVector&
+TGrilleInfo
+::GetIndexes(TInt theAxisNumber) const
+{
+ TIndexes::const_iterator aIter=myIndixes.find(theAxisNumber);
+ if(aIter==myIndixes.end())
+ EXCEPTION(std::runtime_error, "const TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber); fails");
+ return aIter->second;
+}
+
+TFloatVector&
+TGrilleInfo
+::GetIndexes(TInt theAxisNumber)
+{
+ TIndexes::iterator aIter=myIndixes.find(theAxisNumber);
+ if(aIter==myIndixes.end())
+ EXCEPTION(std::runtime_error, "TGrilleInfo::GetIndexes - myIndixes.find(theAxisNumber="<<theAxisNumber<<"); fails");
+ return aIter->second;
+}
+
+TInt
+TGrilleInfo
+::GetNbIndexes(TInt theAxisNumber)
+{
+ const TFloatVector& aVector=GetIndexes(theAxisNumber);
+ return aVector.size();
+}
+
+TInt
+TGrilleInfo
+::GetNbNodes()
+{
+ TInt nbNodes=0;
+ TInt aDim = myMeshInfo->GetDim();
+ for(int i=0;i<aDim;i++)
+ if(nbNodes == 0)
+ nbNodes = this->GetGrilleStructure()[i];
+ else
+ nbNodes = nbNodes*this->GetGrilleStructure()[i];
+
+ return nbNodes;
+}
+
+TInt
+TGrilleInfo
+::GetNbCells()
+{
+ TInt nbCells=0;
+ TInt aDim = myMeshInfo->GetDim();
+ for(int i=0;i<aDim;i++)
+ if(nbCells == 0)
+ nbCells = this->GetGrilleStructure()[i]-1;
+ else
+ nbCells = nbCells*(this->GetGrilleStructure()[i]-1);
+ return nbCells;
+}
+
+TInt
+TGrilleInfo
+::GetNbSubCells()
+{
+ TInt nb=0;
+ TInt aDim = myMeshInfo->GetDim();
+ switch (aDim) {
+ case 3:
+ nb =
+ (myGrilleStructure[0] ) * (myGrilleStructure[1]-1) * (myGrilleStructure[2]-1) +
+ (myGrilleStructure[0]-1) * (myGrilleStructure[1] ) * (myGrilleStructure[2]-1) +
+ (myGrilleStructure[0]-1) * (myGrilleStructure[1]-1) * (myGrilleStructure[2] );
+ break;
+ case 2:
+ nb =
+ (myGrilleStructure[0] ) * (myGrilleStructure[1]-1) +
+ (myGrilleStructure[0]-1) * (myGrilleStructure[1] );
+ break;
+ }
+ return nb;
+}
+
+EGeometrieElement
+TGrilleInfo
+::GetGeom()
+{
+ TInt aDim = myMeshInfo->GetDim();
+ switch(aDim){
+ case 1:
+ return eSEG2;
+ case 2:
+ return eQUAD4;
+ case 3:
+ return eHEXA8;
+ default:
+ return eNONE;
+ }
+}
+
+EGeometrieElement
+TGrilleInfo
+::GetSubGeom()
+{
+ TInt aDim = myMeshInfo->GetDim();
+ switch(aDim){
+ case 2:
+ return eSEG2;
+ case 3:
+ return eQUAD4;
+ }
+ return eNONE;
+}
+
+EEntiteMaillage
+TGrilleInfo
+::GetEntity()
+{
+ return eMAILLE;
+}
+
+EEntiteMaillage
+TGrilleInfo
+::GetSubEntity()
+{
+ TInt aDim = myMeshInfo->GetDim();
+ switch(aDim){
+ case 2:
+ return eARETE;
+ case 3:
+ return eFACE;
+ }
+ return EEntiteMaillage(-1);
+}
+
+const
+TIntVector&
+TGrilleInfo
+::GetGrilleStructure() const
+{
+ return myGrilleStructure;
+}
+
+TIntVector
+TGrilleInfo
+::GetGrilleStructure()
+{
+ return myGrilleStructure;
+}
+
+void
+TGrilleInfo
+::SetGrilleStructure(TInt theAxis,TInt theNb)
+{
+ if(theAxis >= 0 && theAxis <=2 && theNb >= 0)
+ myGrilleStructure[theAxis]=theNb;
+}
+
+const
+TNodeCoord&
+TGrilleInfo
+::GetNodeCoord() const
+{
+ return myCoord;
+}
+
+TNodeCoord&
+TGrilleInfo
+::GetNodeCoord()
+{
+ return myCoord;
+}
+
+TNodeCoord
+TGrilleInfo
+::GetCoord(TInt theId)
+{
+ TNodeCoord aCoord;
+ TInt aDim = myMeshInfo->GetDim();
+ TInt aNbNodes = this->GetNbNodes();
+ aCoord.resize(aDim);
+
+ if(theId >= aNbNodes)
+ EXCEPTION(std::runtime_error, "TGrilleInfo::GetCoord - theId out of range");
+
+ if(myGrilleType == eGRILLE_STANDARD){
+ switch(aDim){
+ case 3:
+ aCoord[2] = myCoord[aDim*theId+2];
+ case 2:
+ aCoord[1] = myCoord[aDim*theId+1];
+ case 1:{
+ aCoord[0] = myCoord[aDim*theId];
+ break;
+ }
+ }
+ } else {
+
+ TFloatVector aVecX = this->GetIndexes(0);
+ TInt nbIndxX = this->GetNbIndexes(0);
+
+ switch(aDim){
+ case 1:{
+ aCoord[0] = aVecX[theId];
+ break;
+ }
+ case 2:{
+ TFloatVector aVecY = this->GetIndexes(1);
+ TInt i,j,k;
+ i = j = k = 0;
+ i = theId % nbIndxX;
+ j = theId / nbIndxX;
+ if(myGrilleType == eGRILLE_CARTESIENNE){
+ aCoord[0] = aVecX[i];
+ aCoord[1] = aVecY[j];
+ } else { // eGRILLE_POLAIRE (cylindrical)
+ aCoord[0] = aVecX[i] * cos(aVecY[j]);
+ aCoord[1] = aVecX[i] * sin(aVecY[j]);
+ }
+ break;
+ }
+ case 3:{
+ TFloatVector aVecY = this->GetIndexes(1);
+ TInt nbIndxY = this->GetNbIndexes(1);
+ TFloatVector aVecZ = this->GetIndexes(2);
+ TInt i,j,k;
+ i = j = k = 0;
+
+ i = theId % nbIndxX;
+ j = (theId / nbIndxX) % nbIndxY;
+ k = theId / (nbIndxX*nbIndxY);
+
+ if(myGrilleType == eGRILLE_CARTESIENNE){
+ aCoord[0] = aVecX[i];
+ aCoord[1] = aVecY[j];
+ aCoord[2] = aVecZ[k];
+ } else { // eGRILLE_POLAIRE (cylindrical)
+ aCoord[0] = aVecX[i] * cos(aVecY[j]);
+ aCoord[1] = aVecX[i] * sin(aVecY[j]);
+ aCoord[2] = aVecZ[k];
+ }
+
+ break;
+ }
+ }
+ }
+
+ return aCoord;
+}
+
+TIntVector
+TGrilleInfo
+::GetConn(TInt theId, const bool isSub)
+{
+ TIntVector anIndexes;
+ TInt aDim = myMeshInfo->GetDim();
+
+ TInt idx;
+ TInt iMin, jMin, kMin, iMax, jMax, kMax;
+ TInt loc[3];
+
+ loc[0] = loc[1] = loc[2] = 0;
+ iMin = iMax = jMin = jMax = kMin = kMax = 0;
+
+ switch(aDim) {
+ case 3:
+ {
+ TInt nbX = this->GetGrilleStructure()[0];
+ TInt nbY = this->GetGrilleStructure()[1];
+ TInt nbZ = this->GetGrilleStructure()[2];
+ TInt d01 = nbX*nbY, dX = 1, dY = 1, dZ = 1;
+ if ( isSub )
+ {
+ if ( theId < nbX * (nbY-1) * (nbZ-1))
+ { // face is normal to X axis
+ dX = 0;
+ }
+ else if ( theId < nbX * (nbY-1) * (nbZ-1) + (nbX-1) * nbY * (nbZ-1))
+ { // face is normal to Y axis
+ theId -= nbX * (nbY-1) * (nbZ-1);
+ dY = 0;
+ }
+ else
+ {
+ theId -= nbX * (nbY-1) * (nbZ-1) + (nbX-1) * nbY * (nbZ-1);
+ dZ = 0;
+ }
+ }
+ //else
+ {
+ iMin = theId % (nbX - dX);
+ jMin = (theId / (nbX - dX)) % (nbY - dY);
+ kMin = theId / ((nbX - dX) * (nbY - dY));
+ iMax = iMin+dX;
+ jMax = jMin+dY;
+ kMax = kMin+dZ;
+ }
+ for (loc[2]=kMin; loc[2]<=kMax; loc[2]++)
+ for (loc[1]=jMin; loc[1]<=jMax; loc[1]++)
+ for (loc[0]=iMin; loc[0]<=iMax; loc[0]++)
+ {
+ idx = loc[0] + loc[1]*nbX + loc[2]*d01;
+ anIndexes.push_back(idx);
+ }
+ break;
+ }
+ case 2:
+ {
+ TInt nbX = this->GetGrilleStructure()[0];
+ TInt nbY = this->GetGrilleStructure()[1];
+ TInt dX = 1, dY = 1;
+ if ( isSub )
+ {
+ if ( theId < nbX * (nbY-1))
+ { // edge is normal to X axis
+ dX = 0;
+ }
+ else
+ {
+ theId -= nbX * (nbY-1);
+ dY = 0;
+ }
+ }
+ iMin = theId % (nbX-dX);
+ jMin = theId / (nbX-dX);
+ iMax = iMin+dX;
+ jMax = jMin+dY;
+ for (loc[1]=jMin; loc[1]<=jMax; loc[1]++)
+ for (loc[0]=iMin; loc[0]<=iMax; loc[0]++)
+ {
+ idx = loc[0] + loc[1]*nbX;
+ anIndexes.push_back(idx);
+ }
+ break;
+ }
+ case 1:
+ {
+ iMin = theId;
+ for (loc[0]=iMin; loc[0]<=iMin+1; loc[0]++)
+ {
+ idx = loc[0];
+ anIndexes.push_back(idx);
+ }
+ break;
+ }
+ }
+
+ return anIndexes;
+}
+
+TInt
+TGrilleInfo
+::GetFamNumNode(TInt theId) const
+{
+ return myFamNumNode[theId];
+}
+
+void
+TGrilleInfo
+::SetFamNumNode(TInt theId,TInt theVal)
+{
+ myFamNumNode[theId] = theVal;
+}
+
+TInt
+TGrilleInfo
+::GetFamNum(TInt theId) const
+{
+ return myFamNum[theId];
+}
+
+void
+TGrilleInfo
+::SetFamNum(TInt theId,TInt theVal)
+{
+ myFamNum[theId] = theVal;
+}
+
+TInt
+TGrilleInfo
+::GetFamSubNum(TInt theId) const
+{
+ return myFamSubNum[theId];
+}
+
+void
+TGrilleInfo
+::SetFamSubNum(TInt theId,TInt theVal)
+{
+ myFamSubNum[theId] = theVal;
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+
+#ifndef MED_Structures_HeaderFile
+#define MED_Structures_HeaderFile
+
+#include "MED_Common.hxx"
+#include "MED_Utilities.hxx"
+
+#ifdef WIN32
+#pragma warning(disable:4251)
+#endif
+
+namespace MED
+{
+
+ //---------------------------------------------------------------
+ //! Defines a type for managing sequence of strings
+ typedef TVector<char> TString;
+ typedef SharedPtr<TString> PString;
+
+ //! Extract a substring from the sequence of the strings
+ MEDWRAPPER_EXPORT
+ std::string
+ GetString(TInt theId, TInt theStep,
+ const TString& theString);
+
+ //! Set a substring in the sequence of the strings
+ MEDWRAPPER_EXPORT
+ void
+ SetString(TInt theId, TInt theStep,
+ TString& theString,
+ const std::string& theValue);
+
+ //! Set a substring in the sequence of the strings
+ MEDWRAPPER_EXPORT
+ void
+ SetString(TInt theId, TInt theStep,
+ TString& theString,
+ const TString& theValue);
+
+ //---------------------------------------------------------------
+ //! Define a parent class for all MEDWrapper classes
+ struct MEDWRAPPER_EXPORT TBase
+ {
+ virtual ~TBase() {}
+ };
+
+
+ //---------------------------------------------------------------
+ //! Define a parent class for all named MED entities
+ struct MEDWRAPPER_EXPORT TNameInfo: virtual TBase
+ {
+ TString myName; //!< Keeps its name
+ virtual std::string GetName() const = 0; //!< Gets its name
+ virtual void SetName(const std::string& theValue) = 0; //!< Set a new name
+ virtual void SetName(const TString& theValue) = 0; //!< Set a new name
+ };
+
+
+ //---------------------------------------------------------------
+ //! Define a parent class for all MED entities that contains a sequence of numbers
+ /*!
+ It defines through corresponding enumeration (EModeSwitch) how the sequence
+ should be interpreted in C or Fortran mode (eFULL_INTERLACE or eNON_INTERLACE).
+ */
+ struct MEDWRAPPER_EXPORT TModeSwitchInfo: virtual TBase
+ {
+ //! To construct instance of the class by default
+ TModeSwitchInfo():
+ myModeSwitch(eFULL_INTERLACE)
+ {}
+
+ //! To construct instance of the class
+ TModeSwitchInfo(EModeSwitch theModeSwitch):
+ myModeSwitch(theModeSwitch)
+ {}
+
+ EModeSwitch myModeSwitch; //!< Keeps the
+ EModeSwitch GetModeSwitch() const { return myModeSwitch;}
+ };
+
+
+ //---------------------------------------------------------------
+ //! Define a base class which represents MED Mesh entity
+ struct MEDWRAPPER_EXPORT TMeshInfo: virtual TNameInfo
+ {
+ TInt myDim; //!< Dimension of the mesh (0, 1, 2 or 3)
+ TInt GetDim() const { return myDim;} //!< Gets dimension of the mesh
+
+ TInt mySpaceDim;
+ TInt GetSpaceDim() const { return mySpaceDim; }
+
+ EMaillage myType; //!< Type of the mesh
+ EMaillage GetType() const { return myType;} //!< Gets type of the mesh
+
+ TString myDesc; //!< Description of the mesh
+ virtual std::string GetDesc() const = 0; //!< Get description for the mesh
+ virtual void SetDesc(const std::string& theValue) = 0; //!< Sets description for the mesh
+
+
+ };
+
+
+ //---------------------------------------------------------------
+ typedef TVector<TInt> TIntVector;
+ typedef TSlice<TInt> TIntVecSlice;
+ typedef TCSlice<TInt> TCIntVecSlice;
+
+ typedef TIntVector TFamAttr;
+
+ //! Define a base class which represents MED Family entity
+ struct MEDWRAPPER_EXPORT TFamilyInfo: virtual TNameInfo
+ {
+ PMeshInfo myMeshInfo; //!< A reference to correspondig MED Mesh
+ //! Get a reference to corresponding MED Mesh
+ const PMeshInfo& GetMeshInfo() const { return myMeshInfo;}
+
+ TInt myId; //!< An unique index of the MED FAMILY
+ TInt GetId() const { return myId;} //!< Gets number of the MED FAMILY
+ void SetId(TInt theId) { myId = theId;} //! Define number of the MED FAMILY
+
+ TInt myNbGroup; //!< Defines number MED Groups connected to
+ //! Gets number of MED GROUPS the MED FAMILY is bound to
+ TInt GetNbGroup() const { return myNbGroup;}
+
+ //! Contains sequence of the names for the MED Groups connected to
+ TString myGroupNames;
+ //! Gets name of a bound MED GROUP by its number
+ virtual std::string GetGroupName(TInt theId) const = 0;
+ //! Sets name of the defined MED GROUP by its number
+ virtual void SetGroupName(TInt theId, const std::string& theValue) = 0;
+
+ TInt myNbAttr; //!< Defines number of the MED Family attributes
+ //! Gets number of attached attributes for the MED FAMILY
+ TInt GetNbAttr() const { return myNbAttr;}
+
+ //! Defines sequence of the indexes of the MED Family attributes
+ TFamAttr myAttrId;
+ //! Get MED FAMILY attribute by its number
+ TInt GetAttrId(TInt theId) const;
+ //! Set MED FAMILY attribute by its number
+ void SetAttrId(TInt theId, TInt theVal);
+
+ //! Defines sequence of the values of the MED Family attributes
+ TFamAttr myAttrVal;
+ //! Get MED FAMILY attribute by its number
+ TInt GetAttrVal(TInt theId) const;
+ //! Set MED FAMILY attribute by its number
+ void SetAttrVal(TInt theId, TInt theVal);
+
+ //! Defines sequence of the names of the MED Family attributes
+ TString myAttrDesc;
+ //! Get value of the MED FAMILY attribute by its number
+ virtual std::string GetAttrDesc(TInt theId) const = 0;
+ //! Set value of the MED FAMILY attribute by its number
+ virtual void SetAttrDesc(TInt theId, const std::string& theValue) = 0;
+ };
+
+
+ //---------------------------------------------------------------
+ typedef TIntVector TElemNum;
+ typedef SharedPtr<TElemNum> PElemNum;
+
+ //! Define a parent class for all MED entities that describes mesh entites such as nodes and cells.
+ struct MEDWRAPPER_EXPORT TElemInfo: virtual TBase
+ {
+ PMeshInfo myMeshInfo; //!< A reference to correspondig MED Mesh
+ //! Get a reference to corresponding MED Mesh
+ const PMeshInfo& GetMeshInfo() const { return myMeshInfo;}
+
+ TInt myNbElem; //<! Number of corresponding mesh entities
+ TInt GetNbElem() const { return myNbElem;} //! Get number of mesh elements
+
+ //! Defines sequence MED Family indexes for corresponding mesh entites
+ PElemNum myFamNum;
+ //! Get number of a MED FAMILY by order number of the mesh element
+ TInt GetFamNum(TInt theId) const;
+ //! Set number of a MED FAMILY for the mesh element with the order number
+ void SetFamNum(TInt theId, TInt theVal);
+
+ //! Defines if the mesh elements are indexed
+ EBooleen myIsElemNum;
+ //! Let know if the mesh elements are indexed
+ EBooleen IsElemNum() const { return myIsElemNum;}
+
+ //! Defines if the mesh elements family are indexed
+ EBooleen myIsFamNum;
+ //! Let know if the mesh elements family are indexed
+ EBooleen IsFamNum() const { return myIsFamNum;}
+
+
+ //! Contains sequence of the indexes for the mesh elements
+ PElemNum myElemNum;
+ //! Get a reference number of the mesh element by its order number
+ TInt GetElemNum(TInt theId) const;
+ //! Set a reference number for the mesh element by its order number
+ void SetElemNum(TInt theId, TInt theVal);
+
+ //! Defines if the mesh elements are named
+ EBooleen myIsElemNames;
+ //! Let know if the mesh elements havew names
+ EBooleen IsElemNames() const { return myIsElemNames;}
+
+ //! Contains sequence of the names for the mesh elements
+ PString myElemNames;
+ //! Get name of the mesh element by its order number
+ virtual std::string GetElemName(TInt theId) const = 0;
+ //! Set name of the mesh element by its order number
+ virtual void SetElemName(TInt theId, const std::string& theValue) = 0;
+ };
+
+
+ //---------------------------------------------------------------
+ typedef TVector<TFloat> TFloatVector;
+ typedef TSlice<TFloat> TFloatVecSlice;
+ typedef TCSlice<TFloat> TCFloatVecSlice;
+
+ typedef TFloatVector TNodeCoord;
+ typedef SharedPtr<TNodeCoord> PNodeCoord;
+
+ typedef TFloatVecSlice TCoordSlice;
+ typedef TCFloatVecSlice TCCoordSlice;
+
+ //! Define a base class which represents MED Nodes entity
+ struct MEDWRAPPER_EXPORT TNodeInfo:
+ virtual TElemInfo,
+ virtual TModeSwitchInfo
+ {
+ PNodeCoord myCoord; //!< Contains all nodal coordinates
+
+ //! Gives coordinates for mesh node by its number (const version)
+ TCCoordSlice GetCoordSlice(TInt theId) const;
+ //! Gives coordinates for mesh node by its number
+ TCoordSlice GetCoordSlice(TInt theId);
+
+ ERepere mySystem; //!< Defines, which coordinate system is used
+ //! Get which coordinate system is used for the node describing
+ ERepere GetSystem() const { return mySystem;}
+ //! Set coordinate system to be used for the node describing
+ void SetSystem(ERepere theSystem) { mySystem = theSystem;}
+
+ TString myCoordNames; //!< Contains names for the coordinate dimensions
+ //! Get name of the coordinate dimension by its order number
+ virtual std::string GetCoordName(TInt theId) const = 0;
+ //! Set name of the coordinate dimension by its order number
+ virtual void SetCoordName(TInt theId, const std::string& theValue) = 0;
+
+ TString myCoordUnits; //!< Contains units for the coordinate dimensions
+ //! Get name of unit for the coordinate dimension by its order number
+ virtual std::string GetCoordUnit(TInt theId) const = 0;
+ //! Set name of unit for the coordinate dimension by its order number
+ virtual void SetCoordUnit(TInt theId, const std::string& theValue) = 0;
+ };
+
+
+ //---------------------------------------------------------------
+ typedef TIntVecSlice TConnSlice;
+ typedef TCIntVecSlice TCConnSlice;
+
+ //! Define a base class which represents MED Cells entity
+ struct MEDWRAPPER_EXPORT TCellInfo:
+ virtual TElemInfo,
+ virtual TModeSwitchInfo
+ {
+ EEntiteMaillage myEntity; //!< Defines the MED Entity where the mesh cells belongs to
+ //! Let known what MED ENTITY the cells belong to
+ EEntiteMaillage GetEntity() const { return myEntity;}
+
+ EGeometrieElement myGeom; //!< Defines the MED Geometric type of the instance
+ //! Let known what MED geometrical type the cells belong to
+ EGeometrieElement GetGeom() const { return myGeom;}
+
+ EConnectivite myConnMode; //!< Defines connectivity mode
+ //! Let known in what connectivity the cells are writen
+ EConnectivite GetConnMode() const { return myConnMode;}
+
+ virtual TInt GetConnDim() const = 0; //!< Gives step in the connectivity sequence
+
+ PElemNum myConn; //!< Defines sequence which describe connectivity for each of mesh cell
+
+ //! Gives connectivities for mesh cell by its number (const version)
+ TCConnSlice GetConnSlice(TInt theElemId) const;
+ //! Gives connectivities for mesh cell by its number
+ TConnSlice GetConnSlice(TInt theElemId);
+ };
+
+ //---------------------------------------------------------------
+ //! Define a base class which represents MED Polygon entity
+ struct MEDWRAPPER_EXPORT TPolygoneInfo:
+ virtual TElemInfo
+ {
+ //! Defines the MED Entity where the polygons belongs to
+ EEntiteMaillage myEntity; // MED_FACE|MED_MAILLE
+ //! Let known what MED ENTITY the MED Polygons belong to
+ EEntiteMaillage GetEntity() const { return myEntity;}
+
+ //! Defines the MED Geometric type of the instance
+ EGeometrieElement myGeom; // ePOLYGONE
+ //! Let known what MED geometrical type the MED Polygons belong to
+ EGeometrieElement GetGeom() const { return ePOLYGONE;}
+
+ //! Defines connectivity mode
+ EConnectivite myConnMode; // eNOD|eDESC(eDESC not used)
+ //! Let known in what connectivity the cells are writen
+ EConnectivite GetConnMode() const { return myConnMode;}
+
+ PElemNum myConn; //!< Table de connectivities
+ PElemNum myIndex; //!< Table de indexes
+
+ //! Gives number of the connectivities for the defined polygon
+ TInt GetNbConn(TInt theElemId) const;
+
+ //! Gives connectivities for polygon by its number (const version)
+ TCConnSlice GetConnSlice(TInt theElemId) const;
+ //! Gives connectivities for polygon by its number
+ TConnSlice GetConnSlice(TInt theElemId);
+ };
+
+ //---------------------------------------------------------------
+ //! Define a class representing MED_BALL structure element.
+ //
+ // This could be a generic class for any structure element
+ // holding any number of contant and variable attributes
+ // but it's too hard to implement
+ //
+ struct MEDWRAPPER_EXPORT TBallInfo:
+ virtual TCellInfo
+ {
+ TFloatVector myDiameters;
+ };
+
+ //---------------------------------------------------------------
+ typedef TVector<TCConnSlice> TCConnSliceArr;
+ typedef TVector<TConnSlice> TConnSliceArr;
+
+ //! Define a base class which represents MED Polyedre entity
+ struct MEDWRAPPER_EXPORT TPolyedreInfo:
+ virtual TElemInfo
+ {
+ //! Defines the MED Entity where the polyedres belongs to
+ EEntiteMaillage myEntity; // MED_FACE|MED_MAILLE
+ //! Let known what MED ENTITY the MED Polyedres belong to
+ EEntiteMaillage GetEntity() const { return myEntity;}
+
+ //! Defines the MED Geometric type of the instance
+ EGeometrieElement myGeom; // ePOLYEDRE
+ //! Let known what MED geometrical type the MED Polyedres belong to
+ EGeometrieElement GetGeom() const { return ePOLYEDRE;}
+
+ //! Defines connectivity mode
+ EConnectivite myConnMode; // eNOD|eDESC(eDESC not used)
+ //! Let known in what connectivity the cells are writen
+ EConnectivite GetConnMode() const { return myConnMode;}
+
+ PElemNum myConn; //!< Table de connectivities
+ PElemNum myFaces; //!< Table de faces indexes
+ PElemNum myIndex; //!< Table de indexes
+
+ //! Gives number of the faces for the defined polyedre (const version)
+ TInt GetNbFaces(TInt theElemId) const;
+ //! Gives number of the nodes for the defined polyedre
+ TInt GetNbNodes(TInt theElemId) const;
+
+ //! Gives sequence of the face connectivities for polyedre by its number (const version)
+ TCConnSliceArr GetConnSliceArr(TInt theElemId) const;
+ //! Gives sequence of the face connectivities for polyedre by its number
+ TConnSliceArr GetConnSliceArr(TInt theElemId);
+ };
+
+ //---------------------------------------------------------------
+ //! Define a base class which represents MED Field entity
+ struct MEDWRAPPER_EXPORT TFieldInfo:
+ virtual TNameInfo
+ {
+ PMeshInfo myMeshInfo; //!< A reference to correspondig MED Mesh
+ //! Get a reference to corresponding MED Mesh
+ const PMeshInfo& GetMeshInfo() const { return myMeshInfo;}
+
+ ETypeChamp myType; //!< Defines type of the MED Field
+ //! Let known what type of the MED FIELD is used
+ ETypeChamp GetType() const { return myType;}
+
+ TInt myNbComp; //!< Defines number of components stored in the field
+ //! Get number of components for the MED FIELD
+ TInt GetNbComp() const { return myNbComp;}
+
+ EBooleen myIsLocal; //!< Defines if the MED Field is local
+ //! Let known is the MED FIELD is local or not
+ EBooleen GetIsLocal() const { return myIsLocal;}
+
+ TInt myNbRef; //!< Defines number of refereces of the field
+ //! Let known number of references for the MED FIELD
+ TInt GetNbRef() const { return myNbRef;}
+
+ TString myCompNames; //!< Contains names for each of MED Field components
+ //! Get name of the component by its order number
+ virtual std::string GetCompName(TInt theId) const = 0;
+ //! Set name for the component by its order number
+ virtual void SetCompName(TInt theId, const std::string& theValue) = 0;
+
+ TString myUnitNames; //!< Contains units for each of MED Field components
+ //! Get unit of the component by its order number
+ virtual std::string GetUnitName(TInt theId) const = 0;
+ //! Set unit for the component by its order number
+ virtual void SetUnitName(TInt theId, const std::string& theValue) = 0;
+
+ };
+
+
+ //---------------------------------------------------------------
+ //! Get dimension of the Gauss coordinates for the defined type of mesh cell
+ MEDWRAPPER_EXPORT
+ TInt
+ GetDimGaussCoord(EGeometrieElement theGeom);
+
+ //! Get number of referenced nodes for the defined type of mesh cell
+ MEDWRAPPER_EXPORT
+ TInt
+ GetNbRefCoord(EGeometrieElement theGeom);
+
+ typedef TFloatVector TWeight;
+
+ //! The class represents MED Gauss entity
+ struct MEDWRAPPER_EXPORT TGaussInfo:
+ virtual TNameInfo,
+ virtual TModeSwitchInfo
+ {
+ typedef boost::tuple<EGeometrieElement,std::string> TKey;
+ typedef boost::tuple<TKey,TInt> TInfo;
+ struct MEDWRAPPER_EXPORT TLess
+ {
+ bool
+ operator()(const TKey& theLeft, const TKey& theRight) const;
+
+ bool
+ operator()(const TGaussInfo& theLeft, const TGaussInfo& theRight) const;
+ };
+
+ //! Defines, which geometrical type the MED Gauss entity belongs to
+ EGeometrieElement myGeom;
+ //! Let known what MED geometrical type the MED GAUSS entity belong to
+ EGeometrieElement GetGeom() const { return myGeom;}
+
+ //! Contains coordinates for the refereced nodes
+ TNodeCoord myRefCoord;
+
+ //! Gives coordinates for the referenced node by its number
+ TCCoordSlice GetRefCoordSlice(TInt theId) const;
+ //! Gives coordinates for the referenced node by its number
+ TCoordSlice GetRefCoordSlice(TInt theId);
+
+ //! Contains coordinates for the Gauss points
+ TNodeCoord myGaussCoord;
+
+ //! Gives coordinates for the Gauss points by its number
+ TCCoordSlice GetGaussCoordSlice(TInt theId) const;
+ //! Gives coordinates for the Gauss points by its number
+ TCoordSlice GetGaussCoordSlice(TInt theId);
+
+ //! Contains wheights for the Gauss points
+ TWeight myWeight;
+
+ //! Gives number of the referenced nodes
+ TInt GetNbRef() const { return GetNbRefCoord(GetGeom());}
+
+ //! Gives dimension of the referenced nodes
+ TInt GetDim() const { return GetDimGaussCoord(GetGeom());}
+
+ //! Gives number of the Gauss Points
+ TInt GetNbGauss() const { return (TInt)(myGaussCoord.size()/GetDim());}
+ };
+
+
+ //---------------------------------------------------------------
+ typedef std::map<EGeometrieElement,PGaussInfo> TGeom2Gauss;
+ typedef std::map<EGeometrieElement,TInt> TGeom2NbGauss;
+
+ //! Define a base class which represents MED TimeStamp
+ struct MEDWRAPPER_EXPORT TTimeStampInfo:
+ virtual TBase
+ {
+ PFieldInfo myFieldInfo; //!< A reference to correspondig MED Field
+ //! Get a reference to corresponding MED Field
+ const PFieldInfo& GetFieldInfo() const { return myFieldInfo;}
+
+ //! Defines the MED Entity where the MED TimeStamp belongs to
+ EEntiteMaillage myEntity;
+ //! Let known to what MED Entity the MED TimeStamp belong to
+ EEntiteMaillage GetEntity() const { return myEntity;}
+
+ //! Keeps map of number of cells per geometric type where the MED TimeStamp belongs to
+ TGeom2Size myGeom2Size;
+ //! Get map of number of cells per geometric type where the MED TimeStamp belongs to
+ const TGeom2Size& GetGeom2Size() const { return myGeom2Size;}
+
+ TGeom2NbGauss myGeom2NbGauss; //!< Keeps number of the Gauss Points for the MED TimeStamp
+ TInt GetNbGauss(EGeometrieElement theGeom) const; //!< Gives number of the Gauss Points for the MED TimeStamp
+
+ TInt myNumDt; //!< Keeps number in time for the MED TimeStamp
+ TInt GetNumDt() const { return myNumDt;} //!< Defines number in time for the MED TimeStamp
+
+ TInt myNumOrd; //!< Keeps number for the MED TimeStamp
+ TInt GetNumOrd() const { return myNumOrd;} //!< Defines number for the MED TimeStamp
+
+ TFloat myDt; //!< Keeps time for the MED TimeStamp
+ TFloat GetDt() const { return myDt;} //!< Defines time for the MED TimeStamp
+
+ //! Keeps map of MED Gauss entityes per geometric type
+ TGeom2Gauss myGeom2Gauss;
+ //! Gets a map of MED Gauss entityes per geometric type
+ const TGeom2Gauss& GetGeom2Gauss() const { return myGeom2Gauss;}
+
+ TString myUnitDt; //!< Defines unit for the time for the MED TimeStamp
+ //! Get unit of time for the MED TimeStamp
+ virtual std::string GetUnitDt() const = 0;
+ //! Set unit of time for the MED TimeStamp
+ virtual void SetUnitDt(const std::string& theValue) = 0;
+ };
+
+
+ //---------------------------------------------------------------
+ //! The class represents MED Profile entity
+ struct MEDWRAPPER_EXPORT TProfileInfo:
+ virtual TNameInfo
+ {
+ typedef std::string TKey;
+ typedef boost::tuple<TKey,TInt> TInfo;
+
+ EModeProfil myMode; //!< Keeps mode for the MED Profile
+ //! Let known what mode of MED Profile is used
+ EModeProfil GetMode() const { return myMode;}
+ //! Set mode for the MED Profile
+ void SetMode(EModeProfil theMode) { myMode = theMode;}
+
+ PElemNum myElemNum; //!< Keeps sequence of cell by its number which belong to the profile
+ //! Get number of mesh elelemts by its order number
+ TInt GetElemNum(TInt theId) const;
+ //! Set number of mesh elelemts by its order number
+ void SetElemNum(TInt theId, TInt theVal);
+
+ //! Let known is the MED Profile defined
+ bool IsPresent() const { return GetName() != "";}
+
+ //! Let known size of the MED Profile
+ TInt GetSize() const { return (TInt)myElemNum->size();}
+ };
+
+
+ //---------------------------------------------------------------
+ //! The class is a helper one. It provide safe and flexible way to get access to values for a MED TimeStamp
+ struct MEDWRAPPER_EXPORT TMeshValueBase:
+ virtual TModeSwitchInfo
+ {
+ TInt myNbElem;
+ TInt myNbComp;
+ TInt myNbGauss;
+ TInt myStep;
+
+ TMeshValueBase();
+
+ //! Initialize the class
+ void
+ Allocate(TInt theNbElem,
+ TInt theNbGauss,
+ TInt theNbComp,
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+ //! Returns size of the value container
+ size_t
+ GetSize() const;
+
+ //! Returns MED interpetation of the value size
+ size_t
+ GetNbVal() const;
+
+ //! Returns number of Gauss Points bounded with the value
+ size_t
+ GetNbGauss() const;
+
+ //! Returns step inside of the data array
+ size_t
+ GetStep() const;
+
+ //! Returns bare pointer on the internal value representation
+ virtual
+ unsigned char*
+ GetValuePtr() = 0;
+ };
+
+ //---------------------------------------------------------------
+ //! The class is a helper one. It provide safe and flexible way to get access to values for a MED TimeStamp
+ template<class TValueType>
+ struct TTMeshValue:
+ virtual TMeshValueBase
+ {
+ typedef TValueType TValue;
+ typedef typename TValueType::value_type TElement;
+
+ typedef TSlice<TElement> TValueSlice;
+ typedef TCSlice<TElement> TCValueSlice;
+
+ typedef TVector<TCValueSlice> TCValueSliceArr;
+ typedef TVector<TValueSlice> TValueSliceArr;
+
+ TValue myValue;
+
+ //! Initialize the class
+ void
+ Allocate(TInt theNbElem,
+ TInt theNbGauss,
+ TInt theNbComp,
+ EModeSwitch theMode = eFULL_INTERLACE)
+ {
+ TMeshValueBase::Allocate(theNbElem, theNbGauss, theNbComp, theMode);
+ myValue.resize(theNbElem * this->GetStep());
+ }
+
+ //! Returns bare pointer on the internal value representation
+ virtual
+ unsigned char*
+ GetValuePtr()
+ {
+ return (unsigned char*)&myValue[0];
+ }
+
+ //! Returns bare pointer on the internal value representation
+ virtual
+ TElement*
+ GetPointer()
+ {
+ return &myValue[0];
+ }
+
+ //! Returns bare pointer on the internal value representation
+ virtual
+ const TElement*
+ GetPointer() const
+ {
+ return &myValue[0];
+ }
+
+ //! Iteration through Gauss Points by their components
+ TCValueSliceArr
+ GetGaussValueSliceArr(TInt theElemId) const
+ {
+ TCValueSliceArr aValueSliceArr(myNbGauss);
+ if(GetModeSwitch() == eFULL_INTERLACE){
+ TInt anId = theElemId * myStep;
+ for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){
+ aValueSliceArr[aGaussId] =
+ TCValueSlice(myValue, std::slice(anId, myNbComp, 1));
+ anId += myNbComp;
+ }
+ }
+ else{
+ for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){
+ aValueSliceArr[aGaussId] =
+ TCValueSlice(myValue, std::slice(theElemId, myNbComp, myStep));
+ }
+ }
+ return aValueSliceArr;
+ }
+
+ //! Iteration through Gauss Points by their components
+ TValueSliceArr
+ GetGaussValueSliceArr(TInt theElemId)
+ {
+ TValueSliceArr aValueSliceArr(myNbGauss);
+ if(GetModeSwitch() == eFULL_INTERLACE){
+ TInt anId = theElemId*myStep;
+ for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){
+ aValueSliceArr[aGaussId] =
+ TValueSlice(myValue, std::slice(anId, myNbComp, 1));
+ anId += myNbComp;
+ }
+ }
+ else{
+ for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){
+ aValueSliceArr[aGaussId] =
+ TValueSlice(myValue, std::slice(theElemId, myNbComp, myStep));
+ }
+ }
+ return aValueSliceArr;
+ }
+
+ //! Iteration through components by corresponding Gauss Points
+ TCValueSliceArr
+ GetCompValueSliceArr(TInt theElemId) const
+ {
+ TCValueSliceArr aValueSliceArr(myNbComp);
+ if(GetModeSwitch() == eFULL_INTERLACE){
+ TInt anId = theElemId*myStep;
+ for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){
+ aValueSliceArr[aCompId] =
+ TCValueSlice(myValue, std::slice(anId, myNbGauss, myNbComp));
+ anId += 1;
+ }
+ }
+ else{
+ for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){
+ aValueSliceArr[aCompId] =
+ TCValueSlice(myValue, std::slice(theElemId, myNbGauss, myStep));
+ }
+ }
+ return aValueSliceArr;
+ }
+
+ //! Iteration through components by corresponding Gauss Points
+ TValueSliceArr
+ GetCompValueSliceArr(TInt theElemId)
+ {
+ if(GetModeSwitch() == eFULL_INTERLACE){
+ TValueSliceArr aValueSliceArr(myNbComp);
+ TInt anId = theElemId*myStep;
+ for(TInt aCompId = 0; aCompId < myNbComp; aCompId++){
+ aValueSliceArr[aCompId] =
+ TValueSlice(myValue, std::slice(anId, myNbGauss, myNbComp));
+ anId += 1;
+ }
+ return aValueSliceArr;
+ }
+ else{
+ TValueSliceArr aValueSliceArr(myNbGauss);
+ for(TInt aGaussId = 0; aGaussId < myNbGauss; aGaussId++){
+ aValueSliceArr[aGaussId] =
+ TValueSlice(myValue,std::slice(theElemId, myNbComp, myStep));
+ }
+ return aValueSliceArr;
+ }
+ }
+ };
+
+ typedef TTMeshValue<TFloatVector> TFloatMeshValue;
+ typedef TTMeshValue<TIntVector> TIntMeshValue;
+
+ //---------------------------------------------------------------
+ // Backward compatibility declarations
+ typedef TFloatVector TValue;
+ typedef TSlice<TFloat> TValueSlice;
+ typedef TCSlice<TFloat> TCValueSlice;
+
+ typedef TVector<TCValueSlice> TCValueSliceArr;
+ typedef TVector<TValueSlice> TValueSliceArr;
+
+ typedef TFloatMeshValue TMeshValue;
+ typedef std::map<EGeometrieElement,TMeshValue> TGeom2Value;
+
+ //---------------------------------------------------------------
+ typedef std::map<EGeometrieElement,PProfileInfo> TGeom2Profile;
+ typedef std::set<EGeometrieElement> TGeom;
+
+ //! The class is a base class for MED TimeStamp values holder
+ struct MEDWRAPPER_EXPORT TTimeStampValueBase:
+ virtual TModeSwitchInfo
+ {
+ //! A reference to correspondig MED TimeStamp
+ PTimeStampInfo myTimeStampInfo;
+ //!< Get a reference to correspondig MED TimeStamp
+ const PTimeStampInfo& GetTimeStampInfo() const { return myTimeStampInfo;}
+
+ //! Keeps set of MED EGeometrieElement which contains values for the timestamp
+ TGeomSet myGeomSet;
+ const TGeomSet& GetGeomSet() const { return myGeomSet;}
+
+ //! Keeps map of MED Profiles per geometric type
+ TGeom2Profile myGeom2Profile;
+ //! Gets a map of MED Profiles per geometric type
+ const TGeom2Profile& GetGeom2Profile() const { return myGeom2Profile;}
+
+ //! Gets type of the champ
+ virtual
+ ETypeChamp
+ GetTypeChamp() const = 0;
+
+ //! Allocates values for the given geometry
+ virtual
+ void
+ AllocateValue(EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theNbGauss,
+ TInt theNbComp,
+ EModeSwitch theMode = eFULL_INTERLACE) = 0;
+
+ virtual
+ size_t
+ GetValueSize(EGeometrieElement theGeom) const = 0;
+
+ virtual
+ size_t
+ GetNbVal(EGeometrieElement theGeom) const = 0;
+
+ virtual
+ size_t
+ GetNbGauss(EGeometrieElement theGeom) const = 0;
+
+ virtual
+ unsigned char*
+ GetValuePtr(EGeometrieElement theGeom) = 0;
+ };
+
+
+ //---------------------------------------------------------------
+ //! The class implements a container for MED TimeStamp values
+ template<class TMeshValueType>
+ struct TTimeStampValue:
+ virtual TTimeStampValueBase
+ {
+ typedef TMeshValueType TTMeshValue;
+ typedef SharedPtr<TMeshValueType> PTMeshValue;
+ typedef typename TMeshValueType::TElement TElement;
+ typedef std::map<EGeometrieElement, PTMeshValue> TTGeom2Value;
+
+ ETypeChamp myTypeChamp; //<! Keeps type of the champ
+
+ //! Gets type of the champ
+ virtual
+ ETypeChamp
+ GetTypeChamp() const
+ {
+ return myTypeChamp;
+ }
+
+ //! Keeps map of MED TimeStamp values per geometric type (const version)
+ TTGeom2Value myGeom2Value;
+
+ const TTGeom2Value&
+ GetGeom2Value() const
+ {
+ return myGeom2Value;
+ }
+
+ //! Gets MED TimeStamp values for the given geometric type (const version)
+ const PTMeshValue&
+ GetMeshValuePtr(EGeometrieElement theGeom) const
+ {
+ typename TTGeom2Value::const_iterator anIter = myGeom2Value.find(theGeom);
+ if(anIter == myGeom2Value.end())
+ EXCEPTION(std::runtime_error,"TTimeStampValue::GetMeshValuePtr - myGeom2Value.find(theGeom) fails");
+ return anIter->second;
+ }
+
+ //! Gets MED TimeStamp values for the given geometric type
+ PTMeshValue&
+ GetMeshValuePtr(EGeometrieElement theGeom)
+ {
+ myGeomSet.insert(theGeom);
+ if(myGeom2Value.find(theGeom) == myGeom2Value.end()){
+ myGeom2Value[theGeom] = PTMeshValue(new TTMeshValue());
+ return myGeom2Value[theGeom];
+ }
+ return myGeom2Value[theGeom];
+ }
+
+ //! Gets MED TimeStamp values for the given geometric type (const version)
+ const TTMeshValue&
+ GetMeshValue(EGeometrieElement theGeom) const
+ {
+ return *(this->GetMeshValuePtr(theGeom));
+ }
+
+ //! Gets MED TimeStamp values for the given geometric type
+ TTMeshValue&
+ GetMeshValue(EGeometrieElement theGeom)
+ {
+ return *(this->GetMeshValuePtr(theGeom));
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ typedef TTimeStampValue<TFloatMeshValue> TFloatTimeStampValue;
+ typedef SharedPtr<TFloatTimeStampValue> PFloatTimeStampValue;
+
+ PFloatTimeStampValue MEDWRAPPER_EXPORT
+ CastToFloatTimeStampValue(const PTimeStampValueBase& theTimeStampValue);
+
+ typedef TTimeStampValue<TIntMeshValue> TIntTimeStampValue;
+ typedef SharedPtr<TIntTimeStampValue> PIntTimeStampValue;
+
+ PIntTimeStampValue MEDWRAPPER_EXPORT
+ CastToIntTimeStampValue(const PTimeStampValueBase& theTimeStampValue);
+
+
+ //---------------------------------------------------------------
+ template<class TMeshValueTypeFrom, class TMeshValueTypeTo>
+ void
+ CopyTimeStampValue(SharedPtr<TTimeStampValue<TMeshValueTypeFrom> > theTimeStampValueFrom,
+ SharedPtr<TTimeStampValue<TMeshValueTypeTo> > theTimeStampValueTo)
+ {
+ typedef TTimeStampValue<TMeshValueTypeFrom> TimeStampValueTypeFrom;
+ typedef TTimeStampValue<TMeshValueTypeTo> TimeStampValueTypeTo;
+ typedef typename TMeshValueTypeTo::TElement TElementTo;
+
+ typename TimeStampValueTypeFrom::TTGeom2Value& aGeom2Value = theTimeStampValueFrom->myGeom2Value;
+ typename TimeStampValueTypeFrom::TTGeom2Value::const_iterator anIter = aGeom2Value.begin();
+ for(; anIter != aGeom2Value.end(); anIter++){
+ const EGeometrieElement& aGeom = anIter->first;
+ const typename TimeStampValueTypeFrom::TTMeshValue& aMeshValue = *anIter->second;
+ typename TimeStampValueTypeTo::TTMeshValue& aMeshValue2 = theTimeStampValueTo->GetMeshValue(aGeom);
+ aMeshValue2.Allocate(aMeshValue.myNbElem,
+ aMeshValue.myNbGauss,
+ aMeshValue.myNbComp,
+ aMeshValue.myModeSwitch);
+ const typename TimeStampValueTypeFrom::TTMeshValue::TValue& aValue = aMeshValue.myValue;
+ typename TimeStampValueTypeTo::TTMeshValue::TValue& aValue2 = aMeshValue2.myValue;
+ TInt aSize = aValue.size();
+ for(TInt anId = 0; anId < aSize; anId++)
+ aValue2[anId] = TElementTo(aValue[anId]);
+ }
+ }
+
+ template<class TMeshValueType>
+ void
+ CopyTimeStampValue(SharedPtr<TTimeStampValue<TMeshValueType> > theTimeStampValueFrom,
+ SharedPtr<TTimeStampValue<TMeshValueType> > theTimeStampValueTo)
+ {
+ typedef TTimeStampValue<TMeshValueType> TimeStampValueType;
+ typename TimeStampValueType::TTGeom2Value& aGeom2Value = theTimeStampValueFrom->myGeom2Value;
+ typename TimeStampValueType::TTGeom2Value::const_iterator anIter = aGeom2Value.begin();
+ for(; anIter != aGeom2Value.end(); anIter++){
+ const EGeometrieElement& aGeom = anIter->first;
+ const typename TimeStampValueType::TTMeshValue& aMeshValue = *anIter->second;
+ typename TimeStampValueType::TTMeshValue& aMeshValue2 = theTimeStampValueTo->GetMeshValue(aGeom);
+ aMeshValue2 = aMeshValue;
+ }
+ }
+
+ //---------------------------------------------------------------
+ inline
+ void
+ CopyTimeStampValueBase(const PTimeStampValueBase& theValueFrom,
+ const PTimeStampValueBase& theValueTo)
+ {
+ if(theValueFrom->GetTypeChamp() == theValueTo->GetTypeChamp()){
+ if(theValueFrom->GetTypeChamp() == eFLOAT64)
+ CopyTimeStampValue<TFloatMeshValue>(theValueFrom, theValueTo);
+ else if(theValueFrom->GetTypeChamp() == eINT)
+ CopyTimeStampValue<TIntMeshValue>(theValueFrom, theValueTo);
+ }else{
+ if(theValueFrom->GetTypeChamp() == eFLOAT64 && theValueTo->GetTypeChamp() == eINT)
+ CopyTimeStampValue<TFloatMeshValue, TIntMeshValue>(theValueFrom, theValueTo);
+ else if(theValueFrom->GetTypeChamp() == eINT && theValueTo->GetTypeChamp() == eFLOAT64)
+ CopyTimeStampValue<TIntMeshValue, TFloatMeshValue>(theValueFrom, theValueTo);
+ }
+ }
+
+
+ //---------------------------------------------------------------
+ // Backward compatibility declarations
+ typedef TFloatTimeStampValue TTimeStampVal;
+ typedef PFloatTimeStampValue PTimeStampVal;
+
+ //---------------------------------------------------------------
+ typedef std::map<TInt,TFloatVector> TIndexes;
+ typedef std::map<TInt,TString> TNames;
+
+ //! Define a base class which represents MED Grille (structured mesh)
+ struct MEDWRAPPER_EXPORT TGrilleInfo:
+ virtual TModeSwitchInfo
+ {
+
+ PMeshInfo myMeshInfo;
+ const PMeshInfo& GetMeshInfo() const { return myMeshInfo;}
+
+ TNodeCoord myCoord; //!< Contains all nodal coordinates, now used only for eGRILLE_STANDARD
+ //! Gives coordinates for mesh nodes (const version)
+ const TNodeCoord& GetNodeCoord() const;
+ TNodeCoord& GetNodeCoord();
+ //! Gives coordinates for mesh node by its number, array index from 0
+ TNodeCoord GetCoord(TInt theId);
+ //! Gives ids of nodes for mesh cell or sub-cell by its number, array index from 0
+ TIntVector GetConn(TInt theId, const bool isSub=false);
+
+ EGrilleType myGrilleType; //!< Defines grille type (eGRILLE_CARTESIENNE,eGRILLE_POLAIRE,eGRILLE_STANDARD)
+ //!Gets grille type (const version)
+ const EGrilleType& GetGrilleType() const;
+ //!Gets grille type
+ EGrilleType GetGrilleType();
+ //!Sets grille type
+ void SetGrilleType(EGrilleType theGrilleType);
+
+
+
+ TString myCoordNames; //!< Contains names for the coordinate dimensions
+ //! Get name of the coordinate dimension by its order number
+ virtual std::string GetCoordName(TInt theId) const = 0 ;
+ //! Set name of the coordinate dimension by its order number
+ virtual void SetCoordName(TInt theId, const std::string& theValue) = 0;
+
+ TString myCoordUnits; //!< Contains units for the coordinate dimensions
+ //! Get name of unit for the coordinate dimension by its order number
+ virtual std::string GetCoordUnit(TInt theId) const = 0;
+ //! Set name of unit for the coordinate dimension by its order number
+ virtual void SetCoordUnit(TInt theId, const std::string& theValue) = 0;
+
+
+ //! Map of index of axes and Table of indexes for certain axe, now used for eGRILLE_CARTESIENNE and eGRILLE_POLAIRE
+ TIndexes myIndixes;
+ //!Gets a map of Tables (const version)
+ const TIndexes& GetMapOfIndexes() const ;
+ //!Gets a map of Tables
+ TIndexes& GetMapOfIndexes();
+ //!Gets a Table of indexes for certain axe(const version)
+ const TFloatVector& GetIndexes(TInt theAxisNumber) const;
+ //!Gets a Table of indexes for certain axe
+ TFloatVector& GetIndexes(TInt theAxisNumber);
+ //!Gets a number of indices per axe
+ TInt GetNbIndexes(TInt theAxisNumber);
+
+ TInt GetNbNodes();//! Return count of all points
+ TInt GetNbCells();//! Return count of all cells
+ TInt GetNbSubCells();//! Return count of all entities of <mesh dimension-1>
+ EGeometrieElement GetGeom();//! Return geometry of cells (calculated from mesh dimension)
+ EGeometrieElement GetSubGeom();//! Return geometry of subcells (calculated from mesh dimension)
+ EEntiteMaillage GetEntity();//! Return entity (eMAILLE)
+ EEntiteMaillage GetSubEntity();//! Return sub entity
+
+ /*!
+ *Vector of grille structure (Example: {3,4,5}, 3 nodes in X axe, 4 nodes in Y axe, ...)
+ */
+ TIntVector myGrilleStructure;
+ //!Gets grille structure(const version)
+ const TIntVector& GetGrilleStructure() const;
+ //!Gets grille structure
+ TIntVector GetGrilleStructure();
+ //!Sets the grille structure of theAxis axe to theNb.
+ void SetGrilleStructure(TInt theAxis,TInt theNb);
+
+ /*!
+ *Defines sequence MED Family indexes for corresponding mesh entites
+ */
+ TElemNum myFamNum;
+ //! Get number of a MED FAMILY by order number of the mesh element
+ TInt GetFamNum(TInt theId) const;
+ //! Set number of a MED FAMILY for the mesh element with the order number
+ void SetFamNum(TInt theId, TInt theVal);
+
+ /*!
+ *Defines sequence MED Family indexes for sub entites
+ */
+ TElemNum myFamSubNum;
+ //! Get number of a MED FAMILY by order number of sub element
+ TInt GetFamSubNum(TInt theId) const;
+ //! Set number of a MED FAMILY for theId-th sub element
+ void SetFamSubNum(TInt theId, TInt theVal);
+
+ /*!
+ *Defines sequence MED Family indexes for corresponding mesh nodes
+ */
+ TElemNum myFamNumNode;
+ //! Get number of a MED FAMILY by order number of the mesh node
+ TInt GetFamNumNode(TInt theId) const;
+ //! Set number of a MED FAMILY for the mesh node with the order number
+ void SetFamNumNode(TInt theId, TInt theVal);
+
+ };
+
+
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_TStructures_HeaderFile
+#define MED_TStructures_HeaderFile
+
+#include "MED_Structures.hxx"
+
+#ifdef WIN32
+#pragma warning(disable:4250)
+#endif
+
+namespace MED
+{
+ //---------------------------------------------------------------
+ //! To provide a common way to handle values of MEDWrapper types as native MED types
+ template<class TValue, class TRepresentation>
+ struct TValueHolder
+ {
+ TValue& myValue;
+ TRepresentation myRepresentation;
+
+ TValueHolder(TValue& theValue):
+ myValue(theValue),
+ myRepresentation(TRepresentation(theValue))
+ {}
+
+ ~TValueHolder()
+ {
+ myValue = TValue(myRepresentation);
+ }
+
+ TRepresentation*
+ operator& ()
+ {
+ return &myRepresentation;
+ }
+
+ operator TRepresentation () const
+ {
+ return myRepresentation;
+ }
+
+ const TValue&
+ operator() () const
+ {
+ return myValue;
+ }
+ };
+
+ //! To customize TValueHolder common template definition for TVector
+ template<class TVal, class TRepresentation>
+ struct TValueHolder<TVector<TVal>, TRepresentation>
+ {
+ typedef TVector<TVal> TValue;
+ TValue& myValue;
+ TRepresentation* myRepresentation;
+
+ TValueHolder(TValue& theValue):
+ myValue(theValue)
+ {
+ if(theValue.empty())
+ myRepresentation = (TRepresentation*)NULL;
+ else
+ myRepresentation = (TRepresentation*)&theValue[0];
+ }
+
+ TRepresentation*
+ operator& ()
+ {
+ return myRepresentation;
+ }
+ };
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTNameInfo: virtual TNameInfo
+ {
+ TTNameInfo(const std::string& theValue)
+ {
+ myName.resize(GetNOMLength<eVersion>()+1);
+ SetName(theValue);
+ }
+
+ virtual
+ std::string
+ GetName() const
+ {
+ return GetString(0, GetNOMLength<eVersion>(), myName);
+ }
+
+ virtual
+ void
+ SetName(const std::string& theValue)
+ {
+ SetString(0, GetNOMLength<eVersion>(), myName, theValue);
+ }
+
+ virtual
+ void
+ SetName(const TString& theValue)
+ {
+ SetString(0, GetNOMLength<eVersion>(), myName, theValue);
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTMeshInfo:
+ virtual TMeshInfo,
+ virtual TTNameInfo<eVersion>
+ {
+ typedef TTNameInfo<eVersion> TNameInfoBase;
+
+ TTMeshInfo(const PMeshInfo& theInfo):
+ TNameInfoBase(theInfo->GetName())
+ {
+ myDim = theInfo->GetDim();
+ mySpaceDim = theInfo->GetSpaceDim();
+ myType = theInfo->GetType();
+
+ myDesc.resize(GetDESCLength<eVersion>()+1);
+ SetDesc(theInfo->GetDesc());
+ }
+
+ TTMeshInfo(TInt theDim, TInt theSpaceDim,
+ const std::string& theValue,
+ EMaillage theType,
+ const std::string& theDesc):
+ TNameInfoBase(theValue)
+ {
+ myDim = theDim;
+ mySpaceDim = theSpaceDim;
+ myType = theType;
+
+ myDesc.resize(GetDESCLength<eVersion>()+1);
+ SetDesc(theDesc);
+ }
+
+ virtual
+ std::string
+ GetDesc() const
+ {
+ return GetString(0, GetDESCLength<eVersion>(), myDesc);
+ }
+
+ virtual
+ void
+ SetDesc(const std::string& theValue)
+ {
+ SetString(0, GetDESCLength<eVersion>(), myDesc, theValue);
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTFamilyInfo:
+ virtual TFamilyInfo,
+ virtual TTNameInfo<eVersion>
+ {
+ typedef TTNameInfo<eVersion> TNameInfoBase;
+
+ TTFamilyInfo(const PMeshInfo& theMeshInfo, const PFamilyInfo& theInfo):
+ TNameInfoBase(theInfo->GetName())
+ {
+ myMeshInfo = theMeshInfo;
+
+ myId = theInfo->GetId();
+
+ myNbGroup = theInfo->GetNbGroup();
+ myGroupNames.resize(myNbGroup*GetLNOMLength<eVersion>()+1);
+ if(myNbGroup){
+ for(TInt anId = 0; anId < myNbGroup; anId++){
+ SetGroupName(anId,theInfo->GetGroupName(anId));
+ }
+ }
+
+ myNbAttr = theInfo->GetNbAttr();
+ myAttrId.resize(myNbAttr);
+ myAttrVal.resize(myNbAttr);
+ myAttrDesc.resize(myNbAttr*GetDESCLength<eVersion>()+1);
+ if(myNbAttr){
+ for(TInt anId = 0; anId < myNbAttr; anId++){
+ SetAttrDesc(anId,theInfo->GetAttrDesc(anId));
+ myAttrVal[anId] = theInfo->GetAttrVal(anId);
+ myAttrId[anId] = theInfo->GetAttrId(anId);
+ }
+ }
+ }
+
+ TTFamilyInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbGroup,
+ TInt theNbAttr,
+ TInt theId,
+ const std::string& theValue):
+ TNameInfoBase(theValue)
+ {
+ myMeshInfo = theMeshInfo;
+
+ myId = theId;
+
+ myNbGroup = theNbGroup;
+ myGroupNames.resize(theNbGroup*GetLNOMLength<eVersion>()+1);
+
+ myNbAttr = theNbAttr;
+ myAttrId.resize(theNbAttr);
+ myAttrVal.resize(theNbAttr);
+ myAttrDesc.resize(theNbAttr*GetDESCLength<eVersion>()+1);
+ }
+
+ TTFamilyInfo(const PMeshInfo& theMeshInfo,
+ const std::string& theValue,
+ TInt theId,
+ const TStringSet& theGroupNames,
+ const TStringVector& theAttrDescs,
+ const TIntVector& theAttrIds,
+ const TIntVector& theAttrVals):
+ TNameInfoBase(theValue)
+ {
+ myMeshInfo = theMeshInfo;
+
+ myId = theId;
+
+ myNbGroup = (TInt)theGroupNames.size();
+ myGroupNames.resize(myNbGroup*GetLNOMLength<eVersion>()+1);
+ if(myNbGroup){
+ TStringSet::const_iterator anIter = theGroupNames.begin();
+ for(TInt anId = 0; anIter != theGroupNames.end(); anIter++, anId++){
+ const std::string& aVal = *anIter;
+ SetGroupName(anId,aVal);
+ }
+ }
+
+ myNbAttr = (TInt)theAttrDescs.size();
+ myAttrId.resize(myNbAttr);
+ myAttrVal.resize(myNbAttr);
+ myAttrDesc.resize(myNbAttr*GetDESCLength<eVersion>()+1);
+ if(myNbAttr){
+ for(TInt anId = 0, anEnd = (TInt)theAttrDescs.size(); anId < anEnd; anId++){
+ SetAttrDesc(anId,theAttrDescs[anId]);
+ myAttrVal[anId] = theAttrVals[anId];
+ myAttrId[anId] = theAttrIds[anId];
+ }
+ }
+ }
+
+ virtual
+ std::string
+ GetGroupName(TInt theId) const
+ {
+ return GetString(theId, GetLNOMLength<eVersion>(), myGroupNames);
+ }
+
+ virtual
+ void
+ SetGroupName(TInt theId, const std::string& theValue)
+ {
+ SetString(theId, GetLNOMLength<eVersion>(), myGroupNames, theValue);
+ }
+
+ virtual
+ std::string
+ GetAttrDesc(TInt theId) const
+ {
+ return GetString(theId, GetDESCLength<eVersion>(), myAttrDesc);
+ }
+
+ virtual
+ void
+ SetAttrDesc(TInt theId, const std::string& theValue)
+ {
+ SetString(theId, GetDESCLength<eVersion>(), myAttrDesc, theValue);
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTElemInfo: virtual TElemInfo
+ {
+ TTElemInfo(const PMeshInfo& theMeshInfo, const PElemInfo& theInfo)
+ {
+ myMeshInfo = theMeshInfo;
+
+ myNbElem = theInfo->GetNbElem();
+ myFamNum.reset(new TElemNum(myNbElem));
+ myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum()
+
+ myIsElemNum = theInfo->IsElemNum();
+ if(theInfo->IsElemNum())
+ myElemNum.reset(new TElemNum(myNbElem));
+ else
+ myElemNum.reset(new TElemNum());
+
+ myIsElemNames = theInfo->IsElemNames();
+ if(theInfo->IsElemNames())
+ myElemNames.reset(new TString(myNbElem*GetPNOMLength<eVersion>() + 1));
+ else
+ myElemNames.reset(new TString());
+
+ if(theInfo->GetNbElem()){
+ for(TInt anId = 0; anId < myNbElem; anId++){
+ SetFamNum(anId, theInfo->GetFamNum(anId));
+ }
+ if(theInfo->IsElemNum() == eVRAI){
+ for(TInt anId = 0; anId < myNbElem; anId++){
+ SetElemNum(anId, theInfo->GetElemNum(anId));
+ }
+ }
+ if(theInfo->IsElemNames() == eVRAI){
+ for(TInt anId = 0; anId < myNbElem; anId++){
+ SetElemName(anId,theInfo->GetElemName(anId));
+ }
+ }
+ }
+ }
+
+ TTElemInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ EBooleen theIsElemNum,
+ EBooleen theIsElemNames)
+ {
+ myMeshInfo = theMeshInfo;
+
+ myNbElem = theNbElem;
+ myFamNum.reset(new TElemNum(theNbElem));
+ myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum()
+
+ myIsElemNum = theIsElemNum;
+ if(theIsElemNum)
+ myElemNum.reset(new TElemNum(theNbElem));
+ else
+ myElemNum.reset(new TElemNum());
+
+ myIsElemNames = theIsElemNames;
+ if(theIsElemNames)
+ myElemNames.reset(new TString(theNbElem*GetPNOMLength<eVersion>() + 1));
+ else
+ myElemNames.reset(new TString());
+ }
+
+ TTElemInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ const TIntVector& theFamilyNums,
+ const TIntVector& theElemNums,
+ const TStringVector& theElemNames)
+ {
+ myMeshInfo = theMeshInfo;
+
+ myNbElem = theNbElem;
+ myFamNum.reset(new TElemNum(theNbElem));
+ myIsFamNum = eFAUX; // is set to eVRAI in SetFamNum()
+
+ myIsElemNum = theElemNums.size()? eVRAI: eFAUX;
+ if(myIsElemNum)
+ myElemNum.reset(new TElemNum(theNbElem));
+ else
+ myElemNum.reset(new TElemNum());
+
+ myIsElemNames = theElemNames.size()? eVRAI: eFAUX;
+ if(myIsElemNames)
+ myElemNames.reset(new TString(theNbElem*GetPNOMLength<eVersion>() + 1));
+ else
+ myElemNames.reset(new TString());
+
+ if(theNbElem){
+
+ if(theFamilyNums.size())
+ *myFamNum = theFamilyNums;
+
+ if(myIsElemNum)
+ *myElemNum = theElemNums;
+
+ if(myIsElemNames){
+ for(TInt anId = 0; anId < theNbElem; anId++){
+ const std::string& aVal = theElemNames[anId];
+ SetElemName(anId,aVal);
+ }
+ }
+ }
+ }
+
+ virtual
+ std::string
+ GetElemName(TInt theId) const
+ {
+ return GetString(theId,GetPNOMLength<eVersion>(), *myElemNames);
+ }
+
+ virtual
+ void
+ SetElemName(TInt theId, const std::string& theValue)
+ {
+ SetString(theId,GetPNOMLength<eVersion>(), *myElemNames, theValue);
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTNodeInfo:
+ virtual TNodeInfo,
+ virtual TTElemInfo<eVersion>
+ {
+ typedef TTElemInfo<eVersion> TElemInfoBase;
+
+ TTNodeInfo(const PMeshInfo& theMeshInfo, const PNodeInfo& theInfo):
+ TNodeInfo(theInfo),
+ TElemInfoBase(theMeshInfo, theInfo)
+ {
+ myModeSwitch = theInfo->GetModeSwitch();
+
+ mySystem = theInfo->GetSystem();
+
+ myCoord.reset(new TNodeCoord(*theInfo->myCoord));
+
+ TInt aSpaceDim = theMeshInfo->GetSpaceDim();
+
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ for(TInt anId = 0; anId < aSpaceDim; anId++)
+ SetCoordName(anId,theInfo->GetCoordName(anId));
+
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ for(TInt anId = 0; anId < aSpaceDim; anId++)
+ SetCoordUnit(anId,theInfo->GetCoordUnit(anId));
+ }
+
+ TTNodeInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ EModeSwitch theMode,
+ ERepere theSystem,
+ EBooleen theIsElemNum,
+ EBooleen theIsElemNames):
+ TModeSwitchInfo(theMode),
+ TElemInfoBase(theMeshInfo,
+ theNbElem,
+ theIsElemNum,
+ theIsElemNames)
+ {
+ mySystem = theSystem;
+
+ myCoord.reset(new TNodeCoord(theNbElem * theMeshInfo->mySpaceDim));
+
+ myCoordUnits.resize(theMeshInfo->mySpaceDim*GetPNOMLength<eVersion>()+1);
+
+ myCoordNames.resize(theMeshInfo->mySpaceDim*GetPNOMLength<eVersion>()+1);
+ }
+
+
+ TTNodeInfo(const PMeshInfo& theMeshInfo,
+ const TFloatVector& theNodeCoords,
+ EModeSwitch theMode,
+ ERepere theSystem,
+ const TStringVector& theCoordNames,
+ const TStringVector& theCoordUnits,
+ const TIntVector& theFamilyNums,
+ const TIntVector& theElemNums,
+ const TStringVector& theElemNames):
+ TModeSwitchInfo(theMode),
+ TElemInfoBase(theMeshInfo,
+ (TInt)theNodeCoords.size()/theMeshInfo->GetDim(),
+ theFamilyNums,
+ theElemNums,
+ theElemNames)
+ {
+ mySystem = theSystem;
+
+ myCoord.reset(new TNodeCoord(theNodeCoords));
+
+ TInt aSpaceDim = theMeshInfo->GetSpaceDim();
+
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ if(!theCoordNames.empty())
+ for(TInt anId = 0; anId < aSpaceDim; anId++)
+ SetCoordName(anId,theCoordNames[anId]);
+
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>() + 1);
+ if(!theCoordUnits.empty())
+ for(TInt anId = 0; anId < aSpaceDim; anId++)
+ SetCoordUnit(anId, theCoordUnits[anId]);
+ }
+
+ virtual
+ std::string
+ GetCoordName(TInt theId) const
+ {
+ return GetString(theId,GetPNOMLength<eVersion>(),myCoordNames);
+ }
+
+ virtual
+ void
+ SetCoordName(TInt theId, const std::string& theValue)
+ {
+ SetString(theId,GetPNOMLength<eVersion>(),myCoordNames,theValue);
+ }
+
+ virtual
+ std::string
+ GetCoordUnit(TInt theId) const
+ {
+ return GetString(theId,GetPNOMLength<eVersion>(),myCoordUnits);
+ }
+
+ virtual
+ void
+ SetCoordUnit(TInt theId, const std::string& theValue)
+ {
+ SetString(theId,GetPNOMLength<eVersion>(),myCoordUnits,theValue);
+ }
+ };
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTPolygoneInfo:
+ virtual TPolygoneInfo,
+ virtual TTElemInfo<eVersion>
+ {
+ typedef TTElemInfo<eVersion> TElemInfoBase;
+
+ TTPolygoneInfo(const PMeshInfo& theMeshInfo, const PPolygoneInfo& theInfo):
+ TElemInfoBase(theMeshInfo,theInfo)
+ {
+ myEntity = theInfo->GetEntity();
+ myGeom = theInfo->GetGeom();
+
+ myIndex.reset(new TElemNum(*theInfo->myIndex));
+ myConn.reset(new TElemNum(*theInfo->myConn));
+
+ myConnMode = theInfo->GetConnMode();
+ }
+
+ TTPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theConnSize,
+ EConnectivite theConnMode,
+ EBooleen theIsElemNum,
+ EBooleen theIsElemNames):
+ TElemInfoBase(theMeshInfo,
+ theNbElem,
+ theIsElemNum,
+ theIsElemNames)
+ {
+ myEntity = theEntity;
+ myGeom = theGeom;
+
+ myIndex.reset(new TElemNum(theNbElem + 1));
+ myConn.reset(new TElemNum(theConnSize));
+
+ myConnMode = theConnMode;
+ }
+
+ TTPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theIndexes,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode,
+ const TIntVector& theFamilyNums,
+ const TIntVector& theElemNums,
+ const TStringVector& theElemNames):
+ TElemInfoBase(theMeshInfo,
+ (TInt)theIndexes.size() - 1,
+ theFamilyNums,
+ theElemNums,
+ theElemNames)
+ {
+ myEntity = theEntity;
+ myGeom = theGeom;
+
+ myIndex.reset(new TElemNum(theIndexes));
+ myConn.reset(new TElemNum(theConnectivities));
+
+ myConnMode = theConnMode;
+ }
+ };
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTPolyedreInfo:
+ virtual TPolyedreInfo,
+ virtual TTElemInfo<eVersion>
+ {
+ typedef TTElemInfo<eVersion> TElemInfoBase;
+
+ TTPolyedreInfo(const PMeshInfo& theMeshInfo, const PPolyedreInfo& theInfo):
+ TElemInfoBase(theMeshInfo,theInfo)
+ {
+ myEntity = theInfo->GetEntity();
+ myGeom = theInfo->GetGeom();
+
+ myIndex.reset(new TElemNum(*theInfo->myIndex));
+ myFaces.reset(new TElemNum(*theInfo->myFaces));
+ myConn.reset(new TElemNum(*theInfo->myConn));
+
+ myConnMode = theInfo->GetConnMode();
+ }
+
+ TTPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theNbFaces,
+ TInt theConnSize,
+ EConnectivite theConnMode,
+ EBooleen theIsElemNum,
+ EBooleen theIsElemNames):
+ TElemInfoBase(theMeshInfo,
+ theNbElem,
+ theIsElemNum,
+ theIsElemNames)
+ {
+ myEntity = theEntity;
+ myGeom = theGeom;
+
+ myIndex.reset(new TElemNum(theNbElem + 1));
+ myFaces.reset(new TElemNum(theNbFaces));
+ myConn.reset(new TElemNum(theConnSize));
+
+ myConnMode = theConnMode;
+ }
+
+ TTPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theIndexes,
+ const TIntVector& theFaces,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode,
+ const TIntVector& theFamilyNums,
+ const TIntVector& theElemNums,
+ const TStringVector& theElemNames):
+ TElemInfoBase(theMeshInfo,
+ (TInt)theIndexes.size()-1,
+ theFamilyNums,
+ theElemNums,
+ theElemNames)
+ {
+ myEntity = theEntity;
+ myGeom = theGeom;
+
+ myIndex.reset(new TElemNum(theIndexes));
+ myFaces.reset(new TElemNum(theFaces));
+ myConn.reset(new TElemNum(theConnectivities));
+
+ myConnMode = theConnMode;
+ }
+ };
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTCellInfo:
+ virtual TCellInfo,
+ virtual TTElemInfo<eVersion>
+ {
+ typedef TTElemInfo<eVersion> TElemInfoBase;
+
+ TTCellInfo(const PMeshInfo& theMeshInfo, const PCellInfo& theInfo):
+ TElemInfoBase(theMeshInfo,theInfo)
+ {
+ myEntity = theInfo->GetEntity();
+ myGeom = theInfo->GetGeom();
+ myConnMode = theInfo->GetConnMode();
+
+ TInt aConnDim = GetNbNodes(myGeom);
+ TInt aNbConn = GetNbConn<eVersion>(myGeom, myEntity, myMeshInfo->myDim);
+ myConn.reset(new TElemNum(myNbElem * aNbConn));
+ for(TInt anElemId = 0; anElemId < myNbElem; anElemId++){
+ TConnSlice aConnSlice = GetConnSlice(anElemId);
+ TCConnSlice aConnSlice2 = theInfo->GetConnSlice(anElemId);
+ for(TInt anConnId = 0; anConnId < aConnDim; anConnId++){
+ aConnSlice[anConnId] = aConnSlice2[anConnId];
+ }
+ }
+ }
+
+ TTCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ EConnectivite theConnMode,
+ EBooleen theIsElemNum,
+ EBooleen theIsElemNames,
+ EModeSwitch theMode):
+ TModeSwitchInfo(theMode),
+ TElemInfoBase(theMeshInfo,
+ theNbElem,
+ theIsElemNum,
+ theIsElemNames)
+ {
+ myEntity = theEntity;
+ myGeom = theGeom;
+
+ myConnMode = theConnMode;
+ TInt aNbConn = GetNbConn<eVersion>(theGeom, myEntity, theMeshInfo->myDim);
+ myConn.reset(new TElemNum(theNbElem * aNbConn));
+ }
+
+ TTCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode,
+ const TIntVector& theFamilyNums,
+ const TIntVector& theElemNums,
+ const TStringVector& theElemNames,
+ EModeSwitch theMode):
+ TModeSwitchInfo(theMode),
+ TElemInfoBase(theMeshInfo,
+ (TInt)theConnectivities.size() / GetNbNodes(theGeom),
+ theFamilyNums,
+ theElemNums,
+ theElemNames)
+ {
+ myEntity = theEntity;
+ myGeom = theGeom;
+
+ myConnMode = theConnMode;
+ TInt aConnDim = GetNbNodes(myGeom);
+ TInt aNbConn = GetNbConn<eVersion>(myGeom, myEntity, myMeshInfo->myDim);
+ myConn.reset(new TElemNum(myNbElem * aNbConn));
+ for(TInt anElemId = 0; anElemId < myNbElem; anElemId++){
+ TConnSlice aConnSlice = GetConnSlice(anElemId);
+ for(TInt anConnId = 0; anConnId < aConnDim; anConnId++){
+ aConnSlice[anConnId] = theConnectivities[anElemId*aConnDim + anConnId];
+ }
+ }
+ }
+
+ virtual
+ TInt
+ GetConnDim() const
+ {
+ return GetNbConn<eVersion>(myGeom, myEntity, myMeshInfo->myDim);
+ }
+
+ };
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTBallInfo:
+ virtual TBallInfo,
+ virtual TTCellInfo<eVersion>
+ {
+ typedef TTCellInfo<eVersion> TCellInfoBase;
+
+ TTBallInfo(const PMeshInfo& theMeshInfo, const PBallInfo& theInfo):
+ TCellInfoBase::TElemInfoBase(theMeshInfo, theInfo),
+ TCellInfoBase(theMeshInfo,theInfo)
+ {
+ myDiameters = theInfo->myDiameters;
+ }
+
+ TTBallInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ EBooleen theIsElemNum ):
+ TCellInfoBase::TElemInfoBase(theMeshInfo,
+ theNbElem,
+ theIsElemNum,
+ /*theIsElemNames=*/eFAUX),
+ TCellInfoBase(theMeshInfo,
+ eSTRUCT_ELEMENT,
+ eBALL,
+ theNbElem,
+ /*EConnectivite=*/eNOD,
+ theIsElemNum,
+ /*theIsElemNames=*/eFAUX,
+ eFULL_INTERLACE)
+ {
+ myDiameters.resize( theNbElem );
+ }
+
+ TTBallInfo(const PMeshInfo& theMeshInfo,
+ const TIntVector& theNodes,
+ TFloatVector& theDiameters,
+ const TIntVector& theFamilyNums,
+ const TIntVector& theElemNums):
+ TCellInfoBase::TElemInfoBase(theMeshInfo,
+ (TInt)std::max(theNodes.size(),theDiameters.size() ),
+ theFamilyNums,
+ theElemNums,
+ TStringVector()),
+ TCellInfoBase(theMeshInfo,
+ eSTRUCT_ELEMENT,
+ eBALL,
+ theNodes,
+ /*EConnectivite=*/eNOD,
+ theFamilyNums,
+ theElemNums,
+ TStringVector(),
+ eFULL_INTERLACE)
+ {
+ myDiameters.swap( theDiameters );
+ }
+ };
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTFieldInfo:
+ virtual TFieldInfo,
+ virtual TTNameInfo<eVersion>
+ {
+ typedef TTNameInfo<eVersion> TNameInfoBase;
+
+ TTFieldInfo(const PMeshInfo& theMeshInfo, const PFieldInfo& theInfo):
+ TNameInfoBase(theInfo->GetName())
+ {
+ myMeshInfo = theMeshInfo;
+
+ myNbComp = theInfo->GetNbComp();
+ myCompNames.resize(myNbComp*GetPNOMLength<eVersion>()+1);
+ for(TInt anId = 0; anId < myNbComp; anId++){
+ SetCompName(anId,theInfo->GetCompName(anId));
+ }
+
+ myUnitNames.resize(myNbComp*GetPNOMLength<eVersion>()+1);
+ for(TInt anId = 0; anId < myNbComp; anId++){
+ SetUnitName(anId,theInfo->GetUnitName(anId));
+ }
+
+ myType = theInfo->GetType();
+
+ myIsLocal = theInfo->GetIsLocal();
+ myNbRef = theInfo->GetNbRef();
+ }
+
+ TTFieldInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbComp,
+ ETypeChamp theType,
+ const std::string& theValue,
+ EBooleen theIsLocal,
+ TInt theNbRef):
+ TNameInfoBase(theValue)
+ {
+ myMeshInfo = theMeshInfo;
+
+ myNbComp = theNbComp;
+ myCompNames.resize(theNbComp*GetPNOMLength<eVersion>()+1);
+ myUnitNames.resize(theNbComp*GetPNOMLength<eVersion>()+1);
+
+ myType = theType;
+
+ myIsLocal = theIsLocal;
+ myNbRef = theNbRef;
+ }
+
+ virtual
+ std::string
+ GetCompName(TInt theId) const
+ {
+ return GetString(theId,GetPNOMLength<eVersion>(),myCompNames);
+ }
+
+ virtual
+ void
+ SetCompName(TInt theId, const std::string& theValue)
+ {
+ SetString(theId,GetPNOMLength<eVersion>(),myCompNames,theValue);
+ }
+
+ virtual
+ std::string
+ GetUnitName(TInt theId) const
+ {
+ return GetString(theId,GetPNOMLength<eVersion>(),myUnitNames);
+ }
+
+ virtual
+ void
+ SetUnitName(TInt theId, const std::string& theValue)
+ {
+ SetString(theId,GetPNOMLength<eVersion>(),myUnitNames,theValue);
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTGaussInfo:
+ virtual TGaussInfo,
+ virtual TTNameInfo<eVersion>
+ {
+ typedef TTNameInfo<eVersion> TNameInfoBase;
+
+ TTGaussInfo(const TGaussInfo::TInfo& theInfo,
+ EModeSwitch theMode):
+ TModeSwitchInfo(theMode),
+ TNameInfoBase(boost::get<1>(boost::get<0>(theInfo)))
+ {
+ const TGaussInfo::TKey& aKey = boost::get<0>(theInfo);
+
+ myGeom = boost::get<0>(aKey);
+ myRefCoord.resize(GetNbRef()*GetDim());
+
+ TInt aNbGauss = boost::get<1>(theInfo);
+ myGaussCoord.resize(aNbGauss*GetDim());
+ myWeight.resize(aNbGauss);
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTTimeStampInfo: virtual TTimeStampInfo
+ {
+ TTTimeStampInfo(const PFieldInfo& theFieldInfo, const PTimeStampInfo& theInfo)
+ {
+ myFieldInfo = theFieldInfo;
+
+ myEntity = theInfo->GetEntity();
+ myGeom2Size = theInfo->GetGeom2Size();
+
+ myNumDt = theInfo->GetNumDt();
+ myNumOrd = theInfo->GetNumOrd();
+ myDt = theInfo->GetDt();
+
+ myUnitDt.resize(GetPNOMLength<eVersion>()+1);
+ SetUnitDt(theInfo->GetUnitDt());
+
+ myGeom2NbGauss = theInfo->myGeom2NbGauss;
+ myGeom2Gauss = theInfo->GetGeom2Gauss();
+ }
+
+ TTTimeStampInfo(const PFieldInfo& theFieldInfo,
+ EEntiteMaillage theEntity,
+ const TGeom2Size& theGeom2Size,
+ const TGeom2NbGauss& theGeom2NbGauss,
+ TInt theNumDt,
+ TInt theNumOrd,
+ TFloat theDt,
+ const std::string& theUnitDt,
+ const TGeom2Gauss& theGeom2Gauss)
+ {
+ myFieldInfo = theFieldInfo;
+
+ myEntity = theEntity;
+ myGeom2Size = theGeom2Size;
+
+ myNumDt = theNumDt;
+ myNumOrd = theNumDt;
+ myDt = theDt;
+
+ myUnitDt.resize(GetPNOMLength<eVersion>()+1);
+ SetUnitDt(theUnitDt);
+
+ myGeom2NbGauss = theGeom2NbGauss;
+ myGeom2Gauss = theGeom2Gauss;
+ }
+
+ virtual
+ std::string
+ GetUnitDt() const
+ {
+ return GetString(0,GetPNOMLength<eVersion>(),myUnitDt);
+ }
+
+ virtual
+ void
+ SetUnitDt(const std::string& theValue)
+ {
+ SetString(0,GetPNOMLength<eVersion>(),myUnitDt,theValue);
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTProfileInfo:
+ virtual TProfileInfo,
+ virtual TTNameInfo<eVersion>
+ {
+ typedef TTNameInfo<eVersion> TNameInfoBase;
+
+ TTProfileInfo(const TProfileInfo::TInfo& theInfo,
+ EModeProfil theMode):
+ TNameInfoBase(boost::get<0>(theInfo))
+ {
+ TInt aSize = boost::get<1>(theInfo);
+ myElemNum.reset(new TElemNum(aSize));
+ myMode = aSize > 0? theMode: eNO_PFLMOD;
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion, class TMeshValueType>
+ struct TTTimeStampValue: virtual TTimeStampValue<TMeshValueType>
+ {
+ TTTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const PTimeStampValueBase& theInfo,
+ ETypeChamp theTypeChamp)
+ {
+ typedef TTimeStampValue<TMeshValueType> TCompatible;
+ if(TCompatible* aCompatible = dynamic_cast<TCompatible*>(theInfo.get())){
+ this->myTimeStampInfo = theTimeStampInfo;
+ this->myTypeChamp = theTypeChamp;
+ this->myGeom2Profile = aCompatible->GetGeom2Profile();
+ this->myGeom2Value = aCompatible->myGeom2Value;
+ this->myGeomSet = aCompatible->GetGeomSet();
+ }else
+ EXCEPTION(std::runtime_error,"TTTimeStampValue::TTTimeStampValue - use incompatible arguments!");
+ }
+
+ TTTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ ETypeChamp theTypeChamp,
+ const TGeom2Profile& theGeom2Profile,
+ EModeSwitch theMode):
+ TModeSwitchInfo(theMode)
+ {
+ this->myTimeStampInfo = theTimeStampInfo;
+
+ this->myTypeChamp = theTypeChamp;
+
+ this->myGeom2Profile = theGeom2Profile;
+
+ TInt aNbComp = theTimeStampInfo->myFieldInfo->myNbComp;
+
+ const TGeom2Size& aGeom2Size = theTimeStampInfo->GetGeom2Size();
+ TGeom2Size::const_iterator anIter = aGeom2Size.begin();
+ for(; anIter != aGeom2Size.end(); anIter++){
+ const EGeometrieElement& aGeom = anIter->first;
+ TInt aNbElem = anIter->second;
+
+ MED::PProfileInfo aProfileInfo;
+ MED::TGeom2Profile::const_iterator anIter = theGeom2Profile.find(aGeom);
+ if(anIter != theGeom2Profile.end())
+ aProfileInfo = anIter->second;
+
+ if(aProfileInfo && aProfileInfo->IsPresent())
+ aNbElem = aProfileInfo->GetSize();
+
+ TInt aNbGauss = theTimeStampInfo->GetNbGauss(aGeom);
+
+ this->GetMeshValue(aGeom).Allocate(aNbElem,aNbGauss,aNbComp);
+ }
+ }
+
+ virtual
+ size_t
+ GetValueSize(EGeometrieElement theGeom) const
+ {
+ return this->GetMeshValue(theGeom).GetSize();
+ }
+
+ virtual
+ size_t
+ GetNbVal(EGeometrieElement theGeom) const
+ {
+ return this->GetMeshValue(theGeom).GetNbVal();
+ }
+
+ virtual
+ size_t
+ GetNbGauss(EGeometrieElement theGeom) const
+ {
+ return this->GetMeshValue(theGeom).GetNbGauss();
+ }
+
+ virtual
+ void
+ AllocateValue(EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theNbGauss,
+ TInt theNbComp,
+ EModeSwitch theMode = eFULL_INTERLACE)
+ {
+ this->GetMeshValue(theGeom).Allocate(theNbElem,theNbGauss,theNbComp,theMode);
+ }
+
+ virtual
+ unsigned char*
+ GetValuePtr(EGeometrieElement theGeom)
+ {
+ return this->GetMeshValue(theGeom).GetValuePtr();
+ }
+ };
+
+ //---------------------------------------------------------------
+ template<EVersion eVersion>
+ struct TTGrilleInfo:
+ virtual TGrilleInfo
+ {
+ TTGrilleInfo(const PMeshInfo& theMeshInfo,
+ const PGrilleInfo& theInfo)
+ {
+ myMeshInfo = theMeshInfo;
+
+ myCoord = theInfo->GetNodeCoord();
+
+ myGrilleType = theInfo->GetGrilleType();
+
+ myCoordNames = theInfo->myCoordNames;
+
+ myCoordUnits = theInfo->myCoordUnits;
+
+ myIndixes = theInfo->GetMapOfIndexes();
+
+ myGrilleStructure = theInfo->GetGrilleStructure();
+
+ myGrilleType = theInfo->GetGrilleType();
+
+ myFamNumNode.resize(theInfo->GetNbNodes());
+ myFamNumNode = theInfo->myFamNumNode;
+
+ myFamNum = theInfo->myFamNum;
+ }
+
+ TTGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type,
+ const TInt nnoeuds)
+ {
+ myMeshInfo = theMeshInfo;
+ TInt aSpaceDim = theMeshInfo->GetSpaceDim();
+ if(type == eGRILLE_STANDARD){
+ myCoord.resize(aSpaceDim*nnoeuds);
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ } else { //if(type == eGRILLE_CARTESIENNE){
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+aSpaceDim);
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>()+aSpaceDim);
+ }
+ myGrilleStructure.resize(aSpaceDim);
+ myFamNumNode.resize(nnoeuds);
+ }
+
+ TTGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type)
+ {
+ myMeshInfo = theMeshInfo;
+ TInt aSpaceDim = theMeshInfo->GetSpaceDim();
+ if(type == eGRILLE_STANDARD){
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ } else {// if(type == eGRILLE_CARTESIENNE){
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+aSpaceDim);
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>()+aSpaceDim);
+ }
+ myGrilleStructure.resize(aSpaceDim);
+ }
+
+ TTGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type,
+ const MED::TIntVector& nbNodeVec)
+ {
+ myMeshInfo = theMeshInfo;
+
+ TInt aSpaceDim = theMeshInfo->GetSpaceDim();
+ if(type == eGRILLE_STANDARD){
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>()+1);
+ } else {// if(type == eGRILLE_CARTESIENNE){
+ myCoordNames.resize(aSpaceDim*GetPNOMLength<eVersion>()+aSpaceDim);
+ myCoordUnits.resize(aSpaceDim*GetPNOMLength<eVersion>()+aSpaceDim);
+ }
+
+ if(type != eGRILLE_STANDARD)
+ for(unsigned int aAxe=0;aAxe<nbNodeVec.size();aAxe++){
+ myIndixes[aAxe].resize(nbNodeVec[aAxe]);
+ }
+ myGrilleStructure.resize(aSpaceDim);
+ }
+
+ virtual
+ std::string
+ GetCoordName(TInt theId) const
+ {
+ return GetString(theId,GetPNOMLength<eVersion>(),myCoordNames);
+ }
+
+ virtual
+ void
+ SetCoordName(TInt theId, const std::string& theValue)
+ {
+ SetString(theId,GetPNOMLength<eVersion>(),myCoordNames,theValue);
+ }
+
+ virtual
+ std::string
+ GetCoordUnit(TInt theId) const
+ {
+ return GetString(theId,GetPNOMLength<eVersion>(),myCoordUnits);
+ }
+
+ virtual
+ void
+ SetCoordUnit(TInt theId, const std::string& theValue)
+ {
+ SetString(theId,GetPNOMLength<eVersion>(),myCoordUnits,theValue);
+ }
+
+ };
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+#ifndef MED_TWrapper_HeaderFile
+#define MED_TWrapper_HeaderFile
+
+#include "MED_TStructures.hxx"
+#include "MED_Wrapper.hxx"
+
+namespace MED
+{
+
+ template<EVersion eVersion>
+ class TTWrapper: public TWrapper
+ {
+ public:
+ //----------------------------------------------------------------------------
+ //! Gets version of the MED library used for the MED file
+ virtual
+ EVersion
+ GetVersion()
+ {
+ return eVersion;
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PMeshInfo
+ CrMeshInfo(TInt theDim = 0, TInt theSpaceDim = 0,
+ const std::string& theValue = "",
+ EMaillage theType = eNON_STRUCTURE,
+ const std::string& theDesc = "")
+ {
+ return PMeshInfo(new TTMeshInfo<eVersion>
+ (theDim,
+ theSpaceDim,
+ theValue,
+ theType,
+ theDesc));
+ }
+
+ virtual
+ PMeshInfo
+ CrMeshInfo(const PMeshInfo& theInfo)
+ {
+ return PMeshInfo(new TTMeshInfo<eVersion>(theInfo));
+ }
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ PFamilyInfo
+ CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbGroup = 0,
+ TInt theNbAttr = 0,
+ TInt theId = 0,
+ const std::string& theValue = "")
+ {
+ return PFamilyInfo(new TTFamilyInfo<eVersion>
+ (theMeshInfo,
+ theNbGroup,
+ theNbAttr,
+ theId,
+ theValue));
+ }
+
+ virtual
+ PFamilyInfo
+ CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ const std::string& theValue,
+ TInt theId,
+ const MED::TStringSet& theGroupNames,
+ const MED::TStringVector& theAttrDescs = MED::TStringVector(),
+ const MED::TIntVector& theAttrIds = MED::TIntVector(),
+ const MED::TIntVector& theAttrVals = MED::TIntVector())
+ {
+ return PFamilyInfo(new TTFamilyInfo<eVersion>
+ (theMeshInfo,
+ theValue,
+ theId,
+ theGroupNames,
+ theAttrDescs,
+ theAttrIds,
+ theAttrVals));
+ }
+
+ virtual
+ PFamilyInfo
+ CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ const PFamilyInfo& theInfo)
+ {
+ return PFamilyInfo(new TTFamilyInfo<eVersion>
+ (theMeshInfo,
+ theInfo));
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PElemInfo
+ CrElemInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI)
+ {
+ return PElemInfo(new TTElemInfo<eVersion>
+ (theMeshInfo,
+ theNbElem,
+ theIsElemNum,
+ theIsElemNames));
+ }
+
+ virtual
+ PElemInfo
+ CrElemInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ const TIntVector& theFamNum,
+ const TIntVector& aElemNum,
+ const TStringVector& aElemNames)
+ {
+ return PElemInfo(new TTElemInfo<eVersion>
+ (theMeshInfo,
+ theNbElem,
+ theFamNum,
+ aElemNum,
+ aElemNames));
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PNodeInfo
+ CrNodeInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ EModeSwitch theMode = eFULL_INTERLACE,
+ ERepere theSystem = eCART,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI)
+ {
+ return PNodeInfo(new TTNodeInfo<eVersion>
+ (theMeshInfo,
+ theNbElem,
+ theMode,
+ theSystem,
+ theIsElemNum,
+ theIsElemNames));
+ }
+
+ virtual
+ PNodeInfo
+ CrNodeInfo(const PMeshInfo& theMeshInfo,
+ const TFloatVector& theNodeCoords,
+ EModeSwitch theMode = eFULL_INTERLACE,
+ ERepere theSystem = eCART,
+ const TStringVector& theCoordNames = TStringVector(),
+ const TStringVector& theCoordUnits = TStringVector(),
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector())
+ {
+ return PNodeInfo(new TTNodeInfo<eVersion>
+ (theMeshInfo,
+ theNodeCoords,
+ theMode,
+ theSystem,
+ theCoordNames,
+ theCoordUnits,
+ theFamilyNums,
+ theElemNums,
+ theElemNames));
+ }
+
+ virtual
+ PNodeInfo
+ CrNodeInfo(const PMeshInfo& theMeshInfo,
+ const PNodeInfo& theInfo)
+ {
+ return PNodeInfo(new TTNodeInfo<eVersion>
+ (theMeshInfo,
+ theInfo));
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PPolygoneInfo
+ CrPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theConnSize,
+ EConnectivite theConnMode = eNOD,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI)
+ {
+ return PPolygoneInfo(new TTPolygoneInfo<eVersion>
+ (theMeshInfo,
+ theEntity,
+ theGeom,
+ theNbElem,
+ theConnSize,
+ theConnMode,
+ theIsElemNum,
+ theIsElemNames));
+ }
+
+ virtual
+ PPolygoneInfo
+ CrPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theIndexes,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode = eNOD,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector())
+ {
+ return PPolygoneInfo(new TTPolygoneInfo<eVersion>
+ (theMeshInfo,
+ theEntity,
+ theGeom,
+ theIndexes,
+ theConnectivities,
+ theConnMode,
+ theFamilyNums,
+ theElemNums,
+ theElemNames));
+ }
+
+ virtual
+ PPolygoneInfo
+ CrPolygoneInfo(const PMeshInfo& theMeshInfo,
+ const PPolygoneInfo& theInfo)
+ {
+ return PPolygoneInfo(new TTPolygoneInfo<eVersion>
+ (theMeshInfo,
+ theInfo));
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PPolyedreInfo
+ CrPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theNbFaces,
+ TInt theConnSize,
+ EConnectivite theConnMode = eNOD,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI)
+ {
+ return PPolyedreInfo(new TTPolyedreInfo<eVersion>
+ (theMeshInfo,
+ theEntity,
+ theGeom,
+ theNbElem,
+ theNbFaces,
+ theConnSize,
+ theConnMode,
+ theIsElemNum,
+ theIsElemNames));
+ }
+
+ virtual
+ PPolyedreInfo
+ CrPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theIndexes,
+ const TIntVector& theFaces,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode = eNOD,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector())
+ {
+ return PPolyedreInfo(new TTPolyedreInfo<eVersion>
+ (theMeshInfo,
+ theEntity,
+ theGeom,
+ theIndexes,
+ theFaces,
+ theConnectivities,
+ theConnMode,
+ theFamilyNums,
+ theElemNums,
+ theElemNames));
+ }
+
+ virtual
+ PPolyedreInfo
+ CrPolyedreInfo(const PMeshInfo& theMeshInfo,
+ const PPolyedreInfo& theInfo)
+ {
+ return PPolyedreInfo(new TTPolyedreInfo<eVersion>
+ (theMeshInfo,
+ theInfo));
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PCellInfo
+ CrCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ EConnectivite theConnMode = eNOD,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI,
+ EModeSwitch theMode = eFULL_INTERLACE)
+ {
+ return PCellInfo(new TTCellInfo<eVersion>
+ (theMeshInfo,
+ theEntity,
+ theGeom,
+ theNbElem,
+ theConnMode,
+ theIsElemNum,
+ theIsElemNames,
+ theMode));
+ }
+
+ virtual
+ PCellInfo
+ CrCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode = eNOD,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector(),
+ EModeSwitch theMode = eFULL_INTERLACE)
+ {
+ return PCellInfo(new TTCellInfo<eVersion>
+ (theMeshInfo,
+ theEntity,
+ theGeom,
+ theConnectivities,
+ theConnMode,
+ theFamilyNums,
+ theElemNums,
+ theElemNames,
+ theMode));
+ }
+
+ virtual
+ PCellInfo
+ CrCellInfo(const PMeshInfo& theMeshInfo,
+ const PCellInfo& theInfo)
+ {
+ return PCellInfo(new TTCellInfo<eVersion>
+ (theMeshInfo,
+ theInfo));
+ }
+
+ //----------------------------------------------------------------------------
+ //! Creates a MEDWrapper MED Balls representation
+ virtual PBallInfo CrBallInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbBalls,
+ EBooleen theIsElemNum = eVRAI)
+ {
+ return PBallInfo( new TTBallInfo<eVersion>( theMeshInfo, theNbBalls, theIsElemNum ));
+ }
+
+ //! Creates a MEDWrapper MED Balls representation
+ virtual PBallInfo CrBallInfo(const PMeshInfo& theMeshInfo,
+ const TIntVector& theNodes,
+ TFloatVector& theDiameters,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector())
+ {
+ return PBallInfo( new TTBallInfo<eVersion>( theMeshInfo, theNodes, theDiameters,
+ theFamilyNums, theElemNums));
+ }
+
+ //! A copy-constructor for the MEDWrapper MED Balls representation
+ virtual PBallInfo CrBallInfo(const PMeshInfo& theMeshInfo,
+ const PBallInfo& theInfo)
+ {
+ return PBallInfo( new TTBallInfo<eVersion>( theMeshInfo, theInfo ));
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PFieldInfo
+ CrFieldInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbComp = 0,
+ ETypeChamp theType = eFLOAT64,
+ const std::string& theValue = "",
+ EBooleen theIsLocal = eVRAI,
+ TInt theNbRef = 1)
+ {
+ return PFieldInfo(new TTFieldInfo<eVersion>
+ (theMeshInfo,
+ theNbComp,
+ theType,
+ theValue,
+ theIsLocal,
+ theNbRef));
+ }
+
+ virtual
+ PFieldInfo
+ CrFieldInfo(const PMeshInfo& theMeshInfo,
+ const PFieldInfo& theInfo)
+ {
+ return PFieldInfo(new TTFieldInfo<eVersion>
+ (theMeshInfo,
+ theInfo));
+ }
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ PTimeStampInfo
+ CrTimeStampInfo(const PFieldInfo& theFieldInfo,
+ EEntiteMaillage theEntity,
+ const TGeom2Size& theGeom2Size,
+ const TGeom2NbGauss& theGeom2NbGauss = TGeom2NbGauss(),
+ TInt theNumDt = 0,
+ TInt theNumOrd = 0,
+ TFloat theDt = 0,
+ const std::string& theUnitDt = "",
+ const TGeom2Gauss& theGeom2Gauss = TGeom2Gauss())
+ {
+ return PTimeStampInfo(new TTTimeStampInfo<eVersion>
+ (theFieldInfo,
+ theEntity,
+ theGeom2Size,
+ theGeom2NbGauss,
+ theNumDt,
+ theNumOrd,
+ theDt,
+ theUnitDt,
+ theGeom2Gauss));
+ }
+
+ virtual
+ PTimeStampInfo
+ CrTimeStampInfo(const PFieldInfo& theFieldInfo,
+ const PTimeStampInfo& theInfo)
+ {
+ return PTimeStampInfo(new TTTimeStampInfo<eVersion>
+ (theFieldInfo,
+ theInfo));
+ }
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ PGaussInfo
+ CrGaussInfo(const TGaussInfo::TInfo& theInfo,
+ EModeSwitch theMode = eFULL_INTERLACE)
+ {
+ return PGaussInfo(new TTGaussInfo<eVersion>
+ (theInfo,
+ theMode));
+ }
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ PProfileInfo
+ CrProfileInfo(const TProfileInfo::TInfo& theInfo,
+ EModeProfil theMode = eCOMPACT)
+ {
+ return PProfileInfo(new TTProfileInfo<eVersion>
+ (theInfo,
+ theMode));
+ }
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ PTimeStampValueBase
+ CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ ETypeChamp theTypeChamp,
+ const TGeom2Profile& theGeom2Profile = TGeom2Profile(),
+ EModeSwitch theMode = eFULL_INTERLACE)
+ {
+ if(theTypeChamp == eFLOAT64)
+ return PTimeStampValueBase(new TTTimeStampValue<eVersion, TFloatMeshValue>
+ (theTimeStampInfo,
+ theTypeChamp,
+ theGeom2Profile,
+ theMode));
+ return PTimeStampValueBase(new TTTimeStampValue<eVersion, TIntMeshValue>
+ (theTimeStampInfo,
+ theTypeChamp,
+ theGeom2Profile,
+ theMode));
+ }
+
+ virtual
+ PTimeStampValueBase
+ CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const PTimeStampValueBase& theInfo,
+ ETypeChamp theTypeChamp)
+ {
+ if(theTypeChamp == eFLOAT64)
+ return PTimeStampValueBase(new TTTimeStampValue<eVersion, TFloatMeshValue>
+ (theTimeStampInfo,
+ theInfo,
+ theTypeChamp));
+ return PTimeStampValueBase(new TTTimeStampValue<eVersion, TIntMeshValue>
+ (theTimeStampInfo,
+ theInfo,
+ theTypeChamp));
+ }
+
+ //----------------------------------------------------------------------------
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const PGrilleInfo& theInfo)
+ {
+ return PGrilleInfo(new TTGrilleInfo<eVersion>
+ (theMeshInfo,
+ theInfo));
+ }
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type)
+ {
+ return PGrilleInfo(new TTGrilleInfo<eVersion>
+ (theMeshInfo,
+ type));
+ }
+
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type,
+ const TInt& nbNodes)
+ {
+ return PGrilleInfo(new TTGrilleInfo<eVersion>
+ (theMeshInfo,
+ type,
+ nbNodes));
+ }
+
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type,
+ const MED::TIntVector& nbNodeVec)
+ {
+ return PGrilleInfo(new TTGrilleInfo<eVersion>
+ (theMeshInfo,
+ type,
+ nbNodeVec));
+ }
+ //----------------------------------------------------------------------------
+ };
+
+}
+
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#include "MED_Utilities.hxx"
+#include "MED_Common.hxx"
+
+using namespace std;
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+// static int MYDEBUG = 0;
+#endif
+
+
+int MED::PrefixPrinter::myCounter = 0;
+
+MED::PrefixPrinter::PrefixPrinter(bool theIsActive):
+ myIsActive(theIsActive)
+{
+ if(myIsActive)
+ myCounter++;
+ MSG(MYDEBUG,"MED::PrefixPrinter::PrefixPrinter(...)- "<<myCounter);
+}
+
+MED::PrefixPrinter::~PrefixPrinter()
+{
+ if(myIsActive){
+ myCounter--;
+ if(myCounter < 0)
+ EXCEPTION(runtime_error,"PrefixPrinter::~PrefixPrinter() - myCounter("<<myCounter<<") < 0");
+ }
+}
+
+string MED::PrefixPrinter::GetPrefix()
+{
+ if(myCounter){
+ if(myCounter < 0)
+ EXCEPTION(runtime_error,"PrefixPrinter::~PrefixPrinter() - myCounter("<<myCounter<<") < 0");
+ return string(myCounter*2,' ');
+ }
+ return "";
+}
+
+
+static MED::TEntity2GeomSet Entity2GeomSet;
+
+bool InitEntity2GeomSet()
+{
+ using namespace MED;
+
+ TGeomSet& aGeomARETESet = Entity2GeomSet[eARETE];
+ aGeomARETESet.insert(eSEG2);
+ aGeomARETESet.insert(eSEG3);
+
+ TGeomSet& aGeomFACESet = Entity2GeomSet[eFACE];
+ aGeomFACESet.insert(eTRIA3);
+ aGeomFACESet.insert(eQUAD4);
+ aGeomFACESet.insert(eTRIA6);
+ aGeomFACESet.insert(eTRIA7);
+ aGeomFACESet.insert(eQUAD8);
+ aGeomFACESet.insert(eQUAD9);
+ aGeomFACESet.insert(ePOLYGONE);
+
+ TGeomSet& aGeomMAILLESet = Entity2GeomSet[eMAILLE];
+ aGeomMAILLESet.insert(ePOINT1);
+ aGeomMAILLESet.insert(aGeomARETESet.begin(),aGeomARETESet.end());
+ aGeomMAILLESet.insert(aGeomFACESet.begin(),aGeomFACESet.end());
+ aGeomMAILLESet.insert(eTETRA4);
+ aGeomMAILLESet.insert(ePYRA5);
+ aGeomMAILLESet.insert(ePENTA6);
+ aGeomMAILLESet.insert(eHEXA8);
+ aGeomMAILLESet.insert(eOCTA12);
+ aGeomMAILLESet.insert(eTETRA10);
+ aGeomMAILLESet.insert(ePYRA13);
+ aGeomMAILLESet.insert(ePENTA15);
+ aGeomMAILLESet.insert(eHEXA20);
+ aGeomMAILLESet.insert(eHEXA27);
+ aGeomMAILLESet.insert(ePOLYEDRE);
+
+ /* This combination allows reading nb of models of structure elements */
+ Entity2GeomSet[eSTRUCT_ELEMENT].insert(eAllGeoType);
+
+ return true;
+}
+
+static bool anIsInited = InitEntity2GeomSet();
+
+const MED::TEntity2GeomSet& MED::GetEntity2GeomSet()
+{
+ return Entity2GeomSet;
+}
+
+
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_Utilities_HeaderFile
+#define MED_Utilities_HeaderFile
+
+#include "MED_WrapperBase.hxx"
+
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <string.h>
+#include <stdexcept>
+
+
+namespace MED
+{
+ class MEDWRAPPER_EXPORT PrefixPrinter
+ {
+ static int myCounter;
+ bool myIsActive;
+ public:
+ PrefixPrinter(bool theIsActive = true);
+ ~PrefixPrinter();
+
+ static std::string GetPrefix();
+ };
+}
+
+#ifdef _DEBUG_
+ #define MSG(deb,msg) if(deb) std::cout<<MED::PrefixPrinter::GetPrefix()<<msg<<" ("<<__FILE__<<" ["<<__LINE__<<"])\n"
+ #define BEGMSG(deb,msg) if(deb) std::cout<<MED::PrefixPrinter::GetPrefix()<<msg
+ #define INITMSGA(deb,lev,msg) MED::PrefixPrinter aPrefixPrinter_##lev(deb); BEGMSG(deb,msg)
+ #define INITMSG(deb,msg) INITMSGA(deb,,msg)
+ #define ADDMSG(deb,msg) if(deb) std::cout<<msg
+#else
+ #define MSG(deb,msg)
+ #define BEGMSG(deb,msg)
+ #define INITMSGA(deb,lev,msg)
+ #define INITMSG(deb,msg)
+ #define ADDMSG(deb,msg)
+#endif
+
+
+#ifndef EXCEPTION
+
+#define EXCEPTION(TYPE, MSG) {\
+ std::ostringstream aStream;\
+ aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
+ throw TYPE(aStream.str().c_str());\
+}
+
+#endif
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_Vector_HeaderFile
+#define MED_Vector_HeaderFile
+
+#include <vector>
+#include <stdexcept>
+
+//#if defined(_DEBUG_)
+# define MED_TVECTOR_CHECK_RANGE
+//#endif
+
+namespace MED
+{
+
+ //! Main purpose to introduce the class was to customize operator []
+ template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
+ class TVector : public std::vector<_Tp, _Alloc>
+ {
+ public:
+ typedef size_t size_type;
+
+ typedef std::vector<_Tp, _Alloc> superclass;
+ typedef typename superclass::allocator_type allocator_type;
+
+ typedef _Tp value_type;
+ typedef value_type& reference;
+ typedef const value_type& const_reference;
+
+ protected:
+ void
+ check_range(size_type __n) const
+ {
+ if (__n >= this->size())
+ throw std::out_of_range("TVector [] access out of range");
+ }
+
+ const_reference
+ get_value(size_type __n) const
+ {
+ return superclass::operator[](__n);
+ }
+
+ reference
+ get_value(size_type __n)
+ {
+ return superclass::operator[](__n);
+ }
+
+ public:
+ explicit
+ TVector(const allocator_type& __a = allocator_type()):
+ superclass(__a)
+ {}
+
+ TVector(size_type __n, const value_type& __val,
+ const allocator_type& __a = allocator_type()):
+ superclass(__n, __val, __a)
+ {}
+
+ explicit
+ TVector(size_type __n):
+ superclass(__n)
+ {}
+
+ TVector(const TVector& __x):
+ superclass(__x)
+ {}
+
+ template<typename _InputIterator>
+ TVector(_InputIterator __first, _InputIterator __last,
+ const allocator_type& __a = allocator_type()):
+ superclass(__first, __last, __a)
+ {}
+
+ template<typename _Yp, typename _Al>
+ TVector(TVector<_Yp, _Al> __y):
+ superclass(__y.begin(), __y.end())
+ {}
+
+ TVector&
+ operator=(const TVector& __x)
+ {
+ superclass::operator=(__x);
+ return *this;
+ }
+
+ template<typename _Yp, typename _Al>
+ TVector&
+ operator=(TVector<_Yp, _Al> __y)
+ {
+ this->assign(__y.begin(), __y.end());
+ return *this;
+ }
+
+ reference
+ operator[](size_type __n)
+ {
+#if defined(MED_TVECTOR_CHECK_RANGE)
+ check_range(__n);
+#endif
+ return get_value(__n);
+ }
+
+ const_reference
+ operator[](size_type __n) const
+ {
+#if defined(MED_TVECTOR_CHECK_RANGE)
+ check_range(__n);
+#endif
+ return get_value(__n);
+ }
+
+ reference
+ at(size_type __n)
+ {
+ check_range(__n);
+ return get_value(__n);
+ }
+
+ const_reference
+ at(size_type __n) const
+ {
+ check_range(__n);
+ return get_value(__n);
+ }
+ };
+
+}
+
+#undef MED_TVECTOR_CHECK_RANGE
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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 : MED_Wrapper.cxx
+// Author : Alexey PETROV
+//
+#include "MED_Wrapper.hxx"
+#include "MED_Utilities.hxx"
+
+#include <boost/version.hpp>
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+static int MYVALUEDEBUG = 0;
+#else
+// static int MYDEBUG = 0;
+// static int MYVALUEDEBUG = 0;
+#endif
+
+namespace MED
+{
+ TLockProxy
+ ::TLockProxy(TWrapper* theWrapper):
+ myWrapper(theWrapper)
+ {
+#if BOOST_VERSION >= 103500
+ myWrapper->myMutex.lock();
+#else
+ boost::detail::thread::lock_ops<TWrapper::TMutex>::lock(myWrapper->myMutex);
+#endif
+ INITMSG(MYDEBUG,"TLockProxy() - this -"<<this<<"; myWrapper = "<<myWrapper<<std::endl);
+ }
+
+ TLockProxy
+ ::~TLockProxy()
+ {
+ INITMSG(MYDEBUG,"~TLockProxy() - this -"<<this<<"; myWrapper = "<<myWrapper<<std::endl);
+#if BOOST_VERSION >= 103500
+ myWrapper->myMutex.unlock();
+#else
+ boost::detail::thread::lock_ops<TWrapper::TMutex>::unlock(myWrapper->myMutex);
+#endif
+ }
+
+ TWrapper*
+ TLockProxy
+ ::operator-> () const // never throws
+ {
+ return myWrapper;
+ }
+
+ //----------------------------------------------------------------------------
+ TWrapper::~TWrapper()
+ {
+ }
+
+ //----------------------------------------------------------------------------
+ PMeshInfo
+ TWrapper
+ ::GetPMeshInfo(TInt theId,
+ TErr* theErr)
+ {
+ PMeshInfo anInfo = CrMeshInfo();
+ GetMeshInfo(theId,*anInfo,theErr);
+ return anInfo;
+ }
+
+
+ //----------------------------------------------------------------------------
+ PFamilyInfo
+ TWrapper
+ ::GetPFamilyInfo(const PMeshInfo& theMeshInfo,
+ TInt theId,
+ TErr* theErr)
+ {
+ // must be reimplemented in connection with mesh type eSTRUCTURE
+ // if(theMeshInfo->GetType() != eNON_STRUCTURE)
+ // return PFamilyInfo();
+
+ TInt aNbAttr = GetNbFamAttr(theId,*theMeshInfo);
+ TInt aNbGroup = GetNbFamGroup(theId,*theMeshInfo);
+ PFamilyInfo anInfo = CrFamilyInfo(theMeshInfo,aNbGroup,aNbAttr);
+ GetFamilyInfo(theId,*anInfo,theErr);
+
+#ifdef _DEBUG_
+ std::string aName = anInfo->GetName();
+ INITMSG(MYDEBUG,"GetPFamilyInfo - aFamilyName = '"<<aName<<
+ "'; andId = "<<anInfo->GetId()<<
+ "; aNbAttr = "<<aNbAttr<<
+ "; aNbGroup = "<<aNbGroup<<"\n");
+ for(TInt iGroup = 0; iGroup < aNbGroup; iGroup++){
+ aName = anInfo->GetGroupName(iGroup);
+ INITMSG(MYDEBUG,"aGroupName = '"<<aName<<"'\n");
+ }
+#endif
+
+ return anInfo;
+ }
+
+
+ //----------------------------------------------------------------------------
+ PNodeInfo
+ TWrapper
+ ::GetPNodeInfo(const PMeshInfo& theMeshInfo,
+ TErr* theErr)
+ {
+ TInt aNbElems = GetNbNodes(*theMeshInfo);
+ if(aNbElems == 0){
+ return PNodeInfo();
+ }
+
+ PNodeInfo anInfo = CrNodeInfo(theMeshInfo,aNbElems);
+ GetNodeInfo(*anInfo,theErr);
+
+#ifdef _DEBUG_
+ TInt aDim = theMeshInfo->myDim;
+ TInt aNbElem = anInfo->GetNbElem();
+ INITMSG(MYDEBUG,"GetPNodeInfo: ");
+ {
+ INITMSG(MYDEBUG,"aCoords: "<<aNbElem<<": ");
+ TNodeCoord& aCoord = anInfo->myCoord;
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ for(TInt iDim = 0, anId = iElem*aDim; iDim < aDim; iDim++, anId++){
+ ADDMSG(MYVALUEDEBUG,aCoord[anId]<<",");
+ }
+ ADDMSG(MYVALUEDEBUG," ");
+ }
+ ADDMSG(MYDEBUG, std::endl);
+
+ BEGMSG(MYVALUEDEBUG, "GetFamNum: ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetFamNum(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+
+ if(anInfo->IsElemNum()){
+ BEGMSG(MYVALUEDEBUG,"GetElemNum: ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetElemNum(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+ }
+ }
+ ADDMSG(MYDEBUG, std::endl);
+#endif
+
+ return anInfo;
+ }
+
+ //----------------------------------------------------------------------------
+ PPolygoneInfo
+ TWrapper
+ ::GetPPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode)
+ {
+ if(theMeshInfo->GetType() != eNON_STRUCTURE)
+ return PPolygoneInfo();
+
+ TInt aNbElem = GetNbPolygones(theMeshInfo,theEntity,theGeom,theConnMode);
+ TInt aConnSize = GetPolygoneConnSize(theMeshInfo,theEntity,theGeom,theConnMode);
+ PPolygoneInfo anInfo = CrPolygoneInfo(theMeshInfo,theEntity,theGeom,aNbElem,aConnSize,theConnMode);
+ GetPolygoneInfo(anInfo);
+
+#ifdef _DEBUG_
+ INITMSG(MYDEBUG,"GetPPolygoneInfo"<<
+ " - theGeom = "<<theGeom<<
+ "; aNbElem = "<<aNbElem<<": ");
+ for(TInt iElem = 1; iElem < aNbElem; iElem++){
+ TCConnSlice aConnSlice = anInfo->GetConnSlice(iElem);
+ TInt aConnDim = aConnSlice.size();
+ for(TInt iConn = 0; iConn < aConnDim; iConn++){
+ ADDMSG(MYVALUEDEBUG,aConnSlice[iConn]<<",");
+ }
+ ADDMSG(MYDEBUG," ");
+ }
+ ADDMSG(MYDEBUG, std::endl);
+#endif
+
+ return anInfo;
+ }
+
+ //----------------------------------------------------------------------------
+ PPolyedreInfo
+ TWrapper
+ ::GetPPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode)
+ {
+ if(theMeshInfo->GetType() != eNON_STRUCTURE)
+ return PPolyedreInfo();
+ TInt aNbElem = GetNbPolyedres(theMeshInfo,theEntity,theGeom,theConnMode);
+ TInt aNbFaces, aConnSize;
+ GetPolyedreConnSize(theMeshInfo,aNbFaces,aConnSize,theConnMode);
+ PPolyedreInfo anInfo = CrPolyedreInfo(theMeshInfo,theEntity,theGeom,aNbElem,aNbFaces,aConnSize,theConnMode);
+ GetPolyedreInfo(anInfo);
+
+#ifdef _DEBUG_
+ INITMSG(MYDEBUG,"GetPPolyedreInfo"<<
+ " - theGeom = "<<theGeom<<
+ "; aNbElem = "<<aNbElem<<": ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ TCConnSliceArr aConnSliceArr = anInfo->GetConnSliceArr(iElem);
+ TInt aNbFaces = aConnSliceArr.size();
+ ADDMSG(MYDEBUG,"{");
+ for(TInt iFace = 0; iFace < aNbFaces; iFace++){
+ TCConnSlice aConnSlice = aConnSliceArr[iFace];
+ TInt aNbConn = aConnSlice.size();
+ ADDMSG(MYDEBUG,"[");
+ for(TInt iConn = 0; iConn < aNbConn; iConn++){
+ ADDMSG(MYVALUEDEBUG,aConnSlice[iConn]<<",");
+ }
+ ADDMSG(MYDEBUG,"] ");
+ }
+ ADDMSG(MYDEBUG,"} ");
+ }
+ ADDMSG(MYDEBUG, std::endl);
+#endif
+
+ return anInfo;
+ }
+
+ //----------------------------------------------------------------------------
+ PElemInfo
+ TWrapper
+ ::GetPElemInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ EMaillage aType = theMeshInfo->GetType();
+ if(aType == eNON_STRUCTURE){
+ switch(theGeom){
+ case ePOINT1:
+ if(theEntity == eNOEUD)
+ return GetPNodeInfo(theMeshInfo,theErr);
+ return GetPCellInfo(theMeshInfo,theEntity,theGeom,theConnMode,theErr);
+ break;
+ case ePOLYGONE:
+ return GetPPolygoneInfo(theMeshInfo,theEntity,theGeom,theConnMode);
+ break;
+ case ePOLYEDRE:
+ return GetPPolyedreInfo(theMeshInfo,theEntity,theGeom,theConnMode);
+ break;
+ default:
+ return GetPCellInfo(theMeshInfo,theEntity,theGeom,theConnMode,theErr);
+ }
+ } else {
+ PGrilleInfo aGrille = GetPGrilleInfo(theMeshInfo);
+
+ TInt nbElems;
+ EBooleen theIsElemNum = eFAUX;
+ // nodes
+ switch(theGeom){
+ case ePOINT1:
+ nbElems = aGrille->GetNbNodes();
+ theIsElemNum = eVRAI;
+ break;
+ case eSEG2:
+ case eQUAD4:
+ case eHEXA8:
+ nbElems = aGrille->GetNbCells();
+ break;
+ default:
+ nbElems = 0;
+ }
+
+ TIntVector aFamNum;
+ TIntVector aElemNum;
+ TStringVector aElemNames;
+
+ PElemInfo aElemInfo;
+
+ if(theGeom == ePOINT1){
+ aElemInfo = CrElemInfo(theMeshInfo,
+ nbElems,
+ theIsElemNum);
+ MED::TElemInfo &aTElemInfo = *aElemInfo;
+
+ // must be reimplemente in connection with mesh type eSTRUCTURE
+// GetNumeration(aTElemInfo,
+// nbElems,
+// theEntity,
+// theGeom,
+// theErr);
+
+ GetFamilies(aTElemInfo,
+ nbElems,
+ theEntity,
+ theGeom,
+ theErr);
+
+ // must be reimplemente in connection with mesh type eSTRUCTURE
+// GetNames(aTElemInfo,
+// nbElems,
+// theEntity,
+// theGeom,
+// theErr);
+ } else {
+ aElemInfo = CrElemInfo(theMeshInfo,
+ nbElems,
+ aFamNum,
+ aElemNum,
+ aElemNames);
+ }
+
+ return aElemInfo;
+ }
+ return PElemInfo();
+ }
+
+
+ //----------------------------------------------------------------------------
+ PCellInfo
+ TWrapper
+ ::GetPCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ if(theMeshInfo->GetType() != eNON_STRUCTURE)
+ return PCellInfo();
+ TInt aNbElem = GetNbCells(theMeshInfo,theEntity,theGeom,theConnMode);
+ PCellInfo anInfo = CrCellInfo(theMeshInfo,theEntity,theGeom,aNbElem,theConnMode);
+ GetCellInfo(anInfo,theErr);
+
+#ifdef _DEBUG_
+ TInt aConnDim = anInfo->GetConnDim();
+ INITMSG(MYDEBUG,"GetPCellInfo - theEntity = "<<theEntity<<"; theGeom = "<<theGeom<<"; aConnDim: "<<aConnDim<<"\n");
+ BEGMSG(MYDEBUG,"GetPCellInfo - aNbElem: "<<aNbElem<<": ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ TCConnSlice aConnSlice = anInfo->GetConnSlice(iElem);
+ for(TInt iConn = 0; iConn < aConnDim; iConn++){
+ ADDMSG(MYVALUEDEBUG,aConnSlice[iConn]<<",");
+ }
+ ADDMSG(MYVALUEDEBUG," ");
+ }
+ ADDMSG(MYDEBUG, std::endl);
+
+ BEGMSG(MYVALUEDEBUG,"GetPCellInfo - GetFamNum: ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetFamNum(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+
+ if(anInfo->IsElemNum()){
+ BEGMSG(MYVALUEDEBUG,"GetPCellInfo - GetElemNum: ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetElemNum(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+ }
+ ADDMSG(MYDEBUG, std::endl);
+#endif
+
+ return anInfo;
+ }
+
+ //----------------------------------------------------------------------------
+ //! Read a MEDWrapped representation of MED Balls from the MED file
+ PBallInfo
+ TWrapper
+ ::GetPBallInfo(const PMeshInfo& theMeshInfo)
+ {
+ TInt nbBalls = GetNbBalls(theMeshInfo);
+ if ( nbBalls < 1 ) return PBallInfo();
+
+ PBallInfo anInfo = CrBallInfo( theMeshInfo, nbBalls );
+ GetBallInfo(anInfo);
+
+ return anInfo;
+ }
+ //----------------------------------------------------------------------------
+ PFieldInfo
+ TWrapper
+ ::GetPFieldInfo(const PMeshInfo& theMeshInfo,
+ TInt theId,
+ TErr* theErr)
+ {
+ TInt aNbComp = GetNbComp(theId);
+ PFieldInfo anInfo = CrFieldInfo(theMeshInfo,aNbComp);
+ GetFieldInfo(theId,*anInfo,theErr);
+
+#ifdef _DEBUG_
+ INITMSG(MYDEBUG,
+ "GetPFieldInfo "<<
+ "- aName = '"<<anInfo->GetName()<<"'"<<
+ "; aType = "<<anInfo->GetType()<<
+ "; aNbComp = "<<aNbComp<<
+ std::endl);
+#endif
+
+ return anInfo;
+ }
+
+
+ //----------------------------------------------------------------------------
+ PTimeStampInfo
+ TWrapper
+ ::GetPTimeStampInfo(const PFieldInfo& theFieldInfo,
+ EEntiteMaillage theEntity,
+ const TGeom2Size& theGeom2Size,
+ TInt theId,
+ TErr* theErr)
+ {
+ PTimeStampInfo anInfo = CrTimeStampInfo(theFieldInfo,theEntity,theGeom2Size);
+ GetTimeStampInfo(theId,*anInfo,theErr);
+
+#ifdef _DEBUG_
+ INITMSG(MYDEBUG,"GetPTimeStampInfo - anEntity = "<<anInfo->GetEntity()<<"\n");
+ TGeom2NbGauss& aGeom2NbGauss = anInfo->myGeom2NbGauss;
+ TGeom2NbGauss::const_iterator anIter = aGeom2NbGauss.begin();
+ for(; anIter != aGeom2NbGauss.end(); anIter++){
+ const EGeometrieElement& aGeom = anIter->first;
+ INITMSG(MYDEBUG,"aGeom = "<<aGeom<<" - "<<aGeom2NbGauss[aGeom]<<";\n");
+ }
+#endif
+
+ return anInfo;
+ }
+
+
+ //----------------------------------------------------------------------------
+ PProfileInfo
+ TWrapper
+ ::GetPProfileInfo(TInt theId,
+ EModeProfil theMode,
+ TErr* theErr)
+ {
+ TProfileInfo::TInfo aPreInfo = GetProfilePreInfo(theId);
+ PProfileInfo anInfo = CrProfileInfo(aPreInfo,theMode);
+ GetProfileInfo(theId,*anInfo,theErr);
+
+ return anInfo;
+ }
+
+
+ //----------------------------------------------------------------------------
+ PTimeStampValueBase
+ TWrapper
+ ::CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const TGeom2Profile& theGeom2Profile,
+ EModeSwitch theMode)
+ {
+ PFieldInfo aFieldInfo = theTimeStampInfo->GetFieldInfo();
+ return CrTimeStampValue(theTimeStampInfo,
+ aFieldInfo->GetType(),
+ theGeom2Profile,
+ theMode);
+ }
+
+ //----------------------------------------------------------------------------
+ PTimeStampValueBase
+ TWrapper
+ ::CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const PTimeStampValueBase& theInfo)
+ {
+ PFieldInfo aFieldInfo = theTimeStampInfo->GetFieldInfo();
+ return CrTimeStampValue(theTimeStampInfo,
+ theInfo,
+ aFieldInfo->GetType());
+ }
+
+ //----------------------------------------------------------------------------
+ template<class TimeStampValueType>
+ void
+ Print(SharedPtr<TimeStampValueType> theTimeStampValue)
+ {
+ INITMSG(MYDEBUG,"Print - TimeStampValue\n");
+ typename TimeStampValueType::TTGeom2Value& aGeom2Value = theTimeStampValue->myGeom2Value;
+ typename TimeStampValueType::TTGeom2Value::const_iterator anIter = aGeom2Value.begin();
+ for(; anIter != aGeom2Value.end(); anIter++){
+ const EGeometrieElement& aGeom = anIter->first;
+ const typename TimeStampValueType::TTMeshValue& aMeshValue = anIter->second;
+ TInt aNbElem = aMeshValue.myNbElem;
+ TInt aNbGauss = aMeshValue.myNbGauss;
+ TInt aNbComp = aMeshValue.myNbComp;
+ INITMSG(MYDEBUG,"aGeom = "<<aGeom<<" - "<<aNbElem<<": ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ typename TimeStampValueType::TTMeshValue::TCValueSliceArr aValueSliceArr = aMeshValue.GetGaussValueSliceArr(iElem);
+ ADDMSG(MYVALUEDEBUG,"{");
+ for(TInt iGauss = 0; iGauss < aNbGauss; iGauss++){
+ const typename TimeStampValueType::TTMeshValue::TCValueSlice& aValueSlice = aValueSliceArr[iGauss];
+ for(TInt iComp = 0; iComp < aNbComp; iComp++){
+ ADDMSG(MYVALUEDEBUG,aValueSlice[iComp]<<" ");
+ }
+ ADDMSG(MYVALUEDEBUG,"| ");
+ }
+ ADDMSG(MYVALUEDEBUG,"} ");
+ }
+ ADDMSG(MYDEBUG,"\n");
+ }
+ }
+
+ //----------------------------------------------------------------------------
+ PTimeStampValueBase
+ TWrapper
+ ::GetPTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr)
+ {
+ PFieldInfo aFieldInfo = theTimeStampInfo->GetFieldInfo();
+ PTimeStampValueBase anInfo = CrTimeStampValue(theTimeStampInfo,
+ aFieldInfo->GetType());
+ GetTimeStampValue(anInfo,
+ theMKey2Profile,
+ theKey2Gauss,
+ theErr);
+#ifdef _DEBUG_
+ if(aFieldInfo->GetType() == eFLOAT64)
+ Print<TFloatTimeStampValue>(anInfo);
+ else
+ Print<TIntTimeStampValue>(anInfo);
+#endif
+ return anInfo;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TWrapper
+ ::GetTimeStampVal(const PTimeStampVal& theVal,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr)
+ {
+ PTimeStampInfo aTimeStampInfo = theVal->GetTimeStampInfo();
+ PFieldInfo aFieldInfo = aTimeStampInfo->GetFieldInfo();
+ if(aFieldInfo->GetType() == eFLOAT64)
+ GetTimeStampValue(theVal,
+ theMKey2Profile,
+ theKey2Gauss,
+ theErr);
+ else{
+ PTimeStampValueBase aVal = CrTimeStampValue(aTimeStampInfo,
+ theVal,
+ eINT);
+ GetTimeStampValue(aVal,
+ theMKey2Profile,
+ theKey2Gauss,
+ theErr);
+ CopyTimeStampValueBase(aVal, theVal);
+ }
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TWrapper
+ ::SetTimeStamp(const PTimeStampVal& theVal,
+ TErr* theErr)
+ {
+ PTimeStampInfo aTimeStampInfo = theVal->GetTimeStampInfo();
+ PFieldInfo aFieldInfo = aTimeStampInfo->GetFieldInfo();
+ if(aFieldInfo->GetType() == eFLOAT64)
+ SetTimeStampValue(theVal, theErr);
+ else{
+ PTimeStampValueBase aVal = CrTimeStampValue(aTimeStampInfo,
+ eINT,
+ theVal->GetGeom2Profile(),
+ theVal->GetModeSwitch());
+ CopyTimeStampValueBase(theVal, aVal);
+ SetTimeStampValue(aVal, theErr);
+ }
+ }
+
+ //----------------------------------------------------------------------------
+ PTimeStampVal
+ TWrapper
+ ::CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo,
+ const TGeom2Profile& theGeom2Profile,
+ EModeSwitch theMode)
+ {
+ return CrTimeStampValue(theTimeStampInfo,
+ eFLOAT64,
+ theGeom2Profile,
+ theMode);
+ }
+
+ //----------------------------------------------------------------------------
+ PTimeStampVal
+ TWrapper
+ ::CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo,
+ const PTimeStampVal& theInfo)
+ {
+ return CrTimeStampValue(theTimeStampInfo,
+ theInfo,
+ eFLOAT64);
+ }
+
+ //----------------------------------------------------------------------------
+ PTimeStampVal
+ TWrapper
+ ::GetPTimeStampVal(const PTimeStampInfo& theTimeStampInfo,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr)
+ {
+ PTimeStampVal anInfo = CrTimeStampVal(theTimeStampInfo);
+ GetTimeStampVal(anInfo,
+ theMKey2Profile,
+ theKey2Gauss,
+ theErr);
+ return anInfo;
+ }
+
+ //----------------------------------------------------------------------------
+ PGrilleInfo
+ TWrapper
+ ::GetPGrilleInfo(const PMeshInfo& theMeshInfo)
+ {
+ if(theMeshInfo->GetType() != eSTRUCTURE)
+ return PGrilleInfo();
+
+ EGrilleType type;
+ GetGrilleType(*theMeshInfo,type);
+ PGrilleInfo anInfo;
+ if(type == eGRILLE_STANDARD){
+ const TInt nnoeuds = GetNbNodes(*theMeshInfo);
+ anInfo = CrGrilleInfo(theMeshInfo,type,nnoeuds);
+ }
+ else {
+ TIntVector aVec;
+ aVec.resize(theMeshInfo->GetDim());
+ for(int aAxe=0;aAxe<theMeshInfo->GetDim();aAxe++){
+ ETable aATable;
+ switch(aAxe){
+ case 0:
+ aATable = eCOOR_IND1;
+ break;
+ case 1:
+ aATable = eCOOR_IND2;
+ break;
+ case 2:
+ aATable = eCOOR_IND3;
+ break;
+ }
+ aVec[aAxe] = GetNbNodes(*theMeshInfo,aATable);
+ }
+ anInfo = CrGrilleInfo(theMeshInfo,type,aVec);
+ }
+
+ GetGrilleInfo(anInfo);
+ anInfo->SetGrilleType(type);
+
+#ifdef _DEBUG_
+ INITMSG(MYDEBUG,"GetPGrilleInfo: ");
+ {
+ TInt aNbElem = anInfo->GetNbNodes();
+ BEGMSG(MYVALUEDEBUG,"GetFamNumNode: ");
+ for(TInt iElem = 0; iElem < aNbElem; iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetFamNumNode(iElem)<<", ");
+ }
+ TInt aNbCells = anInfo->GetNbCells();
+ BEGMSG(MYVALUEDEBUG,"GetFamNum: ");
+ for(TInt iElem = 0; iElem < aNbCells; iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetFamNum(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+ BEGMSG(MYVALUEDEBUG,"GetCoordName: ");
+ for(TInt iElem = 0; iElem < theMeshInfo->GetDim(); iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetCoordName(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+ BEGMSG(MYVALUEDEBUG,"GetCoordUnit: ");
+ for(TInt iElem = 0; iElem < theMeshInfo->GetDim(); iElem++){
+ ADDMSG(MYVALUEDEBUG,anInfo->GetCoordUnit(iElem)<<", ");
+ }
+ ADDMSG(MYVALUEDEBUG, std::endl);
+
+ }
+#endif
+
+ return anInfo;
+ }
+
+ //----------------------------------------------------------------------------
+ PGrilleInfo
+ TWrapper
+ ::GetPGrilleInfo(const PMeshInfo& theMeshInfo,
+ const PGrilleInfo& theInfo)
+ {
+ PGrilleInfo anInfo = CrGrilleInfo(theMeshInfo,theInfo);
+ return anInfo;
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+
+#ifndef MED_Wrapper_HeaderFile
+#define MED_Wrapper_HeaderFile
+
+#include "MED_WrapperBase.hxx"
+
+#include "MED_Structures.hxx"
+#include "MED_Algorithm.hxx"
+
+#include <boost/thread/mutex.hpp>
+
+namespace MED
+{
+
+ //----------------------------------------------------------------------------
+ //! Define a base class that wraps the MED API
+ struct MEDWRAPPER_EXPORT TWrapper
+ {
+ typedef boost::mutex TMutex;
+ //! This is a syncronization primitive which allow to support thread safety for the MED access
+ TMutex myMutex;
+
+ virtual
+ ~TWrapper();
+
+ //----------------------------------------------------------------------------
+ //! Gets version of the MED library used for the MED file
+ virtual
+ EVersion
+ GetVersion() = 0;
+
+ //----------------------------------------------------------------------------
+ //! Creates a MEDWrapper MED Mesh representation
+ virtual
+ PMeshInfo
+ CrMeshInfo(TInt theDim = 0, TInt theSpaceDim = 0,
+ const std::string& theValue = "",
+ EMaillage theType = eNON_STRUCTURE,
+ const std::string& theDesc = "") = 0;
+
+ //! A copy-constructor for the MEDWrapper MED Mesh representation
+ virtual
+ PMeshInfo
+ CrMeshInfo(const PMeshInfo& theInfo) = 0;
+
+ //! Read number of MED Mesh entities in the defined MED file
+ virtual
+ TInt
+ GetNbMeshes(TErr* theErr = NULL) = 0;
+
+ //! Read a MEDWrapper MED Mesh representation by its number
+ virtual
+ void
+ GetMeshInfo(TInt theMeshId,
+ TMeshInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Write the MEDWrapper MED Mesh representation in the defined MED file
+ virtual
+ void
+ SetMeshInfo(const TMeshInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Read a MEDWrapper MED Mesh representation by its number
+ virtual
+ PMeshInfo
+ GetPMeshInfo(TInt theId,
+ TErr* theErr = NULL);
+
+
+ //----------------------------------------------------------------------------
+ //! Read number of MED Family entities in the defined MED file
+ virtual
+ TInt
+ GetNbFamilies(const TMeshInfo& theMeshInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Read number of attributes for defined MED Family
+ virtual
+ TInt
+ GetNbFamAttr(TInt theFamId,
+ const TMeshInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Read number of MED Groups where MED Family with the number belong to
+ virtual
+ TInt
+ GetNbFamGroup(TInt theFamId,
+ const TMeshInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Read a MEDWrapper MED Family representation by its number
+ virtual
+ void
+ GetFamilyInfo(TInt theFamId,
+ TFamilyInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Write a MEDWrapper MED Family representation by its number
+ virtual
+ void
+ SetFamilyInfo(const TFamilyInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Creates a MEDWrapper MED Family representation
+ virtual
+ PFamilyInfo
+ CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbGroup = 0,
+ TInt theNbAttr = 0,
+ TInt theId = 0,
+ const std::string& theValue = "") = 0;
+
+ //! Creates a MEDWrapper MED Family representation
+ virtual
+ PFamilyInfo
+ CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ const std::string& theValue,
+ TInt theId,
+ const TStringSet& theGroupNames,
+ const TStringVector& theAttrDescs = TStringVector(),
+ const TIntVector& theAttrIds = TIntVector(),
+ const TIntVector& theAttrVals = TIntVector()) = 0;
+
+ //! A copy-constructor for the MEDWrapper MED Family representation
+ virtual
+ PFamilyInfo
+ CrFamilyInfo(const PMeshInfo& theMeshInfo,
+ const PFamilyInfo& theInfo) = 0;
+
+ //! Write a MEDWrapper MED Family representation by its number
+ PFamilyInfo
+ GetPFamilyInfo(const PMeshInfo& theMeshInfo,
+ TInt theId,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ //! Read sequence of names for any descendant of TElemInfo
+ virtual
+ void
+ GetNames(TElemInfo& theInfo,
+ TInt theNb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL)
+ {}
+
+ //! Read sequence of numerous for any descendant of TElemInfo
+ virtual
+ void
+ GetNumeration(TElemInfo& theInfo,
+ TInt theNb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL)
+ {}
+
+ //! Read sequence MED Family indexes for any descendant of TElemInfo
+ virtual
+ void
+ GetFamilies(TElemInfo& theInfo,
+ TInt theNb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL)
+ {}
+
+ //! Write sequence of names for any descendant of TElemInfo
+ virtual
+ void
+ SetNames(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL)
+ {}
+
+ //! Write sequence of numerous for any descendant of TElemInfo
+ virtual
+ void
+ SetNumeration(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL)
+ {}
+
+ //! Write sequence MED Family indexes for any descendant of TElemInfo
+ virtual
+ void
+ SetFamilies(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL)
+ {}
+
+ //! Read a MEDWrapper MED Element representation from defined MED file
+ PElemInfo
+ GetPElemInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity = eNOEUD,
+ EGeometrieElement theGeom = ePOINT1,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ //! Read number of nodes in defined MED Mesh
+ virtual
+ TInt
+ GetNbNodes(const TMeshInfo& theMeshInfo,
+ TErr* theErr = NULL) = 0;
+
+ virtual
+ TInt
+ GetNbNodes(const TMeshInfo& theMeshInfo,
+ ETable theTable,
+ TErr* theErr = NULL)
+ {
+ return 0;
+ }
+
+ //! Read a MEDWrapper MED Nodes representation from defined MED file
+ virtual
+ void
+ GetNodeInfo(TNodeInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Write the MEDWrapper MED Nodes representation into defined MED file
+ virtual
+ void
+ SetNodeInfo(const TNodeInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Creates a MEDWrapper MED Nodes representation
+ virtual
+ PElemInfo
+ CrElemInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI)
+ {
+ return PElemInfo();
+ }
+
+ //! Creates a MEDWrapper MED Nodes representation
+ virtual
+ PElemInfo
+ CrElemInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ const TIntVector& theFamNum,
+ const TIntVector& aElemNum,
+ const TStringVector& aElemNames)
+ {
+ return PElemInfo();
+ }
+
+ //! Creates a MEDWrapper MED Nodes representation
+ virtual
+ PNodeInfo
+ CrNodeInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbElem,
+ EModeSwitch theMode = eFULL_INTERLACE,
+ ERepere theSystem = eCART,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI) = 0;
+
+ //! Creates a MEDWrapper MED Nodes representation
+ virtual
+ PNodeInfo
+ CrNodeInfo(const PMeshInfo& theMeshInfo,
+ const TFloatVector& theNodeCoords,
+ EModeSwitch theMode = eFULL_INTERLACE,
+ ERepere theSystem = eCART,
+ const TStringVector& theCoordNames = TStringVector(),
+ const TStringVector& theCoordUnits = TStringVector(),
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector()) = 0;
+
+ //! A copy-constructor for the MEDWrapper MED Nodes representation
+ virtual
+ PNodeInfo
+ CrNodeInfo(const PMeshInfo& theMeshInfo,
+ const PNodeInfo& theInfo) = 0;
+
+ //! Read a MEDWrapper MED Nodes representation from defined MED file
+ PNodeInfo
+ GetPNodeInfo(const PMeshInfo& theMeshInfo,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ //! Read a MEDWrapper MED Polygones representation from defined MED file
+ /*! This feature is supported only for version of 2.2 and higher */
+ virtual
+ void
+ GetPolygoneInfo(TPolygoneInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Write a MEDWrapper MED Polygones representation from defined MED file
+ /*! This feature is supported only for version of 2.2 and higher */
+ virtual
+ void
+ SetPolygoneInfo(const TPolygoneInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Read number of MED Polygones in defined MED Mesh
+ /*! This feature is supported only for version of 2.2 and higher */
+ virtual
+ TInt
+ GetNbPolygones(const TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL)
+ {
+ return 0;
+ }
+
+ //! Read connectivity infroamtion for the MED Polygones in defined MED Mesh
+ /*! This feature is supported only for version of 2.2 and higher */
+ virtual
+ TInt
+ GetPolygoneConnSize(const TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL)
+ {
+ return 0;
+ }
+
+ //! Creates a MEDWrapper MED Polygones representation
+ /*! This feature is supported only for version of 2.2 and higher */
+ virtual
+ PPolygoneInfo
+ CrPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theConnSize,
+ EConnectivite theConnMode = eNOD,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI)
+ {
+ return PPolygoneInfo();
+ }
+
+ //! Creates a MEDWrapper MED Polygones representation
+ /*! This feature is supported only for version of 2.2 and higher */
+ virtual
+ PPolygoneInfo
+ CrPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theIndexes,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode = eNOD,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector())
+ {
+ return PPolygoneInfo();
+ }
+
+ //! A copy-constructor for the MEDWrapper MED Polygones representation
+ virtual
+ PPolygoneInfo
+ CrPolygoneInfo(const PMeshInfo& theMeshInfo,
+ const PPolygoneInfo& theInfo)
+ {
+ return PPolygoneInfo();
+ }
+
+ //! Read a MEDWrapper MED Polygones representation from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ PPolygoneInfo
+ GetPPolygoneInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD);
+
+ //----------------------------------------------------------------------------
+ //! Read a MEDWrapper MED Polyedres representation from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ void
+ GetPolyedreInfo(TPolyedreInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Write a MEDWrapper MED Polyedres representation from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ void
+ SetPolyedreInfo(const TPolyedreInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Read number of MED Polyedres in defined MED Mesh
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ TInt
+ GetNbPolyedres(const TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL)
+ {
+ return 0;
+ }
+
+ //! Read connectivity infroamtion for the MED Polyedres in defined MED Mesh
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ void
+ GetPolyedreConnSize(const TMeshInfo& theMeshInfo,
+ TInt& theNbFaces,
+ TInt& theConnSize,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL)
+ {
+ theNbFaces = theConnSize = 0;
+ }
+
+ virtual
+ PPolyedreInfo
+ CrPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ TInt theNbFaces,
+ TInt theConnSize,
+ EConnectivite theConnMode = eNOD,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI)
+ {
+ return PPolyedreInfo();
+ }
+
+ //! Creates a MEDWrapper MED Polyedres representation
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ PPolyedreInfo
+ CrPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theIndexes,
+ const TIntVector& theFaces,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode = eNOD,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector())
+ {
+ return PPolyedreInfo();
+ }
+
+ //! A copy-constructor for the MEDWrapper MED Polyedres representation
+ virtual
+ PPolyedreInfo
+ CrPolyedreInfo(const PMeshInfo& theMeshInfo,
+ const PPolyedreInfo& theInfo)
+ {
+ return PPolyedreInfo();
+ }
+
+ //! Read a MEDWrapper MED Polyedres representation from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ PPolyedreInfo
+ GetPPolyedreInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD);
+
+ //----------------------------------------------------------------------------
+ //! Get TEntityInfo which contains brief information about existing cells and their destribution among MED ENTITIES
+ virtual
+ TEntityInfo
+ GetEntityInfo(const TMeshInfo& theMeshInfo,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL) = 0;
+
+ //! Read number of cells for defined MED Mesh, ENTITY and geometrical type with define mode of connectivity
+ virtual
+ TInt
+ GetNbCells(const TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL) = 0;
+
+ //! Read a MEDWrapper MED Cells representation from defined MED file
+ virtual
+ void
+ GetCellInfo(TCellInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Write the MEDWrapper MED Cells representation into defined MED file
+ virtual
+ void
+ SetCellInfo(const TCellInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Creates a MEDWrapper MED Cells representation
+ virtual
+ PCellInfo
+ CrCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TInt theNbElem,
+ EConnectivite theConnMode = eNOD,
+ EBooleen theIsElemNum = eVRAI,
+ EBooleen theIsElemNames = eVRAI,
+ EModeSwitch theMode = eFULL_INTERLACE) = 0;
+
+ //! Creates a MEDWrapper MED Cells representation
+ virtual
+ PCellInfo
+ CrCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ const TIntVector& theConnectivities,
+ EConnectivite theConnMode = eNOD,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector(),
+ const TStringVector& theElemNames = TStringVector(),
+ EModeSwitch theMode = eFULL_INTERLACE) = 0;
+
+ //! A copy-constructor for the MEDWrapper MED Cells representation
+ virtual
+ PCellInfo
+ CrCellInfo(const PMeshInfo& theMeshInfo,
+ const PCellInfo& theInfo) = 0;
+
+ //! Read a MEDWrapper MED Cells representation from defined MED file
+ PCellInfo
+ GetPCellInfo(const PMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ //! Read number of balls in the Mesh
+ /*! This feature is supported since version 3.0 */
+ virtual
+ TInt
+ GetNbBalls(const TMeshInfo& theMeshInfo)
+ {
+ return 0;
+ }
+
+ //! Read a MEDWrapped representation of MED_BALL from the MED file
+ /*! This feature is supported since version 3.0 */
+ virtual
+ void
+ GetBallInfo(TBallInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Write a MEDWrapped representation of MED_BALL to the MED file
+ /*! This feature is supported since version 3.0 */
+ virtual
+ void
+ SetBallInfo(const TBallInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Creates a MEDWrapper MED Balls representation
+ /*! This feature is supported since version 3.0 */
+ virtual
+ PBallInfo
+ CrBallInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbBalls,
+ EBooleen theIsElemNum = eVRAI)
+ {
+ return PBallInfo();
+ }
+
+ //! Creates a MEDWrapper MED Balls representation
+ /*! This feature is supported since version 3.0 */
+ virtual
+ PBallInfo
+ CrBallInfo(const PMeshInfo& theMeshInfo,
+ const TIntVector& theNodes,
+ TFloatVector& theDiameters,
+ const TIntVector& theFamilyNums = TIntVector(),
+ const TIntVector& theElemNums = TIntVector())
+ {
+ return PBallInfo();
+ }
+
+ //! A copy-constructor for the MEDWrapped MED Balls representation
+ virtual
+ PBallInfo
+ CrBallInfo(const PMeshInfo& theMeshInfo,
+ const PBallInfo& theInfo)
+ {
+ return PBallInfo();
+ }
+
+ //! Read a MEDWrapped MED Balls representation from defined MED file
+ /*! This feature is supported since version 3.0 */
+ virtual
+ PBallInfo
+ GetPBallInfo(const PMeshInfo& theMeshInfo);
+
+ //----------------------------------------------------------------------------
+ //! Read number of MED FIELDS in defined MED Mesh
+ virtual
+ TInt
+ GetNbFields(TErr* theErr = NULL) = 0;
+
+ //! Read number of components for the defined MED FIELD by its order number
+ virtual
+ TInt
+ GetNbComp(TInt theFieldId,
+ TErr* theErr = NULL) = 0;
+
+ //! Read MEDWrapper MED FIELD representation by its order number
+ virtual
+ void
+ GetFieldInfo(TInt theFieldId,
+ TFieldInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Write MEDWrapper MED FIELD representation into defined MED file
+ virtual
+ void
+ SetFieldInfo(const TFieldInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+
+ //! Creates a MEDWrapper MED FIELD representation
+ virtual
+ PFieldInfo
+ CrFieldInfo(const PMeshInfo& theMeshInfo,
+ TInt theNbComp = 0,
+ ETypeChamp theType = eFLOAT64,
+ const std::string& theValue = "",
+ EBooleen theIsLocal = eVRAI,
+ TInt theNbRef = 1) = 0;
+
+ //! A copy-constructor for the MEDWrapper MED FIELD representation
+ virtual
+ PFieldInfo
+ CrFieldInfo(const PMeshInfo& theMeshInfo,
+ const PFieldInfo& theInfo) = 0;
+
+ //! Read a MEDWrapper MED FIELD representation from defined MED file
+ PFieldInfo
+ GetPFieldInfo(const PMeshInfo& theMeshInfo,
+ TInt theId,
+ TErr* theErr = NULL);
+
+
+ //----------------------------------------------------------------------------
+ //! Read number of MED GAUSS in defined MED Mesh
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ TInt
+ GetNbGauss(TErr* theErr = NULL)
+ {
+ return TInt();
+ }
+
+ //! Read brief MED GAUSS information by its order number from defined MED Mesh
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ TGaussInfo::TInfo
+ GetGaussPreInfo(TInt theId,
+ TErr* theErr = NULL)
+ {
+ return TGaussInfo::TInfo( TGaussInfo::TKey(ePOINT1,""),0 );
+ }
+
+ //! Read a MEDWrapper MED GAUSS representation by its order number from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ void
+ GetGaussInfo(TInt theId,
+ TGaussInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Creates a MEDWrapper MED GAUSS representation
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ PGaussInfo
+ CrGaussInfo(const TGaussInfo::TInfo& theInfo,
+ EModeSwitch theMode = eFULL_INTERLACE) = 0;
+
+
+ //----------------------------------------------------------------------------
+ //! Read number of MED TIMESTAMPS in defined MED Mesh
+ /*!
+ By the way some additional information can be obtained:
+ - to what MED ENTITY the MED TIMESTAMP conntected to;
+ - on what geometrical types the MED TIMESTAMP defined to.
+ */
+ virtual
+ TInt
+ GetNbTimeStamps(const TFieldInfo& theInfo,
+ const TEntityInfo& theEntityInfo,
+ EEntiteMaillage& theEntity,
+ TGeom2Size& theGeom2Size,
+ TErr* theErr = NULL) = 0;
+
+ //! Read MEDWrapper MED TIMESTAMP representation by its order number
+ virtual
+ void
+ GetTimeStampInfo(TInt theTimeStampId,
+ TTimeStampInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Creates a MEDWrapper MED TIMESTAMP representation
+ virtual
+ PTimeStampInfo
+ CrTimeStampInfo(const PFieldInfo& theFieldInfo,
+ EEntiteMaillage theEntity,
+ const TGeom2Size& theGeom2Size,
+ const TGeom2NbGauss& theGeom2NbGauss = TGeom2NbGauss(),
+ TInt theNumDt = 0,
+ TInt theNumOrd = 0,
+ TFloat theDt = 0,
+ const std::string& theUnitDt = "",
+ const TGeom2Gauss& theGeom2Gauss = TGeom2Gauss()) = 0;
+
+ //! A copy-constructor for the MEDWrapper MED TIMESTAMP representation
+ virtual
+ PTimeStampInfo
+ CrTimeStampInfo(const PFieldInfo& theFieldInfo,
+ const PTimeStampInfo& theInfo) = 0;
+
+ //! Read MEDWrapper MED TIMESTAMP representation by its order number
+ PTimeStampInfo
+ GetPTimeStampInfo(const PFieldInfo& theFieldInfo,
+ EEntiteMaillage theEntity,
+ const TGeom2Size& theGeom2Size,
+ TInt theId,
+ TErr* theErr = NULL);
+
+
+ //----------------------------------------------------------------------------
+ //! Read number of MED PROFILES in defined MED Mesh
+ virtual
+ TInt
+ GetNbProfiles(TErr* theErr = NULL) = 0;
+
+ //! Read brief MED PROFILE information by its order number from defined MED Mesh
+ virtual
+ TProfileInfo::TInfo
+ GetProfilePreInfo(TInt theId,
+ TErr* theErr = NULL) = 0;
+
+ //! Read a MEDWrapper MED PROFILE representation by its order number from defined MED file
+ virtual
+ void
+ GetProfileInfo(TInt theId,
+ TProfileInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Creates a MEDWrapper MED PROFILE representation
+ virtual
+ PProfileInfo
+ CrProfileInfo(const TProfileInfo::TInfo& theInfo,
+ EModeProfil theMode = eCOMPACT) = 0;
+
+ //! Write a MEDWrapper MED PROFILE representation
+ virtual
+ void
+ SetProfileInfo(const TProfileInfo& theInfo,
+ TErr* theErr = NULL) = 0;
+
+ //! Read a MEDWrapper MED PROFILE representation by its order number from defined MED file
+ PProfileInfo
+ GetPProfileInfo(TInt theId,
+ EModeProfil theMode = eCOMPACT,
+ TErr* theErr = NULL);
+
+
+ //----------------------------------------------------------------------------
+ //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file
+ virtual
+ void
+ GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr = NULL) = 0;
+
+ //! Write the values for MEDWrapper MED TIEMSTAMP to defined MED file
+ virtual
+ void
+ SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue,
+ TErr* theErr = NULL) = 0;
+
+ //! Creates the values for MEDWrapper MED TIEMSTAMP representation
+ virtual
+ PTimeStampValueBase
+ CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ ETypeChamp theTypeChamp,
+ const TGeom2Profile& theGeom2Profile = TGeom2Profile(),
+ EModeSwitch theMode = eFULL_INTERLACE) = 0;
+
+ //! Creates the values for MEDWrapper MED TIEMSTAMP representation
+ virtual
+ PTimeStampValueBase
+ CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const TGeom2Profile& theGeom2Profile = TGeom2Profile(),
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+ //! A copy-constructor for the values for MEDWrapper MED TIEMSTAMP representation
+ virtual
+ PTimeStampValueBase
+ CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const PTimeStampValueBase& theInfo,
+ ETypeChamp theTypeChamp) = 0;
+
+ //! A copy-constructor for the values for MEDWrapper MED TIEMSTAMP representation
+ virtual
+ PTimeStampValueBase
+ CrTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const PTimeStampValueBase& theInfo);
+
+ //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file
+ PTimeStampValueBase
+ GetPTimeStampValue(const PTimeStampInfo& theTimeStampInfo,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ // Backward compatibility declarations
+ //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file
+ virtual
+ void
+ GetTimeStampVal(const PTimeStampVal& theVal,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr = NULL);
+
+ //! Write the values for MEDWrapper MED TIEMSTAMP to defined MED file
+ virtual
+ void
+ SetTimeStamp(const PTimeStampVal& theVal,
+ TErr* theErr = NULL);
+
+ //! Creates the values for MEDWrapper MED TIEMSTAMP representation
+ virtual
+ PTimeStampVal
+ CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo,
+ const TGeom2Profile& theGeom2Profile = TGeom2Profile(),
+ EModeSwitch theMode = eFULL_INTERLACE);
+
+ //! A copy-constructor for the values for MEDWrapper MED TIEMSTAMP representation
+ virtual
+ PTimeStampVal
+ CrTimeStampVal(const PTimeStampInfo& theTimeStampInfo,
+ const PTimeStampVal& theInfo);
+
+ //! Read the values for MEDWrapper MED TIEMSTAMP from defined MED file
+ PTimeStampVal
+ GetPTimeStampVal(const PTimeStampInfo& theTimeStampInfo,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ //! Read a MEDWrapper MED Grille representation from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ PGrilleInfo
+ GetPGrilleInfo(const PMeshInfo& theMeshInfo);
+
+ //! Read a MEDWrapper MED Grille representation from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ PGrilleInfo
+ GetPGrilleInfo(const PMeshInfo& theMeshInfo,
+ const PGrilleInfo& theInfo);
+
+ //! Read a MEDWrapper MED Grille representation from defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ void
+ GetGrilleInfo(TGrilleInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ //! Write the MEDWrapper MED Grille representation into defined MED file
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ void
+ SetGrilleInfo(const TGrilleInfo& theInfo,
+ TErr* theErr = NULL)
+ {}
+
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const PGrilleInfo& theGrilleInfo)
+ {
+ return PGrilleInfo();
+ }
+
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo)
+ {
+ return PGrilleInfo();
+ }
+
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type)
+ {
+ return PGrilleInfo();
+ }
+
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type,
+ const TInt& nbNodes)
+ {
+ return PGrilleInfo();
+ }
+
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ PGrilleInfo
+ CrGrilleInfo(const PMeshInfo& theMeshInfo,
+ const EGrilleType& type,
+ const MED::TIntVector& nbNodeVec)
+ {
+ return PGrilleInfo();
+ }
+
+ /*! This feature is support only for version of 2.2 and higher */
+ virtual
+ void
+ GetGrilleType(const TMeshInfo& theMeshInfo,
+ EGrilleType& type,
+ TErr* theErr = NULL)
+ {
+ }
+
+ };
+
+
+ //----------------------------------------------------------------------------
+ //! This class provide thread-safety for MEDWrapper interaction
+ class MEDWRAPPER_EXPORT TLockProxy
+ {
+ TLockProxy& operator=(const TLockProxy& );
+ TWrapper* myWrapper;
+
+ public:
+ TLockProxy(TWrapper* theWrapper);
+
+ ~TLockProxy();
+
+ TWrapper * operator-> () const;
+ };
+
+
+ //----------------------------------------------------------------------------
+ //! To specialize the SharedPtr for TWrapper
+ template<>
+ class MEDWRAPPER_EXPORT SharedPtr<TWrapper>: public boost::shared_ptr<TWrapper>
+ {
+ public:
+ SharedPtr() {}
+
+ template<class Y>
+ explicit SharedPtr(Y * p):
+ boost::shared_ptr<TWrapper>(p)
+ {}
+
+ template<class Y>
+ SharedPtr(SharedPtr<Y> const & r):
+ boost::shared_ptr<TWrapper>(r,boost::detail::dynamic_cast_tag())
+ {}
+
+ template<class Y>
+ SharedPtr&
+ operator=(SharedPtr<Y> const & r)
+ {
+ boost::shared_ptr<TWrapper>(r,boost::detail::dynamic_cast_tag()).swap(*this);
+ return *this;
+ }
+
+ template<class Y>
+ SharedPtr&
+ operator()(Y * p) // Y must be complete
+ {
+ return operator=<Y>(SharedPtr<Y>(p));
+ }
+
+ template<class Y>
+ SharedPtr&
+ operator()(SharedPtr<Y> const & r) // Y must be complete
+ {
+ return operator=<Y>(SharedPtr<Y>(r));
+ }
+
+ TLockProxy operator-> () const // never throws
+ {
+ return TLockProxy(this->get());
+ }
+
+ protected:
+ operator const TWrapper& () const;
+
+ operator TWrapper& ();
+
+ TWrapper& operator* () const;
+
+ TWrapper * get() const // never throws
+ {
+ return boost::shared_ptr<TWrapper>::get();
+ }
+ };
+
+ //----------------------------------------------------------------------------
+ typedef SharedPtr<TWrapper> PWrapper;
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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 : MED_WrapperBase.hxx
+// Author : Alexander A. BORODIN
+//
+#ifndef _MED_WrapperBase_HXX_
+#define _MED_WrapperBase_HXX_
+
+#ifdef WIN32
+ #if defined MEDWRAPPER_BASE_EXPORTS || defined MEDWrapperBase_EXPORTS
+ #if defined WIN32
+ #define MEDWRAPPER_EXPORT __declspec( dllexport )
+ #else
+ #define MEDWRAPPER_EXPORT
+ #endif
+ #else
+ #if defined WIN32
+ #define MEDWRAPPER_EXPORT __declspec( dllimport )
+ #else
+ #define MEDWRAPPER_EXPORT
+ #endif
+ #endif
+#else
+ #define MEDWRAPPER_EXPORT
+#endif
+
+#endif
--- /dev/null
+# Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+lib_LTLIBRARIES= libMEDWrapperBase.la
+
+salomeinclude_HEADERS= \
+ MED_Common.hxx \
+ MED_Vector.hxx \
+ MED_SharedPtr.hxx \
+ MED_SliceArray.hxx \
+ MED_Wrapper.hxx \
+ MED_TWrapper.hxx \
+ MED_Structures.hxx \
+ MED_TStructures.hxx \
+ MED_Algorithm.hxx \
+ MED_GaussUtils.hxx \
+ MED_CoordUtils.hxx \
+ MED_Utilities.hxx \
+ MED_GaussDef.hxx \
+ MED_WrapperBase.hxx
+
+dist_libMEDWrapperBase_la_SOURCES= \
+ MED_Structures.cxx \
+ MED_Wrapper.cxx \
+ MED_Algorithm.cxx \
+ MED_GaussUtils.cxx \
+ MED_CoordUtils.cxx \
+ MED_Utilities.cxx \
+ MED_GaussDef.cxx
+
+libMEDWrapperBase_la_CPPFLAGS= $(BOOST_CPPFLAGS) $(HDF5_INCLUDES) -D@MACHINE@
+libMEDWrapperBase_la_CPPFLAGS+= -I$(KERNEL_ROOT_DIR)/include/salome
+libMEDWrapperBase_la_CPPFLAGS+= $(MED_CPPFLAGS)
+libMEDWrapperBase_la_LDFLAGS= $(BOOST_LIB_THREAD) $(BOOST_LIB_SYSTEM) $(BOOST_LIB_DATE_TIME)
--- /dev/null
+# Copyright (C) 2012-2013 CEA/DEN, EDF R&D
+#
+# 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
+#
+
+ADD_SUBDIRECTORY(Base)
+ADD_SUBDIRECTORY(V2_2)
+ADD_SUBDIRECTORY(Factory)
--- /dev/null
+# Copyright (C) 2012-2013 CEA/DEN, EDF R&D
+#
+# 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_DIRECTORIES(
+ ${HDF5_INCLUDE_DIRS}
+ ${BOOST_INCLUDE_DIRS}
+ ${MED3_INCLUDE_DIRS}
+ ${CMAKE_CURRENT_SOURCE_DIR}/../Base
+ ${CMAKE_CURRENT_SOURCE_DIR}/../V2_2
+ )
+
+IF(MED_ENABLE_KERNEL)
+ INCLUDE_DIRECTORIES(${KERNEL_ROOT_DIR}/include/salome)
+ELSE(MED_ENABLE_KERNEL)
+ INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/adm_local_without_kernel)
+ENDIF(MED_ENABLE_KERNEL)
+
+SET(MEDWrapper_SOURCES
+ MED_Factory.cxx
+)
+
+SET(mprint_version_SOURCES
+ mprint_version.cxx
+ )
+
+ADD_LIBRARY(MEDWrapper SHARED ${MEDWrapper_SOURCES})
+SET_TARGET_PROPERTIES(MEDWrapper PROPERTIES COMPILE_FLAGS "${BOOST_DEFINITIONS} ${MED3_DEFINITIONS} ${PLATFORM_DEFINITIONS}")
+TARGET_LINK_LIBRARIES(MEDWrapper MEDWrapper_V2_2)
+INSTALL(TARGETS MEDWrapper DESTINATION ${MED_salomelib_LIBS})
+
+ADD_EXECUTABLE(mprint_version ${mprint_version_SOURCES})
+SET_TARGET_PROPERTIES(mprint_version PROPERTIES COMPILE_FLAGS "${BOOST_DEFINITIONS} ${MED3_DEFINITIONS} ${PLATFORM_DEFINITIONS}")
+TARGET_LINK_LIBRARIES(mprint_version MEDWrapper MEDWrapper_V2_2 MEDWrapperBase ${BOOST_LIBS} ${MED3_LIBS_C_ONLY})
+
+ADD_EXECUTABLE(MED_Test ${mprint_version_SOURCES})
+SET_TARGET_PROPERTIES(MED_Test PROPERTIES COMPILE_FLAGS "${BOOST_DEFINITIONS} ${MED3_DEFINITIONS} ${PLATFORM_DEFINITIONS}")
+TARGET_LINK_LIBRARIES(MED_Test MEDWrapper MEDWrapper_V2_2 MEDWrapperBase ${BOOST_LIBS})
+
+FILE(GLOB MEDWrapper_HEADERS_HXX "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx")
+INSTALL(FILES ${MEDWrapper_HEADERS_HXX} DESTINATION ${MED_salomeinclude_HEADERS})
+INSTALL(TARGETS mprint_version MED_Test DESTINATION ${MED_salomebin_BINS})
--- /dev/null
+// Copyright (C) 2007-2013 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
+
+#include "MED_Factory.hxx"
+#include "MED_Utilities.hxx"
+#include "MED_V2_2_Wrapper.hxx"
+
+#include <stdio.h>
+#include <sstream>
+
+extern "C"
+{
+#include <med.h>
+#ifndef WIN32
+ #include <unistd.h>
+#endif
+}
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+#else
+static int MYDEBUG = 0;
+#endif
+
+namespace MED
+{
+
+ EVersion GetVersionId(const std::string& theFileName,
+ bool theDoPreCheckInSeparateProcess)
+ {
+ INITMSG(MYDEBUG,"GetVersionId - theFileName = '"<<theFileName<<"'"<<std::endl);
+ EVersion aVersion = eVUnknown;
+
+#ifndef WIN32
+ if (access(theFileName.c_str(),F_OK))
+ return aVersion;
+ if(theDoPreCheckInSeparateProcess){
+ // First check, is it possible to deal with the file
+ std::ostringstream aStr;
+ // File name is in quotes for the case of space(s) inside it (PAL13009)
+ aStr<<"bash -c \""<<getenv("SMESH_ROOT_DIR")<<"/bin/salome/mprint_version \'"<<theFileName<<"\'\"";
+ if(!MYDEBUG)
+ aStr<<" 2>&1 > /dev/null";
+
+ std::string aCommand = aStr.str();
+ int aStatus = system(aCommand.c_str());
+
+ BEGMSG(MYDEBUG,"aCommand = '"<<aCommand<<"'; aStatus = "<<aStatus<<std::endl);
+ if(aStatus != 0)
+ return aVersion;
+ }
+#endif
+ // check compatibility of hdf and med versions
+ med_bool hdfok, medok;
+ MEDfileCompatibility(theFileName.c_str(), &hdfok, &medok);
+ if ((!hdfok) /*|| (!medok)*/) // med-2.1 is KO since med-3.0.0
+ return aVersion;
+
+ // Next, try to open the file trough the MED API
+ const char* aFileName = theFileName.c_str();
+ med_idt aFid = MEDfileOpen(aFileName,MED_ACC_RDONLY);
+
+ MSG(MYDEBUG,"GetVersionId - theFileName = '"<<theFileName<<"'; aFid = "<<aFid<<std::endl);
+ if(aFid >= 0){
+ med_int aMajor, aMinor, aRelease;
+ med_err aRet = MEDfileNumVersionRd(aFid,&aMajor,&aMinor,&aRelease);
+ INITMSG(MYDEBUG,"GetVersionId - theFileName = '"<<theFileName<<"'; aRet = "<<aRet<<std::endl);
+ if(aRet >= 0){
+ if(aMajor == 2 && aMinor == 1)
+ aVersion = eV2_1;
+ else
+ aVersion = eV2_2;
+ }
+ else {
+ // VSR: simulate med 2.3.6 behavior, med file version is assumed to 2.1
+ aVersion = eV2_1;
+ }
+ }
+ MEDfileClose(aFid);
+
+ BEGMSG(MYDEBUG,"GetVersionId - theFileName = '"<<theFileName<<"'; aVersion = "<<aVersion<<std::endl);
+ return aVersion;
+ }
+
+ bool getMEDVersion( const std::string& fname, int& major, int& minor, int& release )
+ {
+ med_idt f = MEDfileOpen(fname.c_str(), MED_ACC_RDONLY );
+ if( f<0 )
+ return false;
+
+ med_int aMajor, aMinor, aRelease;
+ med_err aRet = MEDfileNumVersionRd( f, &aMajor, &aMinor, &aRelease );
+ major = aMajor;
+ minor = aMinor;
+ release = aRelease;
+ MEDfileClose( f );
+ if( aRet<0 ) {
+ // VSR: simulate med 2.3.6 behavior, med file version is assumed to 2.1
+ major = 2; minor = release = -1;
+ //return false;
+ }
+ return true;
+ }
+
+ PWrapper CrWrapper(const std::string& theFileName,
+ bool theDoPreCheckInSeparateProcess)
+ {
+ PWrapper aWrapper;
+ EVersion aVersion = GetVersionId(theFileName,theDoPreCheckInSeparateProcess);
+ switch(aVersion){
+ case eV2_2:
+ aWrapper.reset(new MED::V2_2::TVWrapper(theFileName));
+ break;
+ case eV2_1:
+ EXCEPTION(std::runtime_error,"Cannot open file '"<<theFileName<<"'. Med version 2.1 is not supported any more.");
+ //aWrapper.reset(new MED::V2_1::TVWrapper(theFileName));
+ break;
+ default:
+ EXCEPTION(std::runtime_error,"MED::CrWrapper - theFileName = '"<<theFileName<<"'");
+ }
+ return aWrapper;
+ }
+
+ PWrapper CrWrapper(const std::string& theFileName, EVersion theId)
+ {
+ EVersion aVersion = GetVersionId(theFileName);
+
+ if(aVersion != theId)
+ remove(theFileName.c_str());
+
+ PWrapper aWrapper;
+ switch(theId){
+ case eV2_2:
+ aWrapper.reset(new MED::V2_2::TVWrapper(theFileName));
+ break;
+ case eV2_1:
+ EXCEPTION(std::runtime_error,"Cannot open file '"<<theFileName<<"'. Med version 2.1 is not supported any more.");
+ //aWrapper.reset(new MED::V2_1::TVWrapper(theFileName));
+ break;
+ default:
+ aWrapper.reset(new MED::V2_2::TVWrapper(theFileName));
+ }
+ return aWrapper;
+ }
+
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+
+#ifndef MED_Factory_HeaderFile
+#define MED_Factory_HeaderFile
+
+#include "MED_WrapperFactory.hxx"
+#include "MED_Wrapper.hxx"
+
+namespace MED
+{
+ MEDWRAPPER_FACTORY_EXPORT
+ EVersion
+ GetVersionId(const std::string& theFileName,
+ bool theDoPreCheckInSeparateProcess = false);
+
+ MEDWRAPPER_FACTORY_EXPORT
+ bool getMEDVersion( const std::string&, int&, int&, int& );
+
+ MEDWRAPPER_FACTORY_EXPORT
+ PWrapper
+ CrWrapper(const std::string& theFileName,
+ bool theDoPreCheckInSeparateProcess = false);
+
+ MEDWRAPPER_FACTORY_EXPORT
+ PWrapper
+ CrWrapper(const std::string& theFileName, EVersion theId);
+}
+
+#endif
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+#include "MED_Utilities.hxx"
+#include "MED_Algorithm.hxx"
+#include "MED_GaussUtils.hxx"
+#include "MED_Factory.hxx"
+
+#ifdef _DEBUG_
+static int MYDEBUG = 1;
+#else
+// static int MYDEBUG = 0;
+#endif
+
+static int MYWRITEDEBUG = 1;
+
+using namespace MED;
+
+#undef _DEBUG_
+
+void CheckMed(const std::string& theFileName)
+{
+ MSG(MYDEBUG,"CheckMed - theFileName = '"<<theFileName<<"'");
+ {
+ //TErr anErr;
+ PWrapper aMed = CrWrapper(theFileName);
+
+ TKey2Gauss aKey2Gauss = GetKey2Gauss(aMed);
+ TMKey2Profile aMKey2Profile = GetMKey2Profile(aMed);
+ INITMSG(MYDEBUG,"aMed->GetNbProfiles() = "<<aMed->GetNbProfiles()<<std::endl);
+
+ TInt aNbMeshes = aMed->GetNbMeshes();
+ BEGMSG(MYDEBUG,"GetNbMeshes() = "<<aNbMeshes<<std::endl);
+ for(TInt iMesh = 1; iMesh <= aNbMeshes; iMesh++){
+
+ PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh);
+ INITMSG(MYDEBUG,"aMeshInfo->GetName() = '"<<aMeshInfo->GetName()<<"'"<<std::endl);
+
+ TEntityInfo aEntityInfo = aMed->GetEntityInfo(aMeshInfo);
+
+ TEntity2TGeom2ElemInfo anEntity2TGeom2ElemInfo =
+ GetEntity2TGeom2ElemInfo(aMed,aMeshInfo,aEntityInfo);
+
+ TFieldInfo2TimeStampInfoSet aFieldInfo2TimeStampInfoSet =
+ GetFieldInfo2TimeStampInfoSet(aMed,aMeshInfo,aEntityInfo);
+
+ TEntite2TFieldInfo2TimeStampInfoSet anEntite2TFieldInfo2TimeStampInfoSet =
+ GetEntite2TFieldInfo2TimeStampInfoSet(aFieldInfo2TimeStampInfoSet);
+
+ TEntite2TFieldInfo2TimeStampInfoSet::const_iterator anEntite2TFieldInfo2TimeStampInfoSetIter =
+ anEntite2TFieldInfo2TimeStampInfoSet.begin();
+ for(; anEntite2TFieldInfo2TimeStampInfoSetIter != anEntite2TFieldInfo2TimeStampInfoSet.end(); anEntite2TFieldInfo2TimeStampInfoSetIter++){
+ const TFieldInfo2TimeStampInfoSet& aFieldInfo2TimeStampInfoSet = anEntite2TFieldInfo2TimeStampInfoSetIter->second;
+ TFieldInfo2TimeStampInfoSet::const_iterator aFieldInfo2TimeStampInfoSetIter = aFieldInfo2TimeStampInfoSet.begin();
+ for(; aFieldInfo2TimeStampInfoSetIter != aFieldInfo2TimeStampInfoSet.end(); aFieldInfo2TimeStampInfoSetIter++){
+ PFieldInfo aFieldInfo = aFieldInfo2TimeStampInfoSetIter->first;
+ INITMSG(MYDEBUG,
+ "GetPFieldInfo "<<
+ "- aName = '"<<aFieldInfo->GetName()<<"'"<<
+ "; aType = "<<aFieldInfo->GetType()<<
+ "; aNbComp = "<<aFieldInfo->GetNbComp()<<
+ std::endl);
+ const TTimeStampInfoSet& aTimeStampInfoSet = aFieldInfo2TimeStampInfoSetIter->second;
+ TTimeStampInfoSet::const_iterator aTimeStampInfoSettIter = aTimeStampInfoSet.begin();
+ for(; aTimeStampInfoSettIter != aTimeStampInfoSet.end(); aTimeStampInfoSettIter++){
+ PTimeStampInfo aTimeStampInfo = *aTimeStampInfoSettIter;
+ INITMSG(MYDEBUG,
+ "GetPTimeStampInfo "<<
+ "- anEntity = "<<aTimeStampInfo->GetEntity()<<
+ "; aNumDt = "<<aTimeStampInfo->GetNumDt()<<
+ std::endl);
+ PTimeStampValueBase aTimeStampValue =
+ aMed->GetPTimeStampValue(aTimeStampInfo,
+ aMKey2Profile,
+ aKey2Gauss);
+ }
+ }
+ }
+
+ continue;
+
+ TFamilyInfoSet aFamilyInfoSet = GetFamilyInfoSet(aMed,aMeshInfo);
+
+ TEntity2FamilySet aEntity2FamilySet =
+ GetEntity2FamilySet(aMed,anEntity2TGeom2ElemInfo,aFamilyInfoSet);
+
+ TGroupInfo aGroupInfo = GetGroupInfo(aFamilyInfoSet);
+
+ PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo);
+ TEntity2TGeom2ElemInfo::const_iterator anIter = anEntity2TGeom2ElemInfo.begin();
+ for(; anIter != anEntity2TGeom2ElemInfo.end(); anIter++){
+ const EEntiteMaillage& anEntity = anIter->first;
+ if(anEntity != eNOEUD){
+ const TGeom2ElemInfo& aGeom2ElemInfo = anIter->second;
+ TKey2Gauss::const_iterator anIter2 = aKey2Gauss.begin();
+ for(; anIter2 != aKey2Gauss.end(); anIter2++){
+ const TGaussInfo::TKey& aKey = anIter2->first;
+ EGeometrieElement aGeom = boost::get<0>(aKey);
+ TGeom2ElemInfo::const_iterator anIter3 = aGeom2ElemInfo.find(aGeom);
+ if(anIter3 != aGeom2ElemInfo.end()){
+ if(PCellInfo aCellInfo = anIter3->second){
+ PGaussInfo aGaussInfo = anIter2->second;
+ TGaussCoord aGaussCoord;
+ GetGaussCoord3D(aGaussInfo,aCellInfo,aNodeInfo,aGaussCoord);
+ }
+ }
+ }
+ }
+ }
+
+ }
+ }
+ MSG(MYDEBUG,"OK");
+}
+
+
+void CopyMed(const PWrapper& theMed,
+ const PWrapper& theMed2,
+ int theIncr)
+{
+ TKey2Gauss aKey2Gauss = GetKey2Gauss(theMed);
+ TMKey2Profile aMKey2Profile = GetMKey2Profile(theMed);
+
+ TInt aNbMeshes = theMed->GetNbMeshes();
+ MSG(MYDEBUG,"aNbMeshes = "<<aNbMeshes);
+ std::string aName;
+ for(TInt iMesh = 0; iMesh < aNbMeshes; iMesh++){
+ PMeshInfo aMeshInfo = theMed->GetPMeshInfo(iMesh+1);
+#ifdef _DEBUG_
+ TInt aDim = aMeshInfo->myDim;
+ aName = aMeshInfo->GetName();
+ INITMSG(MYDEBUG,"GetMeshInfo - aName = '"<<aName<<"'; aDim = "<<aDim<<"\n");
+#endif
+ PMeshInfo aMeshInfo2 = theMed2->CrMeshInfo(aMeshInfo);
+ if(MYWRITEDEBUG){
+ aName = aMeshInfo2->GetName();
+
+ aName[0] += theIncr;
+ aMeshInfo2->SetName(aName);
+ theMed2->SetMeshInfo(aMeshInfo2);
+ BEGMSG(MYDEBUG,"aNbMeshes2 = "<<theMed2->GetNbMeshes()<<"\n");
+ }
+
+ TEntityInfo aEntityInfo = theMed->GetEntityInfo(aMeshInfo);
+
+ //continue;
+
+ TInt aNbFields = theMed->GetNbFields();
+ MSG(MYDEBUG,"GetNbFields() = "<<aNbFields);
+ for(TInt iField = 0; iField < aNbFields; iField++){
+ PFieldInfo aFieldInfo = theMed->GetPFieldInfo(aMeshInfo,iField+1);
+#ifdef _DEBUG_
+ TInt aNbComp = aFieldInfo->GetNbComp();
+ INITMSG(MYDEBUG,"aName = '"<<aFieldInfo->GetName()<<"'; aNbComp = "<<aNbComp<<";\n");
+#endif
+ PFieldInfo aFieldInfo2 = theMed->CrFieldInfo(aMeshInfo2,aFieldInfo);
+
+ if(MYWRITEDEBUG){
+ aName = aFieldInfo->GetName();
+ aName[0] += theIncr;
+ aFieldInfo2->SetName(aName);
+ theMed2->SetFieldInfo(aFieldInfo2);
+ }
+
+ EEntiteMaillage anEntity;
+ TGeom2Size aGeom2Size;
+ TInt aNbTimeStamps =
+ theMed->GetNbTimeStamps(aFieldInfo,aEntityInfo,anEntity,aGeom2Size);
+ {
+ INITMSG(MYDEBUG,"GetNbTimeStamps = "<<aNbTimeStamps<<std::endl);
+ for(TInt iTimeStamp = 0; iTimeStamp < aNbTimeStamps; iTimeStamp++){
+ PTimeStampInfo aTimeStampInfo =
+ theMed->GetPTimeStampInfo(aFieldInfo,anEntity,aGeom2Size,iTimeStamp+1);
+#ifdef _DEBUG_
+ TInt aNumDt = aTimeStampInfo->GetNumDt();
+ INITMSG(MYDEBUG,"aNumDt = "<<aNumDt<<"\n");
+#endif
+
+ PTimeStampInfo aTimeStampInfo2 =
+ theMed->CrTimeStampInfo(aFieldInfo2,aTimeStampInfo);
+
+ PTimeStampValueBase aTimeStampValue =
+ theMed->GetPTimeStampValue(aTimeStampInfo,
+ aMKey2Profile,
+ aKey2Gauss);
+
+ PTimeStampValueBase aTimeStampValue2 =
+ theMed->CrTimeStampValue(aTimeStampInfo2,
+ aTimeStampValue);
+
+ if(MYWRITEDEBUG) theMed2->SetTimeStamp(aTimeStampValue2);
+ }
+ }
+ }
+
+ TInt aNbFam = theMed->GetNbFamilies(aMeshInfo);
+ MSG(MYDEBUG,"GetNbFamilies() = "<<aNbFam);
+ for(TInt iFam = 0; iFam < aNbFam; iFam++){
+ PFamilyInfo aFamilyInfo = theMed->GetPFamilyInfo(aMeshInfo,iFam+1);
+ TInt aNbGroup = aFamilyInfo->GetNbGroup();
+#ifdef _DEBUG_
+ TInt aNbAttr = aFamilyInfo->GetNbAttr();
+#endif
+ TInt anId = aFamilyInfo->GetId();
+ if(anId == 0)
+ continue;
+
+ aName = aFamilyInfo->GetName();
+#ifdef _DEBUG_
+ INITMSG(MYDEBUG,"aName = '"<<aName<<"'; anId = "<<anId<<
+ "; aNbAttr = "<<aNbAttr<<"; aNbGroup = "<<aNbGroup<<"\n");
+#endif
+ PFamilyInfo aFamilyInfo2 = theMed->CrFamilyInfo(aMeshInfo2,aFamilyInfo);
+ for(TInt iGroup = 0; iGroup < aNbGroup; iGroup++){
+ aName = aFamilyInfo->GetGroupName(iGroup);
+ INITMSG(MYDEBUG,"aGroupName = '"<<aName<<"'\n");
+ aName[0] += theIncr;
+ aFamilyInfo2->SetGroupName(iGroup,aName);
+ }
+
+ if(MYWRITEDEBUG){
+ aName = aFamilyInfo->GetName();
+ aName[0] += theIncr;
+ aFamilyInfo2->SetName(aName);
+ theMed2->SetFamilyInfo(aFamilyInfo2);
+ INITMSG(MYDEBUG,"GetNbFamilies = "<<theMed2->GetNbFamilies(aMeshInfo2)<<std::endl);
+ }
+ }
+
+ MSG(MYDEBUG,"GetEntityInfo - aNbEntities = "<<aEntityInfo.size());
+ TEntityInfo::iterator anEntityInfoIter = aEntityInfo.begin();
+ for(; anEntityInfoIter != aEntityInfo.end(); anEntityInfoIter++){
+ const EEntiteMaillage& anEntity = anEntityInfoIter->first;
+ INITMSG(MYDEBUG,"anEntity = "<<anEntity<<"\n");
+ if(anEntity == eNOEUD){
+ PNodeInfo aNodeInfo = theMed->GetPNodeInfo(aMeshInfo);
+ PNodeInfo aNodeInfo2 = theMed->CrNodeInfo(aMeshInfo2,aNodeInfo);
+ if(MYWRITEDEBUG) theMed2->SetNodeInfo(aNodeInfo2);
+ continue;
+ }
+ TGeom2Size& aGeom2Size = anEntityInfoIter->second;
+ TGeom2Size::iterator aGeomIter = aGeom2Size.begin();
+ for(; aGeomIter != aGeom2Size.end(); aGeomIter++){
+ const EGeometrieElement& aGeom = aGeomIter->first;
+#ifdef _DEBUG_
+ const TInt& aNbElem = aGeomIter->second;
+ INITMSG(MYDEBUG,"aGeom = "<<aGeom<<"; aNbElem = "<<aNbElem<<": ");
+#endif
+ switch(aGeom){
+ case ePOLYGONE: {
+ PPolygoneInfo aPolygoneInfo = theMed->GetPPolygoneInfo(aMeshInfo,anEntity,aGeom);
+ PPolygoneInfo aPolygoneInfo2 = theMed->CrPolygoneInfo(aMeshInfo2,aPolygoneInfo);
+ if(MYWRITEDEBUG) theMed2->SetPolygoneInfo(aPolygoneInfo2);
+ break;
+ }
+ case ePOLYEDRE: {
+ PPolyedreInfo aPolyedreInfo = theMed->GetPPolyedreInfo(aMeshInfo,anEntity,aGeom);
+ PPolyedreInfo aPolyedreInfo2 = theMed->CrPolyedreInfo(aMeshInfo2,aPolyedreInfo);
+ if(MYWRITEDEBUG) theMed2->SetPolyedreInfo(aPolyedreInfo2);
+ break;
+ }
+ default:
+ PCellInfo aCellInfo = theMed->GetPCellInfo(aMeshInfo,anEntity,aGeom);
+ PCellInfo aCellInfo2 = theMed2->CrCellInfo(aMeshInfo2,aCellInfo);
+ if(MYWRITEDEBUG) theMed2->SetCellInfo(aCellInfo2);
+ }
+ }
+ }
+
+ }
+ MSG(MYDEBUG,"OK");
+}
+
+
+void CopyMed(const std::string& theFileName,
+ const std::string& theFileName2,
+ MED::EVersion theVersion,
+ int theNbCopy)
+{
+ MSG(MYDEBUG,"CopyMed - theFileName = '"<<theFileName<<"'; theFileName2 = '"<<theFileName2<<"', theVersion = "<<theVersion);
+
+ PWrapper aMed = CrWrapper(theFileName);
+
+ PWrapper aMed2 = CrWrapper(theFileName2,theVersion);
+
+ for(int i = 0; i < theNbCopy; i++)
+ CopyMed(aMed,aMed2,i);
+}
+
+
+void ReadMed(const char* theFileName,
+ const char* theFileName2,
+ MED::EVersion theVersion = eV2_2,
+ int theNbCopy = 1)
+{
+ MSG(MYDEBUG,"theFileName = '"<<theFileName<<"'; "<<
+ "theFileName2 = '"<<theFileName2<<"'; "<<
+ "theVersion = "<<theVersion<<"; "<<
+ "theNbCopy = "<<theNbCopy);
+
+ CopyMed(theFileName,theFileName2,theVersion,theNbCopy);
+}
+
+#ifdef WIN32
+#pragma warning(disable:4101) // exc unreferenced ... ??
+#endif
+
+int main(int argc, char** argv){
+#ifndef _DEBUG_
+ try{
+#endif
+ if(argc == 2)
+ CheckMed(argv[1]);
+ if(argc == 3)
+ ReadMed(argv[1],argv[2]);
+ if(argc == 4)
+ ReadMed(argv[1],argv[2],MED::EVersion(atoi(argv[3])));
+ if(argc == 5)
+ ReadMed(argv[1],argv[2],MED::EVersion(atoi(argv[3])),atoi(argv[4]));
+ return 0;
+#ifndef _DEBUG_
+ }catch(std::exception& exc){
+ MSG(MYDEBUG,"Follow exception was accured :\n"<<exc.what());
+ }catch(...){
+ MSG(MYDEBUG,"Unknown exception was accured");
+ }
+#endif
+ return 1;
+}
--- /dev/null
+// Copyright (C) 2007-2013 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 : MED_WrapperFactory.hxx
+// Author : Alexander A. BORODIN
+//
+#ifndef _MED_WrapperFactory_HXX_
+#define _MED_WrapperFactory_HXX_
+
+#ifdef WIN32
+ #if defined MEDWRAPPER_FACTORY_EXPORTS || defined MEDWrapper_EXPORTS
+ #if defined WIN32
+ #define MEDWRAPPER_FACTORY_EXPORT __declspec( dllexport )
+ #else
+ #define MEDWRAPPER_FACTORY_EXPORT
+ #endif
+ #else
+ #if defined WIN32
+ #define MEDWRAPPER_FACTORY_EXPORT __declspec( dllimport )
+ #else
+ #define MEDWRAPPER_FACTORY_EXPORT
+ #endif
+ #endif
+#else
+ #define MEDWRAPPER_FACTORY_EXPORT
+#endif
+
+#endif
--- /dev/null
+# Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+lib_LTLIBRARIES= libMEDWrapper.la
+
+salomeinclude_HEADERS= \
+ MED_Factory.hxx \
+ MED_WrapperFactory.hxx
+
+dist_libMEDWrapper_la_SOURCES= \
+ MED_Factory.cxx
+
+libMEDWrapper_la_CPPFLAGS= $(BOOST_CPPFLAGS) $(MED3_INCLUDES) \
+ -I$(srcdir)/../Base
+libMEDWrapper_la_CPPFLAGS+= -I$(KERNEL_ROOT_DIR)/include/salome
+libMEDWrapper_la_CPPFLAGS+= -I$(srcdir)/../V2_2
+libMEDWrapper_la_LDFLAGS= ../V2_2/libMEDWrapper_V2_2.la
+
+# Executables targets
+bin_PROGRAMS = MED_Test mprint_version
+
+dist_MED_Test_SOURCES= MED_Test.cxx
+MED_Test_CPPFLAGS= $(libMEDWrapper_la_CPPFLAGS)
+MED_Test_LDADD= $(libMEDWrapper_la_LDFLAGS) ../Base/libMEDWrapperBase.la \
+ $(BOOST_LIB_THREAD) $(BOOST_LIB_SYSTEM) libMEDWrapper.la
+
+dist_mprint_version_SOURCES= mprint_version.cxx
+mprint_version_CPPFLAGS= $(libMEDWrapper_la_CPPFLAGS)
+mprint_version_LDADD= $(libMEDWrapper_la_LDFLAGS) ../Base/libMEDWrapperBase.la \
+ $(BOOST_LIB_THREAD) $(BOOST_LIB_SYSTEM) libMEDWrapper.la $(MED3_LIBS_C_ONLY)
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+
+#include <med.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+int main (int argc, char **argv)
+{
+ med_idt aFid = MEDfileOpen(argv[1],MED_ACC_RDONLY);
+ if(aFid < 0)
+ exit(1);
+
+ med_int aMajor, aMinor, aRelease;
+ med_err aRet = MEDfileNumVersionRd(aFid,&aMajor,&aMinor,&aRelease);
+ MEDfileClose(aFid);
+ if(aRet < 0) {
+ // VSR: simulate med 2.3.6 behavior, med file version is assumed to 2.1
+ aMajor=2;
+ aMinor=aRelease=-1;
+ }
+
+ printf("%d.%d.%d\n",aMajor,aMinor,aRelease);
+}
--- /dev/null
+# Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+SUBDIRS = Base V2_2 Factory
+
+DIST_SUBDIRS = Base V2_2 Factory
--- /dev/null
+# Copyright (C) 2012-2013 CEA/DEN, EDF R&D
+#
+# 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_DIRECTORIES(
+ ${MED3_INCLUDE_DIRS}
+ ${HDF5_INCLUDE_DIRS}
+ ${BOOST_INCLUDE_DIRS}
+ ${CMAKE_CURRENT_SOURCE_DIR}/../Base
+ )
+
+SET(MEDWrapper_V2_2_SOURCES
+ MED_V2_2_Wrapper.cxx
+ )
+
+IF(MED_ENABLE_KERNEL)
+ INCLUDE_DIRECTORIES(${KERNEL_ROOT_DIR}/include/salome)
+ELSE(MED_ENABLE_KERNEL)
+ INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/adm_local_without_kernel)
+ENDIF(MED_ENABLE_KERNEL)
+
+ADD_LIBRARY(MEDWrapper_V2_2 SHARED ${MEDWrapper_V2_2_SOURCES})
+SET_TARGET_PROPERTIES(MEDWrapper_V2_2 PROPERTIES COMPILE_FLAGS "${HDF5_DEFINITIONS} ${MED3_DEFINITIONS} ${BOOST_DEFINITIONS} ${PLATFORM_DEFINITIONS}")
+TARGET_LINK_LIBRARIES(MEDWrapper_V2_2 MEDWrapperBase ${MED3_LIBS_C_ONLY} ${HDF5_LIBS})
+INSTALL(TARGETS MEDWrapper_V2_2 DESTINATION ${MED_salomelib_LIBS})
+
+FILE(GLOB MEDWrapper_V2_2_HEADERS_HXX "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx")
+INSTALL(FILES ${MEDWrapper_V2_2_HEADERS_HXX} DESTINATION ${MED_salomeinclude_HEADERS})
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+
+#include "MED_V2_2_Wrapper.hxx"
+#include "MED_Algorithm.hxx"
+#include "MED_Utilities.hxx"
+
+extern "C"
+{
+#include <med.h>
+#include <med_err.h>
+}
+
+#ifdef _DEBUG_
+static int MYDEBUG = 0;
+// #else
+// static int MYDEBUG = 0;
+#endif
+
+
+
+namespace MED
+{
+ template<>
+ TInt
+ GetDESCLength<eV2_2>()
+ {
+ return 200;
+ }
+
+ template<>
+ TInt
+ GetIDENTLength<eV2_2>()
+ {
+ return 8;
+ }
+
+ template<>
+ TInt
+ GetNOMLength<eV2_2>()
+ {
+ return 64;
+ }
+
+ template<>
+ TInt
+ GetLNOMLength<eV2_2>()
+ {
+ return 80;
+ }
+
+ template<>
+ TInt
+ GetPNOMLength<eV2_2>()
+ {
+ return 16;
+ }
+
+ template<>
+ void
+ GetVersionRelease<eV2_2>(TInt& majeur, TInt& mineur, TInt& release)
+ {
+ majeur=MED_MAJOR_NUM;
+ mineur=MED_MINOR_NUM;
+ release=MED_RELEASE_NUM;
+ }
+
+ template<>
+ TInt
+ GetNbConn<eV2_2>(EGeometrieElement typmai,
+ EEntiteMaillage typent,
+ TInt mdim)
+ {
+ return typmai%100;
+ }
+
+ namespace V2_2
+ {
+
+ //---------------------------------------------------------------
+ class TFile{
+ TFile();
+ TFile(const TFile&);
+
+ public:
+ TFile(const std::string& theFileName):
+ myCount(0),
+ myFid(0),
+ myFileName(theFileName)
+ {}
+
+ ~TFile()
+ {
+ Close();
+ }
+
+ void
+ Open(EModeAcces theMode, TErr* theErr = NULL)
+ {
+ if(myCount++ == 0){
+ const char* aFileName = myFileName.c_str();
+ myFid = MEDfileOpen(aFileName,med_access_mode(theMode));
+ }
+ if(theErr)
+ *theErr = TErr(myFid);
+ else if(myFid < 0)
+ EXCEPTION(std::runtime_error,"TFile - MEDfileOpen('"<<myFileName<<"',"<<theMode<<")");
+ }
+
+ const TIdt& Id() const
+ {
+ if(myFid < 0)
+ EXCEPTION(std::runtime_error,"TFile - GetFid() < 0");
+ return myFid;
+ }
+
+ void Close()
+ {
+ if(--myCount == 0)
+ MEDfileClose(myFid);
+ }
+
+ protected:
+ TInt myCount;
+ TIdt myFid;
+ std::string myFileName;
+ };
+
+
+ //---------------------------------------------------------------
+ class TFileWrapper
+ {
+ PFile myFile;
+
+ public:
+ TFileWrapper(const PFile& theFile, EModeAcces theMode, TErr* theErr = NULL):
+ myFile(theFile)
+ {
+ myFile->Open(theMode,theErr);
+ }
+
+ ~TFileWrapper()
+ {
+ myFile->Close();
+ }
+ };
+
+
+ //---------------------------------------------------------------
+ TVWrapper::TVWrapper(const std::string& theFileName):
+ myFile(new TFile(theFileName))
+ {}
+
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbMeshes(TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ return MEDnMesh(myFile->Id());
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetMeshInfo(TInt theMeshId,
+ MED::TMeshInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TValueHolder<TString, char> aMeshName(theInfo.myName);
+ TValueHolder<TInt, med_int> aDim(theInfo.myDim);
+ TValueHolder<TInt, med_int> aSpaceDim(theInfo.mySpaceDim);
+ TValueHolder<EMaillage, med_mesh_type> aType(theInfo.myType);
+ char dtunit[MED_SNAME_SIZE+1];
+ med_sorting_type sorttype;
+ med_int nstep;
+ med_axis_type at;
+ int naxis=MEDmeshnAxis(myFile->Id(),theMeshId);
+ char *axisname=new char[naxis*MED_SNAME_SIZE+1];
+ char *axisunit=new char[naxis*MED_SNAME_SIZE+1];
+ TErr aRet = MEDmeshInfo(myFile->Id(),
+ theMeshId,
+ &aMeshName,
+ &aSpaceDim,
+ &aDim,
+ &aType,
+ &theInfo.myDesc[0],
+ dtunit,
+ &sorttype,
+ &nstep,
+ &at,
+ axisname,
+ axisunit);
+ delete [] axisname;
+ delete [] axisunit;
+ if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetMeshInfo - MEDmeshInfo(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetMeshInfo(const MED::TMeshInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TMeshInfo& anInfo = const_cast<MED::TMeshInfo&>(theInfo);
+
+ TValueHolder<TString, char> aMeshName(anInfo.myName);
+ TValueHolder<TInt, med_int> aDim(anInfo.myDim);
+ TValueHolder<TInt, med_int> aSpaceDim(anInfo.mySpaceDim);
+ TValueHolder<EMaillage, med_mesh_type> aType(anInfo.myType);
+ TValueHolder<TString, char> aDesc(anInfo.myDesc);
+
+ char *nam=new char[aSpaceDim*MED_SNAME_SIZE+1];
+ std::fill(nam,nam+aSpaceDim*MED_SNAME_SIZE+1,'\0');
+ char *unit=new char[aSpaceDim*MED_SNAME_SIZE+1];
+ std::fill(unit,unit+aSpaceDim*MED_SNAME_SIZE+1,'\0');
+ TErr aRet = MEDmeshCr(myFile->Id(),
+ &aMeshName,
+ aSpaceDim,
+ aDim,
+ aType,
+ &aDesc,
+ "",
+ MED_SORT_DTIT,
+ MED_CARTESIAN,
+ nam,
+ unit);
+ delete [] nam;
+ delete [] unit;
+
+ //if(aRet == 0)
+ // aRet = MEDunvCr(myFile->Id(),&aMeshName);
+
+ INITMSG(MYDEBUG,"TVWrapper::SetMeshInfo - MED_MODE_ACCES = "<<theMode<<"; aRet = "<<aRet<<std::endl);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetMeshInfo - MEDmeshCr(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetMeshInfo(const MED::TMeshInfo& theInfo,
+ TErr* theErr)
+ {
+ TErr aRet;
+ SetMeshInfo(theInfo,eLECTURE_ECRITURE,&aRet);
+
+ if(aRet < 0)
+ SetMeshInfo(theInfo,eLECTURE_AJOUT,&aRet);
+
+ if(aRet < 0)
+ SetMeshInfo(theInfo,eCREATION,&aRet);
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbFamilies(const MED::TMeshInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ MED::TMeshInfo& anInfo = const_cast<MED::TMeshInfo&>(theInfo);
+ TValueHolder<TString, char> aName(anInfo.myName);
+ return MEDnFamily(myFile->Id(),&aName);
+ }
+
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbFamAttr(TInt theFamId,
+ const MED::TMeshInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ MED::TMeshInfo& anInfo = const_cast<MED::TMeshInfo&>(theInfo);
+
+ TValueHolder<TString, char> aName(anInfo.myName);
+
+ return MEDnFamily23Attribute(myFile->Id(),&aName,theFamId);
+ }
+
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbFamGroup(TInt theFamId,
+ const MED::TMeshInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ MED::TMeshInfo& anInfo = const_cast<MED::TMeshInfo&>(theInfo);
+
+ TValueHolder<TString, char> aName(anInfo.myName);
+
+ return MEDnFamilyGroup(myFile->Id(),&aName,theFamId);
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetFamilyInfo(TInt theFamId,
+ MED::TFamilyInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TString, char> aFamilyName(theInfo.myName);
+ TValueHolder<TInt, med_int> aFamilyId(theInfo.myId);
+ TValueHolder<TFamAttr, med_int> anAttrId(theInfo.myAttrId);
+ TValueHolder<TFamAttr, med_int> anAttrVal(theInfo.myAttrVal);
+ TValueHolder<TString, char> anAttrDesc(theInfo.myAttrDesc);
+ TValueHolder<TString, char> aGroupNames(theInfo.myGroupNames);
+
+ TErr aRet = MEDfamily23Info(myFile->Id(),
+ &aMeshName,
+ theFamId,
+ &aFamilyName,
+ &anAttrId,
+ &anAttrVal,
+ &anAttrDesc,
+ &aFamilyId,
+ &aGroupNames);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetFamilyInfo - MEDfamily23Info(...) - "<<
+ " aMeshInfo.myName = '"<<&aMeshName<<
+ "'; theFamId = "<<theFamId<<
+ "; theInfo.myNbGroup = "<<theInfo.myNbGroup<<
+ "; theInfo.myNbAttr = "<<theInfo.myNbAttr);
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetFamilyInfo(const MED::TFamilyInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TFamilyInfo& anInfo = const_cast<MED::TFamilyInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TString, char> aFamilyName(anInfo.myName);
+ TValueHolder<TInt, med_int> aFamilyId(anInfo.myId);
+ TValueHolder<TFamAttr, med_int> anAttrId(anInfo.myAttrId);
+ TValueHolder<TFamAttr, med_int> anAttrVal(anInfo.myAttrVal);
+ TValueHolder<TInt, med_int> aNbAttr(anInfo.myNbAttr);
+ TValueHolder<TString, char> anAttrDesc(anInfo.myAttrDesc);
+ TValueHolder<TInt, med_int> aNbGroup(anInfo.myNbGroup);
+ TValueHolder<TString, char> aGroupNames(anInfo.myGroupNames);
+
+ TErr aRet = MEDfamilyCr(myFile->Id(),
+ &aMeshName,
+ &aFamilyName,
+ aFamilyId,
+ aNbGroup,
+ &aGroupNames);
+
+ INITMSG(MYDEBUG,"TVWrapper::SetFamilyInfo - MED_MODE_ACCES = "<<theMode<<"; aRet = "<<aRet<<std::endl);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetFamilyInfo - MEDfamilyCr(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetFamilyInfo(const MED::TFamilyInfo& theInfo,
+ TErr* theErr)
+ {
+ TErr aRet;
+ SetFamilyInfo(theInfo,eLECTURE_ECRITURE,&aRet);
+
+ if(aRet < 0)
+ SetFamilyInfo(theInfo,eLECTURE_AJOUT,&aRet);
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetNames(TElemInfo& theInfo,
+ TInt theNb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ if ( theGeom == eBALL )
+ theGeom = GetBallGeom( theInfo.myMeshInfo );
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName (aMeshInfo.myName);
+ TValueHolder<TString, char> anElemNames(theInfo.myElemNames);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (theEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theGeom);
+
+ TErr aRet = MEDmeshEntityNameRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ &anElemNames);
+
+ theInfo.myIsElemNames = aRet != 0? eFAUX : eVRAI ;
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetNumeration(TElemInfo& theInfo,
+ TInt theNb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ if ( theGeom == eBALL )
+ theGeom = GetBallGeom( theInfo.myMeshInfo );
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> anElemNum(theInfo.myElemNum);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (theEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theGeom);
+
+ TErr aRet = MEDmeshEntityNumberRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ &anElemNum);
+
+ theInfo.myIsElemNum = aRet != 0? eFAUX : eVRAI;
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetFamilies(TElemInfo& theInfo,
+ TInt theNb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ if ( theGeom == eBALL )
+ theGeom = GetBallGeom( theInfo.myMeshInfo );
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> aFamNum (theInfo.myFamNum);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (theEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theGeom);
+
+ TErr aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ &aFamNum);
+
+ if(aRet < 0)
+ {
+// if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files
+ {
+ int aSize = (int)theInfo.myFamNum->size();
+ theInfo.myFamNum->clear();
+ theInfo.myFamNum->resize(aSize,0);
+ aRet = 0;
+ }
+// else
+// EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...) of CELLS");
+ }
+ if(theErr)
+ *theErr = aRet;
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetNames(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ SetNames(theInfo,eLECTURE_ECRITURE,theEntity,theGeom,theErr);
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetNames(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ if ( theGeom == eBALL )
+ theGeom = GetBallGeom( theInfo.myMeshInfo );
+
+ MED::TElemInfo& anInfo = const_cast<MED::TElemInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TErr aRet = 0;
+ if(theInfo.myIsElemNames)
+ {
+ TValueHolder<TString, char> aMeshName (aMeshInfo.myName);
+ TValueHolder<TString, char> anElemNames(anInfo.myElemNames);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (theEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theGeom);
+
+ aRet = MEDmeshEntityNameWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ (TInt)anInfo.myElemNames->size(),
+ &anElemNames);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetNames - MEDmeshEntityNameWr(...)");
+ }
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetNumeration(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ SetNumeration(theInfo,eLECTURE_ECRITURE,theEntity,theGeom,theErr);
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetNumeration(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ if ( theGeom == eBALL )
+ theGeom = GetBallGeom( theInfo.myMeshInfo );
+
+ MED::TElemInfo& anInfo = const_cast<MED::TElemInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TErr aRet = 0;
+ if(theInfo.myIsElemNum)
+ {
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> anElemNum(anInfo.myElemNum);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (theEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theGeom);
+
+ aRet = MEDmeshEntityNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ (TInt)anInfo.myElemNum->size(),
+ &anElemNum);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetNumeration - MEDmeshEntityNumberWr(...)");
+ }
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetFamilies(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ SetFamilies(theInfo,eLECTURE_ECRITURE,theEntity,theGeom,theErr);
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetFamilies(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ if ( theGeom == eBALL )
+ theGeom = GetBallGeom( theInfo.myMeshInfo );
+
+ MED::TElemInfo& anInfo = const_cast<MED::TElemInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> aFamNum (anInfo.myFamNum);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (theEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theGeom);
+
+ TErr aRet = MEDmeshEntityFamilyNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ (TInt)anInfo.myFamNum->size(),
+ &aFamNum);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetFamilies - MEDmeshEntityFamilyNumberWr(...)");
+ }
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbNodes(const MED::TMeshInfo& theMeshInfo,
+ ETable theTable,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo);
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<ETable, med_data_type > aTable(theTable);
+ med_bool chgt,trsf;
+ return MEDmeshnEntity(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE,
+ aTable,
+ MED_NO_CMODE,
+ &chgt,
+ &trsf);
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetNodeInfo(MED::TNodeInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TInt, med_int> aDim(aMeshInfo.myDim);
+ TValueHolder<TNodeCoord, med_float> aCoord(theInfo.myCoord);
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch(theInfo.myModeSwitch);
+ TValueHolder<ERepere, med_axis_type> aSystem(theInfo.mySystem);
+ TValueHolder<TString, char> aCoordNames(theInfo.myCoordNames);
+ TValueHolder<TString, char> aCoordUnits(theInfo.myCoordUnits);
+ TValueHolder<TString, char> anElemNames(theInfo.myElemNames);
+ //TValueHolder<EBooleen, med_bool> anIsElemNames(theInfo.myIsElemNames);
+ TValueHolder<TElemNum, med_int> anElemNum(theInfo.myElemNum);
+ //TValueHolder<EBooleen, med_bool> anIsElemNum(theInfo.myIsElemNum);
+ TValueHolder<TElemNum, med_int> aFamNum(theInfo.myFamNum);
+ TValueHolder<TInt, med_int> aNbElem(theInfo.myNbElem);
+
+ TErr aRet = MEDmeshNodeCoordinateRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ aModeSwitch,
+ &aCoord);
+
+ TErr aRet2 =MEDmeshEntityFamilyNumberRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE ,
+ &aFamNum);
+ if (aRet2 < 0)
+ {
+// if (aRet2 == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files
+ {
+ int mySize = (int)theInfo.myFamNum->size();
+ theInfo.myFamNum->clear();
+ theInfo.myFamNum->resize(mySize,0);
+ }
+// else
+// EXCEPTION(std::runtime_error,"GetNodeInfo - MEDmeshEntityFamilyNumberRd(...)");
+ }
+
+ if ( MEDmeshEntityNameRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE ,
+ &anElemNames) < 0) theInfo.myIsElemNames=eFAUX;
+
+ if ( MEDmeshEntityNumberRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE ,
+ &anElemNum) < 0 ) theInfo.myIsElemNum=eFAUX;
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetNodeInfo - MEDmeshNodeCoordinateRd(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetNodeInfo(const MED::TNodeInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TNodeInfo& anInfo = const_cast<MED::TNodeInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName (aMeshInfo.myName);
+ TValueHolder<TNodeCoord, med_float> aCoord (anInfo.myCoord);
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch (anInfo.myModeSwitch);
+ TValueHolder<ERepere, med_axis_type> aSystem (anInfo.mySystem);
+ TValueHolder<TString, char> aCoordNames (anInfo.myCoordNames);
+ TValueHolder<TString, char> aCoordUnits (anInfo.myCoordUnits);
+ TValueHolder<TString, char> anElemNames (anInfo.myElemNames);
+ TValueHolder<EBooleen, med_bool> anIsElemNames(anInfo.myIsElemNames);
+ TValueHolder<TElemNum, med_int> anElemNum (anInfo.myElemNum);
+ TValueHolder<EBooleen, med_bool> anIsElemNum (anInfo.myIsElemNum);
+ TValueHolder<TElemNum, med_int> aFamNum (anInfo.myFamNum);
+ TValueHolder<TInt, med_int> aNbElem (anInfo.myNbElem);
+
+ TErr aRet = MEDmeshNodeCoordinateWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NO_DT,
+ aModeSwitch,
+ aNbElem,
+ &aCoord);
+
+ MEDmeshEntityFamilyNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE,
+ aNbElem,
+ &aFamNum);
+ if(anIsElemNames)
+ MEDmeshEntityNameWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE,
+ aNbElem,
+ &anElemNames);
+ if(anIsElemNum)
+ MEDmeshEntityNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE,
+ aNbElem,
+ &anElemNum);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetNodeInfo - MEDmeshNodeCoordinateWr(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetNodeInfo(const MED::TNodeInfo& theInfo,
+ TErr* theErr)
+ {
+ TErr aRet;
+ SetNodeInfo(theInfo,eLECTURE_ECRITURE,&aRet);
+
+ if(aRet < 0)
+ SetNodeInfo(theInfo,eLECTURE_AJOUT,&aRet);
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+
+ //-----------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetPolygoneInfo(MED::TPolygoneInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> anIndex(theInfo.myIndex);
+ TInt aNbElem = (TInt)theInfo.myElemNum->size();
+ TValueHolder<TElemNum, med_int> aConn(theInfo.myConn);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity(theInfo.myEntity);
+ TValueHolder<EConnectivite, med_connectivity_mode> aConnMode(theInfo.myConnMode);
+
+ TErr aRet;
+ aRet = MEDmeshPolygonRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aConnMode,
+ &anIndex,
+ &aConn);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshPolygonRd(...)");
+
+ if(theInfo.myIsElemNames){
+ GetNames(theInfo,aNbElem,theInfo.myEntity,ePOLYGONE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ if(theInfo.myIsElemNum){
+ GetNumeration(theInfo,aNbElem,theInfo.myEntity,ePOLYGONE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ GetFamilies(theInfo,aNbElem,theInfo.myEntity,ePOLYGONE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetPolygoneInfo(const MED::TPolygoneInfo& theInfo,
+ TErr* theErr)
+ {
+ SetPolygoneInfo(theInfo,eLECTURE_ECRITURE,theErr);
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetPolygoneInfo(const MED::TPolygoneInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TPolygoneInfo& anInfo = const_cast<MED::TPolygoneInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> anIndex(anInfo.myIndex);
+ TValueHolder<TElemNum, med_int> aConn(anInfo.myConn);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity(anInfo.myEntity);
+ TValueHolder<EConnectivite, med_connectivity_mode> aConnMode(anInfo.myConnMode);
+
+ TErr aRet = MEDmeshPolygonWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_UNDEF_DT,
+ anEntity,
+ aConnMode,
+ anInfo.myNbElem + 1,
+ &anIndex,
+ &aConn);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetPolygoneInfo - MEDmeshPolygonWr(...)");
+
+ SetNames(anInfo,theInfo.myEntity,ePOLYGONE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+
+ SetNumeration(anInfo,theInfo.myEntity,ePOLYGONE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+
+ SetFamilies(anInfo,theInfo.myEntity,ePOLYGONE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbPolygones(const MED::TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ return GetNbCells(theMeshInfo,theEntity,theGeom,theConnMode,theErr);
+ }
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetPolygoneConnSize(const MED::TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return 0;
+
+ MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo);
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ med_int aTaille = 0;
+ med_bool chgt,trsf;
+ aTaille=MEDmeshnEntity(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ med_entity_type(theEntity),
+ MED_POLYGON,
+ MED_CONNECTIVITY,
+ med_connectivity_mode(theConnMode),
+ &chgt,
+ &trsf);
+
+
+ if(aTaille < 0)
+ EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshnEntity(...)");
+
+ return TInt(aTaille);
+ }
+
+ //-----------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetPolyedreInfo(TPolyedreInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TInt aNbElem = (TInt)theInfo.myElemNum->size();
+ TValueHolder<TElemNum, med_int> anIndex(theInfo.myIndex);
+ TValueHolder<TElemNum, med_int> aFaces(theInfo.myFaces);
+ TValueHolder<TElemNum, med_int> aConn(theInfo.myConn);
+ TValueHolder<EConnectivite, med_connectivity_mode> aConnMode(theInfo.myConnMode);
+
+ TErr aRet;
+ aRet = MEDmeshPolyhedronRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_CELL,
+ aConnMode,
+ &anIndex,
+ &aFaces,
+ &aConn);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshPolyhedronRd(...)");
+
+ if(theInfo.myIsElemNames){
+ GetNames(theInfo,aNbElem,theInfo.myEntity,ePOLYEDRE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ if(theInfo.myIsElemNum){
+ GetNumeration(theInfo,aNbElem,theInfo.myEntity,ePOLYEDRE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ GetFamilies(theInfo,aNbElem,theInfo.myEntity,ePOLYEDRE,&aRet);
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetPolyedreInfo(const TPolyedreInfo& theInfo,
+ TErr* theErr)
+ {
+ SetPolyedreInfo(theInfo,eLECTURE_ECRITURE,theErr);
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetPolyedreInfo(const MED::TPolyedreInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TPolyedreInfo& anInfo = const_cast<MED::TPolyedreInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> anIndex(anInfo.myIndex);
+ TValueHolder<TElemNum, med_int> aFaces(anInfo.myFaces);
+ TValueHolder<TElemNum, med_int> aConn(anInfo.myConn);
+ TValueHolder<EConnectivite, med_connectivity_mode> aConnMode(anInfo.myConnMode);
+
+ TErr aRet;
+ aRet = MEDmeshPolyhedronWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_UNDEF_DT,
+ MED_CELL,
+ aConnMode,
+ anInfo.myNbElem+1,
+ &anIndex,
+ (TInt)anInfo.myFaces->size(),
+ &aFaces,
+ &aConn);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshPolyhedronWr(...)");
+
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity(anInfo.myEntity);
+
+ if(theInfo.myIsElemNames){
+ TValueHolder<TString, char> anElemNames(anInfo.myElemNames);
+ aRet = MEDmeshEntityNameWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ MED_POLYHEDRON,
+ (TInt)anInfo.myElemNames->size(),
+ &anElemNames);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshEntityNameWr(...)");
+ }
+
+ if(theInfo.myIsElemNum){
+ TValueHolder<TElemNum, med_int> anElemNum(anInfo.myElemNum);
+ aRet = MEDmeshEntityNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ MED_POLYHEDRON,
+ (TInt)anInfo.myElemNum->size(),
+ &anElemNum);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshEntityNumberWr(...)");
+ }
+
+
+ TValueHolder<TElemNum, med_int> aFamNum(anInfo.myFamNum);
+ aRet = MEDmeshEntityFamilyNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ MED_POLYHEDRON,
+ (TInt)anInfo.myFamNum->size(),
+ &aFamNum);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetPolyedreInfo - MEDmeshEntityFamilyNumberWr(...)");
+ }
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbPolyedres(const MED::TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ return GetNbCells(theMeshInfo,theEntity,theGeom,theConnMode,theErr);
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper ::GetPolyedreConnSize(const TMeshInfo& theMeshInfo,
+ TInt& theNbFaces,
+ TInt& theConnSize,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ EXCEPTION(std::runtime_error,"GetPolyedreConnSize - (...)");
+
+ MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo);
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<EConnectivite, med_connectivity_mode> aConnMode(theConnMode);
+ //TValueHolder<TInt, med_int> aNbFaces(theNbFaces);
+ //TValueHolder<TInt, med_int> aConnSize(theConnSize);
+
+ med_bool chgt,trsf;
+ theNbFaces = MEDmeshnEntity(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_CELL,
+ MED_POLYHEDRON,
+ MED_INDEX_NODE,
+ aConnMode,
+ &chgt,
+ &trsf);
+
+ theConnSize = MEDmeshnEntity(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_CELL,
+ MED_POLYHEDRON,
+ MED_CONNECTIVITY,
+ aConnMode,
+ &chgt,
+ &trsf);
+
+ if(theNbFaces < 0 || theConnSize<0)
+ EXCEPTION(std::runtime_error,"GetPolygoneInfo - MEDmeshnEntity(...)");
+
+ }
+
+ //-----------------------------------------------------------------
+ TEntityInfo
+ TVWrapper
+ ::GetEntityInfo(const MED::TMeshInfo& theMeshInfo,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ TEntityInfo anInfo;
+
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return anInfo;
+
+ if(theMeshInfo.GetType() == eNON_STRUCTURE) {
+ TInt aNbElem = GetNbNodes(theMeshInfo);
+ if(aNbElem > 0){
+ anInfo[eNOEUD][ePOINT1] = aNbElem;
+ const TEntity2GeomSet& anEntity2GeomSet = GetEntity2GeomSet();
+ TEntity2GeomSet::const_iterator anIter = anEntity2GeomSet.begin();
+ TEntity2GeomSet::const_iterator anIterEnd = anEntity2GeomSet.end();
+ for(; anIter != anIterEnd; anIter++){
+ const EEntiteMaillage& anEntity = anIter->first;
+ const TGeomSet& aGeomSet = anIter->second;
+ TGeomSet::const_iterator anIter2 = aGeomSet.begin();
+ TGeomSet::const_iterator anIterEnd2 = aGeomSet.end();
+ for(; anIter2 != anIterEnd2; anIter2++){
+ const EGeometrieElement& aGeom = *anIter2;
+ aNbElem = GetNbCells(theMeshInfo,anEntity,aGeom,theConnMode,theErr);
+ if(aNbElem > 0) {
+ if ( anEntity == eSTRUCT_ELEMENT ) {
+ const TInt nbStructTypes = aNbElem;
+ for ( TInt structType = 0; structType < nbStructTypes; ++structType ) {
+ // check type name to keep only "MED_BALL" structured element
+ TValueHolder<TString, char> aMeshName((TString&) theMeshInfo.myName );
+ char geotypename[ MED_NAME_SIZE + 1] = "";
+ med_geometry_type geotype;
+ MEDmeshEntityInfo( myFile->Id(), &aMeshName, MED_NO_DT, MED_NO_IT,
+ med_entity_type(anEntity), structType+1,
+ geotypename, &geotype);
+ if ( strcmp( geotypename, MED_BALL_NAME ) == 0 ) {
+ aNbElem = GetNbCells( theMeshInfo, anEntity, EGeometrieElement(geotype),
+ theConnMode, theErr);
+ if ( aNbElem > 0 )
+ anInfo[anEntity][EGeometrieElement(geotype)] = aNbElem;
+ }
+ }
+ }
+ else {
+ anInfo[anEntity][aGeom] = aNbElem;
+ }
+ }
+ }
+ }
+ }
+ } else { // eSTRUCTURE
+ EGrilleType aGrilleType;
+ TInt aNbNodes = 1;
+ TInt aNbElem = 1;
+ TInt aNbSub = 0;
+ TInt aDim = theMeshInfo.GetDim();
+ EGeometrieElement aGeom, aSubGeom;
+ EEntiteMaillage aSubEntity = eMAILLE;
+
+ GetGrilleType(theMeshInfo, aGrilleType);
+
+ TIntVector aStruct(aDim);
+ if(aGrilleType == eGRILLE_STANDARD)
+ {
+ GetGrilleStruct(theMeshInfo, aStruct, theErr);
+ }
+ else
+ { // eGRILLE_CARTESIENNE and eGRILLE_POLAIRE
+ ETable aTable[3] = { eCOOR_IND1, eCOOR_IND2, eCOOR_IND3 };
+ for(med_int anAxis = 0; anAxis < aDim; anAxis++)
+ aStruct[ anAxis ] = GetNbNodes(theMeshInfo, aTable[anAxis]);
+ }
+ for(med_int i = 0; i < aDim; i++){
+ aNbNodes = aNbNodes * aStruct[i];
+ aNbElem = aNbElem * (aStruct[i] - 1);
+ }
+ switch(aDim){
+ case 1:
+ aGeom = eSEG2;
+ break;
+ case 2:
+ aGeom = eQUAD4;
+ aSubGeom = eSEG2;
+ aSubEntity = eARETE;
+ aNbSub =
+ (aStruct[0] ) * (aStruct[1]-1) +
+ (aStruct[0]-1) * (aStruct[1] );
+ break;
+ case 3:
+ aGeom = eHEXA8;
+ aSubGeom = eQUAD4;
+ aSubEntity = eFACE;
+ aNbSub =
+ (aStruct[0] ) * (aStruct[1]-1) * (aStruct[2]-1) +
+ (aStruct[0]-1) * (aStruct[1] ) * (aStruct[2]-1) +
+ (aStruct[0]-1) * (aStruct[1]-1) * (aStruct[2] );
+ break;
+ }
+ anInfo[eNOEUD][ePOINT1] = aNbNodes;
+ anInfo[eMAILLE][aGeom] = aNbElem;
+ if ( aDim > 1 )
+ anInfo[aSubEntity][aSubGeom] = aNbSub;
+ }
+ return anInfo;
+ }
+
+
+ //-----------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbCells(const MED::TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo);
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ med_bool chgt,trsf;
+ if(theGeom!=MED::ePOLYGONE && theGeom!=MED::ePOLYEDRE && theGeom != MED::eBALL)
+ {
+ return MEDmeshnEntity(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ med_entity_type(theEntity),
+ med_geometry_type(theGeom),
+ MED_CONNECTIVITY,
+ med_connectivity_mode(theConnMode),
+ &chgt,
+ &trsf);
+ }
+ else if(theGeom==MED::ePOLYGONE)
+ {
+ return MEDmeshnEntity(myFile->Id(),&aMeshName,MED_NO_DT,MED_NO_IT,med_entity_type(theEntity),
+ MED_POLYGON,MED_INDEX_NODE,med_connectivity_mode(theConnMode),&chgt,&trsf)-1;
+ }
+ else if ( theGeom==MED::ePOLYEDRE )
+ {
+ return MEDmeshnEntity(myFile->Id(),&aMeshName,MED_NO_DT,MED_NO_IT,med_entity_type(theEntity),
+ MED_POLYHEDRON,MED_INDEX_FACE,med_connectivity_mode(theConnMode),&chgt,&trsf)-1;
+ }
+ else if ( theGeom==MED::eBALL )
+ {
+ return GetNbBalls( theMeshInfo );
+ }
+ return 0;
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetCellInfo(MED::TCellInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName (aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> aConn (theInfo.myConn);
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch (theInfo.myModeSwitch);
+ TValueHolder<TString, char> anElemNames (theInfo.myElemNames);
+ TValueHolder<EBooleen, med_bool> anIsElemNames(theInfo.myIsElemNames);
+ TValueHolder<TElemNum, med_int> anElemNum (theInfo.myElemNum);
+ TValueHolder<EBooleen, med_bool> anIsElemNum (theInfo.myIsElemNum);
+ TValueHolder<TElemNum, med_int> aFamNum (theInfo.myFamNum);
+ TValueHolder<EBooleen, med_bool> anIsFamNum (theInfo.myIsFamNum);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (theInfo.myEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theInfo.myGeom);
+ TValueHolder<EConnectivite, med_connectivity_mode> aConnMode (theInfo.myConnMode);
+
+ TErr aRet;
+ aRet = MEDmeshElementRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ aConnMode,
+ aModeSwitch,
+ &aConn,
+ &anIsElemNames,
+ &anElemNames,
+ &anIsElemNum,
+ &anElemNum,
+ &anIsFamNum,
+ &aFamNum);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetCellInfo - MEDmeshElementRd(...)");
+
+ if (anIsFamNum == MED_FALSE)
+ {
+ int mySize = (int) theInfo.myFamNum->size();
+ theInfo.myFamNum->clear();
+ theInfo.myFamNum->resize(mySize, 0);
+ }
+
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetCellInfo(const MED::TCellInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TCellInfo& anInfo = const_cast<MED::TCellInfo&>(theInfo);
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aMeshName (aMeshInfo.myName);
+ TValueHolder<TElemNum, med_int> aConn (anInfo.myConn);
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch (anInfo.myModeSwitch);
+ TValueHolder<TString, char> anElemNames (anInfo.myElemNames);
+ TValueHolder<EBooleen, med_bool> anIsElemNames(anInfo.myIsElemNames);
+ TValueHolder<TElemNum, med_int> anElemNum (anInfo.myElemNum);
+ TValueHolder<EBooleen, med_bool> anIsElemNum (anInfo.myIsElemNum);
+ TValueHolder<TElemNum, med_int> aFamNum (anInfo.myFamNum);
+ TValueHolder<EBooleen, med_bool> anIsFamNum (anInfo.myIsFamNum);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity (anInfo.myEntity);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (anInfo.myGeom);
+ TValueHolder<EConnectivite, med_connectivity_mode> aConnMode (anInfo.myConnMode);
+ TValueHolder<TInt, med_int> aNbElem (anInfo.myNbElem);
+
+ TErr aRet;
+ aRet = MEDmeshElementConnectivityWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_UNDEF_DT,
+ anEntity,
+ aGeom,
+ aConnMode,
+ aModeSwitch,
+ aNbElem,
+ &aConn);
+
+ MEDmeshEntityFamilyNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ aNbElem,
+ &aFamNum);
+ if(anIsElemNames)
+ MEDmeshEntityNameWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ aNbElem,
+ &anElemNames);
+ if(anIsElemNum)
+ MEDmeshEntityNumberWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ anEntity,
+ aGeom,
+ aNbElem,
+ &anElemNum);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetCellInfo - MEDmeshElementWr(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetCellInfo(const MED::TCellInfo& theInfo,
+ TErr* theErr)
+ {
+ SetCellInfo(theInfo,eLECTURE_ECRITURE,theErr);
+ }
+
+ //----------------------------------------------------------------------------
+ //! Read geom type of MED_BALL structural element
+ EGeometrieElement TVWrapper::GetBallGeom(const TMeshInfo& theMeshInfo)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE);
+
+ // read med_geometry_type of "MED_BALL" element
+ char geotypename[ MED_NAME_SIZE + 1] = MED_BALL_NAME;
+ return EGeometrieElement( MEDstructElementGeotype( myFile->Id(), geotypename ) );
+ }
+
+ //----------------------------------------------------------------------------
+ //! Read number of balls in the Mesh
+ TInt TVWrapper::GetNbBalls(const TMeshInfo& theMeshInfo)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE);
+
+ EGeometrieElement ballType = GetBallGeom( theMeshInfo );
+ if ( ballType < 0 )
+ return 0;
+
+ return GetNbCells( theMeshInfo, eSTRUCT_ELEMENT, ballType, eNOD );
+ }
+
+ //----------------------------------------------------------------------------
+ //! Read a MEDWrapped representation of MED_BALL from the MED file
+ void TVWrapper::GetBallInfo(TBallInfo& theInfo, TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ // check geometry of MED_BALL
+ if ( theInfo.myGeom == eBALL )
+ {
+ theInfo.myGeom = GetBallGeom( *theInfo.myMeshInfo );
+ if ( theInfo.myGeom < 0 ) {
+ if ( !theErr )
+ EXCEPTION(std::runtime_error,"GetBallInfo - no balls in the mesh");
+ *theErr = theInfo.myGeom;
+ return;
+ }
+ }
+
+ // read nodes ids
+ GetCellInfo( theInfo );
+
+ // read diameters
+ TValueHolder<TString, char> aMeshName (theInfo.myMeshInfo->myName);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (theInfo.myGeom);
+ TValueHolder<TFloatVector, void> aDiam (theInfo.myDiameters);
+ char varattname[ MED_NAME_SIZE + 1] = MED_BALL_DIAMETER;
+
+ TErr aRet = MEDmeshStructElementVarAttRd( myFile->Id(), &aMeshName,
+ MED_NO_DT, MED_NO_IT,
+ aGeom,
+ varattname,
+ &aDiam);
+ if ( theErr )
+ *theErr = aRet;
+ else if ( aRet < 0 )
+ EXCEPTION(std::runtime_error,"GetBallInfo - pb at reading diameters");
+ }
+
+
+ //----------------------------------------------------------------------------
+ //! Write a MEDWrapped representation of MED_BALL to the MED file
+ void TVWrapper::SetBallInfo(const TBallInfo& theInfo, EModeAcces theMode, TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ TErr ret;
+ char ballsupportname[MED_NAME_SIZE+1]="BALL_SUPPORT_MESH";
+ EGeometrieElement ballGeom = GetBallGeom( *theInfo.myMeshInfo );
+ if ( ballGeom < 0 )
+ {
+ // no ball model in the file, create support mesh for it
+ char dummyname [MED_NAME_SIZE*3+1]="";
+ if (( ret = MEDsupportMeshCr( myFile->Id(),
+ ballsupportname,
+ theInfo.myMeshInfo->GetSpaceDim(),
+ theInfo.myMeshInfo->GetDim(),
+ "Support mesh for a ball model",
+ MED_CARTESIAN,
+ /*axisname=*/dummyname, /*unitname=*/dummyname)) < 0) {
+ if ( !theErr )
+ EXCEPTION(std::runtime_error,"SetBallInfo - MEDsupportMeshCr");
+ *theErr = ret;
+ return;
+ }
+ // write coordinates of 1 node
+ med_float coord[3] = {0,0,0};
+ if ((ret = MEDmeshNodeCoordinateWr(myFile->Id(),
+ ballsupportname, MED_NO_DT, MED_NO_IT, 0.0,
+ MED_FULL_INTERLACE, /*nnode=*/1, coord)) < 0) {
+ if ( !theErr )
+ EXCEPTION(std::runtime_error,"SetBallInfo - MEDmeshNodeCoordinateWr");
+ *theErr = ret;
+ return;
+ }
+ // ball model creation
+ char geotypename[ MED_NAME_SIZE + 1] = MED_BALL_NAME;
+ if (( ballGeom = (EGeometrieElement) MEDstructElementCr(myFile->Id(),
+ geotypename,
+ theInfo.myMeshInfo->GetSpaceDim(),
+ ballsupportname,
+ MED_NODE,MED_NONE)) < 0 ) {
+ if ( !theErr )
+ EXCEPTION(std::runtime_error,"SetBallInfo - MEDstructElementCr");
+ *theErr = ret;
+ return;
+ }
+ // create diameter attribute
+ if (( ret = MEDstructElementVarAttCr(myFile->Id(),
+ geotypename, MED_BALL_DIAMETER,
+ MED_ATT_FLOAT64, /*ncomp=*/1)) < 0) {
+ if ( !theErr )
+ EXCEPTION(std::runtime_error,"SetBallInfo - MEDstructElementVarAttCr");
+ *theErr = ret;
+ return;
+ }
+ } // ballGeom < 0
+
+ TBallInfo& aBallInfo = ((TBallInfo&) theInfo );
+ aBallInfo.myGeom = ballGeom;
+
+ // write node ids
+ SetCellInfo(theInfo,theMode,theErr);
+ if ( theErr && theErr < 0 )
+ return;
+
+ // write diameter
+ TValueHolder<TString, char> aMeshName (aBallInfo.myMeshInfo->myName);
+ TValueHolder<EGeometrieElement, med_geometry_type> aGeom (aBallInfo.myGeom);
+ TValueHolder<TFloatVector, void> aDiam (aBallInfo.myDiameters);
+ ret = MEDmeshStructElementVarAttWr(myFile->Id(), &aMeshName,
+ MED_NO_DT, MED_NO_IT,
+ aGeom, MED_BALL_DIAMETER,
+ theInfo.myNbElem, &aDiam);
+ if ( theErr )
+ *theErr = ret;
+ else if ( ret < 0 )
+ EXCEPTION(std::runtime_error,"SetBallInfo - MEDmeshStructElementVarAttWr");
+ }
+
+ //----------------------------------------------------------------------------
+ //! Write a MEDWrapped representation of MED_BALL to the MED file
+ void TVWrapper::SetBallInfo(const TBallInfo& theInfo, TErr* theErr)
+ {
+ SetBallInfo( theInfo, eLECTURE_ECRITURE, theErr );
+ }
+
+ //-----------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbFields(TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ return MEDnField(myFile->Id());
+ }
+
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbComp(TInt theFieldId,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ return MEDfieldnComponent(myFile->Id(),theFieldId);
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetFieldInfo(TInt theFieldId,
+ MED::TFieldInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TString aFieldName(256); // Protect from memory problems with too long names
+ TValueHolder<ETypeChamp, med_field_type> aType(theInfo.myType);
+ TValueHolder<TString, char> aCompNames(theInfo.myCompNames);
+ TValueHolder<TString, char> anUnitNames(theInfo.myUnitNames);
+ MED::TMeshInfo& aMeshInfo = theInfo.myMeshInfo;
+
+ TErr aRet;
+ med_bool local;
+ char dtunit[MED_SNAME_SIZE+1];
+ char local_mesh_name[MED_NAME_SIZE+1]="";
+ med_int nbofstp;
+ theInfo.myNbComp = MEDfieldnComponent(myFile->Id(),theFieldId);
+ aRet = MEDfieldInfo(myFile->Id(),
+ theFieldId,
+ &aFieldName[0],
+ local_mesh_name,
+ &local,
+ &aType,
+ &aCompNames,
+ &anUnitNames,
+ dtunit,
+ &nbofstp);
+
+ if(strcmp(&aMeshInfo.myName[0],local_mesh_name) != 0 ) {
+ if(theErr)
+ *theErr = -1;
+ return;
+ }
+
+ theInfo.SetName(aFieldName);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetFieldInfo - MEDfieldInfo(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetFieldInfo(const MED::TFieldInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TFieldInfo& anInfo = const_cast<MED::TFieldInfo&>(theInfo);
+
+ TValueHolder<TString, char> aFieldName(anInfo.myName);
+ TValueHolder<ETypeChamp, med_field_type> aType(anInfo.myType);
+ TValueHolder<TString, char> aCompNames(anInfo.myCompNames);
+ TValueHolder<TString, char> anUnitNames(anInfo.myUnitNames);
+ MED::TMeshInfo& aMeshInfo = anInfo.myMeshInfo;
+ TErr aRet;
+ char dtunit[MED_SNAME_SIZE+1];
+ std::fill(dtunit,dtunit+MED_SNAME_SIZE+1,'\0');
+ aRet = MEDfieldCr(myFile->Id(),
+ &aFieldName,
+ aType,
+ anInfo.myNbComp,
+ &aCompNames,
+ &anUnitNames,
+ dtunit,
+ &aMeshInfo.myName[0]);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetFieldInfo - MEDfieldCr(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetFieldInfo(const MED::TFieldInfo& theInfo,
+ TErr* theErr)
+ {
+ TErr aRet;
+ SetFieldInfo(theInfo,eLECTURE_ECRITURE,&aRet);
+
+ if(aRet < 0)
+ SetFieldInfo(theInfo,eLECTURE_AJOUT,&aRet);
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbGauss(TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ return MEDnLocalization(myFile->Id());
+ }
+
+
+ //----------------------------------------------------------------------------
+ TGaussInfo::TInfo
+ TVWrapper
+ ::GetGaussPreInfo(TInt theId,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return TGaussInfo::TInfo( TGaussInfo::TKey(ePOINT1,""),0 );
+
+ med_int aNbGaussPoints = med_int();
+ TVector<char> aName(GetNOMLength<eV2_2>()+1);
+ med_geometry_type aGeom = MED_NONE;
+
+ TErr aRet;
+ med_int dim;
+ char geointerpname[MED_NAME_SIZE+1]="";
+ char ipointstructmeshname[MED_NAME_SIZE+1]="";
+ med_int nsectionmeshcell;
+ med_geometry_type sectiongeotype;
+ aRet = MEDlocalizationInfo (myFile->Id(),
+ theId,
+ &aName[0],
+ &aGeom,
+ &dim,
+ &aNbGaussPoints,
+ geointerpname,
+ ipointstructmeshname,
+ &nsectionmeshcell,
+ §iongeotype);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetGaussPreInfo - MEDlocalizationInfo(...)");
+ return TGaussInfo::TInfo(TGaussInfo::TKey(EGeometrieElement(aGeom),&aName[0]),
+ TInt(aNbGaussPoints));
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetGaussInfo(TInt theId,
+ TGaussInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TValueHolder<TNodeCoord, med_float> aRefCoord(theInfo.myRefCoord);
+ TValueHolder<TNodeCoord, med_float> aGaussCoord(theInfo.myGaussCoord);
+ TValueHolder<TWeight, med_float> aWeight(theInfo.myWeight);
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch(theInfo.myModeSwitch);
+ TValueHolder<TString, char> aGaussName(theInfo.myName);
+
+ TErr aRet;
+ aRet = MEDlocalizationRd(myFile->Id(),
+ &aGaussName,
+ aModeSwitch,
+ &aRefCoord,
+ &aGaussCoord,
+ &aWeight);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetGaussInfo - MEDlocalizationRd(...)");
+ }
+
+
+ //----------------------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbProfiles(TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return -1;
+
+ return MEDnProfile(myFile->Id());
+ }
+
+ TProfileInfo::TInfo
+ TVWrapper
+ ::GetProfilePreInfo(TInt theId,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return TProfileInfo::TInfo();
+
+ med_int aSize = -1;
+ TVector<char> aName(GetNOMLength<eV2_2>()+1);
+
+ TErr aRet;
+ aRet = MEDprofileInfo(myFile->Id(),
+ theId,
+ &aName[0],
+ &aSize);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetProfilePreInfo - MEDprofileInfo(...)");
+
+ return TProfileInfo::TInfo(&aName[0],aSize);
+ }
+
+ void
+ TVWrapper
+ ::GetProfileInfo(TInt theId,
+ TProfileInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TProfileInfo& anInfo = const_cast<TProfileInfo&>(theInfo);
+ TValueHolder<TElemNum, med_int> anElemNum(anInfo.myElemNum);
+ TValueHolder<TString, char> aProfileName(anInfo.myName);
+
+ TErr aRet;
+ aRet = MEDprofileRd(myFile->Id(),
+ &aProfileName,
+ &anElemNum);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetProfileInfo - MEDprofileRd(...)");
+ }
+
+ void
+ TVWrapper
+ ::SetProfileInfo(const TProfileInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TProfileInfo& anInfo = const_cast<TProfileInfo&>(theInfo);
+ TValueHolder<TElemNum, med_int> anElemNum(anInfo.myElemNum);
+ TValueHolder<TString, char> aProfileName(anInfo.myName);
+
+ TErr aRet;
+ aRet = MEDprofileWr(myFile->Id(), // descripteur du fichier.
+ &aProfileName, // tableau de valeurs du profil.
+ theInfo.GetSize(), // taille du profil.
+ &anElemNum); // nom profil.
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetProfileInfo - MEDprofileWr(...)");
+ }
+
+ void
+ TVWrapper
+ ::SetProfileInfo(const TProfileInfo& theInfo,
+ TErr* theErr)
+ {
+ TErr aRet;
+ SetProfileInfo(theInfo,eLECTURE_ECRITURE,&aRet);
+
+ if(aRet < 0)
+ SetProfileInfo(theInfo,eLECTURE_AJOUT,&aRet);
+
+ if(aRet < 0)
+ SetProfileInfo(theInfo,eCREATION,&aRet);
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //-----------------------------------------------------------------
+ TInt
+ TVWrapper
+ ::GetNbTimeStamps(const MED::TFieldInfo& theInfo,
+ const MED::TEntityInfo& theEntityInfo,
+ EEntiteMaillage& theEntity,
+ TGeom2Size& theGeom2Size,
+ TErr* theErr)
+ {
+ theEntity = EEntiteMaillage(-1);
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr){
+ if(theEntityInfo.empty())
+ *theErr = -1;
+ if(*theErr < 0)
+ return -1;
+ }else if(theEntityInfo.empty())
+ EXCEPTION(std::runtime_error,"GetNbTimeStamps - There is no any Entity on the Mesh");
+
+ bool anIsPerformAdditionalCheck = GetNbMeshes() > 1;
+
+ theGeom2Size.clear();
+ TInt aNbTimeStamps = 0;
+ TIdt anId = myFile->Id();
+
+ MED::TFieldInfo& anInfo = const_cast<MED::TFieldInfo&>(theInfo);
+ TValueHolder<TString, char> aFieldName(anInfo.myName);
+ MED::TMeshInfo& aMeshInfo = anInfo.myMeshInfo;
+
+ // workaround for IPAL13676
+ MED::TEntityInfo localEntityInfo = theEntityInfo;
+ TEntityInfo::iterator anLocalIter = localEntityInfo.find(eMAILLE);
+ if(anLocalIter != localEntityInfo.end()){
+ localEntityInfo[eNOEUD_ELEMENT] = anLocalIter->second;
+ }
+
+ TEntityInfo::const_iterator anIter = localEntityInfo.begin();
+ for(; anIter != localEntityInfo.end(); anIter++){
+ med_entity_type anEntity = med_entity_type(anIter->first);
+ const TGeom2Size& aGeom2Size = anIter->second;
+ TGeom2Size::const_iterator anGeomIter = aGeom2Size.begin();
+ for(; anGeomIter != aGeom2Size.end(); anGeomIter++){
+ med_geometry_type aGeom = med_geometry_type(anGeomIter->first);
+ char aMeshName[MED_NAME_SIZE+1];
+ med_bool islocal;
+ med_field_type ft;
+ char dtunit[MED_SNAME_SIZE+1];
+ med_int myNbComp = MEDfieldnComponentByName(anId,&aFieldName);
+ char *cname=new char[myNbComp*MED_SNAME_SIZE+1];
+ char *unitname=new char[myNbComp*MED_SNAME_SIZE+1];
+ TInt aNbStamps;
+ MEDfieldInfoByName(anId,
+ &aFieldName,
+ aMeshName,
+ &islocal,
+ &ft,
+ cname,
+ unitname,
+ dtunit,
+ &aNbStamps);
+ delete [] cname;
+ delete [] unitname;
+ med_int nval = 0;
+ med_int aNumDt;
+ med_int aNumOrd;
+ med_float aDt;
+ if (aNbStamps > 0)
+ {
+ MEDfieldComputingStepInfo(anId,
+ &aFieldName,
+ 1,
+ &aNumDt,
+ &aNumOrd,
+ &aDt);
+ char profilename[MED_NAME_SIZE+1];
+ char locname[MED_NAME_SIZE+1];
+ med_int profilsize;
+ med_int aNbGauss;
+
+ // protection from crash (division by zero)
+ // inside MEDfieldnValueWithProfile function
+ // caused by the workaround for IPAL13676 (see above)
+ if( anEntity == MED_NODE_ELEMENT && aGeom % 100 == 0 )
+ continue;
+
+ nval = MEDfieldnValueWithProfile(anId,
+ &aFieldName,
+ aNumDt,
+ aNumOrd,
+ anEntity,
+ med_geometry_type(aGeom),
+ 1,
+ MED_COMPACT_STMODE,
+ profilename,
+ &profilsize,
+ locname,
+ &aNbGauss);
+ }
+ bool anIsSatisfied =(nval > 0);
+ if(anIsSatisfied){
+ INITMSG(MYDEBUG,
+ "GetNbTimeStamps aNbTimeStamps = "<<aNbStamps<<
+ "; aGeom = "<<aGeom<<"; anEntity = "<<anEntity<<"\n");
+ if(anIsPerformAdditionalCheck){
+ anIsSatisfied = !strcmp(&aMeshName[0],&aMeshInfo.myName[0]);
+ if(!anIsSatisfied){
+ INITMSG(MYDEBUG,
+ "GetNbTimeStamps aMeshName = '"<<&aMeshName[0]<<"' != "<<
+ "; aMeshInfo.myName = '"<<&aMeshInfo.myName[0]<<"'\n");
+ }
+ }
+ }
+ if(anIsSatisfied){
+ theGeom2Size[EGeometrieElement(aGeom)] = anGeomIter->second;
+ theEntity = EEntiteMaillage(anEntity);
+ aNbTimeStamps = aNbStamps;
+ }
+ }
+ if(!theGeom2Size.empty())
+ break;
+ }
+ return aNbTimeStamps;
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetTimeStampInfo(TInt theTimeStampId,
+ MED::TTimeStampInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ const TGeom2Size& aGeom2Size = theInfo.myGeom2Size;
+
+ if(theErr){
+ if(aGeom2Size.empty())
+ *theErr = -1;
+ if(*theErr < 0)
+ return;
+ }else if(aGeom2Size.empty())
+ EXCEPTION(std::runtime_error,"GetTimeStampInfo - There is no any cell");
+
+ MED::TFieldInfo& aFieldInfo = *theInfo.myFieldInfo;
+ MED::TMeshInfo& aMeshInfo = *aFieldInfo.myMeshInfo;
+
+ TValueHolder<TString, char> aFieldName(aFieldInfo.myName);
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity(theInfo.myEntity);
+ TValueHolder<TInt, med_int> aNumDt(theInfo.myNumDt);
+ TValueHolder<TInt, med_int> aNumOrd(theInfo.myNumOrd);
+ TValueHolder<TString, char> anUnitDt(theInfo.myUnitDt);
+ TValueHolder<TFloat, med_float> aDt(theInfo.myDt);
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<EBooleen, med_bool> anIsLocal(aFieldInfo.myIsLocal);
+ TValueHolder<TInt, med_int> aNbRef(aFieldInfo.myNbRef);
+
+ TGeom2NbGauss& aGeom2NbGauss = theInfo.myGeom2NbGauss;
+
+ // just to get a time stamp unit (anUnitDt)
+ med_field_type aFieldType;
+ med_int aNbComp = MEDfieldnComponentByName(myFile->Id(), &aFieldName);
+ char *aCompName = new char[aNbComp*MED_SNAME_SIZE+1];
+ char *aCompUnit = new char[aNbComp*MED_SNAME_SIZE+1];
+ TInt aNbStamps;
+ MEDfieldInfoByName(myFile->Id(),
+ &aFieldName,
+ &aMeshName,
+ &anIsLocal,
+ &aFieldType,
+ aCompName,
+ aCompUnit,
+ &anUnitDt,
+ &aNbStamps);
+ delete [] aCompName;
+ delete [] aCompUnit;
+
+ TGeom2Size::const_iterator anIter = aGeom2Size.begin();
+ for(; anIter != aGeom2Size.end(); anIter++){
+ const EGeometrieElement& aGeom = anIter->first;
+ med_int aNbGauss = -1;
+
+ TErr aRet;
+ aRet = MEDfieldComputingStepInfo(myFile->Id(),
+ &aFieldName,
+ theTimeStampId,
+ &aNumDt,
+ &aNumOrd,
+ &aDt);
+ char profilename[MED_NAME_SIZE+1];
+ med_int profilsize;
+ char locname[MED_NAME_SIZE+1];
+ MEDfieldnValueWithProfile(myFile->Id(),
+ &aFieldName,
+ aNumDt,
+ aNumOrd,
+ anEntity,
+ med_geometry_type(aGeom),
+ 1,
+ MED_COMPACT_STMODE,
+ profilename,
+ &profilsize,
+ locname,
+ &aNbGauss);
+
+ static TInt MAX_NB_GAUSS_POINTS = 32;
+ if(aNbGauss <= 0 || aNbGauss > MAX_NB_GAUSS_POINTS)
+ aNbGauss = 1;
+
+ aGeom2NbGauss[aGeom] = aNbGauss;
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetTimeStampInfo - MEDfieldnValueWithProfile(...)");
+ }
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TIdt anId = myFile->Id();
+
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch(theTimeStampValue->myModeSwitch);
+ MED::TGeom2Profile& aGeom2Profile = theTimeStampValue->myGeom2Profile;
+
+ MED::PTimeStampInfo aTimeStampInfo = theTimeStampValue->myTimeStampInfo;
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity(aTimeStampInfo->myEntity);
+ TValueHolder<TInt, med_int> aNumDt(aTimeStampInfo->myNumDt);
+ TValueHolder<TInt, med_int> aNumOrd(aTimeStampInfo->myNumOrd);
+
+ MED::PFieldInfo aFieldInfo = aTimeStampInfo->myFieldInfo;
+ TValueHolder<TString, char> aFieldName(aFieldInfo->myName);
+ TValueHolder<EBooleen, med_bool> anIsLocal(aFieldInfo->myIsLocal);
+
+ MED::PMeshInfo aMeshInfo = aFieldInfo->myMeshInfo;
+ TValueHolder<TString, char> aMeshName(aMeshInfo->myName);
+
+ TGeom2Gauss& aGeom2Gauss = aTimeStampInfo->myGeom2Gauss;
+ TVector<char> aGaussName(GetNOMLength<eV2_2>()+1);
+
+ med_storage_mode aProfileMode = med_storage_mode(boost::get<0>(theMKey2Profile));
+ MED::TKey2Profile aKey2Profile = boost::get<1>(theMKey2Profile);
+ TVector<char> aProfileName(GetNOMLength<eV2_2>()+1);
+
+ TGeom2Size& aGeom2Size = aTimeStampInfo->myGeom2Size;
+ TGeom2Size::iterator anIter = aGeom2Size.begin();
+ for(; anIter != aGeom2Size.end(); anIter++){
+ EGeometrieElement aGeom = anIter->first;
+ TInt aNbElem = anIter->second;
+ med_int profilesize,aNbGauss;
+
+ TInt aNbVal = MEDfieldnValueWithProfile(anId,
+ &aFieldName,
+ aNumDt,
+ aNumOrd,
+ anEntity,
+ med_geometry_type(aGeom),
+ 1,
+ aProfileMode,
+ &aProfileName[0],
+ &profilesize,
+ &aGaussName[0],
+ &aNbGauss);
+
+ if(aNbVal <= 0){
+ if(theErr){
+ *theErr = -1;
+ return;
+ }
+ EXCEPTION(std::runtime_error,"GetTimeStampValue - MEDfieldnValueWithProfile(...) - aNbVal == "<<aNbVal<<" <= 0");
+ }
+
+ TInt aNbComp = aFieldInfo->myNbComp;
+ TInt aNbValue = aNbVal;// / aNbGauss; rules in MED changed
+ theTimeStampValue->AllocateValue(aGeom,
+ aNbValue,
+ aNbGauss,
+ aNbComp);
+ TInt aValueSize = theTimeStampValue->GetValueSize(aGeom);
+
+ INITMSG(MYDEBUG,
+ "TVWrapper::GetTimeStampValue - aGeom = "<<aGeom<<
+ "; aNbVal = "<<aNbVal<<
+ "; aNbValue = "<<aNbValue<<
+ "; aNbGauss = "<<aNbGauss<<
+ "; aNbComp = "<<aNbComp<<
+ std::endl);
+
+ TErr aRet = MEDfieldValueWithProfileRd(anId,
+ &aFieldName,
+ aNumDt,
+ aNumOrd,
+ anEntity,
+ med_geometry_type(aGeom),
+ aProfileMode,
+ &aProfileName[0],
+ aModeSwitch,
+ MED_ALL_CONSTITUENT,
+ theTimeStampValue->GetValuePtr(aGeom));
+ if(aRet < 0){
+ if(theErr){
+ *theErr = MED_FALSE;
+ return;
+ }
+ EXCEPTION(std::runtime_error,"GetTimeStampValue - MEDfieldValueWithProfileRd(...)");
+ }
+
+ MED::PGaussInfo aGaussInfo;
+ TGaussInfo::TKey aKey(aGeom,&aGaussName[0]);
+ if(strcmp(&aGaussName[0],"") != 0){
+ MED::TKey2Gauss::const_iterator anIter = theKey2Gauss.find(aKey);
+ if(anIter != theKey2Gauss.end()){
+ aGaussInfo = anIter->second;
+ aGeom2Gauss[aGeom] = aGaussInfo;
+ }
+ }
+
+ MED::PProfileInfo aProfileInfo;
+ if(strcmp(&aProfileName[0],MED_NO_PROFILE) != 0){
+ MED::TKey2Profile::const_iterator anIter = aKey2Profile.find(&aProfileName[0]);
+ if(anIter != aKey2Profile.end()){
+ aProfileInfo = anIter->second;
+ aGeom2Profile[aGeom] = aProfileInfo;
+ }
+ }
+
+ if(aGaussInfo && aNbGauss != aGaussInfo->GetNbGauss()){
+ if(theErr){
+ *theErr = MED_FALSE;
+ return;
+ }
+ EXCEPTION(std::runtime_error,"GetTimeStampValue - aNbGauss != aGaussInfo->GetNbGauss()");
+ }
+
+ if(aProfileInfo && aProfileInfo->IsPresent()){
+ TInt aNbSubElem = aProfileInfo->GetSize();
+ TInt aProfileSize = aNbSubElem*aNbComp*aNbGauss;
+ if(aProfileSize != aValueSize){
+ if(theErr){
+ *theErr = -1;
+ return;
+ }
+ EXCEPTION(std::runtime_error,
+ "GetTimeStampValue - aProfileSize("<<aProfileSize<<
+ ") != aValueSize("<<aValueSize<<
+ "); aNbVal = "<<aNbVal<<
+ "; anEntity = "<<anEntity<<
+ "; aGeom = "<<aGeom<<
+ "; aNbElem = "<<aNbElem<<
+ "; aNbSubElem = "<<aNbSubElem<<
+ "; aNbComp = "<<aNbComp<<
+ "; aNbGauss = "<<aNbGauss<<
+ "");
+ }
+ }else{
+ if((aProfileMode == MED_GLOBAL_STMODE) && (aNbElem != aNbValue)){
+ if(theErr){
+ *theErr = -1;
+ return;
+ }
+ EXCEPTION(std::runtime_error,
+ "GetTimeStampValue - aNbElem("<<aNbElem<<
+ ") != aNbValue("<<aNbValue<<
+ "); aNbVal = "<<aNbVal<<
+ "; anEntity = "<<anEntity<<
+ "; aGeom = "<<aGeom<<
+ "; aNbElem = "<<aNbElem<<
+ "; aNbComp = "<<aNbComp<<
+ "; aNbGauss = "<<aNbGauss<<
+ "");
+ }
+ }
+ }
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetTimeStampValue(const MED::PTimeStampValueBase& theTimeStampValue,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TErr aRet;
+ TIdt anId = myFile->Id();
+
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch(theTimeStampValue->myModeSwitch);
+ MED::TGeom2Profile& aGeom2Profile = theTimeStampValue->myGeom2Profile;
+
+ MED::PTimeStampInfo aTimeStampInfo = theTimeStampValue->myTimeStampInfo;
+ TValueHolder<EEntiteMaillage, med_entity_type> anEntity(aTimeStampInfo->myEntity);
+ TValueHolder<TInt, med_int> aNumDt(aTimeStampInfo->myNumDt);
+ TValueHolder<TInt, med_int> aNumOrd(aTimeStampInfo->myNumOrd);
+ TValueHolder<TString, char> anUnitDt(aTimeStampInfo->myUnitDt);
+ TValueHolder<TFloat, med_float> aDt(aTimeStampInfo->myDt);
+ MED::TGeom2Gauss& aGeom2Gauss = aTimeStampInfo->myGeom2Gauss;
+
+ MED::PFieldInfo aFieldInfo = aTimeStampInfo->myFieldInfo;
+ TValueHolder<TString, char> aFieldName(aFieldInfo->myName);
+
+ MED::PMeshInfo aMeshInfo = aFieldInfo->myMeshInfo;
+ TValueHolder<TString, char> aMeshName(aMeshInfo->myName);
+
+ const TGeomSet& aGeomSet = theTimeStampValue->myGeomSet;
+ TGeomSet::const_iterator anIter = aGeomSet.begin();
+ for(; anIter != aGeomSet.end(); anIter++){
+ EGeometrieElement aGeom = *anIter;
+
+ TVector<char> aGaussName(GetNOMLength<eV2_2>()+1);
+ MED::TGeom2Gauss::const_iterator aGaussIter = aGeom2Gauss.find(aGeom);
+ if(aGaussIter != aGeom2Gauss.end()){
+ MED::PGaussInfo aGaussInfo = aGaussIter->second;
+ strcpy(&aGaussName[0],&aGaussInfo->myName[0]);
+ }
+
+ TVector<char> aProfileName(GetNOMLength<eV2_2>()+1);
+ med_storage_mode aProfileMode = med_storage_mode(eNO_PFLMOD);
+ MED::TGeom2Profile::const_iterator aProfileIter = aGeom2Profile.find(aGeom);
+ if(aProfileIter != aGeom2Profile.end()){
+ MED::PProfileInfo aProfileInfo = aProfileIter->second;
+ aProfileMode = med_storage_mode(aProfileInfo->myMode);
+ strcpy(&aProfileName[0],&aProfileInfo->myName[0]);
+ }
+
+ med_int aNbVal = theTimeStampValue->GetNbVal(aGeom);
+
+ aRet = MEDfieldValueWithProfileWr(anId,
+ &aFieldName,
+ aNumDt,
+ aNumOrd,
+ aDt,
+ anEntity,
+ med_geometry_type(aGeom),
+ aProfileMode,
+ &aProfileName[0],
+ &aGaussName[0],
+ aModeSwitch,
+ MED_ALL_CONSTITUENT,
+ aNbVal,
+ theTimeStampValue->GetValuePtr(aGeom));
+ if(aRet < 0){
+ if(theErr){
+ *theErr = MED_FALSE;
+ break;
+ }
+ EXCEPTION(std::runtime_error,"SetTimeStampValue - MEDfieldValueWithProfileWr(...)");
+ }
+
+ }
+
+ INITMSG(MYDEBUG,"TVWrapper::SetTimeStampValue - MED_MODE_ACCES = "<<theMode<<"; aRet = "<<aRet<<std::endl);
+ }
+
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue,
+ TErr* theErr)
+ {
+ TErr aRet;
+ SetTimeStampValue(theTimeStampValue,eLECTURE_ECRITURE,&aRet);
+
+ if(aRet < 0)
+ SetTimeStampValue(theTimeStampValue,eLECTURE_AJOUT,&aRet);
+
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetGrilleInfo(const MED::TGrilleInfo& theInfo,
+ TErr* theErr)
+ {
+ SetGrilleInfo(theInfo,eLECTURE_ECRITURE,theErr);
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::SetGrilleInfo(const MED::TGrilleInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr)
+ {
+ if(theInfo.myMeshInfo->myType != eSTRUCTURE)
+ return;
+ TFileWrapper aFileWrapper(myFile,theMode,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TGrilleInfo& anInfo = const_cast<MED::TGrilleInfo&>(theInfo);
+
+ MED::TMeshInfo& aMeshInfo = *anInfo.myMeshInfo;
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+
+ TValueHolder<EGrilleType, med_grid_type > aGrilleType(anInfo.myGrilleType);
+
+ TErr aRet = 0;
+ aRet = MEDmeshGridTypeRd(myFile->Id(),
+ &aMeshName,
+ &aGrilleType);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetGrilleInfo - MEDmeshGridTypeRd(...)");
+
+ if(anInfo.myGrilleType == eGRILLE_STANDARD){
+ TValueHolder<TNodeCoord, med_float> aCoord(anInfo.myCoord);
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch(anInfo.myModeSwitch);
+ TValueHolder<TString, char> aCoordNames(anInfo.myCoordNames);
+ TValueHolder<TString, char> aCoordUnits(anInfo.myCoordUnits);
+ med_int aNbNoeuds = med_int(anInfo.myCoord.size() / aMeshInfo.myDim);
+ //med_axis_type aRepere = MED_CARTESIAN;
+
+ aRet = MEDmeshNodeCoordinateWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_UNDEF_DT,
+ aModeSwitch,
+ aNbNoeuds,
+ &aCoord);
+
+ if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetGrilleInfo - MEDmeshNodeCoordinateWr(...)");
+
+ TValueHolder<TIntVector, med_int> aGrilleStructure(anInfo.myGrilleStructure);
+ aRet = MEDmeshGridStructWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_UNDEF_DT,
+ &aGrilleStructure);
+ if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetGrilleInfo - MEDmeshGridStructWr(...)");
+
+ } else {
+ for(med_int aAxis = 0; aAxis < aMeshInfo.myDim; aAxis++){
+ aRet = MEDmeshGridIndexCoordinateWr(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_UNDEF_DT,
+ aAxis+1,
+ anInfo.GetIndexes(aAxis).size(),
+ &anInfo.GetIndexes(aAxis)[0]);
+
+ if(aRet < 0)
+ EXCEPTION(std::runtime_error,"SetGrilleInfo - MEDmeshGridIndexCoordinateWr(...)");
+ }
+
+ }
+
+ return;
+ }
+
+ //----------------------------------------------------------------------------
+ void
+ TVWrapper
+ ::GetGrilleInfo(TGrilleInfo& theInfo,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ MED::TMeshInfo& aMeshInfo = *theInfo.myMeshInfo;
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ EMaillage aMaillageType = aMeshInfo.myType;
+
+ GetGrilleType(aMeshInfo, theInfo.myGrilleType, theErr);
+ EGrilleType aGrilleType = theInfo.myGrilleType;
+
+ TErr aRet = 0;
+ if(aMaillageType == eSTRUCTURE && aGrilleType == eGRILLE_STANDARD) {
+ GetGrilleStruct(aMeshInfo, theInfo.myGrilleStructure, theErr);
+
+ TValueHolder<TNodeCoord, med_float> aCoord(theInfo.myCoord);
+ TValueHolder<EModeSwitch, med_switch_mode> aModeSwitch(theInfo.myModeSwitch);
+ TValueHolder<TString, char> aCoordNames(theInfo.myCoordNames);
+ TValueHolder<TString, char> aCoordUnits(theInfo.myCoordUnits);
+ //med_axis_type aRepere;
+
+ aRet = MEDmeshNodeCoordinateRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ aModeSwitch,
+ &aCoord);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshNodeCoordinateRd(...)");
+
+ //TInt aNbNodes = theInfo.GetNbNodes();//GetNbFamilies(aMeshInfo);
+ TValueHolder<TElemNum, med_int> aFamNumNode(theInfo.myFamNumNode);
+
+ aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ MED_NODE,
+ MED_NO_GEOTYPE,
+ &aFamNumNode);
+
+ if(aRet < 0)
+ {
+// if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files
+ {
+ int mySize = (int)theInfo.myFamNumNode.size();
+ theInfo.myFamNumNode.clear();
+ theInfo.myFamNumNode.resize(mySize,0);
+ aRet = 0;
+ }
+// else
+// EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...)");
+ }
+ if(theErr)
+ *theErr = aRet;
+
+ //============================
+ }
+
+ if(aMaillageType == eSTRUCTURE && aGrilleType != eGRILLE_STANDARD){
+ ETable aTable;
+ for(med_int anAxis = 1; anAxis <= aMeshInfo.myDim; anAxis++){
+ switch(anAxis){
+ case 1 :
+ aTable = eCOOR_IND1;
+ break;
+ case 2 :
+ aTable = eCOOR_IND2;
+ break;
+ case 3 :
+ aTable = eCOOR_IND3;
+ break;
+ default :
+ aRet = -1;
+ }
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetGrilleInfo - anAxis number out of range(...)");
+
+ TInt aNbIndexes = GetNbNodes(aMeshInfo,aTable);
+ if(aNbIndexes < 0)
+ EXCEPTION(std::runtime_error,"GetGrilleInfo - Erreur a la lecture de la taille de l'indice");
+
+ TValueHolder<TFloatVector, med_float> anIndexes(theInfo.GetIndexes(anAxis-1));
+ //TValueHolder<ETable, med_data_type > table(aTable);
+ //char aCompNames[MED_SNAME_SIZE+1];
+ //char anUnitNames[MED_SNAME_SIZE+1];
+ aRet=MEDmeshGridIndexCoordinateRd(myFile->Id(),&aMeshName,
+ MED_NO_DT,MED_NO_IT,
+ anAxis,
+ &anIndexes);
+
+ //theInfo.SetCoordName(anAxis-1, aCompNames);
+ //theInfo.SetCoordUnit(anAxis-1, anUnitNames);
+ theInfo.SetGrilleStructure(anAxis-1, aNbIndexes);
+
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDindicesCoordLire(...)");
+ }
+ }
+
+ EGeometrieElement aGeom = theInfo.GetGeom();
+ EEntiteMaillage aEntity = theInfo.GetEntity();
+ TInt aNbCells = theInfo.GetNbCells();
+
+ theInfo.myFamNum.resize(aNbCells);
+ TValueHolder<TElemNum, med_int> aFamNum(theInfo.myFamNum);
+
+ aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(),
+ &aMeshName,MED_NO_DT,MED_NO_IT,med_entity_type(aEntity),
+ med_geometry_type(aGeom),&aFamNum);
+
+ if ( aMeshInfo.myDim == 3 )
+ {
+ aGeom = theInfo.GetSubGeom();
+ aEntity = theInfo.GetSubEntity();
+ aNbCells = theInfo.GetNbSubCells();
+
+ theInfo.myFamSubNum.resize(aNbCells,0);
+ TValueHolder<TElemNum, med_int> aFamNum(theInfo.myFamSubNum);
+
+ aRet = MEDmeshEntityFamilyNumberRd(myFile->Id(),
+ &aMeshName,MED_NO_DT,MED_NO_IT,
+ med_entity_type(aEntity),
+ med_geometry_type(aGeom),&aFamNum);
+ }
+ if(aRet < 0)
+ {
+// if (aRet == MED_ERR_DOESNTEXIST) // --- only valid with MED3.x files
+ {
+ int mySize = (int)theInfo.myFamNumNode.size();
+ theInfo.myFamNumNode.clear();
+ theInfo.myFamNumNode.resize(mySize,0);
+ aRet = 0;
+ }
+// else
+// EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshEntityFamilyNumberRd(...)");
+ }
+ if(theErr)
+ *theErr = aRet;
+ }
+
+ void
+ TVWrapper
+ ::GetGrilleType(const MED::TMeshInfo& theMeshInfo,
+ EGrilleType& theGridType,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ EXCEPTION(std::runtime_error," GetGrilleType - aFileWrapper (...)");
+
+ MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo);
+
+ if(aMeshInfo.myType == eSTRUCTURE){
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<EGrilleType, med_grid_type> aGridType(theGridType);
+ TErr aRet = MEDmeshGridTypeRd(myFile->Id(),
+ &aMeshName,
+ &aGridType);
+
+ if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshGridTypeRd(...)");
+ }
+ }
+
+ void
+ TVWrapper
+ ::GetGrilleStruct(const MED::TMeshInfo& theMeshInfo,
+ TIntVector& theStruct,
+ TErr* theErr)
+ {
+ TFileWrapper aFileWrapper(myFile,eLECTURE,theErr);
+
+ if(theErr && *theErr < 0)
+ return;
+
+ TErr aRet;
+ MED::TMeshInfo& aMeshInfo = const_cast<MED::TMeshInfo&>(theMeshInfo);
+
+ TValueHolder<TString, char> aMeshName(aMeshInfo.myName);
+ TValueHolder<TIntVector, med_int> aGridStructure(theStruct);
+
+ aRet = MEDmeshGridStructRd(myFile->Id(),
+ &aMeshName,
+ MED_NO_DT,
+ MED_NO_IT,
+ &aGridStructure);
+ if(theErr)
+ *theErr = aRet;
+ else if(aRet < 0)
+ EXCEPTION(std::runtime_error,"GetGrilleInfo - MEDmeshGridStructRd(...)");
+ }
+
+ }
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+//
+#ifndef MED_V2_2_Wrapper_HeaderFile
+#define MED_V2_2_Wrapper_HeaderFile
+
+#ifdef WIN32
+ #if defined MEDWRAPPER_V2_2_EXPORTS || defined MEDWrapper_V2_2_EXPORTS
+ #if defined WIN32
+ #define MED_V22_WRAPPER_EXPORT __declspec( dllexport )
+ #else
+ #define MED_V22_WRAPPER_EXPORT
+ #endif
+ #else
+ #if defined WIN32
+ #define MED_V22_WRAPPER_EXPORT __declspec( dllimport )
+ #else
+ #define MED_V22_WRAPPER_EXPORT
+ #endif
+ #endif
+#else
+ #define MED_V22_WRAPPER_EXPORT
+#endif
+
+#include "MED_Structures.hxx"
+#include "MED_TWrapper.hxx"
+
+namespace MED
+{
+ template<>
+ TInt MED_V22_WRAPPER_EXPORT
+ GetDESCLength<eV2_2>();
+
+ template<>
+ TInt MED_V22_WRAPPER_EXPORT
+ GetIDENTLength<eV2_2>();
+
+ template<>
+ TInt MED_V22_WRAPPER_EXPORT
+ GetNOMLength<eV2_2>();
+
+ template<>
+ TInt MED_V22_WRAPPER_EXPORT
+ GetLNOMLength<eV2_2>();
+
+ template<>
+ TInt MED_V22_WRAPPER_EXPORT
+ GetPNOMLength<eV2_2>();
+
+ template<>
+ void MED_V22_WRAPPER_EXPORT
+ GetVersionRelease<eV2_2>(TInt& majeur, TInt& mineur, TInt& release);
+
+ template<>
+ TInt MED_V22_WRAPPER_EXPORT
+ GetNbConn<eV2_2>(EGeometrieElement typmai,
+ EEntiteMaillage typent,
+ TInt mdim);
+
+ namespace V2_2
+ {
+ //----------------------------------------------------------------------------
+ class TFile;
+ typedef boost::shared_ptr<TFile> PFile;
+
+ typedef enum {eLECTURE, eLECTURE_ECRITURE, eLECTURE_AJOUT, eCREATION} EModeAcces;
+
+ //----------------------------------------------------------------------------
+ class MED_V22_WRAPPER_EXPORT TVWrapper: public MED::TTWrapper<eV2_2>
+ {
+ TVWrapper();
+ TVWrapper(const TVWrapper&);
+ TVWrapper& operator=(const TVWrapper&);
+
+ public:
+ TVWrapper(const std::string& theFileName);
+
+ //----------------------------------------------------------------------------
+ virtual
+ TInt
+ GetNbMeshes(TErr* theErr = NULL);
+
+ virtual
+ void
+ GetMeshInfo(TInt theMeshId, MED::TMeshInfo&,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetMeshInfo(const MED::TMeshInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void SetMeshInfo(const MED::TMeshInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ TInt
+ GetNbFamilies(const MED::TMeshInfo& theMeshInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ TInt
+ GetNbFamAttr(TInt theFamId,
+ const MED::TMeshInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ TInt
+ GetNbFamGroup(TInt theFamId,
+ const MED::TMeshInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetFamilyInfo(TInt theFamId,
+ MED::TFamilyInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetFamilyInfo(const MED::TFamilyInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetFamilyInfo(const MED::TFamilyInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ void
+ GetNames(TElemInfo& theInfo,
+ TInt nb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetNumeration(TElemInfo& theInfo,
+ TInt nb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetFamilies(TElemInfo& theInfo,
+ TInt nb,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetNames(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+
+ void
+ SetNames(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetNumeration(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+ void
+ SetNumeration(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetFamilies(const TElemInfo& theInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+ void
+ SetFamilies(const TElemInfo& theInfo,
+ EModeAcces theMode,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ virtual
+ TInt
+ GetNbNodes(const MED::TMeshInfo& theMeshInfo,
+ TErr* theErr = NULL)
+ {
+ return GetNbNodes(theMeshInfo,eCOOR,theErr);
+ }
+
+ TInt
+ GetNbNodes(const MED::TMeshInfo& theMeshInfo,
+ ETable theTable,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetNodeInfo(MED::TNodeInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetNodeInfo(const MED::TNodeInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetNodeInfo(const MED::TNodeInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ virtual
+ void
+ GetPolygoneInfo(TPolygoneInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetPolygoneInfo(const TPolygoneInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetPolygoneInfo(const MED::TPolygoneInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+ virtual
+ TInt
+ GetNbPolygones(const TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL);
+
+ virtual
+ TInt
+ GetPolygoneConnSize(const TMeshInfo& theMeshInfo,
+ EEntiteMaillage theEntity,
+ EGeometrieElement theGeom,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ virtual
+ void
+ GetPolyedreInfo(TPolyedreInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetPolyedreInfo(const TPolyedreInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetPolyedreInfo(const MED::TPolyedreInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+ virtual
+ TInt
+ GetNbPolyedres(const TMeshInfo& theMeshInfo,
+ EEntiteMaillage,
+ EGeometrieElement,
+ EConnectivite,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetPolyedreConnSize(const TMeshInfo& theMeshInfo,
+ TInt& theNbFaces,
+ TInt& theConnSize,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ virtual
+ TEntityInfo
+ GetEntityInfo(const MED::TMeshInfo& theMeshInfo,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL);
+
+ virtual
+ TInt
+ GetNbCells(const MED::TMeshInfo& theMeshInfo,
+ EEntiteMaillage,
+ EGeometrieElement,
+ EConnectivite theConnMode = eNOD,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetCellInfo(MED::TCellInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetCellInfo(const MED::TCellInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetCellInfo(const MED::TCellInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ //! Read geom type of MED_BALL structural element
+ EGeometrieElement GetBallGeom(const TMeshInfo& theMeshInfo);
+
+ //! Read number of balls in the Mesh
+ virtual TInt GetNbBalls(const TMeshInfo& theMeshInfo);
+
+ //! Read a MEDWrapped representation of MED_BALL from the MED file
+ virtual void GetBallInfo(TBallInfo& theInfo, TErr* theErr = NULL);
+
+ //! Write a MEDWrapped representation of MED_BALL to the MED file
+ virtual void SetBallInfo(const TBallInfo& theInfo, TErr* theErr);
+
+ //! Write a MEDWrapped representation of MED_BALL to the MED file
+ void SetBallInfo(const TBallInfo& theInfo, EModeAcces theMode, TErr* theErr);
+
+ //----------------------------------------------------------------------------
+ virtual
+ TInt
+ GetNbFields(TErr* theErr = NULL);
+
+ virtual
+ TInt
+ GetNbComp(TInt theFieldId,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetFieldInfo(TInt theFieldId,
+ MED::TFieldInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetFieldInfo(const MED::TFieldInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetFieldInfo(const MED::TFieldInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ virtual
+ TInt
+ GetNbGauss(TErr* theErr = NULL);
+
+ virtual
+ TGaussInfo::TInfo
+ GetGaussPreInfo(TInt theId,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetGaussInfo(TInt theId,
+ TGaussInfo& theInfo,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ virtual
+ TInt
+ GetNbProfiles(TErr* theErr = NULL);
+
+ virtual
+ TProfileInfo::TInfo
+ GetProfilePreInfo(TInt theId,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetProfileInfo(TInt theId,
+ TProfileInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetProfileInfo(const TProfileInfo& theInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetProfileInfo(const TProfileInfo& theInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+ //----------------------------------------------------------------------------
+ virtual
+ TInt
+ GetNbTimeStamps(const MED::TFieldInfo& theInfo,
+ const MED::TEntityInfo& theEntityInfo,
+ EEntiteMaillage& theEntity,
+ TGeom2Size& theGeom2Size,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetTimeStampInfo(TInt theTimeStampId,
+ MED::TTimeStampInfo& theInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetTimeStampValue(const PTimeStampValueBase& theTimeStampValue,
+ const TMKey2Profile& theMKey2Profile,
+ const TKey2Gauss& theKey2Gauss,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue,
+ TErr* theErr = NULL);
+
+ void
+ SetTimeStampValue(const PTimeStampValueBase& theTimeStampValue,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+
+ //----------------------------------------------------------------------------
+ virtual
+ void
+ GetGrilleInfo(TGrilleInfo& theGrilleInfo,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ SetGrilleInfo(const MED::TGrilleInfo& theGrilleInfo,
+ TErr* theErr = NULL);
+
+ void
+ SetGrilleInfo(const MED::TGrilleInfo& theGrilleInfo,
+ EModeAcces theMode,
+ TErr* theErr = NULL);
+
+ virtual
+ void
+ GetGrilleType(const MED::TMeshInfo& theMeshInfo,
+ EGrilleType& type,
+ TErr* theErr = NULL);
+
+ void
+ GetGrilleStruct(const MED::TMeshInfo& theMeshInfo,
+ TIntVector& theStruct,
+ TErr* theErr = NULL);
+
+ protected:
+ PFile myFile;
+ };
+ }
+}
+
+#endif
--- /dev/null
+# Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+#
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+lib_LTLIBRARIES= libMEDWrapper_V2_2.la
+
+salomeinclude_HEADERS = \
+ MED_V2_2_Wrapper.hxx
+
+dist_libMEDWrapper_V2_2_la_SOURCES = \
+ MED_V2_2_Wrapper.cxx
+
+libMEDWrapper_V2_2_la_CPPFLAGS= $(BOOST_CPPFLAGS) $(MED3_INCLUDES) $(HDF5_INCLUDES) -I$(srcdir)/../Base
+libMEDWrapper_V2_2_la_CPPFLAGS+= -I$(KERNEL_ROOT_DIR)/include/salome
+libMEDWrapper_V2_2_la_LDFLAGS= $(MED3_LIBS_C_ONLY) $(HDF5_LIBS)
+libMEDWrapper_V2_2_la_LIBADD= ../Base/libMEDWrapperBase.la
SMESHUtils \
Controls \
Driver \
+ MEDWrapper \
DriverMED \
DriverDAT \
DriverUNV \
StdMeshersGUI
endif
-DIST_SUBDIRS = SMDS SMESHDS Controls Driver DriverMED DriverDAT DriverUNV DriverSTL DriverCGNS \
+DIST_SUBDIRS = SMDS SMESHDS Controls Driver MEDWrapper DriverMED DriverDAT DriverUNV DriverSTL DriverCGNS \
DriverGMF \
SMESHUtils SMESH SMESH_I SMESHClient SMESH_SWIG MEFISTO2 StdMeshers StdMeshers_I OBJECT \
SMESHFiltersSelection SMESHGUI PluginUtils SMESH_SWIG_WITHIHM StdMeshersGUI SMESH_PY Tools
/*!
* \brief Filters of elements, to be used with SMDS_SetIterator
*/
- struct TypeFilter
+ struct Filter
+ {
+ virtual bool operator()(const SMDS_MeshElement* e) const = 0;
+ ~Filter() {}
+ };
+ struct NonNullFilter: public Filter
+ {
+ bool operator()(const SMDS_MeshElement* e) const { return e; }
+ };
+ struct TypeFilter : public Filter
{
SMDSAbs_ElementType _type;
TypeFilter( SMDSAbs_ElementType t = SMDSAbs_NbElementTypes ):_type(t) {}
bool operator()(const SMDS_MeshElement* e) const { return e && e->GetType() == _type; }
};
- struct EntityFilter
+ struct EntityFilter : public Filter
{
SMDSAbs_EntityType _type;
EntityFilter( SMDSAbs_EntityType t = SMDSEntity_Last ):_type(t) {}
bool operator()(const SMDS_MeshElement* e) const { return e && e->GetEntityType() == _type; }
};
- struct GeomFilter
+ struct GeomFilter : public Filter
{
SMDSAbs_GeometryType _type;
GeomFilter( SMDSAbs_GeometryType t = SMDSGeom_NONE ):_type(t) {}
std::vector<int> SMDS_VtkVolume::GetQuantities() const
{
vector<int> quantities;
- quantities.clear();
SMDS_Mesh *mesh = SMDS_Mesh::_meshList[myMeshId];
vtkUnstructuredGrid* grid = mesh->getGrid();
vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
{
vtkUnstructuredGrid* grid = SMDS_Mesh::_meshList[myMeshId]->getGrid();
vtkIdType aVtkType = grid->GetCellType(this->myVtkID);
+ if ( aVtkType == VTK_POLYHEDRON)
+ {
+ vtkIdType nFaces = 0;
+ vtkIdType* ptIds = 0;
+ grid->GetFaceStream(this->myVtkID, nFaces, ptIds);
+ int id = 0, nbPoints = 0;
+ for (int i = 0; i < nFaces; i++)
+ {
+ int nodesInFace = ptIds[id];
+ if ( ind < nbPoints + nodesInFace )
+ return SMDS_Mesh::_meshList[myMeshId]->FindNodeVtk( ptIds[ ind + i ]);
+ nbPoints += nodesInFace;
+ id += (nodesInFace + 1);
+ }
+ return 0;
+ }
vtkIdType npts, *pts;
grid->GetCellPoints( this->myVtkID, npts, pts );
const std::vector<int>& interlace = SMDS_MeshCell::fromVtkOrder( VTKCellType( aVtkType ));
libSMESHimpl_la_CPPFLAGS = \
$(KERNEL_CXXFLAGS) \
$(CAS_CPPFLAGS) \
- $(MED_CXXFLAGS) \
$(GEOM_CXX_FLAGS) \
$(VTK_INCLUDES) \
$(BOOST_CPPFLAGS) \
@HDF5_INCLUDES@ \
-I$(srcdir)/../Controls \
+ -I$(srcdir)/../MEDWrapper/Base \
-I$(srcdir)/../Driver \
-I$(srcdir)/../DriverDAT \
-I$(srcdir)/../DriverMED \
SMESH_Algo::SMESH_Algo (int hypId, int studyId, SMESH_Gen * gen)
: SMESH_Hypothesis(hypId, studyId, gen)
{
- gen->_mapAlgo[hypId] = this;
+ //gen->_mapAlgo[hypId] = this;
_onlyUnaryInput = _requireDiscreteBoundary = _requireShape = true;
_quadraticMesh = _supportSubmeshes = false;
{
_shapeType = (1 << TopAbs_VERTEX);
_type = ALGO_0D;
- gen->_map0D_Algo[hypId] = this;
+ //gen->_map0D_Algo[hypId] = this;
}
SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_shapeType = (1 << TopAbs_EDGE);
_type = ALGO_1D;
- gen->_map1D_Algo[hypId] = this;
+ //gen->_map1D_Algo[hypId] = this;
}
SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_shapeType = (1 << TopAbs_FACE);
_type = ALGO_2D;
- gen->_map2D_Algo[hypId] = this;
+ //gen->_map2D_Algo[hypId] = this;
}
SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
: SMESH_Algo(hypId, studyId, gen)
{
_shapeType = (1 << TopAbs_SOLID);
_type = ALGO_3D;
- gen->_map3D_Algo[hypId] = this;
+ //gen->_map3D_Algo[hypId] = this;
}
//=============================================================================
_error = COMPERR_CANCELED;
}
+//================================================================================
+/*
+ * If possible, returns progress of computation [0.,1.]
+ */
+//================================================================================
+
+double SMESH_Algo::GetProgress() const
+{
+ return _progress;
+}
+
//================================================================================
/*!
* \brief store error and comment and then return ( error == COMPERR_OK )
//================================================================================
/*!
- * \brief initialize compute error
+ * \brief initialize compute error before call of Compute()
*/
//================================================================================
_badInputElements.clear();
_computeCanceled = false;
+ _progressTic = 0;
+ _progress = 0.;
+}
+
+//================================================================================
+/*!
+ * \brief Return compute progress by nb of calls of this method
+ */
+//================================================================================
+
+double SMESH_Algo::GetProgressByTic() const
+{
+ int computeCost = 0;
+ for ( size_t i = 0; i < _smToCompute.size(); ++i )
+ computeCost += _smToCompute[i]->GetComputeCost();
+
+ const_cast<SMESH_Algo*>( this )->_progressTic++;
+
+ double x = 5 * _progressTic;
+ x = ( x < computeCost ) ? ( x / computeCost ) : 1.;
+ return 0.9 * sin( x * M_PI / 2 );
}
//================================================================================
*/
virtual void CancelCompute();
+ /*!
+ * \brief If possible, returns progress of computation [0.,1.]
+ */
+ virtual double GetProgress() const;
+
/*!
* \brief evaluates size of prospective mesh on a shape
* \param aMesh - the mesh
*/
virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape);
virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0);
+
/*!
* \brief return compute error
*/
SMESH_ComputeErrorPtr GetComputeError() const;
/*!
- * \brief initialize compute error
+ * \brief initialize compute error etc. before call of Compute()
*/
void InitComputeError();
+ /*!
+ * \brief Return compute progress by nb of calls of this method
+ */
+ double GetProgressByTic() const;
+ /*!
+ * Return a vector of sub-meshes to Compute()
+ */
+ std::vector<SMESH_subMesh*>& SubMeshesToCompute() { return _smToCompute; }
public:
// ==================================================================
std::list<const SMDS_MeshElement*> _badInputElements; //!< to explain COMPERR_BAD_INPUT_MESH
volatile bool _computeCanceled; //!< is set to True while computing to stop it
+
+ double _progress; /* progress of Compute() [0.,1.],
+ to be set by an algo really tracking the progress */
+ int _progressTic; // counter of calls from SMESH_Mesh::GetComputeProgress()
+ std::vector<SMESH_subMesh*> _smToCompute; // sub-meshes to Compute()
};
+
class SMESH_EXPORT SMESH_0D_Algo: public SMESH_Algo
{
public:
}
//=============================================================================
-/*!
+/*
* Compute a mesh
*/
//=============================================================================
bool SMESH_Gen::Compute(SMESH_Mesh & aMesh,
const TopoDS_Shape & aShape,
- const bool anUpward,
- const ::MeshDimension aDim,
- TSetOfInt* aShapesId)
+ const bool aShapeOnly /*=false*/,
+ const bool anUpward /*=false*/,
+ const ::MeshDimension aDim /*=::MeshDim_3D*/,
+ TSetOfInt* aShapesId /*=0*/)
{
MESSAGE("SMESH_Gen::Compute");
MEMOSTAT;
const int globalAlgoDim = 100;
SMESH_subMeshIteratorPtr smIt;
- SMESH_subMesh::compute_event computeEvent;
- if ( !anUpward && aShape.IsSame( aMesh.GetShapeToMesh() ))
- computeEvent = SMESH_subMesh::COMPUTE;
- else
- computeEvent = SMESH_subMesh::COMPUTE_SUBMESH;
+
+ // Fix of Issue 22150. Due to !BLSURF->OnlyUnaryInput(), BLSURF computes edges
+ // that must be computed by Projection 1D-2D when Projection asks to compute
+ // one face only.
+ SMESH_subMesh::compute_event computeEvent =
+ aShapeOnly ? SMESH_subMesh::COMPUTE_SUBMESH : SMESH_subMesh::COMPUTE;
if ( anUpward ) // is called from the below code in this method
{
SMESH_Hypothesis::Hypothesis_Status status;
if ( subAlgo->CheckHypothesis( aMesh, aSubShape, status ))
// mesh a lower smToCompute starting from vertices
- Compute( aMesh, aSubShape, /*anUpward=*/true, aDim, aShapesId );
+ Compute( aMesh, aSubShape, aShapeOnly, /*anUpward=*/true, aDim, aShapesId );
}
}
}
// -----------------------------------------------
// mesh the rest sub-shapes starting from vertices
// -----------------------------------------------
- ret = Compute( aMesh, aShape, /*anUpward=*/true, aDim, aShapesId );
+ ret = Compute( aMesh, aShape, aShapeOnly, /*anUpward=*/true, aDim, aShapesId );
}
MESSAGE( "VSR - SMESH_Gen::Compute() finished, OK = " << ret);
/*!
* \brief Computes aMesh on aShape
+ * \param aShapeOnly - if true, algo->OnlyUnaryInput() feature is ignored and
+ * only \a aShape is computed.
* \param anUpward - compute from vertices up to more complex shape (internal usage)
* \param aDim - upper level dimension of the mesh computation
* \param aShapesId - list of shapes with computed mesh entities (elements or nodes)
*/
bool Compute(::SMESH_Mesh & aMesh,
const TopoDS_Shape & aShape,
+ const bool aShapeOnly=false,
const bool anUpward=false,
const ::MeshDimension aDim=::MeshDim_3D,
TSetOfInt* aShapesId=0);
-#ifdef WITH_SMESH_CANCEL_COMPUTE
void PrepareCompute(::SMESH_Mesh & aMesh,
const TopoDS_Shape & aShape);
void CancelCompute(::SMESH_Mesh & aMesh,
const TopoDS_Shape & aShape);
-#endif
+
+ const SMESH_subMesh* GetCurrentSubMesh() const { return _sm_current; }
/*!
* \brief evaluates size of prospective mesh on a shape
int GetANewId();
- std::map < int, SMESH_Algo * >_mapAlgo;
- std::map < int, SMESH_0D_Algo * >_map0D_Algo;
- std::map < int, SMESH_1D_Algo * >_map1D_Algo;
- std::map < int, SMESH_2D_Algo * >_map2D_Algo;
- std::map < int, SMESH_3D_Algo * >_map3D_Algo;
+ // std::map < int, SMESH_Algo * >_mapAlgo;
+ // std::map < int, SMESH_0D_Algo * >_map0D_Algo;
+ // std::map < int, SMESH_1D_Algo * >_map1D_Algo;
+ // std::map < int, SMESH_2D_Algo * >_map2D_Algo;
+ // std::map < int, SMESH_3D_Algo * >_map3D_Algo;
private:
// number of segments per diagonal of boundary box of geometry by which
// default segment length of appropriate 1D hypotheses is defined
int _segmentation;
- // default of segments
+ // default number of segments
int _nbSegments;
+
counters *_counters;
-#ifdef WITH_SMESH_CANCEL_COMPUTE
- volatile bool _compute_canceled;
+ volatile bool _compute_canceled;
SMESH_subMesh* _sm_current;
-#endif
};
#endif
#include <BRepBndLib.hxx>
#include <BRepPrimAPI_MakeBox.hxx>
#include <Bnd_Box.hxx>
+#include <TColStd_MapOfInteger.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <TopTools_ListIteratorOfListOfShape.hxx>
if ( !subMesh || !subMesh->GetId())
return SMESH_Hypothesis::HYP_BAD_SUBSHAPE;
- StudyContextStruct *sc = _gen->GetStudyContext(_studyId);
- if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end())
- {
- if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis");
- if(MYDEBUG) {
- SCRUTE(_studyId);
- SCRUTE(anHypId);
- }
+ SMESH_Hypothesis *anHyp = GetHypothesis( anHypId );
+ if ( !anHyp )
throw SALOME_Exception(LOCALIZED("hypothesis does not exist"));
- }
-
- SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
- MESSAGE( "SMESH_Mesh::AddHypothesis " << anHyp->GetName() );
bool isGlobalHyp = IsMainShape( aSubShape );
SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
if(MYDEBUG) {
- int hypType = anHyp->GetType();
- SCRUTE(hypType);
+ SCRUTE(anHyp->GetType());
}
// shape
return nbHyps;
}
+//================================================================================
+/*!
+ * \brief Return a hypothesis by its ID
+ */
+//================================================================================
+
+SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const int anHypId) const
+{
+ StudyContextStruct *sc = _gen->GetStudyContext(_studyId);
+ if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end())
+ return false;
+
+ SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
+ return anHyp;
+}
+
//=============================================================================
/*!
*
const char* theMeshName,
bool theAutoGroups,
int theVersion,
- const SMESHDS_Mesh* meshPart)
+ const SMESHDS_Mesh* meshPart,
+ bool theAutoDimension)
throw(SALOME_Exception)
{
Unexpect aCatch(SalomeException);
DriverMED_W_SMESHDS_Mesh myWriter;
- myWriter.SetFile ( file, MED::EVersion(theVersion) );
- myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS );
+ myWriter.SetFile ( file, MED::EVersion(theVersion) );
+ myWriter.SetMesh ( meshPart ? (SMESHDS_Mesh*) meshPart : _myMeshDS );
+ myWriter.SetAutoDimension( theAutoDimension );
if ( !theMeshName )
- myWriter.SetMeshId ( _id );
+ myWriter.SetMeshId ( _id );
else {
- myWriter.SetMeshId ( -1 );
- myWriter.SetMeshName( theMeshName );
+ myWriter.SetMeshId ( -1 );
+ myWriter.SetMeshName ( theMeshName );
}
if ( theAutoGroups ) {
myWriter.Perform();
}
+//================================================================================
+/*!
+ * \brief Export the mesh to a SAUV file
+ */
+//================================================================================
+
void SMESH_Mesh::ExportSAUV(const char *file,
const char* theMeshName,
bool theAutoGroups)
myWriter.Perform();
}
+//================================================================================
+/*!
+ * \brief Return a ratio of "compute cost" of computed sub-meshes to the whole
+ * "compute cost".
+ */
+//================================================================================
+
+double SMESH_Mesh::GetComputeProgress() const
+{
+ double totalCost = 1e-100, computedCost = 0;
+ const SMESH_subMesh* curSM = _gen->GetCurrentSubMesh();
+
+ // get progress of a current algo
+ TColStd_MapOfInteger currentSubIds;
+ if ( curSM )
+ if ( SMESH_Algo* algo = curSM->GetAlgo() )
+ {
+ int algoNotDoneCost = 0, algoDoneCost = 0;
+ const std::vector<SMESH_subMesh*>& smToCompute = algo->SubMeshesToCompute();
+ for ( size_t i = 0; i < smToCompute.size(); ++i )
+ {
+ if ( smToCompute[i]->IsEmpty() )
+ algoNotDoneCost += smToCompute[i]->GetComputeCost();
+ else
+ algoDoneCost += smToCompute[i]->GetComputeCost();
+ currentSubIds.Add( smToCompute[i]->GetId() );
+ }
+ double rate = algo->GetProgress();
+ if ( !( 0. < rate && rate < 1.001 ))
+ {
+ rate = algo->GetProgressByTic();
+ }
+ // cout << "rate: "<<rate << " algoNotDoneCost: " << algoNotDoneCost << endl;
+ computedCost += algoDoneCost + rate * algoNotDoneCost;
+ }
+
+ // get cost of already treated sub-meshes
+ if ( SMESH_subMesh* mainSM = GetSubMeshContaining( 1 ))
+ {
+ SMESH_subMeshIteratorPtr smIt = mainSM->getDependsOnIterator(/*includeSelf=*/true);
+ while ( smIt->more() )
+ {
+ const SMESH_subMesh* sm = smIt->next();
+ const int smCost = sm->GetComputeCost();
+ totalCost += smCost;
+ if ( !currentSubIds.Contains( sm->GetId() ) )
+ {
+ if (( !sm->IsEmpty() ) ||
+ ( sm->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE &&
+ !sm->DependsOn( curSM ) ))
+ computedCost += smCost;
+ }
+ }
+ }
+ // cout << "Total: " << totalCost
+ // << " computed: " << computedCost << " progress: " << computedCost / totalCost
+ // << " nbElems: " << GetMeshDS()->GetMeshInfo().NbElements() << endl;
+ return computedCost / totalCost;
+}
+
//================================================================================
/*!
* \brief Return number of nodes in the mesh
const bool andAncestors,
std::list< TopoDS_Shape > * assignedTo=0) const;
+ SMESH_Hypothesis * GetHypothesis(const int aHypID) const;
+
const std::list<SMESHDS_Command*> & GetLog() throw(SALOME_Exception);
void ClearLog() throw(SALOME_Exception);
*/
bool HasDuplicatedGroupNamesMED();
- void ExportMED(const char *file,
- const char* theMeshName = NULL,
- bool theAutoGroups = true,
- int theVersion = 0,
- const SMESHDS_Mesh* meshPart = 0)
+ void ExportMED(const char * theFile,
+ const char* theMeshName = NULL,
+ bool theAutoGroups = true,
+ int theVersion = 0,
+ const SMESHDS_Mesh* theMeshPart = 0,
+ bool theAutoDimension = false)
throw(SALOME_Exception);
void ExportDAT(const char * file,
void ExportSAUV(const char *file,
const char* theMeshName = NULL,
bool theAutoGroups = true) throw(SALOME_Exception);
+
+ double GetComputeProgress() const;
int NbNodes() const throw(SALOME_Exception);
int Nb0DElements() const throw(SALOME_Exception);
namespace
{
- SMDS_ElemIteratorPtr elemSetIterator( const TIDSortedElemSet& elements )
+ template < class ELEM_SET >
+ SMDS_ElemIteratorPtr elemSetIterator( const ELEM_SET& elements )
{
- typedef SMDS_SetIterator< SMDS_pElement, TIDSortedElemSet::const_iterator> TSetIterator;
+ typedef SMDS_SetIterator
+ < SMDS_pElement, typename ELEM_SET::const_iterator> TSetIterator;
return SMDS_ElemIteratorPtr( new TSetIterator( elements.begin(), elements.end() ));
}
}
TIDSortedElemSet& all0DElems )
{
SMDS_ElemIteratorPtr elemIt;
+ vector< const SMDS_MeshElement* > allNodes;
if ( elements.empty() )
+ {
+ allNodes.reserve( GetMeshDS()->NbNodes() );
elemIt = GetMeshDS()->elementsIterator( SMDSAbs_Node );
+ while ( elemIt->more() )
+ allNodes.push_back( elemIt->next() );
+
+ elemIt = elemSetIterator( allNodes );
+ }
else
+ {
elemIt = elemSetIterator( elements );
+ }
while ( elemIt->more() )
{
return SEW_OK;
}
+//================================================================================
+/*!
+ * \brief Create elements equal (on same nodes) to given ones
+ * \param [in] theElements - a set of elems to duplicate. If it is empty, all
+ * elements of the uppest dimension are duplicated.
+ */
+//================================================================================
+
+void SMESH_MeshEditor::DoubleElements( const TIDSortedElemSet& theElements )
+{
+ CrearLastCreated();
+ SMESHDS_Mesh* mesh = GetMeshDS();
+
+ // get an element type and an iterator over elements
+
+ SMDSAbs_ElementType type;
+ SMDS_ElemIteratorPtr elemIt;
+ vector< const SMDS_MeshElement* > allElems;
+ if ( theElements.empty() )
+ {
+ if ( mesh->NbNodes() == 0 )
+ return;
+ // get most complex type
+ SMDSAbs_ElementType types[SMDSAbs_NbElementTypes] = {
+ SMDSAbs_Volume, SMDSAbs_Face, SMDSAbs_Edge,
+ SMDSAbs_0DElement, SMDSAbs_Ball, SMDSAbs_Node
+ };
+ for ( int i = 0; i < SMDSAbs_NbElementTypes; ++i )
+ if ( mesh->GetMeshInfo().NbElements( types[i] ))
+ {
+ type = types[i];
+ break;
+ }
+ // put all elements in the vector <allElems>
+ allElems.reserve( mesh->GetMeshInfo().NbElements( type ));
+ elemIt = mesh->elementsIterator( type );
+ while ( elemIt->more() )
+ allElems.push_back( elemIt->next());
+ elemIt = elemSetIterator( allElems );
+ }
+ else
+ {
+ type = (*theElements.begin())->GetType();
+ elemIt = elemSetIterator( theElements );
+ }
+
+ // duplicate elements
+
+ if ( type == SMDSAbs_Ball )
+ {
+ SMDS_UnstructuredGrid* vtkGrid = mesh->getGrid();
+ while ( elemIt->more() )
+ {
+ const SMDS_MeshElement* elem = elemIt->next();
+ if ( elem->GetType() != SMDSAbs_Ball )
+ continue;
+ if (( elem = mesh->AddBall( elem->GetNode(0),
+ vtkGrid->GetBallDiameter( elem->getVtkId() ))))
+ myLastCreatedElems.Append( elem );
+ }
+ }
+ else
+ {
+ vector< const SMDS_MeshNode* > nodes;
+ while ( elemIt->more() )
+ {
+ const SMDS_MeshElement* elem = elemIt->next();
+ if ( elem->GetType() != type )
+ continue;
+
+ nodes.assign( elem->begin_nodes(), elem->end_nodes() );
+
+ if ( type == SMDSAbs_Volume && elem->GetVtkType() == VTK_POLYHEDRON )
+ {
+ std::vector<int> quantities =
+ static_cast< const SMDS_VtkVolume* >( elem )->GetQuantities();
+ elem = mesh->AddPolyhedralVolume( nodes, quantities );
+ }
+ else
+ {
+ AddElement( nodes, type, elem->IsPoly() );
+ elem = 0; // myLastCreatedElems is already filled
+ }
+ if ( elem )
+ myLastCreatedElems.Append( elem );
+ }
+ }
+}
+
//================================================================================
/*!
\brief Creates a hole in a mesh by doubling the nodes of some particular elements
double z = nodesCoords[i++];
gp_Pnt p = gp_Pnt(x, y ,z);
gpnts.push_back(p);
- MESSAGE("TopoDS_Vertex " << k++ << " " << p.X() << " " << p.Y() << " " << p.Z());
+ MESSAGE("TopoDS_Vertex " << k << " " << p.X() << " " << p.Y() << " " << p.Z());
+ k++;
}
}
else // --- no group, no coordinates : use the vertices of the geom shape provided, and radius
// Return an index of the shape theElem is on
// or zero if a shape not found
+ void DoubleElements( const TIDSortedElemSet& theElements );
+
bool DoubleNodes( const std::list< int >& theListOfNodes,
const std::list< int >& theListOfModifiedElems );
double SMESH_MesherHelper::GetNodeU(const TopoDS_Edge& E,
const SMDS_MeshNode* n,
const SMDS_MeshNode* inEdgeNode,
- bool* check)
+ bool* check) const
{
double param = Precision::Infinite();
{
SMESH_TNodeXYZ nPnt[3];
SMDS_ElemIteratorPtr nodesIt = elem->nodesIterator();
+ int iNodeOnFace = 0, iPosDim = SMDS_TOP_VERTEX;
for ( int iN = 0; nodesIt->more() && iN < 3; ++iN) // loop on nodes
+ {
nPnt[ iN ] = nodesIt->next();
-
+ if ( nPnt[ iN ]._node->GetPosition()->GetTypeOfPosition() > iPosDim )
+ {
+ iNodeOnFace = iN;
+ iPosDim = nPnt[ iN ]._node->GetPosition()->GetTypeOfPosition();
+ }
+ }
// compute normal
gp_Vec v01( nPnt[0], nPnt[1] ), v02( nPnt[0], nPnt[2] );
if ( v01.SquareMagnitude() > RealSmall() &&
{
Ne = v01 ^ v02;
if (( normalOK = ( Ne.SquareMagnitude() > RealSmall() )))
- uv = GetNodeUV( theFace, nPnt[0]._node, nPnt[2]._node, &normalOK );
+ uv = GetNodeUV( theFace, nPnt[iNodeOnFace]._node, 0, &normalOK );
}
}
}
double GetNodeU(const TopoDS_Edge& theEdge,
const SMDS_MeshNode* theNode,
const SMDS_MeshNode* inEdgeNode=0,
- bool* check=0);
+ bool* check=0) const;
/*!
* \brief Return node UV on face
* \param inFaceNode - a node of element being created located inside a face
_algoState = NO_ALGO;
_computeState = NOT_READY;
}
+ _computeCost = 0; // how costly is to compute this sub-mesh
+ _realComputeCost = 0;
}
//=============================================================================
return subMeshesComputed;
}
+//================================================================================
+/*!
+ * \brief Return cost of computing this sub-mesh. If hypotheses are not well defined,
+ * zero is returned
+ * \return int - the computation cost in abstract units.
+ */
+//================================================================================
+
+int SMESH_subMesh::GetComputeCost() const
+{
+ return _realComputeCost;
+}
+
+//================================================================================
+/*!
+ * \brief Return cost of computing this sub-mesh. The cost depends on the shape type
+ * and number of sub-meshes this one DependsOn().
+ * \return int - the computation cost in abstract units.
+ */
+//================================================================================
+
+int SMESH_subMesh::computeCost() const
+{
+ if ( !_computeCost )
+ {
+ int computeCost;
+ switch ( _subShape.ShapeType() ) {
+ case TopAbs_SOLID:
+ case TopAbs_SHELL: computeCost = 1000; break;
+ case TopAbs_FACE: computeCost = 100; break;
+ case TopAbs_EDGE: computeCost = 10; break;
+ default: computeCost = 1;
+ }
+ SMESH_subMeshIteratorPtr childIt = getDependsOnIterator(/*includeSelf=*/false);
+ while ( childIt->more() )
+ computeCost += childIt->next()->computeCost();
+
+ ((SMESH_subMesh*)this)->_computeCost = computeCost;
+ }
+ return _computeCost;
+}
+
//=============================================================================
/*!
*
return _mapDepend;
}
+//================================================================================
+/*!
+ * \brief Return a key for SMESH_subMesh::_mapDepend map
+ */
+//================================================================================
+
+namespace {
+ int dependsOnMapKey( const SMESH_subMesh* sm )
+ {
+ int type = sm->GetSubShape().ShapeType();
+ int ordType = 9 - type; // 2 = Vertex, 8 = CompSolid
+ int cle = sm->GetId();
+ cle += 10000000 * ordType; // sort map by ordType then index
+ return cle;
+ }
+}
+
//=============================================================================
/*!
* For simple Shapes (solid, face, edge): add subMesh into dependence list.
void SMESH_subMesh::insertDependence(const TopoDS_Shape aSubShape)
{
SMESH_subMesh *aSubMesh = _father->GetSubMesh(aSubShape);
- int type = aSubShape.ShapeType();
- int ordType = 9 - type; // 2 = Vertex, 8 = CompSolid
- int cle = aSubMesh->GetId();
- cle += 10000000 * ordType; // sort map by ordType then index
+ int cle = dependsOnMapKey( aSubMesh );
if ( _mapDepend.find( cle ) == _mapDepend.end())
{
_mapDepend[cle] = aSubMesh;
}
}
+//================================================================================
+/*!
+ * \brief Return \c true if \a this sub-mesh depends on \a other
+ */
+//================================================================================
+
+bool SMESH_subMesh::DependsOn( const SMESH_subMesh* other ) const
+{
+ return other ? _mapDepend.count( dependsOnMapKey( other )) : false;
+}
+
//=============================================================================
/*!
- *
+ * Return a shape of \a this sub-mesh
*/
//=============================================================================
const TopoDS_Shape & SMESH_subMesh::GetSubShape() const
{
- //MESSAGE("SMESH_subMesh::GetSubShape");
- return _subShape;
+ return _subShape;
}
-
//=======================================================================
//function : CanAddHypothesis
//purpose : return true if theHypothesis can be attached to me:
if (stateChange || modifiedHyp)
ComputeStateEngine(MODIF_ALGO_STATE);
+ _realComputeCost = ( _algoState == HYP_OK ) ? computeCost() : 0;
+
return ret;
}
void SMESH_subMesh::DumpAlgoState(bool isMain)
{
- int dim = SMESH_Gen::GetShapeDim(_subShape);
-// if (dim < 1) return;
+ // if (dim < 1) return;
if (isMain)
{
const map < int, SMESH_subMesh * >&subMeshes = DependsOn();
sm->DumpAlgoState(false);
}
}
- int type = _subShape.ShapeType();
- MESSAGE("dim = " << dim << " type of shape " << type);
+ //int type = _subShape.ShapeType();
+ MESSAGE("dim = " << SMESH_Gen::GetShapeDim(_subShape) <<
+ " type of shape " << _subShape.ShapeType());
switch (_algoState)
{
case NO_ALGO:
break;
}
TopoDS_Shape shape = _subShape;
+ algo->SubMeshesToCompute().assign( 1, this );
// check submeshes needed
if (_father->HasShapeToMesh() ) {
bool subComputed = false, subFailed = false;
if (!algo->OnlyUnaryInput()) {
if ( event == COMPUTE /*&&
( algo->NeedDiscreteBoundary() || algo->SupportSubmeshes() )*/)
- shape = getCollection( gen, algo, subComputed, subFailed );
+ shape = getCollection( gen, algo, subComputed, subFailed, algo->SubMeshesToCompute());
else
subComputed = SubMeshesComputed( & subFailed );
}
OCC_CATCH_SIGNALS;
#endif
algo->InitComputeError();
+
MemoryReserve aMemoryReserve;
SMDS_Mesh::CheckMemory();
Kernel_Utils::Localizer loc;
TopoDS_Shape SMESH_subMesh::getCollection(SMESH_Gen * theGen,
SMESH_Algo* theAlgo,
bool & theSubComputed,
- bool & theSubFailed)
+ bool & theSubFailed,
+ std::vector<SMESH_subMesh*>& theSubs)
{
theSubComputed = SubMeshesComputed( & theSubFailed );
BRep_Builder aBuilder;
aBuilder.MakeCompound( aCompound );
+ theSubs.clear();
+
TopExp_Explorer anExplorer( mainShape, _subShape.ShapeType() );
for ( ; anExplorer.More(); anExplorer.Next() )
{
const TopoDS_Shape& S = anExplorer.Current();
SMESH_subMesh* subMesh = _father->GetSubMesh( S );
+ theSubs.push_back( subMesh );
if ( subMesh == this )
{
aBuilder.Add( aCompound, S );
SMESH_Algo* GetAlgo() const;
const std::map < int, SMESH_subMesh * >& DependsOn();
+ bool DependsOn( const SMESH_subMesh* other ) const;
/*!
- * \brief Return iterator on the submeshes this one depends on
+ * \brief Return iterator on the sub-meshes this one depends on. By default
+ * most simple sub-meshes go first.
*/
SMESH_subMeshIteratorPtr getDependsOnIterator(const bool includeSelf,
- const bool complexShapeFirst) const;
+ const bool complexShapeFirst=false) const;
const TopoDS_Shape & GetSubShape() const;
bool IsEmpty() const;
bool IsMeshComputed() const;
- // check if _subMeshDS contains mesh elements
+ // check if _subMeshDS contains mesh elements unless _alwaysComputed==true
/*!
* \brief Allow algo->Compute() if a subshape of lower dim is meshed but
bool SubMeshesComputed(bool * isFailedToCompute=0) const;
+ int GetComputeCost() const;
+ // how costly is to compute this sub-mesh
/*!
* \brief Find common submeshes (based on shared subshapes with other
TopoDS_Shape getCollection(SMESH_Gen * theGen,
SMESH_Algo* theAlgo,
bool & theSubComputed,
- bool & theSubFailed);
+ bool & theSubFailed,
+ std::vector<SMESH_subMesh*>& theSubs);
/*!
* \brief Update compute_state by _computeError
* \retval bool - false if there are errors
const SMESH_Hypothesis * theHyp,
const int theHypType = 0);
//
+ int computeCost() const;
protected:
algo_state _algoState;
compute_state _computeState;
SMESH_ComputeErrorPtr _computeError;
+ int _computeCost; // how costly is to compute this sub-mesh
+ int _realComputeCost; // _computeCost depending on presence of needed hypotheses
// allow algo->Compute() if a sub-shape of lower dim is meshed but
// none mesh entity is bound to it. Eg StdMeshers_CompositeSegment_1D can
../SMESH/libSMESHimpl.la \
../SMESHDS/libSMESHDS.la \
../Controls/libSMESHControls.la \
+ ../MEDWrapper/Factory/libMEDWrapper.la \
+ ../MEDWrapper/Base/libMEDWrapperBase.la \
+ ../MEDWrapper/V2_2/libMEDWrapper_V2_2.la \
$(KERNEL_LDFLAGS) -lSalomeLifeCycleCORBA -lSalomeNS -lOpUtil -lSALOMEBasics \
-lSalomeIDLKernel -lSALOMELocalTrace \
$(GEOM_LDFLAGS) -lNMTDS -lSalomeIDLGEOM \
- $(MED_LDFLAGS) -lMEDWrapper_V2_2 -lSalomeIDLMED -lMEDWrapper \
$(CAS_KERNEL)
SMESHClientBin_CPPFLAGS = \
-I$(srcdir)/../SMESH_I \
-I$(srcdir)/../Controls \
-I$(srcdir)/../SMESHClient \
+ -I$(srcdir)/../MEDWrapper/Base \
-I$(top_builddir) \
-I$(top_builddir)/idl
#include <SALOMEDSClient_SComponent.hxx>
#include <SALOMEDSClient_StudyBuilder.hxx>
#include <SALOMEDS_Study.hxx>
+#include <SALOMEDS_SObject.hxx>
// OCCT includes
#include <Standard_ErrorHandler.hxx>
if ( resMgr )
toCreateGroups = resMgr->booleanValue( "SMESH", "auto_groups", false );
bool toOverwrite = true;
+ bool toFindOutDim = true;
QString aFilter, aTitle = QObject::tr("SMESH_EXPORT_MESH");
QString anInitialPath = "";
anInitialPath + QString("/") + aMeshName,
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
{
SUIT_FileDlg* fd = new SUIT_FileDlg( SMESHGUI::desktop(), false, true, true );
if (it.value() == SMESH::MED_V2_2)
aDefaultFilter = it.key();
}
+ QStringList checkBoxes;
+ checkBoxes << QObject::tr("SMESH_AUTO_GROUPS") << QObject::tr("SMESH_AUTO_DIM");
- SalomeApp_CheckFileDlg* fd = new SalomeApp_CheckFileDlg
- ( SMESHGUI::desktop(), false, QObject::tr("SMESH_AUTO_GROUPS"), true, true );
+ SalomeApp_CheckFileDlg* fd =
+ new SalomeApp_CheckFileDlg ( SMESHGUI::desktop(), false, checkBoxes, true, true );
fd->setWindowTitle( aTitle );
fd->setNameFilters( filters );
fd->selectNameFilter(aDefaultFilter);
- fd->SetChecked(toCreateGroups);
+ fd->SetChecked(0,toCreateGroups);
+ fd->SetChecked(1,toFindOutDim);
if ( !anInitialPath.isEmpty() )
fd->setDirectory( anInitialPath );
fd->selectFile(aMeshName);
}
}
}
- toCreateGroups = fd->IsChecked();
+ toCreateGroups = fd->IsChecked(0);
+ toFindOutDim = fd->IsChecked(1);
delete fd;
}
else
SMESH::SMESH_Mesh_var aMeshItem = aMeshOrGroup->GetMesh();
if ( aMeshOrGroup->_is_equivalent( aMeshItem ))
aMeshItem->ExportToMEDX( aFilename.toLatin1().data(), toCreateGroups,
- aFormat, toOverwrite && aMeshIndex == 0 );
+ aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim );
else
aMeshItem->ExportPartToMED( aMeshOrGroup, aFilename.toLatin1().data(), toCreateGroups,
- aFormat, toOverwrite && aMeshIndex == 0 );
+ aFormat, toOverwrite && aMeshIndex == 0, toFindOutDim );
}
}
else if ( isSAUV )
SMESH::RepaintCurrentView();
}
+ void OverallMeshQuality() {
+ SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
+ LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+ SALOME_ListIO selected;
+ if( aSel )
+ aSel->selectedObjects( selected );
+
+ if ( selected.IsEmpty() ) return;
+ SALOME_ListIteratorOfListIO It( selected );
+ for ( ; It.More(); It.Next() ) {
+ SMESHGUI_CtrlInfoDlg* ctrlDlg = new SMESHGUI_CtrlInfoDlg( SMESHGUI::desktop() );
+ ctrlDlg->showInfo( It.Value() );
+ ctrlDlg->show();
+ }
+ }
+
QString functorToString( SMESH::Controls::FunctorPtr f )
{
QString type = QObject::tr( "UNKNOWN_CONTROL" );
}
}
+ void sortChildren(){
+ LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr();
+ SALOME_ListIO selected;
+ if( aSel ) {
+ aSel->selectedObjects( selected );
+
+ if(selected.Extent()){
+ Handle(SALOME_InteractiveObject) anIObject = selected.First();
+ _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
+ _PTR(SObject) aSObj = aStudy->FindObjectID(anIObject->getEntry());
+ if (aSObj) {
+ if ( aStudy->GetUseCaseBuilder()->SortChildren( aSObj, true/*AscendingOrder*/ ) ) {
+ SMESHGUI::GetSMESHGUI()->updateObjBrowser();
+ }
+ }
+ }
+ }
+ }
+
void SetDisplayMode(int theCommandID, SMESHGUI_StudyId2MarkerMap& theMarkerMap)
{
SALOME_ListIO selected;
return autoUpdate && !exceeded;
}
+//=============================================================================
+/*!
+ *
+ */
+//=============================================================================
+bool SMESHGUI::automaticUpdate( SMESH::SMESH_Mesh_ptr theMesh,
+ int* entities, bool* limitExceeded )
+{
+ SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr();
+ if ( !resMgr )
+ return false;
+
+ bool autoUpdate = resMgr->booleanValue( "SMESH", "auto_update", false );
+ long updateLimit = resMgr->integerValue( "SMESH", "update_limit", 500000 );
+ bool incrementalLimit = resMgr->booleanValue( "SMESH", "incremental_limit", false );
+
+ long requestedSize = theMesh->NbElements();
+
+ *entities = SMESH_Actor::eAllEntity;
+
+ bool exceeded = updateLimit > 0 && requestedSize > updateLimit;
+
+ if ( limitExceeded ) *limitExceeded = autoUpdate && exceeded;
+
+ if ( incrementalLimit ) {
+ long nbOdElems = theMesh->Nb0DElements();
+ long nbEdges = theMesh->NbEdges();
+ long nbFaces = theMesh->NbFaces();
+ long nbVolumes = theMesh->NbVolumes();
+ long nbBalls = theMesh->NbBalls();
+ long total = 0;
+
+ if ( nbOdElems > 0 ) {
+ if ( total + nbOdElems > updateLimit )
+ *entities = *entities & ~SMESH_Actor::e0DElements;
+ else
+ exceeded = false;
+ }
+ total += nbOdElems;
+
+ if ( nbEdges > 0 ) {
+ if ( total + nbEdges > updateLimit )
+ *entities = *entities & ~SMESH_Actor::eEdges;
+ else
+ exceeded = false;
+ }
+ total += nbEdges;
+
+ if ( nbFaces > 0 ) {
+ if ( total + nbFaces > updateLimit )
+ *entities = *entities & ~SMESH_Actor::eFaces;
+ else
+ exceeded = false;
+ }
+ total += nbFaces;
+
+ if ( nbVolumes > 0 ) {
+ if ( total + nbVolumes > updateLimit )
+ *entities = *entities & ~SMESH_Actor::eVolumes;
+ else
+ exceeded = false;
+ }
+ total += nbVolumes;
+
+ if ( nbBalls > 0 ) {
+ if ( total + nbBalls > updateLimit )
+ *entities = *entities & ~SMESH_Actor::eBallElem;
+ else
+ exceeded = false;
+ }
+ total += nbBalls;
+ }
+
+ return autoUpdate && !exceeded;
+}
+
//=============================================================================
/*!
*
case 214: // UPDATE
{
if(checkLock(aStudy)) break;
+ SUIT_OverrideCursor wc;
try {
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
SMDSAbs_EntityType type = SMDSEntity_Last;
switch (theCommandID) {
- case 4034:
- type = SMDSEntity_Quad_Edge; break;
- case 4035:
- type = SMDSEntity_Quad_Triangle; break;
- case 4036:
- type = SMDSEntity_Quad_Quadrangle; break;
- case 4136:
- type = SMDSEntity_BiQuad_Quadrangle; break;
- case 4137:
- type = SMDSEntity_BiQuad_Triangle; break;
- case 4037:
- type = SMDSEntity_Quad_Tetra; break;
- case 4038:
- type = SMDSEntity_Quad_Pyramid; break;
- case 4039:
- type = SMDSEntity_Quad_Penta; break;
- case 4040:
- type = SMDSEntity_Quad_Hexa; break;
- case 4140:
- type = SMDSEntity_TriQuad_Hexa; break;
+ case 4034: type = SMDSEntity_Quad_Edge; break;
+ case 4035: type = SMDSEntity_Quad_Triangle; break;
+ case 4036: type = SMDSEntity_Quad_Quadrangle; break;
+ case 4136: type = SMDSEntity_BiQuad_Quadrangle; break;
+ case 4137: type = SMDSEntity_BiQuad_Triangle; break;
+ case 4037: type = SMDSEntity_Quad_Tetra; break;
+ case 4038: type = SMDSEntity_Quad_Pyramid; break;
+ case 4039: type = SMDSEntity_Quad_Penta; break;
+ case 4040: type = SMDSEntity_Quad_Hexa; break;
+ case 4140: type = SMDSEntity_TriQuad_Hexa; break;
default: break;
}
if ( type != SMDSEntity_Last )
SUIT_MessageBox::No ) == SUIT_MessageBox::Yes;
if( confirm ) {
try {
+ SUIT_OverrideCursor wc;
SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
int removed = aMeshEditor->RemoveOrphanNodes();
SUIT_MessageBox::information(SMESHGUI::desktop(),
SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject );
SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aObject );
if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) {
+ SUIT_OverrideCursor wc;
::Control( theCommandID );
break;
}
tr( "NOT_A_VTK_VIEWER" ) );
}
break;
+ case 6032:
+ OverallMeshQuality();
+ break;
case 9010:
{
+ SUIT_OverrideCursor wc;
LightApp_SelectionMgr* mgr = selectionMgr();
SALOME_ListIO selected; mgr->selectedObjects( selected );
}
case 9011:
{
+ SUIT_OverrideCursor wc;
LightApp_SelectionMgr* mgr = selectionMgr();
SALOME_ListIO selected; mgr->selectedObjects( selected );
dlg->show();
break;
}
+ case 41:
+ ::sortChildren();
+ break;
+
}
anApp->updateActions(); //SRN: To update a Save button in the toolbar
createSMESHAction( 6029, "EQUAL_EDGE", "ICON_EQUAL_EDGE", 0, true );
createSMESHAction( 6030, "EQUAL_FACE", "ICON_EQUAL_FACE", 0, true );
createSMESHAction( 6031, "EQUAL_VOLUME", "ICON_EQUAL_VOLUME", 0, true );
+ createSMESHAction( 6032, "OVERALL_MESH_QUALITY" );
createSMESHAction( 6003, "FREE_BORDER", "ICON_FREE_EDGE_2D", 0, true );
createSMESHAction( 6004, "CONNECTION", "ICON_CONNECTION", 0, true );
createSMESHAction( 6005, "FREE_NODE", "ICON_FREE_NODE", 0, true );
createSMESHAction( 301, "SHOW" );
createSMESHAction( 302, "DISPLAY_ONLY" );
+ createSMESHAction( 41, "SORT_CHILD_ITEMS" );
+
// ----- create menu --------------
int fileId = createMenu( tr( "MEN_FILE" ), -1, 1 ),
editId = createMenu( tr( "MEN_EDIT" ), -1, 3 ),
createMenu( 6024, volumeId, -1 );
createMenu( 6026, volumeId, -1 );
createMenu( 6031, volumeId, -1 );
+ createMenu( separator(), ctrlId, -1 );
+ createMenu( 6032, ctrlId, -1 );
createMenu( 4000, addId, -1 );
createMenu( 4009, addId, -1 );
createPopupItem( 214, OB, mesh_part ); // UPDATE
createPopupItem( 900, OB, mesh_part ); // ADV_INFO
createPopupItem( 904, OB, mesh_group ); // FIND_ELEM
+ createPopupItem( 6032, OB, mesh_part ); // CTRL_INFO
popupMgr()->insert( separator(), -1, 0 );
createPopupItem( 801, OB, mesh ); // CREATE_GROUP
createPopupItem( 806, OB, mesh ); // CREATE_GEO_GROUP
popupMgr()->insert( separator(), -1, 0 );
createPopupItem( 214, View, mesh_part ); // UPDATE
createPopupItem( 900, View, mesh_part ); // ADV_INFO
+ createPopupItem( 6032,View, mesh_part ); // CTRL_INFO
createPopupItem( 904, View, mesh ); // FIND_ELEM
popupMgr()->insert( separator(), -1, 0 );
popupMgr()->insert ( action( 6031 ), aSubId, -1 ); // EQUAL_VOLUME
popupMgr()->setRule( action( 6031 ), aMeshInVtkHasVolumes, QtxPopupMgr::VisibleRule );
popupMgr()->setRule( action( 6031 ), "controlMode = 'eCoincidentElems3D'", QtxPopupMgr::ToggleRule );
-
+
popupMgr()->insert( separator(), anId, -1 );
popupMgr()->insert( action( 201 ), anId, -1 ); // SCALAR_BAR_PROP
popupMgr()->insert( separator(), -1, -1 );
+ popupMgr()->insert( action( 41 ), -1, -1 );
+ popupMgr()->setRule( action( 41 ), "$component={'SMESH'} and client='ObjectBrowser' and isContainer and nbChildren>1", QtxPopupMgr::VisibleRule );
+ popupMgr()->insert( separator(), -1, -1 );
+
connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ),
this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) );
int genTab = addPreference( tr( "PREF_TAB_GENERAL" ) );
int autoUpdate = addPreference( tr( "PREF_AUTO_UPDATE" ), genTab, LightApp_Preferences::Auto, "SMESH", "auto_update" );
+ setPreferenceProperty( autoUpdate, "columns", 2 );
int lim = addPreference( tr( "PREF_UPDATE_LIMIT" ), autoUpdate, LightApp_Preferences::IntSpin, "SMESH", "update_limit" );
setPreferenceProperty( lim, "min", 0 );
setPreferenceProperty( lim, "max", 100000000 );
setPreferenceProperty( lim, "step", 1000 );
setPreferenceProperty( lim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
+ addPreference( tr( "PREF_INCREMENTAL_LIMIT" ), autoUpdate, LightApp_Preferences::Bool, "SMESH", "incremental_limit" );
int qaGroup = addPreference( tr( "PREF_GROUP_QUALITY" ), genTab );
setPreferenceProperty( qaGroup, "columns", 2 );
setPreferenceProperty( nodesLim, "max", 10000000 );
setPreferenceProperty( nodesLim, "step", 10000 );
setPreferenceProperty( nodesLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
+ int ctrlLim = addPreference( tr( "PREF_CTRL_LIMIT" ), infoGroup, LightApp_Preferences::IntSpin, "SMESH", "info_controls_limit" );
+ setPreferenceProperty( ctrlLim, "special", tr( "PREF_UPDATE_LIMIT_NOLIMIT" ) );
+ setPreferenceProperty( ctrlLim, "min", 0 );
+ setPreferenceProperty( ctrlLim, "max", 10000000 );
+ setPreferenceProperty( ctrlLim, "step", 1000 );
addPreference( tr( "PREF_ELEM_INFO_GRP_DETAILS" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "elem_info_grp_details" );
addPreference( tr( "PREF_DUMP_BASE_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_base" );
addPreference( tr( "PREF_DUMP_ELEM_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_elem" );
addPreference( tr( "PREF_DUMP_ADD_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_add" );
+ addPreference( tr( "PREF_DUMP_CTRL_INFO" ), infoGroup, LightApp_Preferences::Bool, "SMESH", "info_dump_ctrl" );
int segGroup = addPreference( tr( "PREF_GROUP_SEGMENT_LENGTH" ), genTab );
setPreferenceProperty( segGroup, "columns", 2 );
bool isActiveStudyLocked();
static bool automaticUpdate(unsigned int requestedSize = 0, bool* limitExceeded = 0);
+ static bool automaticUpdate( SMESH::SMESH_Mesh_ptr, int*, bool* );
static void Modified( bool = true );
#include "SMESHGUI_MeshOrderOp.h"
#include "SMESHGUI_MeshOrderDlg.h"
+#include "SMESH_Actor.h"
#include "SMESH_ActorUtils.h"
#include <SMDS_SetIterator.hxx>
#include <QButtonGroup>
#include <QCloseEvent>
#include <QTimerEvent>
+#include <QProgressBar>
// VTK includes
#include <vtkProperty.h>
#include <vector>
#include <set>
+#ifndef WIN32
+#include <sys/sysinfo.h>
+#endif
+
#define SPACING 6
#define MARGIN 11
#define COLONIZE(str) (QString(str).contains(":") > 0 ? QString(str) : QString(str) + " :" )
-/* OBSOLETE
-static void addSeparator( QWidget* parent )
-{
- QGridLayout* l = qobject_cast<QGridLayout*>( parent->layout() );
- int row = l->rowCount();
- int cols = l->columnCount();
- for ( int i = 0; i < cols; i++ ) {
- QFrame* hline = new QFrame( parent );
- hline->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- l->addWidget( hline, row, i );
- }
-}
-*/
-
enum TCol {
COL_ALGO = 0, COL_SHAPE, COL_ERROR, COL_SHAPEID, COL_PUBLISHED, COL_BAD_MESH, NB_COLUMNS
};
qthread(gen, mesh, mainShape)
{
// --
- setWindowTitle(tr("Compute"));
+ setWindowTitle(tr("TITLE"));
setMinimumWidth( 200 );
- cancelButton = new QPushButton(tr("Cancel"));
+ cancelButton = new QPushButton(tr("CANCEL"));
cancelButton->setDefault(true);
+ cancelButton->setCheckable(true);
QLabel * nbNodesName = new QLabel(tr("SMESH_MESHINFO_NODES"), this );
QLabel * nbElemsName = new QLabel(tr("SMESH_MESHINFO_ELEMENTS"), this );
+ QLabel * freeRAMName = new QLabel(tr("SMESH_FREERAM"), this );
nbNodesLabel = new QLabel("0", this );
nbElemsLabel = new QLabel("0", this );
+ freeRAMLabel = new QLabel("", this );
+ progressBar = new QProgressBar(this);
+ progressBar->setMinimum( 0 );
+ progressBar->setMaximum( 1000 );
QGridLayout* layout = new QGridLayout(this);
layout->setMargin( MARGIN );
layout->setSpacing( SPACING );
- layout->addWidget(nbNodesName, 0, 0);
- layout->addWidget(nbNodesLabel, 0, 1);
- layout->addWidget(nbElemsName, 1, 0);
- layout->addWidget(nbElemsLabel, 1, 1);
- layout->addWidget(cancelButton, 2, 0, 1, 2);
+ int row = 0;
+ layout->addWidget(nbNodesName, row, 0);
+ layout->addWidget(nbNodesLabel, row++, 1);
+ layout->addWidget(nbElemsName, row, 0);
+ layout->addWidget(nbElemsLabel, row++, 1);
+#ifndef WNT
+ layout->addWidget(freeRAMName, row, 0);
+ layout->addWidget(freeRAMLabel, row++, 1);
+#endif
+ layout->addWidget(progressBar, row++, 0, 1, 2);
+ layout->addWidget(cancelButton, row++, 0, 1, 2);
adjustSize();
update();
void SMESHGUI_ComputeDlg_QThreadQDialog::onCancel()
{
qthread.cancel();
-}
+ cancelButton->setText( tr("CANCELING"));
+ cancelButton->setEnabled(false);
+}
void SMESHGUI_ComputeDlg_QThreadQDialog::timerEvent(QTimerEvent *event)
{
+ if ( !cancelButton->isChecked() ) // not yet cancelled
+ progressBar->setValue( progressBar->maximum() * qthread.getMesh()->GetComputeProgress() );
+
if(qthread.isFinished())
- {
- close();
- }
- nbNodesLabel->setText( QString("%1").arg( qthread.getMesh()->NbNodes() ));
- nbElemsLabel->setText( QString("%1").arg( qthread.getMesh()->NbElements() ));
+ {
+ close();
+ }
+ else
+ {
+ nbNodesLabel->setText( QString("%1").arg( qthread.getMesh()->NbNodes() ));
+ nbElemsLabel->setText( QString("%1").arg( qthread.getMesh()->NbElements() ));
+#ifndef WNT
+ struct sysinfo si;
+ const int err = sysinfo( &si );
+ if ( err )
+ freeRAMLabel->setText("");
+ else
+ freeRAMLabel->setText( tr("SMESH_GIGABYTE").arg
+ ( si.freeram * si.mem_unit /1024./1024./1024., 0, 'f', 2 ));
+#endif
+ }
event->accept();
}
void SMESHGUI_ComputeDlg_QThreadQDialog::closeEvent(QCloseEvent *event)
{
if(qthread.isRunning())
- {
+ {
event->ignore();
return;
}
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
#endif
- bool res;
SMESHGUI_ComputeDlg_QThreadQDialog qthreaddialog(desktop(), gen, myMesh, myMainShape);
qthreaddialog.exec();
- res = qthreaddialog.result();
- res = gen->Compute(myMesh, myMainShape);
- if (res)
- computeFailed = false;
+ computeFailed = !qthreaddialog.result();
}
catch(const SALOME::SALOME_Exception & S_ex) {
memoryLack = true;
// SHOW MESH
// NPAL16631: if ( getSMESHGUI()->automaticUpdate() )
SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( SMESHGUI::GetSMESHGUI() );
- long newSize = myMesh->NbElements();
bool limitExceeded;
+ long limitSize = resMgr->integerValue( "SMESH", "update_limit", 500000 );
+ int entities = SMESH_Actor::eAllEntity;
if ( !memoryLack )
{
- if ( getSMESHGUI()->automaticUpdate( newSize, &limitExceeded ) )
+ if ( getSMESHGUI()->automaticUpdate( myMesh, &entities, &limitExceeded ) )
{
try {
#if (OCC_VERSION_MAJOR << 16 | OCC_VERSION_MINOR << 8 | OCC_VERSION_MAINTENANCE) > 0x060100
OCC_CATCH_SIGNALS;
#endif
+ SMESH_Actor *anActor = SMESH::FindActorByObject( myMesh );
+ if ( !anActor ) anActor = SMESH::CreateActor( aMeshSObj->GetStudy(), aMeshSObj->GetID().c_str(), true );
+
+ anActor->SetEntityMode( entities );
+ SMESH::DisplayActor( SMESH::GetActiveWindow(), anActor );
+
SMESH::Update(myIObject, true);
+
+ if ( limitExceeded )
+ {
+ SUIT_MessageBox::warning( desktop(),
+ tr( "SMESH_WRN_WARNING" ),
+ tr( "SMESH_WRN_SIZE_INC_LIMIT_EXCEEDED" ).arg( myMesh->NbElements() ).arg( limitSize ) );
+ }
}
catch (...) {
#ifdef _DEBUG_
}
else if ( limitExceeded )
{
- long limitSize = resMgr->integerValue( "SMESH", "update_limit", 500000 );
SUIT_MessageBox::warning( desktop(),
tr( "SMESH_WRN_WARNING" ),
- tr( "SMESH_WRN_SIZE_LIMIT_EXCEEDED" ).arg( newSize ).arg( limitSize ) );
+ tr( "SMESH_WRN_SIZE_LIMIT_EXCEEDED" ).arg( myMesh->NbElements() ).arg( limitSize ) );
}
}
LightApp_SelectionMgr *Sel = selectionMgr();
class QTableWidget;
class QLabel;
class QtxComboBox;
+class QProgressBar;
class SMESHGUI_ComputeDlg;
class SMESHGUI_MeshInfosBox;
class SMESHGUI_PrecomputeDlg;
QPushButton * cancelButton;
QLabel * nbNodesLabel;
QLabel * nbElemsLabel;
+ QLabel * freeRAMLabel;
+ QProgressBar* progressBar;
};
#endif // SMESHGUI_COMPUTEDLG_H
#include "SMESHGUI.h"
#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_MeshUtils.h"
#include "SMESHGUI_VTKUtils.h"
#include <SMESH_TypeFilter.hxx>
#include <QKeyEvent>
#include <utilities.h>
+#include <SALOMEDSClient_SObject.hxx>
// IDL includes
#include <SALOMEconfig.h>
SUIT_ResourceMgr* aResMgr = SMESH::GetResourceMgr( mySMESHGUI );
QPixmap iconWithoutElem (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_DUPLICATE_NODES")));
QPixmap iconWithElem (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_DUPLICATE_NODES_WITH_ELEM")));
+ QPixmap iconElemOnly (aResMgr->loadPixmap("SMESH", tr("ICON_SMESH_DUPLICATE_ELEM_ONLY")));
QPixmap iconSelect (aResMgr->loadPixmap("SMESH", tr("ICON_SELECT")));
// Main layout
aRadioButton1->setIcon(iconWithoutElem);
QRadioButton* aRadioButton2 = new QRadioButton(aConstructorsBox);
aRadioButton2->setIcon(iconWithElem);
+ QRadioButton* aRadioButton3 = new QRadioButton(aConstructorsBox);
+ aRadioButton3->setIcon(iconElemOnly);
aConstructorsBoxLayout->addWidget(aRadioButton1);
aConstructorsBoxLayout->addWidget(aRadioButton2);
+ aConstructorsBoxLayout->addWidget(aRadioButton3);
myGroupConstructors->addButton(aRadioButton1, 0);
myGroupConstructors->addButton(aRadioButton2, 1);
+ myGroupConstructors->addButton(aRadioButton3, 2);
// Arguments
myGroupArguments = new QGroupBox(this);
aMainLayout->addWidget(myGroupArguments);
aMainLayout->addWidget(aGroupButtons);
+ myCheckBoxNewElemGroup->setChecked(true);
+ myCheckBoxNewNodeGroup->setChecked(true);
+
// Initialize the dialog
Init();
void SMESHGUI_DuplicateNodesDlg::Init()
{
mySMESHGUI->SetActiveDialogBox((QDialog*)this);
- myCheckBoxNewElemGroup->setChecked(true);
- myCheckBoxNewNodeGroup->setChecked(true);
// Set initial parameters
myBusy = false;
myCheckBoxNewNodeGroup->show();
// Hide the third field
+ myTextLabel2->show();
+ mySelectButton2->show();
+ myLineEdit2->show();
myTextLabel3->hide();
mySelectButton3->hide();
myLineEdit3->hide();
myCheckBoxNewNodeGroup->show();
// Show the third field
+ myTextLabel2->show();
+ mySelectButton2->show();
+ myLineEdit2->show();
myTextLabel3->show();
mySelectButton3->show();
myLineEdit3->show();
+ break;
+ }
+ case 2:
+ {
+ // Set text to the group of arguments and to all the labels
+ myGroupArguments->setTitle(tr("DUPLICATION_ONLY_ELEMS"));
+ myTextLabel1->setText(tr("GROUP_ELEMS_TO_DUPLICATE"));
+
+ myCheckBoxNewElemGroup->show();
+ myCheckBoxNewNodeGroup->hide();
+
+ // Hide the second and the third field
+ myTextLabel2->hide();
+ mySelectButton2->hide();
+ myLineEdit2->hide();
+ myTextLabel3->hide();
+ mySelectButton3->hide();
+ myLineEdit3->hide();
+
break;
}
}
bool toCreateElemGroup = myCheckBoxNewElemGroup->isChecked();
bool toCreateNodeGroup = myCheckBoxNewNodeGroup->isChecked();
- int operationMode = myGroupConstructors->checkedId();
+ int operationMode = myGroupConstructors->checkedId();
// Apply changes
bool result = false;
SUIT_OverrideCursor aWaitCursor;
+ QStringList anEntryList;
try {
SMESH::SMESH_Mesh_var aMesh = myGroups1[0]->GetMesh();
SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor();
- if ( operationMode == 0 ) {
+ switch ( operationMode ) {
+ case 0:
+ {
SMESH::ListOfGroups_var g1 = new SMESH::ListOfGroups();
g1->length( myGroups1.count() );
for ( int i = 0; i < myGroups1.count(); i++ )
else {
result = aMeshEditor->DoubleNodeGroups( g1.in(), g2.in() );
}
+ break;
}
- else {
+ case 1:
+ {
SMESH::ListOfGroups_var g1 = new SMESH::ListOfGroups();
g1->length( myGroups1.count() );
for ( int i = 0; i < myGroups1.count(); i++ )
else {
result = aMeshEditor->DoubleNodeElemGroups( g1.in(), g2.in(), g3.in() );
}
+ break;
+ }
+ case 2:
+ {
+ result = true;
+ QString groupName;
+ if ( toCreateElemGroup )
+ groupName = SMESH::UniqueName("DoubleElements");
+ for ( int i = 0; i < myGroups1.count(); i++ )
+ {
+ SMESH::SMESH_Group_var group =
+ aMeshEditor->DoubleElements( myGroups1[i], groupName.toLatin1().data() );
+ if ( group->_is_nil() )
+ {
+ if ( toCreateElemGroup )
+ result = false;
+ }
+ else
+ {
+ if ( _PTR(SObject) so = SMESH::FindSObject( group ))
+ anEntryList.append( so->GetID().c_str() );
+ }
+ }
+ break;
+ }
}
}
catch (const SALOME::SALOME_Exception& S_ex) {
catch ( const std::exception& exc ) {
INFOS( "Follow exception was cought:\n\t" << exc.what() );
}
- catch (...){
+ catch (...) {
INFOS( "Unknown exception was cought !!!" );
}
SMESHGUI::Modified();
mySMESHGUI->updateObjBrowser(true);
+ if ( !anEntryList.isEmpty())
+ if( LightApp_Application* anApp =
+ dynamic_cast<LightApp_Application*>( SUIT_Session::session()->activeApplication() ))
+ anApp->browseObjects( anEntryList, true, false );
+
// Reinitialize the dialog
Init();
-
+
return true;
}
// check group of proper type is selected
if ( ok ) {
SMESH::ElementType aGroupType = aGroup->GetType();
- if ( operationMode == 0 ) {
+ switch ( operationMode ) {
+ case 0:
ok = ( myCurrentLineEdit == myLineEdit1 && aGroupType == SMESH::NODE ) ||
( myCurrentLineEdit == myLineEdit2 && aGroupType != SMESH::NODE );
- }
- else {
+ break;
+ case 1:
ok = ( myCurrentLineEdit == myLineEdit1 && ( aGroupType == SMESH::EDGE ||
aGroupType == SMESH::FACE ) ) ||
( myCurrentLineEdit == myLineEdit2 && aGroupType == SMESH::NODE ) ||
( myCurrentLineEdit == myLineEdit3 && aGroupType != SMESH::NODE );
+ break;
+ case 2:
+ ok = ( aGroupType != SMESH::NODE );
+ break;
}
}
if ( ok ) aGroups << aGroup;
/*!
\brief Check if the input data is valid.
- \return \c true id the data is valid
+ \return \c true if the data is valid
*/
bool SMESHGUI_DuplicateNodesDlg::isValid()
{
//
#include "SMESHGUI_FileInfoDlg.h"
-#include <MED_Common.hxx>
+#include "MED_Common.hxx"
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
-SMESHGUI_FileInfoDlg::SMESHGUI_FileInfoDlg( QWidget* parent, SALOME_MED::MedFileInfo* inf )
+SMESHGUI_FileInfoDlg::SMESHGUI_FileInfoDlg( QWidget* parent, SMESH::MedFileInfo* inf )
: QtxDialog( parent, true, true, QtxDialog::OK )
{
setWindowTitle( tr( "CAPTION" ) );
#include <QtxDialog.h>
#include <SALOMEconfig.h>
-#include CORBA_CLIENT_HEADER(MED)
+#include CORBA_CLIENT_HEADER(SMESH_Mesh)
class SMESHGUI_FileInfoDlg : public QtxDialog
{
Q_OBJECT
public:
- SMESHGUI_FileInfoDlg( QWidget*, SALOME_MED::MedFileInfo* );
+ SMESHGUI_FileInfoDlg( QWidget*, SMESH::MedFileInfo* );
virtual ~SMESHGUI_FileInfoDlg();
};
Table* aTable = myTables[ aType ];
ComboItem* aCompareItem = (ComboItem*)aTable->item(row, 1);
- int aCriterionType = GetCriterionType(row);
+ // find out type of a existing threshould table item
QtxColorButton* clrBtn = qobject_cast<QtxColorButton*>(aTable->cellWidget(row, 2));
- int aComboType = ComboItem::Type();
- int aIntSpinType = IntSpinItem::Type();
- int aDoubleSpinType = DoubleSpinItem::Type();
- QTableWidgetItem* aTableItem = aTable->item(row, 2);
- bool isComboItem = false;
- bool isIntSpinItem = false;
- bool isDoubleSpinItem = false;
- if (aTableItem) {
- int aTableType = aTable->item(row, 2)->type();
- isComboItem = ( aTableType == aComboType );
- isIntSpinItem = ( aTableType == aIntSpinType );
- isDoubleSpinItem = ( aTableType == aDoubleSpinType );
+ bool isComboItem = false;
+ bool isIntSpinItem = false;
+ bool isDoubleSpinItem = false;
+ if ( QTableWidgetItem* aTableItem = aTable->item(row, 2) )
+ {
+ int aTableType = aTableItem->type();
+ isComboItem = ( aTableType == ComboItem::Type() );
+ isIntSpinItem = ( aTableType == IntSpinItem::Type() );
+ isDoubleSpinItem = ( aTableType == DoubleSpinItem::Type() );
+ }
+
+ // find out a type of item required by a new criterion and other table features
+ int aCriterionType = GetCriterionType(row);
+ bool anIsDoubleCriterion = false;
+ bool anIsIntCriterion = false;
+ bool anIsComboCriterion = false;
+ // other features:
+ QList<int> comboIDs; // values to show in a combo item
+ int nbCompareSigns = 0; // possible values are 0,1,3
+ bool isThresholdEditable = false; // actual for "simple" item types
+ switch ( aCriterionType )
+ {
+ case SMESH::FT_AspectRatio:
+ case SMESH::FT_AspectRatio3D:
+ case SMESH::FT_Warping:
+ case SMESH::FT_MinimumAngle:
+ case SMESH::FT_Taper:
+ case SMESH::FT_Skew:
+ case SMESH::FT_Area:
+ case SMESH::FT_Volume3D:
+ case SMESH::FT_MaxElementLength2D:
+ case SMESH::FT_MaxElementLength3D:
+ anIsDoubleCriterion = true; nbCompareSigns = 3; break;
+
+ case SMESH::FT_FreeBorders:
+ case SMESH::FT_FreeEdges:
+ case SMESH::FT_FreeNodes:
+ case SMESH::FT_FreeFaces:
+ case SMESH::FT_EqualNodes:
+ case SMESH::FT_EqualEdges:
+ case SMESH::FT_EqualFaces:
+ case SMESH::FT_EqualVolumes: break;
+
+ case SMESH::FT_MultiConnection:
+ case SMESH::FT_MultiConnection2D: anIsIntCriterion = true; break;
+
+ case SMESH::FT_Length:
+ case SMESH::FT_Length2D: anIsDoubleCriterion = true; break;
+
+ case SMESH::FT_BelongToGeom:
+ case SMESH::FT_BelongToPlane:
+ case SMESH::FT_BelongToCylinder:
+ case SMESH::FT_BelongToGenSurface:
+ case SMESH::FT_LyingOnGeom: nbCompareSigns = 1; isThresholdEditable = true; break;
+
+ case SMESH::FT_RangeOfIds: nbCompareSigns = 1; isThresholdEditable = true; break;
+
+ case SMESH::FT_BadOrientedVolume:
+ case SMESH::FT_BareBorderVolume:
+ case SMESH::FT_BareBorderFace:
+ case SMESH::FT_OverConstrainedVolume:
+ case SMESH::FT_OverConstrainedFace:
+ case SMESH::FT_LinearOrQuadratic: break;
+
+ case SMESH::FT_GroupColor: nbCompareSigns = 1; isThresholdEditable = true; break;
+
+ case SMESH::FT_ElemGeomType:
+ comboIDs = geomTypes( aType ); anIsComboCriterion = true; nbCompareSigns = 1; break;
+
+ case SMESH::FT_EntityType:
+ comboIDs = entityTypes( aType ); anIsComboCriterion = true; nbCompareSigns = 1; break;
+
+ case SMESH::FT_CoplanarFaces: isThresholdEditable = true; break;
+
+ case SMESH::FT_BallDiameter: anIsDoubleCriterion = true; break;
+
+ case SMESH::FT_ConnectedElements: isThresholdEditable = true; break;
+
+ case SMESH::FT_LessThan:
+ case SMESH::FT_MoreThan:
+ case SMESH::FT_EqualTo:
+ case SMESH::FT_LogicalNOT:
+ case SMESH::FT_LogicalAND:
+ case SMESH::FT_LogicalOR:
+ case SMESH::FT_Undefined:
+ default: return;
}
-
- bool anIsDoubleCriterion =
- aCriterionType == SMESH::FT_AspectRatio ||
- aCriterionType == SMESH::FT_AspectRatio3D ||
- aCriterionType == SMESH::FT_Taper ||
- aCriterionType == SMESH::FT_Warping ||
- aCriterionType == SMESH::FT_MinimumAngle ||
- aCriterionType == SMESH::FT_Skew ||
- aCriterionType == SMESH::FT_Area ||
- aCriterionType == SMESH::FT_Length ||
- aCriterionType == SMESH::FT_Length2D ||
- aCriterionType == SMESH::FT_MaxElementLength2D ||
- aCriterionType == SMESH::FT_MaxElementLength3D ||
- aCriterionType == SMESH::FT_Volume3D ||
- aCriterionType == SMESH::FT_EntityType;
+
+ // get a precision of a double criterion
int aPrecision = 0;
if ( anIsDoubleCriterion ) {
- const char* aPrecisionType = getPrecision( aCriterionType );
+ const char* aPrecisionType = getPrecision( aCriterionType );
SUIT_ResourceMgr* aResourceMgr = SMESH::GetResourceMgr( mySMESHGUI );
if( aPrecisionType && aResourceMgr )
aPrecision = aResourceMgr->integerValue( "SMESH", aPrecisionType, aPrecision );
}
- // if the precision is to be changed we should remove the existing
- // spin item and create another one with new precision
- bool anIsPrecisionChanged = false;
- if ( anIsDoubleCriterion && isDoubleSpinItem ) {
- if ( DoubleSpinItem* aDoubleSpinItem = dynamic_cast<DoubleSpinItem*>( aTable->item( row, 2 ) ) ) {
- anIsPrecisionChanged = aDoubleSpinItem->precision() != aPrecision;
+ // check if the current item type satisfies the criterion
+ bool itemTypeKO =
+ ( aCriterionType == SMESH::FT_GroupColor && !clrBtn) ||
+ ( anIsComboCriterion && !isComboItem ) ||
+ ( anIsIntCriterion && !isIntSpinItem ) ||
+ ( anIsDoubleCriterion && !isDoubleSpinItem );
+
+ if ( !itemTypeKO )
+ {
+ if ( anIsDoubleCriterion )
+ {
+ // if the precision is to be changed we should remove the existing
+ // spin item and create another one with new precision
+ if ( DoubleSpinItem* aDoubleSpinItem = dynamic_cast<DoubleSpinItem*>( aTable->item( row, 2 )))
+ itemTypeKO = ( aDoubleSpinItem->precision() != aPrecision );
+ else
+ itemTypeKO = true;
+ }
+ else if ( anIsComboCriterion )
+ {
+ if ( ComboItem* aComboItem = dynamic_cast<ComboItem*>( aTable->item( row, 2 )))
+ itemTypeKO = ( aComboItem->count() != comboIDs.count() );
+ else
+ itemTypeKO = true;
+ }
+ else if ( !anIsIntCriterion && aCriterionType != SMESH::FT_GroupColor )
+ {
+ itemTypeKO = ( clrBtn || isComboItem || isIntSpinItem || isDoubleSpinItem );
}
}
- if ( (aCriterionType != SMESH::FT_GroupColor && clrBtn) ||
- (aCriterionType != SMESH::FT_ElemGeomType && isComboItem) ||
- (aCriterionType != SMESH::FT_EntityType && isComboItem) ||
- (aCriterionType != SMESH::FT_MultiConnection && isIntSpinItem) ||
- (!anIsDoubleCriterion && isDoubleSpinItem) ||
- anIsPrecisionChanged )
+ // update the table row
+
+ bool isSignalsBlocked = aTable->signalsBlocked();
+ aTable->blockSignals( true );
+
+ // update threshold table item
+ if ( itemTypeKO )
{
- bool isSignalsBlocked = aTable->signalsBlocked();
- aTable->blockSignals( true );
aTable->removeCellWidget( row, 2 );
- aTable->setItem( row, 2, new QTableWidgetItem() );
- aTable->blockSignals( isSignalsBlocked );
- }
- if ( (aCriterionType == SMESH::FT_GroupColor && !clrBtn) ||
- (aCriterionType == SMESH::FT_ElemGeomType && !isComboItem) ||
- (aCriterionType == SMESH::FT_EntityType && !isComboItem) ||
- (aCriterionType == SMESH::FT_MultiConnection && !isIntSpinItem) ||
- (anIsDoubleCriterion && !isDoubleSpinItem) ||
- anIsPrecisionChanged )
- {
- bool isSignalsBlocked = aTable->signalsBlocked();
- aTable->blockSignals( true );
- if ( aCriterionType == SMESH::FT_GroupColor )
+
+ if ( aCriterionType == SMESH::FT_GroupColor ) // ---------------------- QtxColorButton
+ {
aTable->setCellWidget( row, 2, new QtxColorButton( aTable ) );
- else if ( aCriterionType == SMESH::FT_ElemGeomType ) {
- QList<int> typeIds = geomTypes( aType );
- QMap<int, QString> typeNames;
- QList<int>::const_iterator anIter = typeIds.begin();
- for ( int i = 0; anIter != typeIds.end(); ++anIter, ++i)
- {
- QString typeKey = QString( "GEOM_TYPE_%1" ).arg( *anIter );
- typeNames[ *anIter ] = tr( typeKey.toLatin1().data() );
- }
- ComboItem* typeBox = new ComboItem( typeNames );
- aTable->setItem( row, 2, typeBox );
- }
- else if ( aCriterionType == SMESH::FT_EntityType ) {
- QList<int> typeIds = entityTypes( aType );
- QMap<int, QString> typeNames;
- QList<int>::const_iterator anIter = typeIds.begin();
- for ( int i = 0; anIter != typeIds.end(); ++anIter, ++i)
+ }
+ else if ( anIsComboCriterion ) // -------------------------------------------ComboItem
+ {
+ QString msgPrefix
+ ( aCriterionType == SMESH::FT_ElemGeomType ? "GEOM_TYPE_%1" : "ENTITY_TYPE_%1" );
+ QMap<int, QString> names;
+ QList<int>::const_iterator id = comboIDs.begin();
+ for ( ; id != comboIDs.end(); ++id )
{
- QString typeKey = QString( "ENTITY_TYPE_%1" ).arg( *anIter );
- typeNames[ *anIter ] = tr( typeKey.toLatin1().data() );
+ QString name = msgPrefix.arg( *id );
+ names[ *id ] = tr( name.toLatin1().data() );
}
- ComboItem* typeBox = new ComboItem( typeNames );
- aTable->setItem( row, 2, typeBox );
+ ComboItem* comboBox = new ComboItem( names );
+ aTable->setItem( row, 2, comboBox );
}
- else if ( aCriterionType == SMESH::FT_MultiConnection ) {
+ else if ( anIsIntCriterion ) // ------------------------------------------ IntSpinItem
+ {
IntSpinItem* intSpin = new IntSpinItem( 0 );
aTable->setItem( row, 2, intSpin );
}
- else if ( anIsDoubleCriterion ) {
+ else if ( anIsDoubleCriterion ) // -------------------------------------DoubleSpinItem
+ {
DoubleSpinItem* dblSpin = new DoubleSpinItem( 0 );
dblSpin->setPrecision( aPrecision );
aTable->setItem( row, 2, dblSpin );
}
- aTable->blockSignals( isSignalsBlocked );
- }
-
- // set Compare and enable/desable Threshold
- if ((aType == SMESH::NODE && (aCriterionType == SMESH::FT_FreeNodes ||
- aCriterionType == SMESH::FT_EqualNodes )) ||
- (aType == SMESH::EDGE && (aCriterionType == SMESH::FT_FreeBorders ||
- aCriterionType == SMESH::FT_EqualEdges )) ||
- (aType == SMESH::FACE && (aCriterionType == SMESH::FT_BareBorderFace ||
- aCriterionType == SMESH::FT_OverConstrainedFace ||
- aCriterionType == SMESH::FT_FreeEdges ||
- aCriterionType == SMESH::FT_FreeFaces ||
- aCriterionType == SMESH::FT_EqualFaces)) ||
- (aType == SMESH::VOLUME && (aCriterionType == SMESH::FT_BadOrientedVolume ||
- aCriterionType == SMESH::FT_OverConstrainedVolume ||
- aCriterionType == SMESH::FT_BareBorderVolume ||
- aCriterionType == SMESH::FT_EqualVolumes )) ||
- aCriterionType == SMESH::FT_LinearOrQuadratic ||
- aCriterionType == SMESH::FT_CoplanarFaces ||
- aCriterionType == SMESH::FT_ConnectedElements
- )
- {
- // - No compare
- bool isSignalsBlocked = aTable->signalsBlocked();
- aTable->blockSignals( true );
-
- if (aCompareItem->count() > 0)
- aCompareItem->clear();
- aTable->setEditable(false, row, 1);
- // - Threshold is NOT editable for most of criteria
- aTable->item(row, 2)->setText( QString("") );
- aTable->setEditable(( aCriterionType == SMESH::FT_ConnectedElements ||
- aCriterionType == SMESH::FT_CoplanarFaces ), row, 2);
- aTable->blockSignals( isSignalsBlocked );
- }
- else if (aCriterionType == SMESH::FT_RangeOfIds ||
- aCriterionType == SMESH::FT_GroupColor ||
- aCriterionType == SMESH::FT_ElemGeomType ||
- aCriterionType == SMESH::FT_EntityType ||
- aCriterionType == SMESH::FT_BelongToGeom ||
- aCriterionType == SMESH::FT_BelongToPlane ||
- aCriterionType == SMESH::FT_BelongToCylinder ||
- aCriterionType == SMESH::FT_BelongToGenSurface ||
- aCriterionType == SMESH::FT_LyingOnGeom)
- {
- // - EQUAL_TO compare ONLY
- QMap<int, QString> aMap;
- aMap[ SMESH::FT_EqualTo ] = tr("EQUAL_TO");
- aCompareItem->setItems(aMap);
- // if (!aTable->isEditable(row, 2))
- aTable->setEditable(false, row, 1);
- // - Threshold is editable
- if (!aTable->isEditable(row, 2))
- aTable->setEditable(true, row, 2);
+ else // --------------------------------------------------------------QTableWidgetItem
+ {
+ aTable->setItem( row, 2, new QTableWidgetItem() );
+ }
}
- else
+
+ // set Compare
+ if ( aCompareItem->count() != nbCompareSigns )
{
- // All compare signs
- if (aCompareItem && aCompareItem->count() != 3)
- {
+ switch ( nbCompareSigns ) {
+ case 0: {
+ aCompareItem->clear();
+ break;
+ }
+ case 1: {
+ QMap<int, QString> aMap;
+ aMap[ SMESH::FT_EqualTo ] = tr("EQUAL_TO");
+ aCompareItem->setItems(aMap);
+ break;
+ }
+ case 3: {
aCompareItem->setItems(getCompare());
+ break;
}
- // Threshold is editable
- if (aTable->item( row, 2 )) {
- QString aText = aTable->text(row, 2);
- bool isOk = false;
- aText.toDouble(&isOk);
- aTable->item( row, 2 )->setText(isOk ? aText : QString(""));
- if (!aTable->isEditable(row, 1))
- aTable->setEditable(true, row, 1);
- if (!aTable->isEditable(row, 2))
- aTable->setEditable(true, row, 2);
}
}
+ aTable->setEditable( nbCompareSigns == 3, row, 1);
+
+ // enable/desable Threshold
+ if ( aCriterionType == SMESH::FT_GroupColor ||
+ anIsComboCriterion ||
+ anIsIntCriterion ||
+ anIsDoubleCriterion )
+ {
+ isThresholdEditable = true;
+ }
+ aTable->setEditable( isThresholdEditable, row, 2);
+
+
+ aTable->blockSignals( isSignalsBlocked );
updateAdditionalWidget();
{
QLabel* lab = new QLabel( (*anIt).myName, GroupC1 );
GroupC1Layout->addWidget( lab, i, 0 );
+ myParamLabels << lab;
QWidget* w = getCustomWidget( *anIt, GroupC1, i );
if ( !w )
return myParamWidgets;
}
+//================================================================================
+/*!
+ * \brief Returns a QLabel of a spesified parameter.
+ * If isCreation(), the 1st label (supposed to be "Name") is not countered.
+ */
+//================================================================================
+
+QLabel* SMESHGUI_GenericHypothesisCreator::getLabel(int i) const
+{
+ if ( isCreation() )
+ i++;
+ if ( i < myParamLabels.size() )
+ return (QLabel*) myParamLabels.at(i);
+ return NULL;
+}
+
QtxDialog* SMESHGUI_GenericHypothesisCreator:: dlg() const
{
return myDlg;
bool hasInitParamsHypothesis() const;
const ListOfWidgets& widgets() const;
ListOfWidgets& changeWidgets();
+ QLabel* getLabel(int i) const;
QtxDialog* dlg() const;
QString getVariableName(const char* methodName) const;
QString myHypName;
QString myHypType;
ListOfWidgets myParamWidgets;
+ ListOfWidgets myParamLabels;
bool myIsCreate;
QtxDialog* myDlg;
QString myShapeEntry;
#include "SMESHGUI_MeshInfo.h"
-#include "SMESH_Actor.h"
-#include "SMESHGUI.h"
-#include "SMESHGUI_IdValidator.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
#include "SMDSAbs_ElementType.hxx"
-#include "SMDS_Mesh.hxx"
#include "SMDS_BallElement.hxx"
#include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx"
+#include "SMDS_Mesh.hxx"
#include "SMESHDS_Mesh.hxx"
-#include "SMESH_ControlsDef.hxx"
+#include "SMESHGUI.h"
+#include "SMESHGUI_FilterUtils.h"
+#include "SMESHGUI_IdValidator.h"
+#include "SMESHGUI_SpinBox.h"
+#include "SMESHGUI_Utils.h"
+#include "SMESHGUI_VTKUtils.h"
+#include "SMESH_Actor.h"
#include <LightApp_SelectionMgr.h>
#include <SUIT_FileDlg.h>
#include <QLineEdit>
#include <QMenu>
#include <QPushButton>
+#include <QToolButton>
#include <QRadioButton>
#include <QTextStream>
#include <QTabWidget>
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(GEOM_Gen)
+namespace {
+
const int SPACING = 6;
const int MARGIN = 9;
const int MAXITEMS = 10;
NodeConnectivity = 100,
ElemConnectivity,
};
+} // namesapce
/*!
\class ExtraWidget
\internal
*/
-
class ExtraWidget : public QWidget
{
public:
QCheckBox* myBaseChk;
QCheckBox* myElemChk;
QCheckBox* myAddChk;
+ QCheckBox* myCtrlChk;
};
/*!
myBaseChk = new QCheckBox( SMESHGUI::tr( "PREF_DUMP_BASE_INFO" ), hB );
myElemChk = new QCheckBox( SMESHGUI::tr( "PREF_DUMP_ELEM_INFO" ), hB );
myAddChk = new QCheckBox( SMESHGUI::tr( "PREF_DUMP_ADD_INFO" ), hB );
+ myCtrlChk = new QCheckBox( SMESHGUI::tr( "PREF_DUMP_CTRL_INFO" ), hB );
- QHBoxLayout* layout = new QHBoxLayout( hB );
- layout->addWidget( myBaseChk );
- layout->addWidget( myElemChk );
- layout->addWidget( myAddChk );
+ QGridLayout* layout = new QGridLayout( hB );
+ layout->addWidget( myBaseChk, 0, 0 );
+ layout->addWidget( myElemChk, 0, 1 );
+ layout->addWidget( myAddChk, 1, 0 );
+ layout->addWidget( myCtrlChk, 1, 1 );
QPushButton* pb = new QPushButton( this );
l->addWidget( a3DHexPriTotal, 25, 1 );
l->addWidget( a3DPolLab, 26, 0 );
l->addWidget( a3DPolTotal, 26, 1 );
- l->addWidget( myLoadBtn, 27, 1, 1, 3 );
+ l->addWidget( myLoadBtn, 28, 1, 1, 3 );
l->setColumnStretch( 0, 0 );
l->setColumnStretch( 1, 5 );
l->setColumnStretch( 2, 5 );
l->setColumnStretch( 3, 5 );
- l->setRowStretch( 23, 5 );
+ l->setRowStretch( 27, 5 );
clear();
}
else if ( !aGroup->_is_nil() ) {
QString objType;
switch( aGroup->GetType() ) {
- case SMESH::NODE:
- objType = tr( "OBJECT_GROUP_NODES" );
- break;
- case SMESH::EDGE:
- objType = tr( "OBJECT_GROUP_EDGES" );
- break;
- case SMESH::FACE:
- objType = tr( "OBJECT_GROUP_FACES" );
- break;
- case SMESH::VOLUME:
- objType = tr( "OBJECT_GROUP_VOLUMES" );
- break;
- case SMESH::ELEM0D:
- objType = tr( "OBJECT_GROUP_0DELEMS" );
- break;
- case SMESH::BALL:
- objType = tr( "OBJECT_GROUP_BALLS" );
- break;
- default:
- objType = tr( "OBJECT_GROUP" );
- break;
+ case SMESH::NODE: objType = tr( "OBJECT_GROUP_NODES" );break;
+ case SMESH::EDGE: objType = tr( "OBJECT_GROUP_EDGES" );break;
+ case SMESH::FACE: objType = tr( "OBJECT_GROUP_FACES" );break;
+ case SMESH::VOLUME:objType = tr( "OBJECT_GROUP_VOLUMES" );break;
+ case SMESH::ELEM0D:objType = tr( "OBJECT_GROUP_0DELEMS" );break;
+ case SMESH::BALL: objType = tr( "OBJECT_GROUP_BALLS" );break;
+ default: objType = tr( "OBJECT_GROUP" );break;
}
myWidgets[iObject][iSingle]->setProperty( "text", objType );
}
long nbQuadrangles = info[SMDSEntity_Quadrangle] + info[SMDSEntity_Quad_Quadrangle] + info[SMDSEntity_BiQuad_Quadrangle];
long nb2DLinear = info[SMDSEntity_Triangle] + info[SMDSEntity_Quadrangle] + info[SMDSEntity_Polygon];
long nb2DQuadratic = info[SMDSEntity_Quad_Triangle] + info[SMDSEntity_BiQuad_Triangle] + info[SMDSEntity_Quad_Quadrangle] + info[SMDSEntity_BiQuad_Quadrangle];
- myWidgets[i2D][iTotal] ->setProperty( "text", QString::number( nb2DLinear + nb2DQuadratic ) );
+ myWidgets[i2D][iTotal] ->setProperty( "text", QString::number( nb2DLinear + nb2DQuadratic ));
myWidgets[i2D][iLinear] ->setProperty( "text", QString::number( nb2DLinear ) );
myWidgets[i2D][iQuadratic] ->setProperty( "text", QString::number( nb2DQuadratic ) );
myWidgets[i2DTriangles][iTotal] ->setProperty( "text", QString::number( nbTriangles ) );
{
// type
GEOM::GEOM_Object_var shape = mesh->GetShapeToMesh();
- SALOME_MED::MedFileInfo* inf = mesh->GetMEDFileInfo();
+ SMESH::MedFileInfo* inf = mesh->GetMEDFileInfo();
QTreeWidgetItem* typeItem = createItem( parent, Bold );
typeItem->setText( 0, tr( "TYPE" ) );
if ( !CORBA::is_nil( shape ) ) {
myAddInfo = new SMESHGUI_AddInfo( myTabWidget );
myTabWidget->addTab( myAddInfo, tr( "ADDITIONAL_INFO" ) );
+ // controls info
+
+ myCtrlInfo = new SMESHGUI_CtrlInfo( myTabWidget );
+ myTabWidget->addTab( myCtrlInfo, tr( "CTRL_INFO" ) );
+
// buttons
QPushButton* okBtn = new QPushButton( tr( "SMESH_BUT_OK" ), this );
if ( !CORBA::is_nil( obj ) ) {
myBaseInfo->showInfo( obj );
myAddInfo->showInfo( obj );
+ myCtrlInfo->showInfo( obj );
myActor = SMESH::FindActorByEntry( IO->getEntry() );
SVTK_Selector* selector = SMESH::GetViewWindow()->GetSelector();
disconnect( selMgr, 0, this, 0 );
selMgr->clearFilters();
- if ( myTabWidget->currentIndex() == BaseInfo || myTabWidget->currentIndex() == AddInfo ) {
+ if ( myTabWidget->currentIndex() == BaseInfo || myTabWidget->currentIndex() == AddInfo || myTabWidget->currentIndex() == CtrlInfo ) {
SMESH::SetPointRepresentation( false );
if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow() )
aViewWindow->SetSelectionMode( ActorSelection );
bool anIsBase = true;
bool anIsElem = true;
bool anIsAdd = true;
+ bool anIsCtrl = true;
if ( SUIT_ResourceMgr* aResourceMgr = SMESHGUI::resourceMgr() ) {
anIsBase = aResourceMgr->booleanValue( "SMESH", "info_dump_base", anIsBase );
anIsElem = aResourceMgr->booleanValue( "SMESH", "info_dump_elem", anIsElem );
anIsAdd = aResourceMgr->booleanValue( "SMESH", "info_dump_add", anIsAdd );
+ anIsCtrl = aResourceMgr->booleanValue( "SMESH", "info_dump_ctrl", anIsCtrl );
}
DumpFileDlg fd( this );
fd.myBaseChk->setChecked( anIsBase );
fd.myElemChk->setChecked( anIsElem );
fd.myAddChk ->setChecked( anIsAdd );
+ fd.myCtrlChk->setChecked( anIsCtrl );
if ( fd.exec() == QDialog::Accepted )
{
QString aFileName = fd.selectedFile();
bool toBase = fd.myBaseChk->isChecked();
bool toElem = fd.myElemChk->isChecked();
bool toAdd = fd.myAddChk->isChecked();
+ bool toCtrl = fd.myCtrlChk->isChecked();
if ( !aFileName.isEmpty() ) {
QFileInfo aFileInfo( aFileName );
if ( toBase ) myBaseInfo->saveInfo( out );
if ( toElem ) myElemInfo->saveInfo( out );
if ( toAdd ) myAddInfo ->saveInfo( out );
+ if ( toCtrl ) myCtrlInfo->saveInfo( out );
}
}
}
+
+/*!
+ \class SMESHGUI_CtrlInfo
+ \brief Class for the mesh controls information widget.
+*/
+
+/*!
+ \brief Constructor
+ \param parent parent widget
+*/
+SMESHGUI_CtrlInfo::SMESHGUI_CtrlInfo( QWidget* parent )
+ : QFrame( parent ), myPlot( 0 ), myPlot3D( 0 )
+{
+ setFrameStyle( StyledPanel | Sunken );
+
+ myMainLayout = new QGridLayout( this );
+ myMainLayout->setMargin( MARGIN );
+ myMainLayout->setSpacing( SPACING );
+
+ // name
+ QLabel* aNameLab = new QLabel( tr( "NAME_LAB" ), this );
+ QLabel* aName = createField();
+ aName->setMinimumWidth( 150 );
+ myWidgets << aName;
+
+ SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
+ QIcon aComputeIcon( aResMgr->loadPixmap( "SMESH", tr( "ICON_COMPUTE" ) ) );
+
+ SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
+
+ // nodes info
+ QLabel* aNodesLab = new QLabel( tr( "NODES_INFO" ), this );
+ QLabel* aNodesFreeLab = new QLabel( tr( "NUMBER_OF_THE_FREE_NODES" ), this );
+ QLabel* aNodesFree = createField();
+ myWidgets << aNodesFree;
+ myPredicates << aFilterMgr->CreateFreeNodes();
+ //
+ QLabel* aNodesDoubleLab = new QLabel( tr( "NUMBER_OF_THE_DOUBLE_NODES" ), this );
+ QLabel* aNodesDouble = createField();
+ myWidgets << aNodesDouble;
+ myPredicates << aFilterMgr->CreateEqualNodes();
+ QLabel* aToleranceLab = new QLabel( tr( "DOUBLE_NODES_TOLERANCE" ), this );
+ myToleranceWidget = new SMESHGUI_SpinBox( this );
+ myToleranceWidget->RangeStepAndValidator(0.0000000001, 1000000.0, 0.0000001, "length_precision" );
+ myToleranceWidget->setAcceptNames( false );
+ myToleranceWidget->SetValue( SMESHGUI::resourceMgr()->doubleValue( "SMESH", "equal_nodes_tolerance", 1e-7 ) );
+
+ // edges info
+ QLabel* anEdgesLab = new QLabel( tr( "EDGES_INFO" ), this );
+ QLabel* anEdgesDoubleLab = new QLabel( tr( "NUMBER_OF_THE_DOUBLE_EDGES" ), this );
+ QLabel* anEdgesDouble = createField();
+ myWidgets << anEdgesDouble;
+ myPredicates << aFilterMgr->CreateEqualEdges();
+
+ // faces info
+ QLabel* aFacesLab = new QLabel( tr( "FACES_INFO" ), this );
+ QLabel* aFacesDoubleLab = new QLabel( tr( "NUMBER_OF_THE_DOUBLE_FACES" ), this );
+ QLabel* aFacesDouble = createField();
+ myWidgets << aFacesDouble;
+ myPredicates << aFilterMgr->CreateEqualFaces();
+ QLabel* aFacesOverLab = new QLabel( tr( "NUMBER_OF_THE_OVER_CONSTRAINED" ), this );
+ QLabel* aFacesOver = createField();
+ myWidgets << aFacesOver;
+ myPredicates << aFilterMgr->CreateOverConstrainedFace();
+ QLabel* anAspectRatioLab = new QLabel( tr( "ASPECT_RATIO_HISTOGRAM" ), this );
+ myPlot = createPlot( this );
+ myAspectRatio = aFilterMgr->CreateAspectRatio();
+
+ // volumes info
+ QLabel* aVolumesLab = new QLabel( tr( "VOLUMES_INFO" ), this );
+ QLabel* aVolumesDoubleLab = new QLabel( tr( "NUMBER_OF_THE_DOUBLE_VOLUMES" ), this );
+ QLabel* aVolumesDouble = createField();
+ myWidgets << aVolumesDouble;
+ myPredicates << aFilterMgr->CreateEqualVolumes();
+ QLabel* aVolumesOverLab = new QLabel( tr( "NUMBER_OF_THE_OVER_CONSTRAINED" ), this );
+ QLabel* aVolumesOver = createField();
+ myWidgets << aVolumesOver;
+ myPredicates << aFilterMgr->CreateOverConstrainedVolume();
+ QLabel* anAspectRatio3DLab = new QLabel( tr( "ASPECT_RATIO_3D_HISTOGRAM" ), this );
+ myPlot3D = createPlot( this );
+ myAspectRatio3D = aFilterMgr->CreateAspectRatio3D();
+
+ QToolButton* aFreeNodesBtn = new QToolButton( this );
+ aFreeNodesBtn->setIcon(aComputeIcon);
+ myButtons << aFreeNodesBtn; //0
+
+ QToolButton* aDoubleNodesBtn = new QToolButton( this );
+ aDoubleNodesBtn->setIcon(aComputeIcon);
+ myButtons << aDoubleNodesBtn; //1
+
+ QToolButton* aDoubleEdgesBtn = new QToolButton( this );
+ aDoubleEdgesBtn->setIcon(aComputeIcon);
+ myButtons << aDoubleEdgesBtn; //2
+
+ QToolButton* aDoubleFacesBtn = new QToolButton( this );
+ aDoubleFacesBtn->setIcon(aComputeIcon);
+ myButtons << aDoubleFacesBtn; //3
+
+ QToolButton* aOverContFacesBtn = new QToolButton( this );
+ aOverContFacesBtn->setIcon(aComputeIcon);
+ myButtons << aOverContFacesBtn; //4
+
+ QToolButton* aComputeFaceBtn = new QToolButton( this );
+ aComputeFaceBtn->setIcon(aComputeIcon);
+ myButtons << aComputeFaceBtn; //5
+
+ QToolButton* aDoubleVolumesBtn = new QToolButton( this );
+ aDoubleVolumesBtn->setIcon(aComputeIcon);
+ myButtons << aDoubleVolumesBtn; //6
+
+ QToolButton* aOverContVolumesBtn = new QToolButton( this );
+ aOverContVolumesBtn->setIcon(aComputeIcon);
+ myButtons << aOverContVolumesBtn; //7
+
+ QToolButton* aComputeVolumeBtn = new QToolButton( this );
+ aComputeVolumeBtn->setIcon(aComputeIcon);
+ myButtons << aComputeVolumeBtn; //8
+
+ connect( aComputeFaceBtn, SIGNAL( clicked() ), this, SLOT( computeAspectRatio() ) );
+ connect( aComputeVolumeBtn, SIGNAL( clicked() ), this, SLOT( computeAspectRatio3D() ) );
+ connect( aFreeNodesBtn, SIGNAL( clicked() ), this, SLOT( computeFreeNodesInfo() ) );
+ connect( aDoubleNodesBtn, SIGNAL( clicked() ), this, SLOT( computeDoubleNodesInfo() ) );
+ connect( aDoubleEdgesBtn, SIGNAL( clicked() ), this, SLOT( computeDoubleEdgesInfo() ) );
+ connect( aDoubleFacesBtn, SIGNAL( clicked() ), this, SLOT( computeDoubleFacesInfo() ) );
+ connect( aOverContFacesBtn, SIGNAL( clicked() ), this, SLOT( computeOverConstrainedFacesInfo() ) );
+ connect( aDoubleVolumesBtn, SIGNAL( clicked() ), this, SLOT( computeDoubleVolumesInfo() ) );
+ connect( aOverContVolumesBtn, SIGNAL( clicked() ), this, SLOT( computeOverConstrainedVolumesInfo() ) );
+ connect( myToleranceWidget, SIGNAL(valueChanged(double)), this, SLOT( setTolerance( double )));
+
+ setFontAttributes( aNameLab );
+ setFontAttributes( aNodesLab );
+ setFontAttributes( anEdgesLab );
+ setFontAttributes( aFacesLab );
+ setFontAttributes( aVolumesLab );
+
+ myMainLayout->addWidget( aNameLab, 0, 0 ); //0
+ myMainLayout->addWidget( aName, 0, 1, 1, 2 ); //1
+ myMainLayout->addWidget( aNodesLab, 1, 0, 1, 3 ); //2
+ myMainLayout->addWidget( aNodesFreeLab, 2, 0 ); //3
+ myMainLayout->addWidget( aNodesFree, 2, 1 ); //4
+ myMainLayout->addWidget( aFreeNodesBtn, 2, 2 ); //5
+ myMainLayout->addWidget( aNodesDoubleLab, 3, 0 ); //6
+ myMainLayout->addWidget( aNodesDouble, 3, 1 ); //7
+ myMainLayout->addWidget( aDoubleNodesBtn, 3, 2 ); //8
+ myMainLayout->addWidget( aToleranceLab, 4, 0 ); //9
+ myMainLayout->addWidget( myToleranceWidget, 4, 1 ); //10
+ myMainLayout->addWidget( anEdgesLab, 5, 0, 1, 3 ); //11
+ myMainLayout->addWidget( anEdgesDoubleLab, 6, 0 ); //12
+ myMainLayout->addWidget( anEdgesDouble, 6, 1 ); //13
+ myMainLayout->addWidget( aDoubleEdgesBtn, 6, 2 ); //14
+ myMainLayout->addWidget( aFacesLab, 7, 0, 1, 3 ); //15
+ myMainLayout->addWidget( aFacesDoubleLab, 8, 0 ); //16
+ myMainLayout->addWidget( aFacesDouble, 8, 1 ); //17
+ myMainLayout->addWidget( aDoubleFacesBtn, 8, 2 ); //18
+ myMainLayout->addWidget( aFacesOverLab, 9, 0 ); //19
+ myMainLayout->addWidget( aFacesOver, 9, 1 ); //20
+ myMainLayout->addWidget( aOverContFacesBtn, 9, 2 ); //21
+ myMainLayout->addWidget( anAspectRatioLab, 10, 0 ); //22
+ myMainLayout->addWidget( aComputeFaceBtn, 10, 2 ); //23
+ myMainLayout->addWidget( myPlot, 11, 0, 1, 3 );//24
+ myMainLayout->addWidget( aVolumesLab, 12, 0, 1, 3 );//25
+ myMainLayout->addWidget( aVolumesDoubleLab, 13, 0 ); //26
+ myMainLayout->addWidget( aVolumesDouble, 13, 1 ); //27
+ myMainLayout->addWidget( aDoubleVolumesBtn, 13, 2 ); //28
+ myMainLayout->addWidget( aVolumesOverLab, 14, 0 ); //28
+ myMainLayout->addWidget( aVolumesOver, 14, 1 ); //30
+ myMainLayout->addWidget( aOverContVolumesBtn,14, 2 ); //31
+ myMainLayout->addWidget( anAspectRatio3DLab, 15, 0 ); //32
+ myMainLayout->addWidget( aComputeVolumeBtn, 15, 2 ); //33
+ myMainLayout->addWidget( myPlot3D, 16, 0, 1, 3 );//34
+
+ myMainLayout->setColumnStretch( 0, 0 );
+ myMainLayout->setColumnStretch( 1, 5 );
+ myMainLayout->setRowStretch ( 11, 5 );
+ myMainLayout->setRowStretch ( 16, 5 );
+ myMainLayout->setRowStretch ( 17, 1 );
+
+ clearInternal();
+}
+
+/*!
+ \brief Destructor
+*/
+SMESHGUI_CtrlInfo::~SMESHGUI_CtrlInfo()
+{}
+
+/*!
+ \brief Change widget font attributes (bold, ...).
+ \param w widget
+ \param attr font attributes (XORed flags)
+*/
+void SMESHGUI_CtrlInfo::setFontAttributes( QWidget* w )
+{
+ if ( w ) {
+ QFont f = w->font();
+ f.setBold( true );
+ w->setFont( f );
+ }
+}
+
+/*!
+ \brief Create info field
+ \return new info field
+*/
+QLabel* SMESHGUI_CtrlInfo::createField()
+{
+ QLabel* lab = new QLabel( this );
+ lab->setFrameStyle( StyledPanel | Sunken );
+ lab->setAlignment( Qt::AlignCenter );
+ lab->setAutoFillBackground( true );
+ QPalette pal = lab->palette();
+ pal.setColor( QPalette::Window, QApplication::palette().color( QPalette::Active, QPalette::Base ) );
+ lab->setPalette( pal );
+ lab->setMinimumWidth( 60 );
+ return lab;
+}
+
+/*!
+ \brief Create QwtPlot
+ \return new QwtPlot
+*/
+QwtPlot* SMESHGUI_CtrlInfo::createPlot( QWidget* parent )
+{
+ QwtPlot* aPlot = new QwtPlot( parent );
+ aPlot->setMinimumSize( 100, 100 );
+ QFont xFont = aPlot->axisFont( QwtPlot::xBottom );
+ xFont.setPointSize( 5 );
+ QFont yFont = aPlot->axisFont( QwtPlot::yLeft );
+ yFont.setPointSize( 5 );
+ aPlot->setAxisFont( QwtPlot::xBottom, xFont );
+ aPlot->setAxisFont( QwtPlot::yLeft, yFont );
+ aPlot->replot();
+ return aPlot;
+}
+
+/*!
+ \brief Show controls information on the selected object
+*/
+void SMESHGUI_CtrlInfo::showInfo( SMESH::SMESH_IDSource_ptr obj )
+{
+ clearInternal();
+
+ myObject = SMESH::SMESH_IDSource::_duplicate( obj );
+ if ( myObject->_is_nil() ) return;
+
+ if ( _PTR(SObject) aSO = SMESH::FindSObject( obj ))
+ myWidgets[0]->setText( aSO->GetName().c_str() );
+
+ SMESH::SMESH_Mesh_var mesh = obj->GetMesh();
+ if ( mesh->_is_nil() ) return;
+
+ const bool meshLoaded = mesh->IsLoaded();
+ if ( !meshLoaded ) // mesh not yet loaded from the hdf file
+ // enable Compute buttons, just in case obj->GetNbElementsByType() fails
+ for ( int i = 0; i < myButtons.count(); ++i )
+ myButtons[i]->setEnabled( true );
+
+ SMESH::long_array_var nbElemsByType = obj->GetNbElementsByType();
+ if ( ! &nbElemsByType.in() ) return;
+
+ const CORBA::Long ctrlLimit =
+ meshLoaded ? SMESHGUI::resourceMgr()->integerValue( "SMESH", "info_controls_limit", 3000 ) : -1;
+
+ // nodes info
+ const CORBA::Long nbNodes = nbElemsByType[ SMESH::NODE ];
+ const CORBA::Long nbElems = ( nbElemsByType[ SMESH::EDGE ] +
+ nbElemsByType[ SMESH::FACE ] +
+ nbElemsByType[ SMESH::VOLUME ] );
+ if ( nbNodes + nbElems > 0 ) {
+ if ( Max( (int)nbNodes, (int)nbElems ) <= ctrlLimit ) {
+ // free nodes
+ computeFreeNodesInfo();
+ // double nodes
+ computeDoubleNodesInfo();
+ }
+ else {
+ myButtons[0]->setEnabled( true );
+ myButtons[1]->setEnabled( true );
+ }
+ }
+ else {
+ for( int i=2; i<=10; i++)
+ myMainLayout->itemAt(i)->widget()->setVisible( false );
+ }
+
+ // edges info
+ if ( nbElemsByType[ SMESH::EDGE ] > 0 ) {
+ // double edges
+ if( nbElemsByType[ SMESH::EDGE ] <= ctrlLimit )
+ computeDoubleEdgesInfo();
+ else
+ myButtons[2]->setEnabled( true );
+ }
+ else {
+ for( int i=11; i<=14; i++)
+ myMainLayout->itemAt(i)->widget()->setVisible( false );
+ }
+
+ // faces info
+ if ( nbElemsByType[ SMESH::FACE ] > 0 ) {
+ if ( nbElemsByType[ SMESH::FACE ] <= ctrlLimit ) {
+ // double faces
+ computeDoubleFacesInfo();
+ // over constrained faces
+ computeOverConstrainedFacesInfo();
+ // aspect Ratio histogram
+ computeAspectRatio();
+ }
+ else {
+ myButtons[3]->setEnabled( true );
+ myButtons[4]->setEnabled( true );
+ myButtons[5]->setEnabled( true );
+ }
+ }
+ else {
+ myMainLayout->setRowStretch(11,0);
+ for( int i=15; i<=24; i++)
+ myMainLayout->itemAt(i)->widget()->setVisible( false );
+ }
+
+ // volumes info
+ if ( nbElemsByType[ SMESH::VOLUME ] > 0 ) {
+ if ( nbElemsByType[ SMESH::VOLUME ] <= ctrlLimit ) {
+ // double volumes
+ computeDoubleVolumesInfo();
+ // over constrained volumes
+ computeOverConstrainedVolumesInfo();
+ // aspect Ratio 3D histogram
+ computeAspectRatio3D();
+ }
+ else {
+ myButtons[6]->setEnabled( true );
+ myButtons[7]->setEnabled( true );
+ myButtons[8]->setEnabled( true );
+ }
+ }
+ else {
+ myMainLayout->setRowStretch(16,0);
+ for( int i=25; i<=34; i++)
+ myMainLayout->itemAt(i)->widget()->setVisible( false );
+ }
+}
+
+//================================================================================
+/*!
+ * \brief Computes and shows nb of elements satisfying a given predicate
+ * \param [in] ft - a predicate type (SMESH::FunctorType)
+ * \param [in] iBut - index of one of myButtons to disable
+ * \param [in] iWdg - index of one of myWidgets to show the computed number
+ */
+//================================================================================
+
+void SMESHGUI_CtrlInfo::computeNb( int ft, int iBut, int iWdg )
+{
+ myButtons[ iBut ]->setEnabled( false );
+ myWidgets[ iWdg ]->setText( "" );
+ if ( myObject->_is_nil() ) return;
+
+ SUIT_OverrideCursor wc;
+
+ SMESH::SMESH_Mesh_var mesh = myObject->GetMesh();
+ if ( !mesh->_is_nil() && !mesh->IsLoaded() )
+ {
+ mesh->Load();
+ this->showInfo( myObject ); // try to show all values
+ if ( !myWidgets[ iWdg ]->text().isEmpty() )
+ return; // <ft> predicate already computed
+ }
+ // look for a predicate of type <ft>
+ for ( int i = 0; i < myPredicates.count(); ++i )
+ if ( myPredicates[i]->GetFunctorType() == ft )
+ {
+ CORBA::Long nb = myPredicates[i]->NbSatisfying( myObject );
+ myWidgets[ iWdg ]->setText( QString::number( nb ));
+ }
+}
+
+void SMESHGUI_CtrlInfo::computeFreeNodesInfo()
+{
+ computeNb( SMESH::FT_FreeNodes, 0, 1 );
+}
+
+void SMESHGUI_CtrlInfo::computeDoubleNodesInfo()
+{
+ computeNb( SMESH::FT_EqualNodes, 1, 2 );
+}
+
+void SMESHGUI_CtrlInfo::computeDoubleEdgesInfo()
+{
+ computeNb( SMESH::FT_EqualEdges, 2, 3 );
+}
+
+void SMESHGUI_CtrlInfo::computeDoubleFacesInfo()
+{
+ computeNb( SMESH::FT_EqualFaces, 3, 4 );
+}
+
+void SMESHGUI_CtrlInfo::computeOverConstrainedFacesInfo()
+{
+ computeNb( SMESH::FT_OverConstrainedFace, 4, 5 );
+}
+
+void SMESHGUI_CtrlInfo::computeDoubleVolumesInfo()
+{
+ computeNb( SMESH::FT_EqualVolumes, 6, 6 );
+}
+
+void SMESHGUI_CtrlInfo::computeOverConstrainedVolumesInfo()
+{
+ computeNb( SMESH::FT_OverConstrainedVolume, 7, 7 );
+}
+
+void SMESHGUI_CtrlInfo::computeAspectRatio()
+{
+ myButtons[5]->setEnabled( false );
+
+ if ( myObject->_is_nil() ) return;
+
+ SUIT_OverrideCursor wc;
+
+ Plot2d_Histogram* aHistogram = getHistogram( myAspectRatio );
+ if ( aHistogram && !aHistogram->isEmpty() ) {
+ QwtPlotItem* anItem = aHistogram->createPlotItem();
+ anItem->attach( myPlot );
+ myPlot->replot();
+ }
+}
+
+void SMESHGUI_CtrlInfo::computeAspectRatio3D()
+{
+ myButtons[8]->setEnabled( false );
+
+ if ( myObject->_is_nil() ) return;
+
+ SUIT_OverrideCursor wc;
+
+ Plot2d_Histogram* aHistogram = getHistogram( myAspectRatio3D );
+ if ( aHistogram && !aHistogram->isEmpty() ) {
+ QwtPlotItem* anItem = aHistogram->createPlotItem();
+ anItem->attach( myPlot3D );
+ myPlot3D->replot();
+ }
+}
+
+/*!
+ \brief Internal clean-up (reset widget)
+*/
+void SMESHGUI_CtrlInfo::clearInternal()
+{
+ for( int i=0; i<=34; i++)
+ myMainLayout->itemAt(i)->widget()->setVisible( true );
+ for( int i=0; i<=8; i++)
+ myButtons[i]->setEnabled( false );
+ myPlot->detachItems();
+ myPlot3D->detachItems();
+ myPlot->replot();
+ myPlot3D->replot();
+ myWidgets[0]->setText( QString() );
+ for ( int i = 1; i < myWidgets.count(); i++ )
+ myWidgets[i]->setText( "" );
+ myMainLayout->setRowStretch(11,5);
+ myMainLayout->setRowStretch(16,5);
+}
+
+void SMESHGUI_CtrlInfo::setTolerance( double theTolerance )
+{
+ //SMESH::long_array_var anElems = getElementsByType( SMESH::NODE );
+ myButtons[1]->setEnabled( true );
+ myWidgets[2]->setText("");
+}
+
+Plot2d_Histogram* SMESHGUI_CtrlInfo::getHistogram( SMESH::NumericalFunctor_ptr aNumFun )
+{
+ SMESH::SMESH_Mesh_var mesh = myObject->GetMesh();
+ if ( mesh->_is_nil() ) return 0;
+ if ( !mesh->IsLoaded() )
+ mesh->Load();
+ aNumFun->SetMesh( mesh );
+
+ CORBA::Long cprecision = 6;
+ if ( SMESHGUI::resourceMgr()->booleanValue( "SMESH", "use_precision", false ) )
+ cprecision = SMESHGUI::resourceMgr()->integerValue( "SMESH", "controls_precision", -1 );
+ aNumFun->SetPrecision( cprecision );
+
+ int nbIntervals = SMESHGUI::resourceMgr()->integerValue( "SMESH", "scalar_bar_num_colors", false );
+
+ SMESH::Histogram_var histogramVar = aNumFun->GetLocalHistogram( nbIntervals,
+ /*isLogarithmic=*/false,
+ myObject );
+ Plot2d_Histogram* aHistogram = new Plot2d_Histogram();
+ aHistogram->setColor( palette().color( QPalette::Highlight ) );
+ if ( &histogramVar.in() )
+ {
+ for ( size_t i = 0, nb = histogramVar->length(); i < nb; i++ )
+ aHistogram->addPoint( 0.5 * ( histogramVar[i].min + histogramVar[i].max ), histogramVar[i].nbEvents );
+ if ( histogramVar->length() >= 2 )
+ aHistogram->setWidth( ( histogramVar[0].max - histogramVar[0].min ) * 0.8 );
+ }
+ return aHistogram;
+}
+
+void SMESHGUI_CtrlInfo::saveInfo( QTextStream &out ) {
+ out << QString( 20, '-' ) << "\n";
+ out << tr( "CTRL_INFO" ) << "\n";
+ out << QString( 20, '-' ) << "\n";
+ out << tr( "NAME_LAB" ) << " " << myWidgets[0]->text() << "\n";
+ out << tr( "NODES_INFO" ) << "\n";
+ out << QString( SPACING_INFO, ' ' ) << tr( "NUMBER_OF_THE_FREE_NODES" ) << ": " << myWidgets[1]->text() << "\n";
+ out << QString( SPACING_INFO, ' ' ) << tr( "NUMBER_OF_THE_DOUBLE_NODES" ) << ": " << myWidgets[2]->text() << "\n";
+ out << tr( "EDGES_INFO" ) << "\n";
+ out << QString( SPACING_INFO, ' ' ) << tr( "NUMBER_OF_THE_DOUBLE_EDGES" ) << ": " << myWidgets[3]->text() << "\n";
+ out << tr( "FACES_INFO" ) << "\n";
+ out << QString( SPACING_INFO, ' ' ) << tr( "NUMBER_OF_THE_DOUBLE_FACES" ) << ": " << myWidgets[4]->text() << "\n";
+ out << QString( SPACING_INFO, ' ' ) << tr( "NUMBER_OF_THE_OVER_CONSTRAINED" ) << ": " << myWidgets[5]->text() << "\n";
+ out << tr( "VOLUMES_INFO" ) << "\n";
+ out << QString( SPACING_INFO, ' ' ) << tr( "NUMBER_OF_THE_DOUBLE_VOLUMES" ) << ": " << myWidgets[6]->text() << "\n";
+ out << QString( SPACING_INFO, ' ' ) << tr( "NUMBER_OF_THE_OVER_CONSTRAINED" ) << ": " << myWidgets[7]->text() << "\n";
+}
+
+/*!
+ \class SMESHGUI_CtrlInfoDlg
+ \brief Controls information dialog box
+*/
+
+/*!
+ \brief Constructor
+ \param parent parent widget
+ \param page specifies the dialog page to be shown at the start-up
+*/
+SMESHGUI_CtrlInfoDlg::SMESHGUI_CtrlInfoDlg( QWidget* parent )
+: QDialog( parent )
+{
+ setAttribute( Qt::WA_DeleteOnClose, true );
+ setWindowTitle( tr( "CTRL_INFO" ) );
+ setMinimumSize( 400, 600 );
+
+ myCtrlInfo = new SMESHGUI_CtrlInfo( this );
+
+ // buttons
+ QPushButton* okBtn = new QPushButton( tr( "SMESH_BUT_OK" ), this );
+ okBtn->setAutoDefault( true );
+ okBtn->setDefault( true );
+ okBtn->setFocus();
+
+ QGridLayout* l = new QGridLayout ( this );
+ l->setMargin( MARGIN );
+ l->setSpacing( SPACING );
+ l->addWidget( myCtrlInfo, 0, 0, 1, 3 );
+ l->addWidget( okBtn, 1, 1 );
+ l->setColumnStretch( 0, 5 );
+ l->setColumnStretch( 2, 5 );
+
+ connect( okBtn, SIGNAL( clicked() ), this, SLOT( reject() ) );
+ connect( SMESHGUI::GetSMESHGUI(), SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( deactivate() ) );
+ connect( SMESHGUI::GetSMESHGUI(), SIGNAL( SignalCloseAllDialogs() ), this, SLOT( reject() ) );
+
+ updateSelection();
+}
+
+/*!
+ \brief Destructor
+*/
+SMESHGUI_CtrlInfoDlg::~SMESHGUI_CtrlInfoDlg()
+{
+}
+
+/*!
+ \brief Show controls information
+ \param IO interactive object
+*/
+void SMESHGUI_CtrlInfoDlg::showInfo( const Handle(SALOME_InteractiveObject)& IO )
+{
+ if ( SMESH::SMESH_IDSource_var obj = SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO ) )
+ myCtrlInfo->showInfo( obj );
+}
+
+/*!
+ \brief Perform clean-up actions on the dialog box closing.
+*/
+void SMESHGUI_CtrlInfoDlg::reject()
+{
+ SMESH::SetPointRepresentation( false );
+ QDialog::reject();
+}
+
+/*!
+ \brief Setup selection mode depending on the current dialog box state.
+*/
+void SMESHGUI_CtrlInfoDlg::updateSelection()
+{
+ LightApp_SelectionMgr* selMgr = SMESHGUI::selectionMgr();
+ disconnect( selMgr, 0, this, 0 );
+ SMESH::SetPointRepresentation( false );
+ connect( selMgr, SIGNAL( currentSelectionChanged() ), this, SLOT( updateInfo() ) );
+ updateInfo();
+}
+
+/*!
+ \brief Show mesh information
+*/
+void SMESHGUI_CtrlInfoDlg::updateInfo()
+{
+ SUIT_OverrideCursor wc;
+
+ SALOME_ListIO selected;
+ SMESHGUI::selectionMgr()->selectedObjects( selected );
+
+ if ( selected.Extent() == 1 ) {
+ Handle(SALOME_InteractiveObject) IO = selected.First();
+ showInfo( IO );
+ }
+}
+
+/*!
+ \brief Activate dialog box
+*/
+void SMESHGUI_CtrlInfoDlg::activate()
+{
+ SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog();
+ SMESHGUI::GetSMESHGUI()->SetActiveDialogBox( this );
+ updateSelection();
+}
+
+/*!
+ \brief Deactivate dialog box
+*/
+void SMESHGUI_CtrlInfoDlg::deactivate()
+{
+ disconnect( SMESHGUI::selectionMgr(), SIGNAL( currentSelectionChanged() ), this, SLOT( updateInfo() ) );
+}
+
+
#define SMESHGUI_MESHINFO_H
#include "SMESH_SMESHGUI.hxx"
-#include <SALOME_InteractiveObject.hxx>
+#include "SMESH_ControlsDef.hxx"
+
+#include <Plot2d_Histogram.h>
#include <QFrame>
#include <QDialog>
#include <SALOMEconfig.h>
#include CORBA_SERVER_HEADER(SMESH_Mesh)
#include CORBA_SERVER_HEADER(SMESH_Group)
+#include CORBA_SERVER_HEADER(SMESH_Filter)
+#include <SALOME_InteractiveObject.hxx>
+#include <SALOME_GenericObj_wrap.hxx>
+
+class QAbstractButton;
class QButtonGroup;
class QContextMenuEvent;
class QLabel;
class QPushButton;
class QTabWidget;
class QTextBrowser;
+class QGridLayout;
class SMESH_Actor;
class SMDS_MeshNode;
class SMDS_MeshElement;
+class SMESHGUI_SpinBox;
class ExtraWidget;
SMESH::submesh_array_var mySubMeshes;
};
+class SMESHGUI_EXPORT SMESHGUI_CtrlInfo : public QFrame
+{
+ Q_OBJECT;
+
+public:
+ SMESHGUI_CtrlInfo( QWidget* = 0 );
+ ~SMESHGUI_CtrlInfo();
+
+ void showInfo( SMESH::SMESH_IDSource_ptr );
+ void saveInfo( QTextStream &out );
+
+private:
+ enum ObjectType { Mesh, SubMesh, Group };
+ QLabel* createField();
+ QwtPlot* createPlot( QWidget* );
+ void setFontAttributes( QWidget* );
+ void clearInternal();
+ Plot2d_Histogram* getHistogram( SMESH::NumericalFunctor_ptr functor );
+ void computeNb( int ft, int iBut, int iWdg );
+
+private slots:
+ void computeAspectRatio();
+ void computeAspectRatio3D();
+ void computeFreeNodesInfo();
+ void computeDoubleNodesInfo();
+ void computeDoubleEdgesInfo();
+ void computeDoubleFacesInfo();
+ void computeOverConstrainedFacesInfo();
+ void computeDoubleVolumesInfo();
+ void computeOverConstrainedVolumesInfo();
+ void setTolerance( const double theTolerance );
+
+
+private:
+ typedef SALOME::GenericObj_wrap< SMESH::Predicate > TPredicate;
+ typedef SALOME::GenericObj_wrap< SMESH::NumericalFunctor > TNumFunctor;
+ SMESH::SMESH_IDSource_var myObject;
+ ObjectType myObjectType;
+ SMESHGUI_SpinBox* myToleranceWidget;
+ QList<QLabel*> myWidgets;
+ QGridLayout* myMainLayout;
+ QwtPlot* myPlot;
+ QwtPlot* myPlot3D;
+ QList<QAbstractButton*> myButtons;
+ QList<TPredicate> myPredicates;
+ TNumFunctor myAspectRatio, myAspectRatio3D;
+};
+
class SMESHGUI_EXPORT SMESHGUI_MeshInfoDlg : public QDialog
{
Q_OBJECT;
enum {
BaseInfo, //!< base mesh information
ElemInfo, //!< mesh element information
- AddInfo //!< additional information
+ AddInfo, //!< additional information
+ CtrlInfo //!< controls information
};
SMESHGUI_MeshInfoDlg( QWidget* = 0, int = BaseInfo );
QLineEdit* myID;
SMESHGUI_ElemInfo* myElemInfo;
SMESHGUI_AddInfo* myAddInfo;
+ SMESHGUI_CtrlInfo* myCtrlInfo;
SMESH_Actor* myActor;
};
+class SMESHGUI_EXPORT SMESHGUI_CtrlInfoDlg : public QDialog
+{
+ Q_OBJECT;
+
+public:
+ SMESHGUI_CtrlInfoDlg( QWidget* = 0 );
+ ~SMESHGUI_CtrlInfoDlg();
+
+ void showInfo( const Handle(SALOME_InteractiveObject)& );
+ void reject();
+
+private slots:
+ void updateInfo();
+ void activate();
+ void deactivate();
+ void updateSelection();
+
+private:
+ SMESHGUI_CtrlInfo* myCtrlInfo;
+};
+
#endif // SMESHGUI_MESHINFO_H
if ( !p ) p = aStudy->FindComponent( "SMESH" );
if ( p ) {
_PTR(ChildIterator) iter = aStudy->NewChildIterator( p );
+ iter->InitEx(/*allLevels=*/true);
int idx = 0;
while( true ) {
bool found = false;
else if ( p=="groupType" ) val = QVariant( groupType( ind ) );
else if ( p=="quadratic2DMode") val = QVariant(quadratic2DMode(ind));
else if ( p=="isDistributionVisible") val = QVariant(isDistributionVisible(ind));
+ else if ( p=="hasChildren") val = QVariant(hasChildren(ind));
+ else if ( p=="nbChildren") val = QVariant(nbChildren(ind));
+ else if ( p=="isContainer") val = QVariant(isContainer(ind));
if( val.isValid() )
return val;
return QVariant( false );
}
+//=======================================================================
+//function : hasChildren
+//purpose :
+//=======================================================================
+
+bool SMESHGUI_Selection::hasChildren( int ind ) const
+{
+ if ( ind >= 0 )
+ {
+ _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() );
+ return SMESH::GetActiveStudyDocument()->GetUseCaseBuilder()->HasChildren( sobj );
+ }
+ return false;
+}
+
+//=======================================================================
+//function : hasChildren
+//purpose :
+//=======================================================================
+
+int SMESHGUI_Selection::nbChildren( int ind ) const
+{
+ int nb = 0;
+ if ( ind >= 0 )
+ {
+ _PTR(SObject) sobj = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() );
+ if ( sobj->GetStudy()->GetUseCaseBuilder()->IsUseCaseNode( sobj ) ) {
+ _PTR(UseCaseIterator) it = sobj->GetStudy()->GetUseCaseBuilder()->GetUseCaseIterator( sobj );
+ for (it->Init(false); it->More(); it->Next()) nb++;
+ }
+ }
+ return nb;
+}
+
+//=======================================================================
+//function : isContainer
+//purpose :
+//=======================================================================
+
+bool SMESHGUI_Selection::isContainer( int ind ) const
+{
+ return ind >= 0 && ind < myTypes.count() && myTypes[ind] == "Unknown";
+}
+
//=======================================================================
//function : type
//purpose :
SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( SMESH::SObjectToObject( SO ) );
if( !aMesh->_is_nil() )
{
- SALOME_MED::MedFileInfo_var inf = aMesh->GetMEDFileInfo();
+ SMESH::MedFileInfo_var inf = aMesh->GetMEDFileInfo();
res = strlen( (char*)inf->fileName ) > 0;
}
}
virtual QString quadratic2DMode(int ) const;
virtual bool isDistributionVisible(int ) const;
+ virtual bool hasChildren( int ) const;
+ virtual int nbChildren( int ) const;
+ virtual bool isContainer( int ) const;
// parameters got from actor return nothing if an actor is not visible
virtual QList<QVariant> elemTypes( int ) const;
#define SPACING 6
#define MARGIN 11
-//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
-#define WITHGENERICOBJ
//=================================================================================
// class : SMESHGUI_TranslationDlg()
switch ( actionButton ) {
case MOVE_ELEMS_BUTTON:
if(CheckBoxMesh->isChecked())
- for ( int i = 0; i < myObjects.count(); i++ ) {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
- myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
- aMeshEditor->TranslateObject(myObjects[i], aVector, false);
- }
+ for ( int i = 0; i < myObjects.count(); i++ ) {
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
+ myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ aMeshEditor->TranslateObject(myObjects[i], aVector, false);
+ }
else {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
- myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
+ myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
aMeshEditor->Translate(anElementsId, aVector, false);
- }
+ }
break;
case COPY_ELEMS_BUTTON:
if ( makeGroups ) {
SMESH::ListOfGroups_var groups;
if(CheckBoxMesh->isChecked()) {
- for ( int i = 0; i < myObjects.count(); i++ ) {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
- myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
- groups = aMeshEditor->TranslateObjectMakeGroups(myObjects[i],aVector);
- }
- }
+ for ( int i = 0; i < myObjects.count(); i++ ) {
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
+ myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ groups = aMeshEditor->TranslateObjectMakeGroups(myObjects[i],aVector);
+ }
+ }
else {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
- myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
+ myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
groups = aMeshEditor->TranslateMakeGroups(anElementsId, aVector);
- }
+ }
}
else {
if(CheckBoxMesh->isChecked()) {
- for ( int i = 0; i < myObjects.count(); i++ ) {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
- myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
- aMeshEditor->TranslateObject(myObjects[i], aVector, true);
- }
- }
+ for ( int i = 0; i < myObjects.count(); i++ ) {
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
+ myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ aMeshEditor->TranslateObject(myObjects[i], aVector, true);
+ }
+ }
else {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
- myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
+ myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
aMeshEditor->Translate(anElementsId, aVector, true);
- }
+ }
}
break;
case MAKE_MESH_BUTTON: {
SMESH::SMESH_Mesh_var mesh;
if (CheckBoxMesh->isChecked()) {
- for ( int i = 0; i < myObjects.count(); i++ ) {
- QString aName = SMESH::UniqueMeshName( LineEditNewMesh->text().replace( "*", myObjectsNames[i] ) );
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
- myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
- mesh = aMeshEditor->TranslateObjectMakeMesh(myObjects[i], aVector, makeGroups,
- aName.toLatin1().data());
- if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) )
- anEntryList.append( aSObject->GetID().c_str() );
-
-#ifdef WITHGENERICOBJ
- // obj has been published in study. Its refcount has been incremented.
- // It is safe to decrement its refcount
- // so that it will be destroyed when the entry in study will be removed
- mesh->UnRegister();
-#endif
- }
- }
- else {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
- myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
- mesh = aMeshEditor->TranslateMakeMesh(anElementsId, aVector, makeGroups,
+ for ( int i = 0; i < myObjects.count(); i++ ) {
+ QString aName = SMESH::UniqueMeshName( LineEditNewMesh->text().replace( "*", myObjectsNames[i] ) );
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditor();
+ myMeshes[i]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ mesh = aMeshEditor->TranslateObjectMakeMesh(myObjects[i], aVector, makeGroups,
+ aName.toLatin1().data());
+ if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) )
+ anEntryList.append( aSObject->GetID().c_str() );
+
+ // obj has been published in study. Its refcount has been incremented.
+ // It is safe to decrement its refcount
+ // so that it will be destroyed when the entry in study will be removed
+ mesh->UnRegister();
+ }
+ }
+ else {
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditor();
+ myMeshes[0]->SetParameters(aParameters.join( ":" ).toLatin1().constData());
+ mesh = aMeshEditor->TranslateMakeMesh(anElementsId, aVector, makeGroups,
LineEditNewMesh->text().toLatin1().data());
if( _PTR(SObject) aSObject = SMESH::ObjectToSObject( mesh ) )
anEntryList.append( aSObject->GetID().c_str() );
-
-#ifdef WITHGENERICOBJ
+
// obj has been published in study. Its refcount has been incremented.
// It is safe to decrement its refcount
// so that it will be destroyed when the entry in study will be removed
mesh->UnRegister();
-#endif
- }
- break;
+ }
+ break;
}
}
} catch (...) {
Handle(SALOME_InteractiveObject) IO = it.Value();
SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO( IO );
if ( aMesh->_is_nil() )
- return;
+ return;
SMESH_Actor* anActor = SMESH::FindActorByObject( aMesh );
if ( !anActor )
- anActor = SMESH::FindActorByEntry( IO->getEntry() );
+ anActor = SMESH::FindActorByEntry( IO->getEntry() );
if ( !anActor && !CheckBoxMesh->isChecked() )
- return;
+ return;
if ( !SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO )->_is_nil() ) {
- if ( _PTR(Study) aStudy = SMESH::GetActiveStudyDocument() ) {
- _PTR(SObject) obj = aStudy->FindObjectID( qPrintable( QString( IO->getEntry() ) ) );
- _PTR(GenericAttribute) anAttr;
- if ( obj && obj->FindAttribute( anAttr, "AttributeName" ) ) {
- _PTR(AttributeName) aNameAttr( anAttr );
- myObjects << SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO );
- myObjectsNames << aNameAttr->Value().c_str();
- myMeshes << aMesh;
- }
- }
+ if ( _PTR(Study) aStudy = SMESH::GetActiveStudyDocument() ) {
+ _PTR(SObject) obj = aStudy->FindObjectID( qPrintable( QString( IO->getEntry() ) ) );
+ _PTR(GenericAttribute) anAttr;
+ if ( obj && obj->FindAttribute( anAttr, "AttributeName" ) ) {
+ _PTR(AttributeName) aNameAttr( anAttr );
+ myObjects << SMESH::IObjectToInterface<SMESH::SMESH_IDSource>( IO );
+ myObjectsNames << aNameAttr->Value().c_str();
+ myMeshes << aMesh;
+ }
+ }
}
myActor = anActor;
if (CheckBoxMesh->isChecked()) {
SMESH::GetNameOfSelectedIObjects( mySelectionMgr, aString );
if (myMeshes.isEmpty())
- return;
+ return;
} else {
aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, aList.First(), aString);
myElementsId = aString;
bool copy = ( ActionGroup->checkedId() == COPY_ELEMS_BUTTON ||
ActionGroup->checkedId() == MAKE_MESH_BUTTON );
SUIT_OverrideCursor aWaitCursor;
- QList<SMESH::MeshPreviewStruct_var> aMeshPreviewStruct;
+ QList<SMESH::MeshPreviewStruct_var> aMeshPreviewStruct;
if(CheckBoxMesh->isChecked())
- for ( int i = 0; i < myObjects.count(); i++ ) {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditPreviewer();
- aMeshEditor->TranslateObject(myObjects[i], aVector, copy);
- aMeshPreviewStruct << aMeshEditor->GetPreviewData();
- }
+ for ( int i = 0; i < myObjects.count(); i++ ) {
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[i]->GetMeshEditPreviewer();
+ aMeshEditor->TranslateObject(myObjects[i], aVector, copy);
+ aMeshPreviewStruct << aMeshEditor->GetPreviewData();
+ }
else {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditPreviewer();
+ SMESH::SMESH_MeshEditor_var aMeshEditor = myMeshes[0]->GetMeshEditPreviewer();
aMeshEditor->Translate(anElementsId, aVector, copy);
- aMeshPreviewStruct << aMeshEditor->GetPreviewData();
- }
- setSimulationPreview( aMeshPreviewStruct );
+ aMeshPreviewStruct << aMeshEditor->GetPreviewData();
+ }
+ setSimulationPreview( aMeshPreviewStruct );
} catch (...) {
}
<source>ICON_CONNECTION_2D</source>
<translation>mesh_multi_edges_2d.png</translation>
</message>
- <message>
+ <message>
<source>ICON_CREATE_GROUP</source>
<translation>mesh_group.png</translation>
</message>
<source>ICON_FREE_EDGE</source>
<translation>mesh_free_edges.png</translation>
</message>
- <message>
+ <message>
<source>ICON_FREE_EDGE_2D</source>
<translation>mesh_free_edges_2d.png</translation>
</message>
- <message>
+ <message>
<source>ICON_FREE_NODE</source>
<translation>mesh_free_nodes.png</translation>
</message>
<source>ICON_REORIENT_2D</source>
<translation>reorient_faces_face.png</translation>
</message>
- <message>
+ <message>
<source>ICON_SMESH_DUPLICATE_NODES</source>
<translation>mesh_duplicate_nodes.png</translation>
</message>
- <message>
+ <message>
<source>ICON_SMESH_DUPLICATE_NODES_WITH_ELEM</source>
<translation>mesh_duplicate_nodes_with_elem.png</translation>
+ </message>
+ <message>
+ <source>ICON_SMESH_DUPLICATE_ELEM_ONLY</source>
+ <translation>mesh_duplicate_elem_only.png</translation>
</message>
<message>
<source>ICON_SMESH_TREE_ALGO</source>
<source>MEN_RESET</source>
<translation>Reset</translation>
</message>
+ <message>
+ <source>MEN_OVERALL_MESH_QUALITY</source>
+ <translation>Overall Mesh Quality</translation>
+ </message>
<message>
<source>MEN_DISTRIBUTION_CTRL</source>
<translation>Distribution</translation>
</message>
<message>
<source>MEN_DUPLICATE_NODES</source>
- <translation>Duplicate Nodes</translation>
+ <translation>Duplicate Nodes or/and Elements</translation>
</message>
<message>
<source>MEN_TRANSF</source>
<source>SMESH_AUTO_GROUPS</source>
<translation>Automatically create groups</translation>
</message>
+ <message>
+ <source>SMESH_AUTO_DIM</source>
+ <translation>Automatically define space dimension</translation>
+ </message>
<message>
<source>SMESH_REQUIRED_GROUPS</source>
<translation>Create groups of required entities</translation>
</message>
<message>
<source>SMESH_DUPLICATE_TITLE</source>
- <translation>Duplicate Nodes</translation>
+ <translation>Duplicate Nodes and/or Elements</translation>
</message>
<message>
<source>SMESH_SCALE</source>
<source>SMESH_WRN_SIZE_LIMIT_EXCEEDED</source>
<translation>No automatic update of the presentation has been done: new mesh size (%1 elements) exceeds current size limit (%2 elements).
Please check preferences of Mesh module.
+</translation>
+ </message>
+ <message>
+ <source>SMESH_WRN_SIZE_INC_LIMIT_EXCEEDED</source>
+ <translation>New mesh sise (%1 elements) exceeds current size limit (%2 elements).
+Not all mesh elements are shown. Please check preferences of Mesh module.
</translation>
</message>
<message>
</message>
<message>
<source>STB_DUPLICATE_NODES</source>
- <translation>Duplicate Nodes</translation>
+ <translation>Duplicate Nodes or/and Elements</translation>
</message>
<message>
<source>STB_TRANSP</source>
</message>
<message>
<source>TOP_DUPLICATE_NODES</source>
- <translation>Duplicate Nodes</translation>
+ <translation>Duplicate Nodes or/and Elements</translation>
</message>
<message>
<source>TOP_TRANSP</source>
<translation>Selected object has been used to create another one.
It can't be deleted </translation>
</message>
+ <message>
+ <source>SMESH_FREERAM</source>
+ <translation>Free RAM</translation>
+ </message>
+ <message>
+ <source>SMESH_GIGABYTE</source>
+ <translation>%1 GB</translation>
+ </message>
+ <message>
+ <source>MEN_SORT_CHILD_ITEMS</source>
+ <translation>Sort children</translation>
+ </message>
+ <message>
+ <source>STB_SORT_CHILD_ITEMS</source>
+ <translation>Sort child items</translation>
+ </message>
</context>
<context>
<name>SMESHGUI_Dialog</name>
<source>PREF_UPDATE_LIMIT_NOLIMIT</source>
<translation>No limit</translation>
</message>
+ <message>
+ <source>PREF_INCREMENTAL_LIMIT</source>
+ <translation>Incremental limit check</translation>
+ </message>
<message>
<source>PREF_BACKFACE</source>
<translation>Back surface color</translation>
<source>PREF_DUMP_ADD_INFO</source>
<translation>Dump additional information</translation>
</message>
+ <message>
+ <source>PREF_DUMP_CTRL_INFO</source>
+ <translation>Dump controls information</translation>
+ </message>
<message>
<source>PREF_GPP_NODES_LIMIT</source>
<translation>Automatic nodes compute limit</translation>
</message>
+ <message>
+ <source>PREF_CTRL_LIMIT</source>
+ <translation>Automatic controls compute limit</translation>
+ </message>
<message>
<source>SMESH_PREF_GROUP_PRECISION</source>
<translation>Input fields precision</translation>
<translation>Bad Mesh to Group</translation>
</message>
</context>
+<context>
+ <name>SMESHGUI_ComputeDlg_QThreadQDialog</name>
+ <message>
+ <source>CANCEL</source>
+ <translation>Cancel</translation>
+ </message>
+ <message>
+ <source>CANCELING</source>
+ <translation>Canceling...</translation>
+ </message>
+ <message>
+ <source>TITLE</source>
+ <translation>Compute</translation>
+ </message>
+</context>
<context>
<name>SMESHGUI_PrecomputeDlg</name>
<message>
</message>
<message>
<source>DUPLICATION_WITHOUT_ELEMS</source>
- <translation>Without duplication of border elements</translation>
+ <translation>Duplicate nodes only</translation>
</message>
<message>
<source>GROUP_NODES_TO_DUPLICATE</source>
</message>
<message>
<source>DUPLICATION_WITH_ELEMS</source>
- <translation>With duplication of border elements</translation>
+ <translation>Duplicate nodes and border elements</translation>
+ </message>
+ <message>
+ <source>DUPLICATION_ONLY_ELEMS</source>
+ <translation>Duplicate elements only</translation>
</message>
<message>
<source>GROUP_ELEMS_TO_DUPLICATE</source>
<source>ADDITIONAL_INFO</source>
<translation>Additional Info</translation>
</message>
+ <message>
+ <source>CTRL_INFO</source>
+ <translation>Quality Info</translation>
+ </message>
<message>
<source>NODE_MODE</source>
<translation>Node</translation>
<translation>Vertex</translation>
</message>
</context>
+<context>
+ <name>SMESHGUI_CtrlInfo</name>
+ <message>
+ <source>CTRL_INFO</source>
+ <translation>Quality information</translation>
+ </message>
+ <message>
+ <source>NAME_LAB</source>
+ <translation>Name:</translation>
+ </message>
+ <message>
+ <source>VALUE</source>
+ <translation>Value</translation>
+ </message>
+ <message>
+ <source>BUT_COMPUTE</source>
+ <translation>Compute</translation>
+ </message>
+ <message>
+ <source>NODES_INFO</source>
+ <translation>Nodes Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_FREE_NODES</source>
+ <translation>Number of the free nodes</translation>
+ </message>
+ <message>
+ <source>DOUBLE_NODES_TOLERANCE</source>
+ <translation>Double nodes tolerance</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_NODES</source>
+ <translation>Number of the double nodes</translation>
+ </message>
+ <message>
+ <source>EDGES_INFO</source>
+ <translation>Edges Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_EDGES</source>
+ <translation>Number of the double edges</translation>
+ </message>
+ <message>
+ <source>FACES_INFO</source>
+ <translation>Faces Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_FACES</source>
+ <translation>Number of the double faces</translation>
+ </message>
+ <message>
+ <source>ASPECT_RATIO_HISTOGRAM</source>
+ <translation>Aspect Ratio histogram</translation>
+ </message>
+ <message>
+ <source>VOLUMES_INFO</source>
+ <translation>Volumes Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_VOLUMES</source>
+ <translation>Number of the double volumes</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_OVER_CONSTRAINED</source>
+ <translation>Number of the over-constrained</translation>
+ </message>
+ <message>
+ <source>ASPECT_RATIO_3D_HISTOGRAM</source>
+ <translation>Aspect Ratio 3D histogram</translation>
+ </message>
+</context>
+<context>
+ <name>SMESHGUI_CtrlInfoDlg</name>
+ <message>
+ <source>CTRL_INFO</source>
+ <translation>Quality Info</translation>
+ </message>
+</context>
<context>
<name>SMESHGUI_MinDistance</name>
<message>
<TS version="2.0" language="fr_FR">
<context>
<name>@default</name>
+ <message>
+ <source>SMESH_GIGABYTE</source>
+ <translation type="unfinished">%1 GB</translation>
+ </message>
+ <message>
+ <source>SMESH_FREERAM</source>
+ <translation type="unfinished">Free RAM</translation>
+ </message>
+ <message>
+ <source>STB_BIQUADRATIC_TRIANGLE</source>
+ <translation type="unfinished">BiQuadratic Triangle</translation>
+ </message>
+ <message>
+ <source>TOP_BIQUADRATIC_TRIANGLE</source>
+ <translation type="unfinished">BiQuadratic Triangle</translation>
+ </message>
+ <message>
+ <source>MEN_BIQUADRATIC_TRIANGLE</source>
+ <translation type="unfinished">BiQuadratic Triangle</translation>
+ </message>
+ <message>
+ <source>SMESH_BIQUADRATIC_TRIANGLES</source>
+ <translation type="unfinished">BiQuadratic Triangles</translation>
+ </message>
+ <message>
+ <source>SMESH_BIQUADRATIC_TRIANGLE</source>
+ <translation type="unfinished">BiQuadratic Triangle</translation>
+ </message>
+ <message>
+ <source>SMESH_AUTO_DIM</source>
+ <translation type="unfinished">Automatically define space dimension</translation>
+ </message>
+ <message>
+ <source>SMESH_ADD_BIQUADRATIC_TRIANGLE_TITLE</source>
+ <translation type="unfinished">Add BiQuadratic Triangle</translation>
+ </message>
+ <message>
+ <source>COMPERR_WARNING</source>
+ <translation type="unfinished">Warning</translation>
+ </message>
<message>
<source>SMESH_EXPORT_MESH</source>
<translation>Exporter le maillage</translation>
<source>MEN_RESET</source>
<translation>Restaurer</translation>
</message>
+ <message>
+ <source>MEN_OVERALL_MESH_QUALITY</source>
+ <translation type="unfinished">Overall Mesh Quality</translation>
+ </message>
<message>
<source>MEN_DISTRIBUTION_CTRL</source>
<translation>Distribution</translation>
<source>SMESH_WRN_SIZE_LIMIT_EXCEEDED</source>
<translation>La présentation n'a pas été mise à jour automatiquement: la nouvelle taille du maillage (%1 éléments) dépasse la limite de taille actuelle (%2 éléments).
Vérifiez la limite dans les préférences du module Mesh.
+</translation>
+ </message>
+ <message>
+ <source>SMESH_WRN_SIZE_INC_LIMIT_EXCEEDED</source>
+ <translation type="unfinished">New mesh sise (%1 elements) exceeds current size limit (%2 elements).
+Not all mesh elements are shown. Please check preferences of Mesh module.
</translation>
</message>
<message>
<translation>L'objet sélectionné a été utilisé pour en créer un autre.
Il ne peut pas être supprimé.</translation>
</message>
+ <message>
+ <source>MEN_SORT_CHILD_ITEMS</source>
+ <translation type="unfinished">Sort children</translation>
+ </message>
+ <message>
+ <source>STB_SORT_CHILD_ITEMS</source>
+ <translation type="unfinished">Sort child items</translation>
+ </message>
</context>
<context>
<name>SMESHGUI_Dialog</name>
<source>PREF_UPDATE_LIMIT_NOLIMIT</source>
<translation>Sans limite</translation>
</message>
+ <message>
+ <source>PREF_INCREMENTAL_LIMIT</source>
+ <translation type="unfinished">Incremental limit check</translation>
+ </message>
<message>
<source>PREF_BACKFACE</source>
<translation>Couleur de face arrière</translation>
<source>PREF_DUMP_ADD_INFO</source>
<translation>Copier les informations additionelles</translation>
</message>
+ <message>
+ <source>PREF_DUMP_CTRL_INFO</source>
+ <translation type="unfinished">Dump controls information</translation>
+ </message>
<message>
<source>PREF_GPP_NODES_LIMIT</source>
<translation>Calcul automatique du nombre de nœuds: limite</translation>
</message>
+ <message>
+ <source>PREF_CTRL_LIMIT</source>
+ <translation type="unfinished">Automatic controls compute limit</translation>
+ </message>
<message>
<source>SMESH_PREF_GROUP_PRECISION</source>
<translation>Précision des champs d'entrée</translation>
</context>
<context>
<name>SMESHGUI_AddQuadraticElementDlg</name>
+ <message>
+ <source>SMESH_ADD_BIQUADRATIC_TRIANGLE</source>
+ <translation type="unfinished">Add BiQuadratic Triangle</translation>
+ </message>
<message>
<source>SMESH_ADD_QUADRATIC_EDGE</source>
<translation>Ajouter une arête quadratique</translation>
</context>
<context>
<name>SMESHGUI_ComputeDlg</name>
+ <message>
+ <source>GROUP_OF_BAD_MESH</source>
+ <translation type="unfinished">Bad Mesh to Group</translation>
+ </message>
<message>
<source>CAPTION</source>
<translation>Le calcul du maillage a échoué</translation>
</context>
<context>
<name>SMESHGUI_CuttingOfQuadsDlg</name>
+ <message>
+ <source>TO_4_TRIA</source>
+ <translation type="unfinished">Cut into 4 triangles</translation>
+ </message>
<message>
<source>CAPTION</source>
<translation>Découpe des quadrangles</translation>
</context>
<context>
<name>SMESHGUI_FilterTable</name>
+ <message>
+ <source>ENTITY_TYPE_24</source>
+ <translation type="unfinished">BALL</translation>
+ </message>
+ <message>
+ <source>ENTITY_TYPE_23</source>
+ <translation type="unfinished">QPOLYEDRE</translation>
+ </message>
+ <message>
+ <source>ENTITY_TYPE_1</source>
+ <translation type="unfinished">POINT1</translation>
+ </message>
+ <message>
+ <source>CONNECTED_ELEMS</source>
+ <translation type="unfinished">Elements of a domain</translation>
+ </message>
<message>
<source>ADD</source>
<translation>Ajouter</translation>
</context>
<context>
<name>SMESHGUI_DuplicateNodesDlg</name>
+ <message>
+ <source>DUPLICATION_ONLY_ELEMS</source>
+ <translation type="unfinished">Duplicate elements only</translation>
+ </message>
<message>
<source>DUPLICATION_MODE</source>
<translation>Mode de duplication</translation>
<source>ADDITIONAL_INFO</source>
<translation>Infos détaillées</translation>
</message>
+ <message>
+ <source>CTRL_INFO</source>
+ <translation type="unfinished">Quality Info</translation>
+ </message>
<message>
<source>NODE_MODE</source>
<translation>Nœud</translation>
<translation>Point</translation>
</message>
</context>
+<context>
+ <name>SMESHGUI_CtrlInfo</name>
+ <message>
+ <source>CTRL_INFO</source>
+ <translation type="unfinished">Quality information</translation>
+ </message>
+ <message>
+ <source>NAME_LAB</source>
+ <translation type="unfinished">Name:</translation>
+ </message>
+ <message>
+ <source>VALUE</source>
+ <translation type="unfinished">Value</translation>
+ </message>
+ <message>
+ <source>BUT_COMPUTE</source>
+ <translation type="unfinished">Compute</translation>
+ </message>
+ <message>
+ <source>NODES_INFO</source>
+ <translation type="unfinished">Nodes Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_FREE_NODES</source>
+ <translation type="unfinished">Number of the free nodes</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_NODES</source>
+ <translation type="unfinished">Number of the double nodes</translation>
+ </message>
+ <message>
+ <source>DOUBLE_NODES_TOLERANCE</source>
+ <translation>Tolérance des nœuds doubles</translation>
+ </message>
+ <message>
+ <source>EDGES_INFO</source>
+ <translation type="unfinished">Edges Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_EDGES</source>
+ <translation type="unfinished">Number of the double edges</translation>
+ </message>
+ <message>
+ <source>FACES_INFO</source>
+ <translation type="unfinished">Faces Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_FACES</source>
+ <translation type="unfinished">Number of the double faces</translation>
+ </message>
+ <message>
+ <source>ASPECT_RATIO_HISTOGRAM</source>
+ <translation type="unfinished">Aspect Ratio histogram</translation>
+ </message>
+ <message>
+ <source>VOLUMES_INFO</source>
+ <translation type="unfinished">Volumes Information:</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_DOUBLE_VOLUMES</source>
+ <translation type="unfinished">Number of the double volumes</translation>
+ </message>
+ <message>
+ <source>NUMBER_OF_THE_OVER_CONSTRAINED</source>
+ <translation type="unfinished">Number of the over-constrained</translation>
+ </message>
+ <message>
+ <source>ASPECT_RATIO_3D_HISTOGRAM</source>
+ <translation type="unfinished">Aspect Ratio 3D histogram</translation>
+ </message>
+</context>
+<context>
+ <name>SMESHGUI_CtrlInfoDlg</name>
+ <message>
+ <source>CTRL_INFO</source>
+ <translation type="unfinished">Quality Info</translation>
+ </message>
+</context>
<context>
<name>SMESHGUI_MinDistance</name>
<message>
<translation>Coef de réduction:</translation>
</message>
</context>
+<context>
+ <name>SMESHGUI_ComputeDlg_QThreadQDialog</name>
+ <message>
+ <source>TITLE</source>
+ <translation type="unfinished">Compute</translation>
+ </message>
+ <message>
+ <source>CANCELING</source>
+ <translation type="unfinished">Canceling...</translation>
+ </message>
+ <message>
+ <source>CANCEL</source>
+ <translation type="unfinished">Cancel</translation>
+ </message>
+</context>
</TS>
start.SetCoord( iParam, sumParam / 4.);
}
if ( needGrid ) {
- // compute nodes of 3 x 3 x 3 grid
+ // compute nodes of 10 x 10 x 10 grid
int iNode = 0;
Bnd_Box box;
- for ( double x = 0.25; x < 0.9; x += 0.25 )
- for ( double y = 0.25; y < 0.9; y += 0.25 )
- for ( double z = 0.25; z < 0.9; z += 0.25 ) {
+ for ( double x = 0.05; x < 1.; x += 0.1 )
+ for ( double y = 0.05; y < 1.; y += 0.1 )
+ for ( double z = 0.05; z < 1.; z += 0.1 ) {
TxyzPair & prmPtn = my3x3x3GridNodes[ iNode++ ];
prmPtn.first.SetCoord( x, y, z );
ShellPoint( prmPtn.first, prmPtn.second );
{
double minDist = DBL_MAX;
gp_XYZ* bestParam = 0;
- for ( int iNode = 0; iNode < 27; iNode++ ) {
+ for ( int iNode = 0; iNode < 1000; iNode++ ) {
TxyzPair & prmPtn = my3x3x3GridNodes[ iNode ];
double dist = ( thePoint.XYZ() - prmPtn.second ).SquareModulus();
if ( dist < minDist ) {
<< " ------ NB IT: " << myNbIterations << ", SUM DIST: " << mySumDist );
#endif
+ const double reachedDist = sqrt( sqDistance );
+ if ( reachedDist > 1000 * myTolerance &&
+ computeParameters( thePoint, theParams, solution ) &&
+ reachedDist > distance() )
+ return true;
+
theParams = solution;
if ( myFaceIndex > 0 )
double myValues[ 4 ]; // values computed at myParam: square distance and 3 derivatives
typedef std::pair<gp_XYZ,gp_XYZ> TxyzPair;
- TxyzPair my3x3x3GridNodes[ 27 ]; // to compute the first param guess
+ TxyzPair my3x3x3GridNodes[ 1000 ]; // to compute the first param guess
bool myGridComputed;
};
SMESH_Hypothesis_i.hxx \
SMESH_PythonDump.hxx \
SMESH_Group_i.hxx \
- SMESH_MEDMesh_i.hxx \
SMESH_Filter_i.hxx \
SMESH_MeshEditor_i.hxx \
- SMESH_MEDFamily_i.hxx \
- SMESH_MEDSupport_i.hxx \
SMESH_Pattern_i.hxx \
SMESH_2smeshpy.hxx \
SMESH_NoteBook.hxx \
SMESH_Gen_i_1.cxx \
SMESH_DumpPython.cxx \
SMESH_Mesh_i.cxx \
- SMESH_MEDMesh_i.cxx \
- SMESH_MEDFamily_i.cxx \
- SMESH_MEDSupport_i.cxx \
SMESH_subMesh_i.cxx \
SMESH_MeshEditor_i.cxx \
SMESH_Hypothesis_i.cxx \
$(BOOST_CPPFLAGS) \
$(KERNEL_CXXFLAGS) \
$(GUI_CXXFLAGS) \
- $(MED_CXXFLAGS) \
$(GEOM_CXXFLAGS) \
-I$(srcdir)/../Controls \
-I$(srcdir)/../SMDS \
-I$(srcdir)/../SMESHDS \
+ -I$(srcdir)/../MEDWrapper/Base \
+ -I$(srcdir)/../MEDWrapper/Factory \
-I$(srcdir)/../Driver \
-I$(srcdir)/../DriverMED \
-I$(srcdir)/../DriverCGNS \
-lSalomeGenericObj \
-lSalomeIDLKernel \
-lSALOMELocalTrace \
- $(MED_LDFLAGS) \
- -lMEDWrapper \
- -lMEDWrapper_V2_2 \
- -lSalomeIDLMED \
$(CAS_LDPATH) \
-lTKCDF \
-lTKBO \
cmd->Clear();
return;
}
- // comment a command having not created args
- for ( int iArg = cmd->GetNbArgs(); iArg; --iArg )
+ // check if an Object was created in the script
+ _AString comment;
+ const _pyID& obj = cmd->GetObject();
+ if ( !obj.IsEmpty() && cmd->IsStudyEntry( obj ) && !presentObjects.count( obj ))
+ {
+ comment = "not created Object";
+ theGen->ObjectCreationRemoved( obj );
+ }
+ // check if a command has not created args
+ for ( int iArg = cmd->GetNbArgs(); iArg && comment.IsEmpty(); --iArg )
{
const _pyID& arg = cmd->GetArg( iArg );
if ( arg.IsEmpty() || arg.Value( 1 ) == '"' || arg.Value( 1 ) == '\'' )
for ( ; id != idList.end(); ++id )
if ( !theGen->IsGeomObject( *id ) && !presentObjects.count( *id ))
{
- cmd->Comment();
- cmd->GetString() += " ### " ;
- cmd->GetString() += *id + " has not been yet created";
- for ( int i = 0; i < cmd->GetNbResultValues(); i++ ) {
- _pyID objID = cmd->GetResultValue( i+1 );
- theGen->ObjectCreationRemoved( objID ); // objID.SetName( name ) is not needed
- }
- return;
+ comment += *id + " has not been yet created";
+ break;
}
}
- // comment a command having not created Object
- const _pyID& obj = cmd->GetObject();
- if ( !obj.IsEmpty() && cmd->IsStudyEntry( obj ) && !presentObjects.count( obj ))
+ // treat result objects
+ const _pyID& result = cmd->GetResultValue();
+ if ( !result.IsEmpty() && result.Value( 1 ) != '"' && result.Value( 1 ) != '\'' )
+ {
+ list< _pyID > idList = cmd->GetStudyEntries( result );
+ list< _pyID >::iterator id = idList.begin();
+ for ( ; id != idList.end(); ++id )
+ if ( comment.IsEmpty() )
+ presentObjects.insert( *id );
+ else
+ theGen->ObjectCreationRemoved( *id ); // objID.SetName( name ) is not needed
+ }
+ // comment the command
+ if ( !comment.IsEmpty() )
{
cmd->Comment();
- cmd->GetString() += " ### not created object" ;
- for ( int i = 0; i < cmd->GetNbResultValues(); i++ ) {
- _pyID objID = cmd->GetResultValue( i+1 );
- theGen->ObjectCreationRemoved( objID ); // objID.SetName( name ) is not needed
- }
+ cmd->GetString() += " ### ";
+ cmd->GetString() += comment;
}
- const _pyID& result = cmd->GetResultValue();
- if ( result.IsEmpty() || result.Value( 1 ) == '"' || result.Value( 1 ) == '\'' )
- return;
- list< _pyID > idList = cmd->GetStudyEntries( result );
- list< _pyID >::iterator id = idList.begin();
- for ( ; id != idList.end(); ++id )
- presentObjects.insert( *id );
}
//================================================================================
undef2newItems[ 44 ].push_back( 37 );
undef2newItems[ 45 ].push_back( 36 );
undef2newItems[ 46 ].push_back( 39 );
+
+ ASSERT( undef2newItems.rbegin()->first == SMESH::FT_Undefined );
}
int iType = Type.IntegerValue();
BinaryOp = TCollection_AsciiString( iBinaryOp );
}
}
+
+ //================================================================================
+ /*!
+ * \brief Replaces "SMESH.PointStruct(x,y,z)" and "SMESH.DirStruct( SMESH.PointStruct(x,y,z))"
+ * arguments of a given command by a list "[x,y,z]" if the list is accesible
+ * type of argument.
+ */
+ //================================================================================
+
+ void StructToList( Handle( _pyCommand)& theCommand )
+ {
+ static TStringSet methodsAcceptingList;
+ if ( methodsAcceptingList.empty() ) {
+ const char * methodNames[] = {
+ "GetCriterion","Reorient2D","ExtrusionSweep","ExtrusionSweepMakeGroups0D",
+ "ExtrusionSweepMakeGroups","ExtrusionSweep0D",
+ "AdvancedExtrusion","AdvancedExtrusionMakeGroups",
+ "ExtrusionSweepObject","ExtrusionSweepObject0DMakeGroups",
+ "ExtrusionSweepObjectMakeGroups","ExtrusionSweepObject0D",
+ "ExtrusionSweepObject1D","ExtrusionSweepObject1DMakeGroups",
+ "ExtrusionSweepObject2D","ExtrusionSweepObject2DMakeGroups",
+ "Translate","TranslateMakeGroups","TranslateMakeMesh",
+ "TranslateObject","TranslateObjectMakeGroups", "TranslateObjectMakeMesh"
+ ,"" }; // <- mark of the end
+ methodsAcceptingList.Insert( methodNames );
+ }
+ if ( methodsAcceptingList.Contains( theCommand->GetMethod() ))
+ {
+ for ( int i = theCommand->GetNbArgs(); i > 0; --i )
+ {
+ const _AString & arg = theCommand->GetArg( i );
+ if ( arg.Search( "SMESH.PointStruct" ) == 1 ||
+ arg.Search( "SMESH.DirStruct" ) == 1 )
+ {
+ Handle(_pyCommand) workCmd = new _pyCommand( arg );
+ if ( workCmd->GetNbArgs() == 1 ) // SMESH.DirStruct( SMESH.PointStruct(x,y,z))
+ {
+ workCmd = new _pyCommand( workCmd->GetArg( 1 ) );
+ }
+ if ( workCmd->GetNbArgs() == 3 ) // SMESH.PointStruct(x,y,z)
+ {
+ _AString newArg = "[ ";
+ newArg += ( workCmd->GetArg( 1 ) + ", " +
+ workCmd->GetArg( 2 ) + ", " +
+ workCmd->GetArg( 3 ) + " ]");
+ theCommand->SetArg( i, newArg );
+ }
+ }
+ }
+ }
+ }
+ //================================================================================
+ /*!
+ * \brief Replaces "mesh.GetIDSource([id1,id2])" argument of a given command by
+ * a list "[id1,id2]" if the list is an accesible type of argument.
+ */
+ //================================================================================
+
+ void GetIDSourceToList( Handle( _pyCommand)& theCommand )
+ {
+ static TStringSet methodsAcceptingList;
+ if ( methodsAcceptingList.empty() ) {
+ const char * methodNames[] = {
+ "ExportPartToMED","ExportPartToDAT","ExportPartToUNV","ExportPartToSTL",
+ "ExportCGNS","ExportGMF",
+ "Create0DElementsOnAllNodes","Reorient2D","QuadTo4Tri",
+ "ScaleMakeGroups","Scale","ScaleMakeMesh",
+ "FindCoincidentNodesOnPartBut","DoubleElements"
+ ,"" }; // <- mark of the end
+ methodsAcceptingList.Insert( methodNames );
+ }
+ if ( methodsAcceptingList.Contains( theCommand->GetMethod() ))
+ {
+ for ( int i = theCommand->GetNbArgs(); i > 0; --i )
+ {
+ _pyCommand argCmd( theCommand->GetArg( i ));
+ if ( argCmd.GetMethod() == "GetIDSource" &&
+ argCmd.GetNbArgs() == 2 )
+ {
+ theCommand->SetArg( i, argCmd.GetArg( 1 ));
+ }
+ }
+ }
+ }
}
//================================================================================
PlaceSubmeshAfterItsCreation( aCommand );
}
+ // Method( SMESH.PointStruct(x,y,z) -> Method( [x,y,z]
+ StructToList( aCommand );
+
// Find an object to process theCommand
// SMESH_Gen method?
if ( objID == this->GetID() || objID == SMESH_2smeshpy::GenName())
{
this->Process( aCommand );
+ addFilterUser( aCommand, theGen ); // protect filters from clearing
return aCommand;
}
myObjects.insert( make_pair( subMeshID, subMesh ));
}
+ // Method( mesh.GetIDSource([id1,id2]) -> Method( [id1,id2]
+ GetIDSourceToList( aCommand );
+
+ addFilterUser( aCommand, theGen ); // protect filters from clearing
+
id_mesh->second->Process( aCommand );
id_mesh->second->AddProcessedCmd( aCommand );
return aCommand;
map< _pyID, Handle(_pyMeshEditor) >::iterator id_editor = myMeshEditors.find( objID );
if ( id_editor != myMeshEditors.end() )
{
+ // Method( mesh.GetIDSource([id1,id2]) -> Method( [id1,id2]
+ GetIDSourceToList( aCommand );
+
+ addFilterUser( aCommand, theGen ); // protect filters from clearing
+
const TCollection_AsciiString& method = aCommand->GetMethod();
// some commands of SMESH_MeshEditor create meshes and groups
UnaryOp = SMESH + SMESH::FunctorTypeToString( SMESH::FunctorType( UnaryOp.IntegerValue() ));
BinaryOp = SMESH + SMESH::FunctorTypeToString( SMESH::FunctorType( BinaryOp.IntegerValue() ));
+ if ( Compare == "SMESH.FT_EqualTo" )
+ Compare = "'='";
+
aCommand->RemoveArgs();
aCommand->SetObject( SMESH_2smeshpy::GenName() );
aCommand->SetMethod( "GetCriterion" );
(*pos)->SetOrderNb( i++ );
}
+//================================================================================
+/*!
+ * \brief Call _pyFilter.AddUser() if a filter is used as a command arg
+ */
+//================================================================================
+
+void _pyGen::addFilterUser( Handle(_pyCommand)& theCommand, const Handle(_pyObject)& user )
+{
+ const char filterPrefix[] = "aFilter0x";
+ if ( theCommand->GetString().Search( filterPrefix ) < 1 )
+ return;
+
+ for ( int i = theCommand->GetNbArgs(); i > 0; --i )
+ {
+ const _AString & arg = theCommand->GetArg( i );
+ // NOT TREATED CASE: arg == "[something, aFilter0x36a2f60]"
+ if ( arg.Search( filterPrefix ) != 1 )
+ continue;
+
+ Handle(_pyFilter) filter = Handle(_pyFilter)::DownCast( FindObject( arg ));
+ if ( !filter.IsNull() )
+ {
+ filter->AddUser( user );
+ if ( !filter->GetNewID().IsEmpty() )
+ theCommand->SetArg( i, filter->GetNewID() );
+ }
+ }
+}
+
//================================================================================
/*!
* \brief Set command be last in list of commands
// ----------------------------------------------------------------------
else if ( theCommand->MethodStartsFrom( "Export" ))
{
- if ( method == "ExportToMED" || // ExportToMED() --> ExportMED()
- method == "ExportToMEDX" ) { // ExportToMEDX() --> ExportMED()
+ if ( method == "ExportToMED" || // ExportToMED() --> ExportMED()
+ method == "ExportToMEDX" ) // ExportToMEDX() --> ExportMED()
+ {
theCommand->SetMethod( "ExportMED" );
+ if ( theCommand->GetNbArgs() == 5 )
+ {
+ // ExportToMEDX(...,autoDimension) -> ExportToMEDX(...,meshPart=None,autoDimension)
+ _AString autoDimension = theCommand->GetArg( 5 );
+ theCommand->SetArg( 5, "None" );
+ theCommand->SetArg( 6, autoDimension );
+ }
}
else if ( method == "ExportCGNS" )
{ // ExportCGNS(part, ...) -> ExportCGNS(..., part)
TCollection_AsciiString newMethod = method;
newMethod.Remove( 7, 6 );
theCommand->SetMethod( newMethod );
- // make the 1st arg be the last one
+ // make the 1st arg be the last one (or last but one for ExportMED())
_pyID partID = theCommand->GetArg( 1 );
- int nbArgs = theCommand->GetNbArgs();
+ int nbArgs = theCommand->GetNbArgs() - (newMethod == "ExportMED");
for ( int i = 2; i <= nbArgs; ++i )
theCommand->SetArg( i-1, theCommand->GetArg( i ));
theCommand->SetArg( nbArgs, partID );
void _pyMeshEditor::Process( const Handle(_pyCommand)& theCommand)
{
- // names of SMESH_MeshEditor methods fully equal to methods of the python class Mesh, so
- // commands calling this methods are converted to calls of Mesh methods
+ // Names of SMESH_MeshEditor methods fully equal to methods of the python class Mesh, so
+ // commands calling these methods are converted to calls of Mesh methods without
+ // additional modifs, only object is changed from MeshEditor to Mesh.
static TStringSet sameMethods;
if ( sameMethods.empty() ) {
const char * names[] = {
- "RemoveElements","RemoveNodes","RemoveOrphanNodes","AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall",
- "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces","MoveNode", "MoveClosestNodeToPoint",
+ "RemoveElements","RemoveNodes","RemoveOrphanNodes",
+ "AddNode","Add0DElement","AddEdge","AddFace","AddPolygonalFace","AddBall",
+ "AddVolume","AddPolyhedralVolume","AddPolyhedralVolumeByFaces",
+ "MoveNode", "MoveClosestNodeToPoint",
"InverseDiag","DeleteDiag","Reorient","ReorientObject",
"TriToQuad","TriToQuadObject", "QuadTo4Tri", "SplitQuad","SplitQuadObject",
"BestSplit","Smooth","SmoothObject","SmoothParametric","SmoothParametricObject",
"ConvertToQuadratic","ConvertFromQuadratic","RenumberNodes","RenumberElements",
"RotationSweep","RotationSweepObject","RotationSweepObject1D","RotationSweepObject2D",
- "ExtrusionSweep","AdvancedExtrusion","ExtrusionSweepObject","ExtrusionSweepObject1D","ExtrusionSweepObject2D",
- "ExtrusionAlongPath","ExtrusionAlongPathObject","ExtrusionAlongPathX",
- "ExtrusionAlongPathObject1D","ExtrusionAlongPathObject2D",
+ "ExtrusionSweep","AdvancedExtrusion","ExtrusionSweepObject","ExtrusionSweepObject1D",
+ "ExtrusionSweepObject2D","ExtrusionAlongPath","ExtrusionAlongPathObject",
+ "ExtrusionAlongPathX","ExtrusionAlongPathObject1D","ExtrusionAlongPathObject2D",
"Mirror","MirrorObject","Translate","TranslateObject","Rotate","RotateObject",
- "FindCoincidentNodes",/*"FindCoincidentNodesOnPart",*/"MergeNodes","FindEqualElements",
+ "FindCoincidentNodes","MergeNodes","FindEqualElements",
"MergeElements","MergeEqualElements","SewFreeBorders","SewConformFreeBorders",
"SewBorderToSide","SewSideElements","ChangeElemNodes","GetLastCreatedNodes",
"GetLastCreatedElems",
"MirrorMakeMesh","MirrorObjectMakeMesh","TranslateMakeMesh","TranslateObjectMakeMesh",
"Scale","ScaleMakeMesh","RotateMakeMesh","RotateObjectMakeMesh","MakeBoundaryMesh",
- "MakeBoundaryElements", "SplitVolumesIntoTetra"
+ "MakeBoundaryElements", "SplitVolumesIntoTetra",
+ "DoubleElements","DoubleNodes","DoubleNode","DoubleNodeGroup","DoubleNodeGroups",
+ "DoubleNodeElem","DoubleNodeElemInRegion","DoubleNodeElemGroup",
+ "DoubleNodeElemGroupInRegion","DoubleNodeElemGroups","DoubleNodeElemGroupsInRegion",
+ "DoubleNodesOnGroupBoundaries","CreateFlatElementsOnFacesGroups","CreateHoleSkin"
,"" }; // <- mark of the end
sameMethods.Insert( names );
}
return EMPTY;
if ( myBegPos.Length() < thePartIndex )
return UNKNOWN;
+ ASSERT( thePartIndex > 0 );
return myBegPos( thePartIndex );
}
{
while ( myBegPos.Length() < thePartIndex )
myBegPos.Append( UNKNOWN );
+ ASSERT( thePartIndex > 0 );
myBegPos( thePartIndex ) = thePosition;
}
if ( i <= Length() )
{
myString.Insert( i, "#" );
- for ( int iPart = 0; iPart < myBegPos.Length(); ++iPart )
+ for ( int iPart = 1; iPart <= myBegPos.Length(); ++iPart )
{
int begPos = GetBegPos( iPart + 1 );
if ( begPos != UNKNOWN )
void setNeighbourCommand( Handle(_pyCommand)& theCmd,
Handle(_pyCommand)& theOtherCmd,
const bool theIsAfter );
-
+ void addFilterUser( Handle(_pyCommand)& theCmd, const Handle(_pyObject)& user );
+
private:
std::map< _pyID, Handle(_pyMesh) > myMeshes;
std::map< _pyID, Handle(_pyMeshEditor) > myMeshEditors;
aScript += helper + "aFilterManager = " + aSMESHGen + ".CreateFilterManager()\n\t";
aScript += helper + "aMeasurements = " + aSMESHGen + ".CreateMeasurements()\n\t";
+ // This is not needed since entering a plug-in system to smesh.py
// import python files corresponding to plugins
- set<string> moduleNameSet;
- map<string, GenericHypothesisCreator_i*>::iterator hyp_creator = myHypCreatorMap.begin();
- for ( ; hyp_creator != myHypCreatorMap.end(); ++hyp_creator ) {
- string moduleName = hyp_creator->second->GetModuleName();
- bool newModule = moduleNameSet.insert( moduleName ).second;
- if ( newModule )
- aScript += helper + "\n\t" + "from salome." + (char*) moduleName.c_str() + " import " + (char*) moduleName.c_str() +"Builder";
- }
+ // set<string> moduleNameSet;
+ // map<string, GenericHypothesisCreator_i*>::iterator hyp_creator = myHypCreatorMap.begin();
+ // for ( ; hyp_creator != myHypCreatorMap.end(); ++hyp_creator ) {
+ // string moduleName = hyp_creator->second->GetModuleName();
+ // bool newModule = moduleNameSet.insert( moduleName ).second;
+ // if ( newModule )
+ // aScript += helper + "\n\t" + "from salome." + (char*) moduleName.c_str() + " import " + (char*) moduleName.c_str() +"Builder";
+ // }
// Dump trace of restored study
if (theSavedTrace.Length() > 0) {
do {
aName = aBaseName + (++objectCounter);
} while (theObjectNames.IsBound(aName));
- seqRemoved.Append(aName);
+ if ( !aRemovedObjIDs.count( anEntry ))
+ seqRemoved.Append(aName);
mapRemoved.Bind(anEntry, "1");
theObjectNames.Bind(anEntry, aName);
}
anUpdatedScript += "\n\taStudyBuilder = theStudy.NewBuilder()";
}
for (int ir = 1; ir <= seqRemoved.Length(); ir++) {
- if ( aRemovedObjIDs.count( seqRemoved.Value(ir) )) continue;
anUpdatedScript += "\n\tSO = theStudy.FindObjectIOR(theStudy.ConvertObjectToIOR(";
anUpdatedScript += seqRemoved.Value(ir);
// for object wrapped by class of smeshBuilder.py
}
// Set object names
- anUpdatedScript += "\n\t## set object names";
-// anUpdatedScript += "\n\t\tsmeshgui = salome.ImportComponentGUI(\"SMESH\")";
-// anUpdatedScript += "\n\t\tsmeshgui.Init(theStudy._get_StudyId())";
-// anUpdatedScript += "\n";
- TCollection_AsciiString aGUIName;
+ TCollection_AsciiString aGUIName, aSetNameScriptPart;
Resource_DataMapOfAsciiStringAsciiString mapEntries;
for (Standard_Integer i = 1; i <= aLen; i += 2)
{
aName = geom->GetDumpName( anEntry.ToCString() );
if (aName.IsEmpty() && // Not a GEOM object
theNames.IsBound(anEntry) &&
- !aRemovedObjIDs.count(anEntry) && // a command creating anEntry was erased
+ !aRemovedObjIDs.count(anEntry) && // A command creating anEntry was erased
!mapEntries.IsBound(anEntry) && // Not yet processed
!mapRemoved.IsBound(anEntry)) // Was not removed
{
aName = theObjectNames.Find(anEntry);
aGUIName = theNames.Find(anEntry);
mapEntries.Bind(anEntry, aName);
- anUpdatedScript += helper + "\n\t" + aSMESHGen + ".SetName(" + aName;
+ aSetNameScriptPart += helper + "\n\t" + aSMESHGen + ".SetName(" + aName;
if ( anEntry2AccessorMethod.IsBound( anEntry ) )
- anUpdatedScript += helper + "." + anEntry2AccessorMethod( anEntry );
- anUpdatedScript += helper + ", '" + aGUIName + "')";
+ aSetNameScriptPart += helper + "." + anEntry2AccessorMethod( anEntry );
+ aSetNameScriptPart += helper + ", '" + aGUIName + "')";
}
}
-
- // Issue 0021249: removed (a similar block is dumped by SALOMEDSImpl_Study)
- //anUpdatedScript += "\n\tif salome.sg.hasDesktop():";
- //anUpdatedScript += "\n\t\tsalome.sg.updateObjBrowser(0)";
+ if ( !aSetNameScriptPart.IsEmpty() )
+ {
+ anUpdatedScript += "\n\t## set object names";
+ anUpdatedScript += aSetNameScriptPart;
+ }
// -----------------------------------------------------------------
// store visual properties of displayed objects
#include "SMDS_MeshNode.hxx"
#include "SMESHDS_Mesh.hxx"
#include "SMESH_Gen_i.hxx"
+#include "SMESH_Group_i.hxx"
#include "SMESH_PythonDump.hxx"
#include <SALOMEDS_wrap.hxx>
std::vector<int> elements;
myNumericalFunctorPtr->GetHistogram(nbIntervals,nbEvents,funValues,elements,0,isLogarithmic);
-#ifdef WIN32
- nbIntervals = CORBA::Short( min( nbEvents.size(), funValues.size() - 1));
-#else
- nbIntervals = CORBA::Short( std::min( nbEvents.size(), funValues.size() - 1));
-#endif
SMESH::Histogram_var histogram = new SMESH::Histogram;
+
+ nbIntervals = CORBA::Short( Min( int( nbEvents.size()),
+ int( funValues.size() - 1 )));
+ if ( nbIntervals > 0 )
+ {
+ histogram->length( nbIntervals );
+ for ( int i = 0; i < nbIntervals; ++i )
+ {
+ HistogramRectangle& rect = histogram[i];
+ rect.nbEvents = nbEvents[i];
+ rect.min = funValues[i];
+ rect.max = funValues[i+1];
+ }
+ }
+ return histogram._retn();
+}
+
+SMESH::Histogram* NumericalFunctor_i::GetLocalHistogram(CORBA::Short nbIntervals,
+ CORBA::Boolean isLogarithmic,
+ SMESH::SMESH_IDSource_ptr object)
+{
+ SMESH::Histogram_var histogram = new SMESH::Histogram;
+
+ std::vector<int> nbEvents;
+ std::vector<double> funValues;
+ std::vector<int> elements;
+
+ SMDS_ElemIteratorPtr elemIt;
+ if ( SMESH::DownCast< SMESH_GroupOnFilter_i* >( object ) ||
+ SMESH::DownCast< SMESH::Filter_i* >( object ))
+ {
+ elemIt = SMESH_Mesh_i::GetElements( object, GetElementType() );
+ }
+ else
+ {
+ SMESH::SMESH_Mesh_var mesh = object->GetMesh();
+ SMESH::long_array_var objNbElems = object->GetNbElementsByType();
+ SMESH::long_array_var meshNbElems = mesh-> GetNbElementsByType();
+ if ( meshNbElems[ GetElementType() ] !=
+ objNbElems [ GetElementType() ] )
+ {
+ elements.reserve( objNbElems[ GetElementType() ]);
+ elemIt = SMESH_Mesh_i::GetElements( object, GetElementType() );
+ }
+ }
+ if ( elemIt )
+ {
+ while ( elemIt->more() )
+ elements.push_back( elemIt->next()->GetID() );
+ if ( elements.empty() ) return histogram._retn();
+ }
+
+ myNumericalFunctorPtr->GetHistogram(nbIntervals,nbEvents,funValues,elements,0,isLogarithmic);
+
+ nbIntervals = CORBA::Short( Min( int( nbEvents.size()),
+ int( funValues.size() - 1 )));
if ( nbIntervals > 0 )
{
histogram->length( nbIntervals );
return myPredicatePtr->IsSatisfy( theId );
}
+CORBA::Long Predicate_i::NbSatisfying( SMESH::SMESH_IDSource_ptr obj )
+{
+ SMESH::SMESH_Mesh_var meshVar = obj->GetMesh();
+ const SMDS_Mesh* meshDS = MeshPtr2SMDSMesh( meshVar );
+ if ( !meshDS )
+ return 0;
+ myPredicatePtr->SetMesh( meshDS );
+
+ SMDSAbs_ElementType elemType = SMDSAbs_ElementType( GetElementType() );
+
+ int nb = 0;
+ SMDS_ElemIteratorPtr elemIt =
+ SMESH::DownCast<SMESH_Mesh_i*>( meshVar )->GetElements( obj, GetElementType() );
+ if ( elemIt )
+ while ( elemIt->more() )
+ {
+ const SMDS_MeshElement* e = elemIt->next();
+ if ( e && e->GetType() == elemType )
+ nb += myPredicatePtr->IsSatisfy( e->GetID() );
+ }
+ return nb;
+}
+
Controls::PredicatePtr Predicate_i::GetPredicate()
{
return myPredicatePtr;
return anArray._retn();
}
-template<class TElement, class TIterator, class TPredicate>
-static void collectMeshInfo(const TIterator& theItr,
- TPredicate& thePred,
- SMESH::long_array& theRes)
-{
- if (!theItr)
- return;
- while (theItr->more()) {
- const SMDS_MeshElement* anElem = theItr->next();
- if ( thePred->IsSatisfy( anElem->GetID() ) )
- theRes[ anElem->GetEntityType() ]++;
+//=============================================================================
+/*!
+ * \brief Returns number of mesh elements per each \a EntityType
+ */
+//=============================================================================
+
+SMESH::long_array* ::Filter_i::GetMeshInfo()
+{
+ SMESH::long_array_var aRes = new SMESH::long_array();
+ aRes->length(SMESH::Entity_Last);
+ for (int i = 0; i < SMESH::Entity_Last; i++)
+ aRes[i] = 0;
+
+ if ( !CORBA::is_nil(myMesh) && myPredicate )
+ {
+ const SMDS_Mesh* aMesh = MeshPtr2SMDSMesh(myMesh);
+ SMDS_ElemIteratorPtr it = aMesh->elementsIterator( SMDSAbs_ElementType( GetElementType() ));
+ while ( it->more() )
+ {
+ const SMDS_MeshElement* anElem = it->next();
+ if ( myPredicate->IsSatisfy( anElem->GetID() ) )
+ aRes[ anElem->GetEntityType() ]++;
+ }
}
+
+ return aRes._retn();
}
//=============================================================================
/*!
- * \brief Returns statistic of mesh elements
+ * \brief Returns number of mesh elements of each \a ElementType
*/
//=============================================================================
-SMESH::long_array* ::Filter_i::GetMeshInfo()
+
+SMESH::long_array* ::Filter_i::GetNbElementsByType()
{
SMESH::long_array_var aRes = new SMESH::long_array();
- aRes->length(SMESH::Entity_Last);
- for (int i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++)
+ aRes->length(SMESH::NB_ELEMENT_TYPES);
+ for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++)
aRes[i] = 0;
- if(!CORBA::is_nil(myMesh) && myPredicate) {
- const SMDS_Mesh* aMesh = MeshPtr2SMDSMesh(myMesh);
- SMDS_ElemIteratorPtr it;
- switch( GetElementType() )
+ if ( !CORBA::is_nil(myMesh) && myPredicate ) {
+ const SMDS_Mesh* aMesh = MeshPtr2SMDSMesh(myMesh);
+ SMDS_ElemIteratorPtr it = aMesh->elementsIterator( SMDSAbs_ElementType( GetElementType() ));
+ CORBA::Long& nbElems = aRes[ GetElementType() ];
+ while ( it->more() )
{
- case SMDSAbs_Node:
- collectMeshInfo<const SMDS_MeshNode*>(aMesh->nodesIterator(),myPredicate,aRes);
- break;
- case SMDSAbs_Edge:
- collectMeshInfo<const SMDS_MeshElement*>(aMesh->edgesIterator(),myPredicate,aRes);
- break;
- case SMDSAbs_Face:
- collectMeshInfo<const SMDS_MeshElement*>(aMesh->facesIterator(),myPredicate,aRes);
- break;
- case SMDSAbs_Volume:
- collectMeshInfo<const SMDS_MeshElement*>(aMesh->volumesIterator(),myPredicate,aRes);
- break;
- case SMDSAbs_All:
- default:
- collectMeshInfo<const SMDS_MeshElement*>(aMesh->elementsIterator(),myPredicate,aRes);
- break;
+ const SMDS_MeshElement* anElem = it->next();
+ if ( myPredicate->IsSatisfy( anElem->GetID() ) )
+ nbElems++;
}
}
return aRes._retn();
}
+
//================================================================================
/*!
* \brief Return GetElementType() within an array
{
public:
CORBA::Double GetValue( CORBA::Long theElementId );
- SMESH::Histogram* GetHistogram(CORBA::Short nbIntervals, CORBA::Boolean isLogarithmic);
+ SMESH::Histogram* GetHistogram(CORBA::Short nbIntervals,
+ CORBA::Boolean isLogarithmic);
+ SMESH::Histogram* GetLocalHistogram(CORBA::Short nbIntervals,
+ CORBA::Boolean isLogarithmic,
+ SMESH::SMESH_IDSource_ptr object);
void SetPrecision( CORBA::Long thePrecision );
CORBA::Long GetPrecision();
Controls::NumericalFunctorPtr GetNumericalFunctor();
{
public:
CORBA::Boolean IsSatisfy( CORBA::Long theElementId );
+ CORBA::Long NbSatisfying( SMESH::SMESH_IDSource_ptr obj );
Controls::PredicatePtr GetPredicate();
protected:
// =========================
virtual SMESH::long_array* GetIDs();
virtual SMESH::long_array* GetMeshInfo();
+ virtual SMESH::long_array* GetNbElementsByType();
virtual SMESH::array_of_ElementType* GetTypes();
virtual SMESH::SMESH_Mesh_ptr GetMesh();
virtual bool IsMeshInfoCorrect() { return true; }
#include "SMESH_Gen_i.hxx"
#include "SMESH_version.h"
+#include "DriverMED_W_SMESHDS_Mesh.h"
+#include "DriverMED_R_SMESHDS_Mesh.h"
+#ifdef WITH_CGNS
+#include "DriverCGNS_Read.hxx"
+#endif
+#include "MED_Factory.hxx"
#include "SMDS_EdgePosition.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMDS_PolyhedralVolumeOfNodes.hxx"
#include "SMESH_Mesh_i.hxx"
#include "SMESH_PreMeshInfo.hxx"
#include "SMESH_PythonDump.hxx"
+#include "memoire.h"
#include CORBA_SERVER_HEADER(SMESH_Group)
#include CORBA_SERVER_HEADER(SMESH_Filter)
#include CORBA_SERVER_HEADER(SMESH_MeshEditor)
-#include "DriverMED_W_SMESHDS_Mesh.h"
-#include "DriverMED_R_SMESHDS_Mesh.h"
-#ifdef WITH_CGNS
-#include "DriverCGNS_Read.hxx"
-#endif
-#include "memoire.h"
#include <GEOM_Client.hxx>
// activate the CORBA servant of hypothesis
hypothesis_i = SMESH::SMESH_Hypothesis::_narrow( myHypothesis_i->_this() );
int nextId = RegisterObject( hypothesis_i );
- if(MYDEBUG) MESSAGE( "Add hypo to map with id = "<< nextId );
+ if(MYDEBUG) { MESSAGE( "Add hypo to map with id = "<< nextId ); }
+ else { nextId = 0; } // avoid "unused variable" warning in release mode
return hypothesis_i._retn();
}
// activate the CORBA servant of Mesh
SMESH::SMESH_Mesh_var mesh = SMESH::SMESH_Mesh::_narrow( meshServant->_this() );
int nextId = RegisterObject( mesh );
- if(MYDEBUG) MESSAGE( "Add mesh to map with id = "<< nextId);
+ if(MYDEBUG) { MESSAGE( "Add mesh to map with id = "<< nextId); }
+ else { nextId = 0; } // avoid "unused variable" warning in release mode
return mesh._retn();
}
catch (SALOME_Exception& S_ex) {
::SMESH_Mesh& myLocMesh = meshServant->GetImpl();
TSetOfInt shapeIds;
::MeshDimension aDim = (MeshDimension)theDimension;
- if ( myGen.Compute( myLocMesh, myLocShape, false, aDim, &shapeIds ) )
+ if ( myGen.Compute( myLocMesh, myLocShape, false, false, aDim, &shapeIds ) )
{
int nbShapeId = shapeIds.size();
theShapesId.length( nbShapeId );
}
pd << ""; // prevent optimizing pd out
+ // creation of tree nodes for all data objects in the study
+ // to support tree representation customization and drag-n-drop:
+ SALOMEDS::UseCaseBuilder_var useCaseBuilder = theComponent->GetStudy()->GetUseCaseBuilder();
+ if ( !useCaseBuilder->IsUseCaseNode( theComponent ) ) {
+ useCaseBuilder->SetRootCurrent();
+ useCaseBuilder->Append( theComponent ); // component object is added as the top level item
+ SALOMEDS::ChildIterator_var it = theComponent->GetStudy()->NewChildIterator( theComponent );
+ for (it->InitEx(true); it->More(); it->Next()) {
+ useCaseBuilder->AppendTo( it->Value()->GetFather(), it->Value() );
+ }
+ }
+
INFOS( "SMESH_Gen_i::Load completed" );
return true;
}
#endif
}
+//=================================================================================
+// function : Move()
+// purpose : Moves objects to the specified position.
+// Is used in the drag-n-drop functionality.
+//=================================================================================
+void SMESH_Gen_i::Move( const SMESH::sobject_list& what,
+ SALOMEDS::SObject_ptr where,
+ CORBA::Long row )
+{
+ if ( CORBA::is_nil( where ) ) return;
+
+ SALOMEDS::Study_var study = where->GetStudy();
+ SALOMEDS::StudyBuilder_var studyBuilder = study->NewBuilder();
+ SALOMEDS::UseCaseBuilder_var useCaseBuilder = study->GetUseCaseBuilder();
+ SALOMEDS::SComponent_var father = where->GetFatherComponent();
+ std::string dataType = father->ComponentDataType();
+ if ( dataType != "SMESH" ) return; // not a SMESH component
+
+ SALOMEDS::SObject_var objAfter;
+ if ( row >= 0 && useCaseBuilder->HasChildren( where ) ) {
+ // insert at given row -> find insertion position
+ SALOMEDS::UseCaseIterator_var useCaseIt = useCaseBuilder->GetUseCaseIterator( where );
+ int i;
+ for ( i = 0; i < row && useCaseIt->More(); i++, useCaseIt->Next() );
+ if ( i == row && useCaseIt->More() ) {
+ objAfter = useCaseIt->Value();
+ }
+ }
+
+ for ( int i = 0; i < what.length(); i++ ) {
+ SALOMEDS::SObject_var sobj = what[i];
+ if ( CORBA::is_nil( sobj ) ) continue; // skip bad object
+ // insert the object to the use case tree
+ if ( !CORBA::is_nil( objAfter ) )
+ useCaseBuilder->InsertBefore( sobj, objAfter ); // insert at given row
+ else
+ useCaseBuilder->AppendTo( where, sobj ); // append to the end of list
+ }
+}
+
//=============================================================================
/*!
* SMESHEngine_factory
const std::string & GetLastObjEntry() const { return myLastObj; }
std::vector< std::string > GetAllParameters(const std::string& theObjectEntry) const;
+ // Move objects to the specified position
+ void Move( const SMESH::sobject_list& what,
+ SALOMEDS::SObject_ptr where,
+ CORBA::Long row );
+
private:
// Create hypothesis of given type
SMESH::SMESH_Hypothesis_ptr createHypothesis( const char* theHypName,
{
SALOMEDS::SObject_wrap SO = SMESH_Gen_i::ObjectToSObject( theStudy, theIOR );
SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
+ SALOMEDS::UseCaseBuilder_var useCaseBuilder = theStudy->GetUseCaseBuilder();
if ( SO->_is_nil() ) {
if ( theTag == 0 )
SO = aStudyBuilder->NewObject( theFatherObject );
selAttr->SetSelectable( false );
}
+ // add object to the use case tree
+ // (to support tree representation customization and drag-n-drop)
+ useCaseBuilder->AppendTo( SO->GetFather(), SO );
+
return SO._retn();
}
if ( !theSObject->FindSubObject( theTag, aReferenceSO.inout() ))
aReferenceSO = aStudyBuilder->NewObjectToTag( theSObject, theTag );
aStudyBuilder->Addreference( aReferenceSO, aToObjSO );
+ // add reference to the use case tree
+ // (to support tree representation customization and drag-n-drop)
+ theStudy->GetUseCaseBuilder()->AppendTo( aReferenceSO->GetFather(), aReferenceSO );
}
}
return father._retn();
SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
+ SALOMEDS::UseCaseBuilder_var useCaseBuilder = theStudy->GetUseCaseBuilder();
SALOMEDS::GenericAttribute_wrap anAttr;
SALOMEDS::AttributePixMap_wrap aPixmap;
aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" );
CORBA::String_var userName = aComp->componentusername();
SetName( father, userName.in(), "MESH" );
+ // add component to the use case tree
+ // (to support tree representation customization and drag-n-drop)
+ useCaseBuilder->SetRootCurrent();
+ useCaseBuilder->Append( father ); // component object is added as the top level item
if(MYDEBUG) MESSAGE("PublishComponent--END");
return father._retn();
}
//=============================================================================
-/*!
- * Returns statistic of mesh elements
- * Result array of number enityties
+/*
+ * Returns number of mesh elements of each \a SMESH::EntityType
+ * Result array of number of elements per \a SMESH::EntityType
* Inherited from SMESH_IDSource
*/
//=============================================================================
return aRes._retn();
}
+//=============================================================================
+/*
+ * Returns number of mesh elements of each \a ElementType
+ */
+//=============================================================================
+
+SMESH::long_array* SMESH_GroupBase_i::GetNbElementsByType()
+{
+ SMESH::long_array_var aRes = new SMESH::long_array();
+ aRes->length(SMESH::NB_ELEMENT_TYPES);
+ for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++)
+ aRes[ i ] = 0;
+
+ if ( myPreMeshInfo )
+ aRes[ GetType() ] = myPreMeshInfo->NbElements( SMDSAbs_ElementType( GetType() ));
+ else
+ aRes[ GetType() ] = Size();
+
+ return aRes._retn();
+}
+
//=======================================================================
//function : GetIDs
//purpose : Returns ids of members
virtual SMESH::SMESH_Mesh_ptr GetMesh();
/*!
- * Returns statistic of mesh elements
- * Result array of number enityties
+ * Returns number of mesh elements of each \a EntityType
+ * Result array of number of elements per \a EntityType
* Inherited from SMESH_IDSource
*/
virtual SMESH::long_array* GetMeshInfo();
-
- // Inherited from SMESH_IDSource interface
+ /*!
+ * Returns number of mesh elements of each \a ElementType
+ */
+ virtual SMESH::long_array* GetNbElementsByType();
+ /*!
+ * Returns a sequence of all element IDs
+ */
virtual SMESH::long_array* GetIDs();
-
/*!
* Returns types of elements it contains
* Inherited from SMESH_IDSource interface
+++ /dev/null
-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-// File : SMESH_MEDFamily_i.cxx
-// Module : SMESH
-//
-#include "SMESH_MEDFamily_i.hxx"
-#include "utilities.h"
-#include "Utils_CorbaException.hxx"
-
-using namespace std;
-
-//=============================================================================
-/*!
- * Default constructor
- */
-//=============================================================================
-SMESH_MEDFamily_i::SMESH_MEDFamily_i()
-{
- BEGIN_OF("Default Constructor SMESH_MEDFamily_i");
- END_OF("Default Constructor SMESH_MEDFamily_i");
-}
-//=============================================================================
-/*!
- * constructor par recopie
- */
-//=============================================================================
-SMESH_MEDFamily_i::SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f):
- SMESH_MEDSupport_i(f._subMesh_i,f._name,f._description,f._entity),
- _subMesh_i(f._subMesh_i),
- _identifier(f._identifier),
- _numberOfAttribute(f._numberOfAttribute),
- _numberOfGroup(f._numberOfGroup),
- _attributeValue(f._attributeValue)
-{
- BEGIN_OF("Copy Constructor SMESH_MEDFamily_i");
- _attributeDescription=new string[_numberOfAttribute];
- for (int i=0;i<_numberOfAttribute;i++) {
- _attributeDescription[i]=f._attributeDescription[i];
- };
- _groupName=new string[_numberOfGroup];
- for (int i=0;i<_numberOfAttribute;i++) {
- _groupName[i]=f._groupName[i];
- };
- END_OF("Copy Constructor SMESH_MEDFamily_i");
-}
-//=============================================================================
-/*!
- * Destructor
- */
-//=============================================================================
-SMESH_MEDFamily_i::~SMESH_MEDFamily_i()
-{
-}
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDFamily_i::SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm,
- string name, string description, SALOME_MED::medEntityMesh entity):
- SMESH_MEDSupport_i( sm, name, description, entity ),
-
- _subMesh_i(sm),
- _identifier(identifier),
- _numberOfAttribute(0),
- _attributeIdentifier((int*)NULL),
- _attributeValue((int*)NULL),
- _attributeDescription((string*)NULL),
- _numberOfGroup(0),
- _groupName((string*)NULL)
-{
- BEGIN_OF("Constructor SMESH_MEDFamily_i");
- END_OF("Constructor SMESH_MEDFamily_i");
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for Family's Identifier
- */
-//=============================================================================
-
-CORBA::Long SMESH_MEDFamily_i::getIdentifier()
-throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- return _identifier;
-
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for number of attributes
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getNumberOfAttributes()
-throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- return _numberOfAttribute;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attributes identifiers
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong* SMESH_MEDFamily_i::getAttributesIdentifiers()
-throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- };
-
- SALOME_TYPES::ListOfLong_var myseq= new SALOME_TYPES::ListOfLong;
- myseq->length(_numberOfAttribute);
- for (int i=0;i<_numberOfAttribute;i++)
- {
- myseq[i]=_attributeIdentifier[i];
- };
- return myseq._retn();
-
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attribute identifier I
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getAttributeIdentifier(CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- };
- ASSERT (i <= _numberOfAttribute);
- return _attributeIdentifier[i];
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attributes values
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong* SMESH_MEDFamily_i::getAttributesValues()
- throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
-
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- };
-
- SALOME_TYPES::ListOfLong_var myseq= new SALOME_TYPES::ListOfLong;
- myseq->length(_numberOfAttribute);
- for (int i=0;i<_numberOfAttribute;i++)
- {
- myseq[i]=_attributeValue[i];
- };
- return myseq._retn();
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attribute value I
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getAttributeValue(CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- }
-
- ASSERT (i <= _numberOfAttribute);
- return _attributeValue[i];
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attributes desriptions
- */
-//=============================================================================
-SALOME_TYPES::ListOfString * SMESH_MEDFamily_i::getAttributesDescriptions()
- throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- }
- SALOME_TYPES::ListOfString_var myseq = new SALOME_TYPES::ListOfString;
- for (int i=0;i<_numberOfAttribute;i++)
- {
- myseq[i]=CORBA::string_dup(_attributeDescription[i].c_str());
- }
- return myseq._retn();
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attribute description i
- */
-//=============================================================================
-char * SMESH_MEDFamily_i::getAttributeDescription( CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- }
- ASSERT (i <= _numberOfAttribute);
- return CORBA::string_dup(_attributeDescription[i].c_str());
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the number of groups
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getNumberOfGroups()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return 0;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the name of the group i
- */
-//=============================================================================
-char * SMESH_MEDFamily_i::getGroupName( CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for all the groups name
- */
-//=============================================================================
-SALOME_TYPES::ListOfString* SMESH_MEDFamily_i::getGroupsNames()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
+++ /dev/null
-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-// File : SMESH_MEDFamily_i.hxx
-// Module : SMESH
-//
-#ifndef SMESH_MED_FAMILY_I_HXX_
-#define SMESH_MED_FAMILY_I_HXX_
-
-#include "SMESH.hxx"
-
-#include "SMESH_MEDSupport_i.hxx"
-
-#include<string>
-
-class SMESH_I_EXPORT SMESH_MEDFamily_i:
- public virtual POA_SALOME_MED::FAMILY,
- public virtual SMESH_MEDSupport_i
-{
-protected :
- SMESH_MEDFamily_i();
- ~SMESH_MEDFamily_i();
-
- ::SMESH_subMesh_i* _subMesh_i;
-
- // Values
- int _identifier;
- int _numberOfAttribute;
- int * _attributeIdentifier;
- int * _attributeValue;
- std::string * _attributeDescription;
- int _numberOfGroup ;
- std::string * _groupName ;
-
-
-public :
-
- // Constructors and associated internal methods
- SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm,
- std::string name, std::string description, SALOME_MED::medEntityMesh entity );
- SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f);
-
- // IDL Methods
- void setProtocol(SALOME::TypeOfCommunication typ) {}
- void release() {}
- SALOME::SenderInt_ptr getSenderForNumber(SALOME_MED::medGeometryElement) {return SALOME::SenderInt::_nil();}
- SALOME::SenderInt_ptr getSenderForNumberIndex() {return SALOME::SenderInt::_nil();}
-
- CORBA::Long getIdentifier()
- throw (SALOME::SALOME_Exception);
- CORBA::Long getNumberOfAttributes()
- throw (SALOME::SALOME_Exception);
- SALOME_TYPES::ListOfLong* getAttributesIdentifiers()
- throw (SALOME::SALOME_Exception);
- CORBA::Long getAttributeIdentifier(CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- SALOME_TYPES::ListOfLong* getAttributesValues()
- throw (SALOME::SALOME_Exception);
- CORBA::Long getAttributeValue(CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- SALOME_TYPES::ListOfString* getAttributesDescriptions()
- throw (SALOME::SALOME_Exception);
- char* getAttributeDescription( CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- CORBA::Long getNumberOfGroups()
- throw (SALOME::SALOME_Exception);
- char * getGroupName( CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- SALOME_TYPES::ListOfString* getGroupsNames()
- throw (SALOME::SALOME_Exception);
-};
-#endif /* MED_FAMILY_I_HXX_ */
+++ /dev/null
-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-// File : SMESH_MEDMesh_i.cxx
-// Module : SMESH
-//
-#include "SMESH_MEDMesh_i.hxx"
-#include "SMESH_Gen_i.hxx"
-#include "SMESH_Mesh_i.hxx"
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_SubMesh.hxx"
-
-#include "SMESH_MEDSupport_i.hxx"
-#include "SMESH_MEDFamily_i.hxx"
-
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Iterator.hxx>
-#include <TopoDS_Compound.hxx>
-#include <TopoDS_CompSolid.hxx>
-#include <TopoDS_Solid.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Wire.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TopTools_MapOfShape.hxx>
-
-#include <utilities.h>
-#include <Utils_CorbaException.hxx>
-
-#include <Utils_ORB_INIT.hxx>
-#include <Utils_SINGLETON.hxx>
-#include <Utils_ExceptHandlers.hxx>
-#include <SALOMEDS_wrap.hxx>
-
-extern "C"
-{
-#include <stdio.h>
-}
-
-using namespace std;
-
-//=============================================================================
-/*!
- * Default constructor
- */
-//=============================================================================
-// PN Est-ce un const ?
-SMESH_MEDMesh_i::SMESH_MEDMesh_i()
-{
- BEGIN_OF("Default Constructor SMESH_MEDMesh_i");
- END_OF("Default Constructor SMESH_MEDMesh_i");
-}
-
-//=============================================================================
-/*!
- * Destructor
- */
-//=============================================================================
-SMESH_MEDMesh_i::~SMESH_MEDMesh_i()
-{
-}
-
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""),
- _compte(false),
- _creeFamily(false),
- _famIdent(0),
- _indexElts(0),
- _indexEnts(0)
-{
- BEGIN_OF("Constructor SMESH_MEDMesh_i");
-
- _mesh_i = m_i;
- _meshDS = _mesh_i->GetImpl().GetMeshDS();
-
- END_OF("Constructor SMESH_MEDMesh_i");
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Name
- */
-//=============================================================================
-char *SMESH_MEDMesh_i::getName() throw(SALOME::SALOME_Exception)
-{
- if (_meshDS == NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
-
- try
- {
- SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen();
- SALOMEDS::Study_var study = gen->GetCurrentStudy();
- SALOMEDS::SObject_wrap meshSO = gen->ObjectToSObject( study, _mesh_i->_this());
- if ( meshSO->_is_nil() )
- return CORBA::string_dup("toto");
-
- CORBA::String_var name = meshSO->GetName();
-
- return CORBA::string_dup( name.in() );
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nom");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for corbaindex cuisine interne
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Space Dimension
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()throw(SALOME::SALOME_Exception)
-{
- // PN : Il semblerait que la dimension soit fixee a 3
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- return 3;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Mesh Dimension
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getMeshDimension()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- // PN : Il semblerait que la dimension soit fixee a 3
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- return 3;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the boolean _isAGrid
- */
-//=============================================================================
-CORBA::Boolean SMESH_MEDMesh_i::getIsAGrid() throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return false;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the connectivities, to see if they exist
- */
-//=============================================================================
-CORBA::Boolean
-SMESH_MEDMesh_i::existConnectivity(SALOME_MED::medConnectivity connectivityType,
- SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!!!! IMPLEMENTED BUT ONLY PARTIALLY !!!!!!");
-
-
- return false;
-
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinate
- */
-//=============================================================================
-CORBA::Double SMESH_MEDMesh_i::getCoordinate(CORBA::Long Number, CORBA::Long Axis)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return 0.0;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates System
- */
-//=============================================================================
-char *SMESH_MEDMesh_i::getCoordinatesSystem() throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- // PN : En dur. Non encore prevu
- try
- {
- string systcoo = "CARTESIEN";
- return CORBA::string_dup(systcoo.c_str());
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au maillage");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates
- */
-//=============================================================================
-SALOME_TYPES::ListOfDouble * SMESH_MEDMesh_i::getCoordinates
-(SALOME_MED::medModeSwitch typeSwitch) throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_TYPES::ListOfDouble_var myseq = new SALOME_TYPES::ListOfDouble;
- try
- {
- // PN : En dur
- int spaceDimension = 3;
- int nbNodes = _meshDS->NbNodes();
- SCRUTE(nbNodes);
- myseq->length(nbNodes * spaceDimension);
- int i = 0;
-
- SMDS_NodeIteratorPtr itNodes=_meshDS->nodesIterator();
- while(itNodes->more())
- {
- const SMDS_MeshNode* node = itNodes->next();
-
- if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE)
- {
- myseq[i * 3] = node->X();
- myseq[i * 3 + 1] = node->Y();
- myseq[i * 3 + 2] = node->Z();
- SCRUTE(myseq[i * 3]);
- SCRUTE(myseq[i * 3 + 1]);
- SCRUTE(myseq[i * 3 + 2]);
- }
- else
- {
- ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE);
- myseq[i] = node->X();
- myseq[i + nbNodes] = node->Y();
- myseq[i + (nbNodes * 2)] = node->Z();
- SCRUTE(myseq[i]);
- SCRUTE(myseq[i + nbNodes]);
- SCRUTE(myseq[i + (nbNodes * 2)]);
- }
- i++;
- }
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux coordonnees");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates Names
- */
-//=============================================================================
-SALOME_TYPES::ListOfString *
-SMESH_MEDMesh_i::getCoordinatesNames()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_TYPES::ListOfString_var myseq = new SALOME_TYPES::ListOfString;
- try
- {
- // PN : en dur
- int spaceDimension = 3;
- myseq->length(spaceDimension);
- myseq[0] = CORBA::string_dup("x");
- myseq[1] = CORBA::string_dup("y");
- myseq[2] = CORBA::string_dup("z");
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux noms des coordonnees");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates Units
- */
-//=============================================================================
-SALOME_TYPES::ListOfString *
-SMESH_MEDMesh_i::getCoordinatesUnits()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_TYPES::ListOfString_var myseq = new SALOME_TYPES::ListOfString;
- try
- {
- // PN : en dur
- int spaceDimension = 3;
- myseq->length(spaceDimension);
- myseq[0] = CORBA::string_dup("m");
- myseq[1] = CORBA::string_dup("m");
- myseq[2] = CORBA::string_dup("m");
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux unites des coordonnees");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Number of Nodes
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- try
- {
- return _meshDS->NbNodes();
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nombre de noeuds");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for number of Types
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- try
- {
- if (!_compte)
- calculeNbElts();
- int retour = 0;
- if (_mapNbTypes.find(entity) != _mapNbTypes.end())
- retour = _mapNbTypes[entity];
- return retour;
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nombre de Types");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for existing geometry element types
- * Not implemented for MED_ALL_ENTITIES
- */
-//=============================================================================
-SALOME_MED::medGeometryElement_array *
-SMESH_MEDMesh_i::getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME::
- SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- if (entity == SALOME_MED::MED_ALL_ENTITIES)
- THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES",
- SALOME::BAD_PARAM);
- if (!_compte)
- calculeNbElts();
- SALOME_MED::medGeometryElement_array_var myseq =
- new SALOME_MED::medGeometryElement_array;
- try
- {
- if (_mapNbTypes.find(entity) == _mapNbTypes.end())
- THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
- SALOME::BAD_PARAM);
- int nbTypes = _mapNbTypes[entity];
-
- myseq->length(nbTypes);
-
- if (_mapIndToVectTypes.find(entity) == _mapIndToVectTypes.end())
- THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
- SALOME::INTERNAL_ERROR);
-
- int index = _mapIndToVectTypes[entity];
- ASSERT(_TypesId[index].size() != 0);
- int i = 0;
- vector < SALOME_MED::medGeometryElement >::iterator it;
- for (it = _TypesId[index].begin(); it != _TypesId[index].end(); it++)
- {
- myseq[i++] = *it;
- };
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux differents types");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns number of elements of type medGeometryElement
- * Not implemented for MED_ALL_ELEMENTS
- * implemented for MED_ALL_ENTITIES
- *
- * Dans cette implementation, il n est pas prevu de tenir compte du entity
- * qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED::
- medEntityMesh entity,
- SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- if (geomElement == SALOME_MED::MED_ALL_ELEMENTS)
- THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ELEMENTS",
- SALOME::BAD_PARAM);
- if (!_compte)
- calculeNbElts();
-
- try
- {
- int retour = 0;
- if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
- {
- int index = _mapIndToSeqElts[geomElement];
-
- retour = _seq_elemId[index]->length();
- }
- return retour;
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nombre d élements");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for connectivities
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong *
-SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity,
- SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- if (mode != SALOME_MED::MED_NODAL)
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- /*if (typeSwitch == SALOME_MED::MED_NO_INTERLACE)
- THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented", SALOME::BAD_PARAM);*/
- if (!_compte)
- calculeNbElts();
-
- // Faut-il renvoyer un pointeur vide ???
- if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
- THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh",
- SALOME::BAD_PARAM);
-
- int index = _mapIndToSeqElts[geomElement];
-
- return _seq_elemId[index]._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for connectivities
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong *
-SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Find an element corresponding to the given connectivity
- */
-//=============================================================================
-CORBA::Long
-SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity,
- SALOME_MED::medGeometryElement type,
- const SALOME_TYPES::ListOfLong & connectivity)
- throw(SALOME::SALOME_Exception)
-{
- const char *LOC = "getElementNumber ";
- MESSAGE(LOC << "Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return -1;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Ascendant connectivities
- * not implemented for MED_ALL_ENTITIES and MED_MAILLE
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong *
-SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED::
- medConnectivity mode) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for connectivities
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong *
-SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED::
- medConnectivity mode) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns number of families within the mesh
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED::
- medEntityMesh entity) throw(SALOME::SALOME_Exception)
-{
- if (_creeFamily == false)
- createFamilies();
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- return _families.size();
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns number of groups within the mesh
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- MESSAGE(" Pas d implementation des groupes dans SMESH");
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for families within the mesh
- */
-//=============================================================================
-SALOME_MED::Family_array *
-SMESH_MEDMesh_i::getFamilies(SALOME_MED::
- medEntityMesh entity) throw(SALOME::SALOME_Exception)
-{
- if (_creeFamily == false)
- createFamilies();
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array;
- int nbfam = _families.size();
- myseq->length(nbfam);
- int i = 0;
- vector < SALOME_MED::FAMILY_ptr >::iterator it;
- for (it = _families.begin(); it != _families.end(); it++)
- {
- myseq[i++] = *it;
- };
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for family i within the mesh
- */
-//=============================================================================
-SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED::
- medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- if (_creeFamily == false)
- createFamilies();
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
-
- SCRUTE(_families[i]->getName());
- MESSAGE(" SMESH_MEDMesh_i::getFamily " << i) return _families[i];
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for groups within the mesh
- */
-//=============================================================================
-SALOME_MED::Group_array *
-SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME::
- SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- MESSAGE(" Pas d implementation des groupes dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for group i within the mesh
- */
-//=============================================================================
-SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED::
- medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- MESSAGE(" Pas d implementation des groupes dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
-}
-//=============================================================================
-/*!
- * CORBA: Returns references for the global numbering index
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong*
-SMESH_MEDMesh_i::getGlobalNumberingIndex(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Returns references for the support of boundary elements of type
- * entity
- */
-//=============================================================================
-SALOME_MED::SUPPORT_ptr
-SMESH_MEDMesh_i::getBoundaryElements(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Method return a reference on a support define on all the element of
- * an entity.
- */
-//=============================================================================
-SALOME_MED::SUPPORT_ptr
-SMESH_MEDMesh_i::getSupportOnAll(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Returns references for the support of the skin of the support
- * mySupport3D
- */
-//=============================================================================
-SALOME_MED::SUPPORT_ptr
-SMESH_MEDMesh_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: add the Mesh in the StudyManager
- * PN Pas Implemente
- */
-//=============================================================================
-void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy,
- SALOME_MED::GMESH_ptr myIor) throw(SALOME::SALOME_Exception)
-{
- BEGIN_OF("MED_Mesh_i::addInStudy");
- if (_meshId != "")
- {
- MESSAGE("Mesh already in Study");
- THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study", SALOME::BAD_PARAM);
- }
- END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
-}
-
-//=============================================================================
-/*!
- * CORBA: write mesh in a med file
- */
-//=============================================================================
-void SMESH_MEDMesh_i::write(CORBA::Long i, const char *driverMeshName)
- throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA: read mesh in a med file
- */
-//=============================================================================
-void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA : release driver
- */
-//=============================================================================
-void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA : attach driver
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType,
- const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * Calcule le Nb d'elements par entite geometrique
- */
-//=============================================================================
-void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception)
-{
- if (!_compte)
- {
- _compte = true;
-
- _mapNbTypes[SALOME_MED::MED_NODE] = 1;
- // On compte les aretes MED_SEG2 ou MED_SEG3
- // On range les elements dans les vecteurs correspondants
-
- _mapIndToSeqElts[SALOME_MED::MED_SEG2] = _indexElts++;
- _mapIndToSeqElts[SALOME_MED::MED_SEG3] = _indexElts++;
- _mapIndToVectTypes[SALOME_MED::MED_EDGE] = _indexEnts++;
-
- int trouveSeg2 = 0;
- int trouveSeg3 = 0;
- SALOME_MED::medGeometryElement medElement;
-
- SMDS_EdgeIteratorPtr itEdges=_meshDS->edgesIterator();
- while(itEdges->more())
- {
- const SMDS_MeshEdge* elem = itEdges->next();
- int nb_of_nodes = elem->NbNodes();
-
- switch (nb_of_nodes)
- {
- case 2:
- {
- medElement = SALOME_MED::MED_SEG2;
- if (trouveSeg2 == 0)
- {
- trouveSeg2 = 1;
- _TypesId[SALOME_MED::MED_EDGE].
- push_back(SALOME_MED::MED_SEG2);
- }
- break;
- }
- case 3:
- {
- medElement = SALOME_MED::MED_SEG3;
- if (trouveSeg3 == 0)
- {
- trouveSeg3 = 1;
- _TypesId[SALOME_MED::MED_EDGE].
- push_back(SALOME_MED::MED_SEG3);
- }
- break;
- }
- }
- int index = _mapIndToSeqElts[medElement];
- SCRUTE(index);
- // Traitement de l arete
-
- int longueur = _seq_elemId[index]->length();
- _seq_elemId[index]->length(longueur + nb_of_nodes);
-
- SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
-
- for(int k=0; itn->more(); k++)
- _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
- }
-
- _mapNbTypes[SALOME_MED::MED_EDGE] = trouveSeg2 + trouveSeg3;
-
- // On compte les faces MED_TRIA3, MED_HEXA8, MED_TRIA6
- // On range les elements dans les vecteurs correspondants
- int trouveTria3 = 0;
- int trouveTria6 = 0;
- int trouveQuad4 = 0;
-
- _mapIndToSeqElts[SALOME_MED::MED_TRIA3] = _indexElts++;
- _mapIndToSeqElts[SALOME_MED::MED_TRIA6] = _indexElts++;
- _mapIndToSeqElts[SALOME_MED::MED_QUAD4] = _indexElts++;
- _mapIndToVectTypes[SALOME_MED::MED_FACE] = _indexEnts++;
-
- SMDS_FaceIteratorPtr itFaces=_meshDS->facesIterator();
- while(itFaces->more())
- {
- const SMDS_MeshFace * elem = itFaces->next();
- int nb_of_nodes = elem->NbNodes();
-
- switch (nb_of_nodes)
- {
- case 3:
- {
- medElement = SALOME_MED::MED_TRIA3;
- if (trouveTria3 == 0)
- {
- trouveTria3 = 1;
- _TypesId[SALOME_MED::MED_FACE].
- push_back(SALOME_MED::MED_TRIA3);
- }
- break;
- }
- case 4:
- {
- medElement = SALOME_MED::MED_QUAD4;
- if (trouveQuad4 == 0)
- {
- trouveQuad4 = 1;
- _TypesId[SALOME_MED::MED_FACE].
- push_back(SALOME_MED::MED_QUAD4);
- }
- break;
- }
- case 6:
- {
- medElement = SALOME_MED::MED_TRIA6;
- if (trouveTria6 == 0)
- {
- trouveTria6 = 1;
- _TypesId[SALOME_MED::MED_FACE].
- push_back(SALOME_MED::MED_TRIA6);
- }
- break;
- }
- }
- int index = _mapIndToSeqElts[medElement];
- SCRUTE(index);
-
- // Traitement de la face
- // Attention La numérotation des noeuds Med commence a 1
-
- int longueur = _seq_elemId[index]->length();
- _seq_elemId[index]->length(longueur + nb_of_nodes);
-
- SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
-
- for(int k=0; itn->more(); k++)
- _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
- } //itFaces
-
- _mapNbTypes[SALOME_MED::MED_FACE] =
- trouveTria3 + trouveTria6 + trouveQuad4;
-
- _mapIndToSeqElts[SALOME_MED::MED_HEXA8] = _indexElts++;
- _mapIndToVectTypes[SALOME_MED::MED_CELL] = _indexEnts++;
- int index = _mapIndToSeqElts[medElement];
-
- int trouveHexa8 = 0;
-
- SMDS_VolumeIteratorPtr itVolumes=_meshDS->volumesIterator();
- while(itVolumes->more())
- {
- const SMDS_MeshVolume * elem = itVolumes->next();
-
- int nb_of_nodes = elem->NbNodes();
- medElement = SALOME_MED::MED_HEXA8;
- ASSERT(nb_of_nodes == 8);
-
- if (trouveHexa8 == 0)
- {
- trouveHexa8 = 1;
- _TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MED_HEXA8);
- };
- // Traitement de la maille
- int longueur = _seq_elemId[index]->length();
- _seq_elemId[index]->length(longueur + nb_of_nodes);
-
- SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
- for(int k=0; itn->more(); k++)
- _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
- }
-
- _mapNbTypes[SALOME_MED::MED_CELL] = trouveHexa8;
- _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES]
- =
- trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 +
- trouveSeg3;
- }// fin du _compte
-};
-
-//=============================================================================
-/*!
- * Creation des familles
- */
-//=============================================================================
-void SMESH_MEDMesh_i::createFamilies() throw(SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- string famDes = ("Je ne sais pas");
- string famName0 = "Famille_";
- string famName;
- char numero[10];
-
- if (_creeFamily == false)
- {
- _creeFamily = true;
- //SMESH_subMesh_i *subMeshServant;
-
- map < int, SMESH_subMesh_i * >::iterator it;
- for (it = _mesh_i->_mapSubMesh_i.begin();
- it != _mesh_i->_mapSubMesh_i.end(); it++)
- {
- SMESH_subMesh_i *submesh_i = (*it).second;
- int famIdent = (*it).first;
-
- ASSERT(famIdent < 999999999);
- sprintf(numero, "%d\n", famIdent);
- famName = famName0 + numero;
-
- SMESH_MEDFamily_i *famservant =
- new SMESH_MEDFamily_i(famIdent, submesh_i,
- famName, famDes, SALOME_MED::MED_NODE);
-#ifdef WNT
- SALOME_MED::FAMILY_ptr famille = SALOME_MED::FAMILY::_nil();
- POA_SALOME_MED::FAMILY* servantbase = dynamic_cast<POA_SALOME_MED::FAMILY*>(famservant);
- if ( servantbase )
- famille = SALOME_MED::FAMILY::_narrow( servantbase->_this() );
-#else
- SALOME_MED::FAMILY_ptr famille =
- SALOME_MED::FAMILY::_narrow( famservant->POA_SALOME_MED::FAMILY::_this() );
-#endif
- _families.push_back(famille);
- }
- }
-};
-//=============================================================================
-/*!
- * Gives informations of the considered mesh.
- */
-//=============================================================================
-SALOME_MED::GMESH::meshInfos * SMESH_MEDMesh_i::getMeshGlobal()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-
-//================================================================================
-/*!
- * \brief Converts this GMESH into MESH
- */
-//================================================================================
-
-SALOME_MED::MESH_ptr SMESH_MEDMesh_i::convertInMESH() throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-
-//=============================================================================
-/*!
- * Gives informations on coordinates of the considered mesh.
- */
-//=============================================================================
-SALOME_MED::GMESH::coordinateInfos * SMESH_MEDMesh_i::getCoordGlobal()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * Gives informations on connectivities of the considered mesh for the entity
- * entity.
- */
-//=============================================================================
-SALOME_MED::MESH::connectivityInfos *
-SMESH_MEDMesh_i::getConnectGlobal(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * Gives the type of the element number of entity entity
- */
-//=============================================================================
-SALOME_MED::medGeometryElement
-SMESH_MEDMesh_i::getElementType(SALOME_MED::medEntityMesh entity,
- CORBA::Long number)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return (SALOME_MED::medGeometryElement) 0;
-}
+++ /dev/null
-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-// File : SMESH_MEDMesh_i.hxx
-// Module : SMESH
-//
-#ifndef _MED_SMESH_MESH_I_HXX_
-#define _MED_SMESH_MESH_I_HXX_
-
-#include "SMESH.hxx"
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(MED)
-#include <string>
-#include <vector>
-#include <map>
-
-#include "SMESHDS_Mesh.hxx"
-
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "SALOME_GenericObj_i.hh"
-
-#define MED_NBR_GEOMETRIE_MAILLE 15
-#define MED_NBR_TYPE 5
-
-class SMESH_Mesh_i;
-
-class SMESH_I_EXPORT SMESH_MEDMesh_i:
- public virtual POA_SALOME_MED::MESH,
- public virtual SALOME::GenericObj_i
-{
-protected:
- // C++ object containing values
- ::SMESH_Mesh_i * _mesh_i;
- SMESHDS_Mesh *_meshDS;
-
- std::string _meshId;
- bool _compte;
- bool _creeFamily;
- int _indexElts;
- int _indexEnts;
- int _famIdent;
-
- std::map < SALOME_MED::medGeometryElement, int >_mapIndToSeqElts;
- SALOME_TYPES::ListOfLong_var _seq_elemId[MED_NBR_GEOMETRIE_MAILLE];
-
- std::map < SALOME_MED::medEntityMesh, int >_mapNbTypes;
- std::map < SALOME_MED::medEntityMesh, int >_mapIndToVectTypes;
- std::vector < SALOME_MED::medGeometryElement >
- _TypesId[MED_NBR_GEOMETRIE_MAILLE];
-
- std::vector < SALOME_MED::FAMILY_ptr > _families;
-public:
-
- // Constructors and associated internal methods
- SMESH_MEDMesh_i();
- SMESH_MEDMesh_i(SMESH_Mesh_i * m);
- ~SMESH_MEDMesh_i();
-
- // IDL Methods
- void setProtocol(SALOME::TypeOfCommunication typ) {}
- void release() {}
- SALOME::SenderDouble_ptr getSenderForCoordinates(SALOME_MED::medModeSwitch) {return SALOME::SenderDouble::_nil();}
- SALOME::SenderInt_ptr getSenderForConnectivity(SALOME_MED::medConnectivity,
- SALOME_MED::medEntityMesh,
- SALOME_MED::medGeometryElement)
- {
- return SALOME::SenderInt::_nil();
- }
- SALOME::SenderInt_ptr getSenderForConnectivityIndex(SALOME_MED::medConnectivity,
- SALOME_MED::medEntityMesh,
- SALOME_MED::medGeometryElement)
- {
- return SALOME::SenderInt::_nil();
- }
- SALOME::SenderInt_ptr getSenderForPolygonsConnectivity(SALOME_MED::medConnectivity, SALOME_MED::medEntityMesh) {return SALOME::SenderInt::_nil();}
- SALOME::SenderInt_ptr getSenderForPolygonsConnectivityIndex(SALOME_MED::medConnectivity, SALOME_MED::medEntityMesh) {return SALOME::SenderInt::_nil();}
- SALOME::SenderInt_ptr getSenderForPolyhedronConnectivity(SALOME_MED::medConnectivity) {return SALOME::SenderInt::_nil();}
- SALOME::SenderInt_ptr getSenderForPolyhedronIndex(SALOME_MED::medConnectivity) {return SALOME::SenderInt::_nil();}
- SALOME::SenderInt_ptr getSenderForPolyhedronFacesIndex() {return SALOME::SenderInt::_nil();}
-
- char *getName() throw(SALOME::SALOME_Exception);
- CORBA::Long getSpaceDimension() throw(SALOME::SALOME_Exception);
-
- CORBA::Long getMeshDimension() throw(SALOME::SALOME_Exception);
-
- CORBA::Boolean getIsAGrid() throw (SALOME::SALOME_Exception);
-
- CORBA::Boolean
- existConnectivity(SALOME_MED::medConnectivity connectivityType,
- SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception);
-
- char *getCoordinatesSystem() throw(SALOME::SALOME_Exception);
-
- CORBA::Double getCoordinate(CORBA::Long Number, CORBA::Long Axis)
- throw (SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfDouble * getCoordinates(SALOME_MED::medModeSwitch typeSwitch)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfString * getCoordinatesNames()
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfString * getCoordinatesUnits()
- throw(SALOME::SALOME_Exception);
-
- CORBA::Long getNumberOfNodes() throw(SALOME::SALOME_Exception);
-
- CORBA::Long getNumberOfTypes(SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::medGeometryElement_array *
- getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME::
- SALOME_Exception);
-
- SALOME_MED::medGeometryElement
- getElementType(SALOME_MED::medEntityMesh entity,
- CORBA::Long number)
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long getNumberOfElements(SALOME_MED::medEntityMesh entity,
- SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong *
- getConnectivity(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity,
- SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong *
- getConnectivityIndex(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong*
- getGlobalNumberingIndex(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long getElementNumber(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity,
- SALOME_MED::medGeometryElement type,
- const SALOME_TYPES::ListOfLong & connectivity)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong *
- getReverseConnectivity(SALOME_MED::medConnectivity mode)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong *
- getReverseConnectivityIndex(SALOME_MED::medConnectivity mode)
- throw(SALOME::SALOME_Exception);
-
- // Family and Group
- CORBA::Long getNumberOfFamilies(SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception);
-
- CORBA::Long getNumberOfGroups(SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::Family_array *
- getFamilies(SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::FAMILY_ptr getFamily(SALOME_MED::medEntityMesh entity,
- CORBA::Long i)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::Group_array * getGroups(SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::GROUP_ptr getGroup(SALOME_MED::medEntityMesh entity,
- CORBA::Long i)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::SUPPORT_ptr
- getBoundaryElements(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception);
-
- SALOME_MED::SUPPORT_ptr
- getSupportOnAll(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception);
-
- SALOME_MED::SUPPORT_ptr getSkin(SALOME_MED::SUPPORT_ptr mySupport3D)
- throw (SALOME::SALOME_Exception);
-
- SALOME_MED::FIELD_ptr getVolume(SALOME_MED::SUPPORT_ptr mySupport)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::FIELD_ptr getArea(SALOME_MED::SUPPORT_ptr mySupport)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::FIELD_ptr getLength(SALOME_MED::SUPPORT_ptr mySupport)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::FIELD_ptr getNormal(SALOME_MED::SUPPORT_ptr mySupport)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::FIELD_ptr getBarycenter(SALOME_MED::SUPPORT_ptr mySupport)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::FIELD_ptr getNeighbourhood(SALOME_MED::SUPPORT_ptr mySupport)
- throw(SALOME::SALOME_Exception);
-
- // Others
- void addInStudy(SALOMEDS::Study_ptr myStudy,
- SALOME_MED::GMESH_ptr myIor)
- throw(SALOME::SALOME_Exception);
- CORBA::Long addDriver(SALOME_MED::medDriverTypes driverType,
- const char *fileName, const char *meshName)
- throw(SALOME::SALOME_Exception);
- void rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception);
- void read(CORBA::Long i) throw(SALOME::SALOME_Exception);
- void write(CORBA::Long i, const char *driverMeshName)
- throw(SALOME::SALOME_Exception);
-
- // Cuisine interne
- CORBA::Long getCorbaIndex()
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::GMESH::meshInfos * getMeshGlobal()
- throw (SALOME::SALOME_Exception);
-
- bool areEquals(SALOME_MED::GMESH_ptr other) { return false;};
-
- SALOME_MED::MESH_ptr convertInMESH() throw (SALOME::SALOME_Exception);
-
- SALOME_MED::GMESH::coordinateInfos * getCoordGlobal()
- throw (SALOME::SALOME_Exception);
-
- SALOME_MED::MESH::connectivityInfos *
- getConnectGlobal(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception);
-
- //
- void calculeNbElts() throw(SALOME::SALOME_Exception);
- void createFamilies() throw(SALOME::SALOME_Exception);
-};
-
-#endif /* _MED_MESH_I_HXX_ */
+++ /dev/null
-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-// File : SMESH_MEDSupport_i.cxx
-// Module : SMESH
-//
-#include "SMESH_MEDSupport_i.hxx"
-#include "utilities.h"
-#include "Utils_CorbaException.hxx"
-#include "Utils_ExceptHandlers.hxx"
-
-#include "SMESHDS_Mesh.hxx"
-
-#include "SMESH_subMesh.hxx"
-#include "SMESH_Mesh_i.hxx"
-#include "SMESH_subMesh_i.hxx"
-#include "SMESH_Gen_i.hxx"
-
-#include <TopoDS_Iterator.hxx>
-
-using namespace std;
-
-
-//=============================================================================
-/*!
- * Default constructor
- */
-//=============================================================================
-SMESH_MEDSupport_i::SMESH_MEDSupport_i()
-{
- BEGIN_OF("Default Constructor SMESH_MEDSupport_i");
- END_OF("Default Constructor SMESH_MEDSupport_i");
-}
-
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDSupport_i::SMESH_MEDSupport_i(SMESH_subMesh_i * sm, string name,
- string description, SALOME_MED::medEntityMesh entity)
- :_subMesh_i(sm), _name(name), _description(description), _entity(entity),
- _seqNumber(false), _seqLength(0)
-{
- BEGIN_OF("Constructor SMESH_MEDSupport_i");
-
- int subMeshId = sm->GetId();
-
- MESSAGE(" subMeshId " << subMeshId);
-
- SMESH_Mesh_i* mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( sm->GetMesh() );
- _subMesh = mesh_i->GetImpl().GetSubMeshContaining( subMeshId );
-
- if (_entity == SALOME_MED::MED_NODE)
- {
- _numberOfGeometricType = 1;
- _geometricType = new SALOME_MED::medGeometryElement[1];
- _geometricType[0] = SALOME_MED::MED_NONE;
- }
- else
- {
- MESSAGE("Pas implemente dans cette version");
- THROW_SALOME_CORBA_EXCEPTION
- ("Seules les familles de noeuds sont implementees ",
- SALOME::BAD_PARAM);
- }
-
- END_OF("Constructor SMESH_MEDSupport_i");
-}
-
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDSupport_i::
-SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s):_subMesh(s._subMesh),
-_name(s._name), _description(s._description), _entity(s._entity),
-_seqNumber(false), _seqLength(0)
-{
- BEGIN_OF("Constructor SMESH_MEDSupport_i");
-
- END_OF("Constructor SMESH_MEDSupport_i");
-}
-
-//=============================================================================
-/*!
- * Destructor
- */
-//=============================================================================
-
-SMESH_MEDSupport_i::~SMESH_MEDSupport_i()
-{
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Corba Index
- */
-//=============================================================================
-
-CORBA::Long SMESH_MEDSupport_i::getCorbaIndex()throw(SALOME::SALOME_Exception)
-{
- if (_subMesh == NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- MESSAGE("Not implemented for SMESH_i");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented ", SALOME::BAD_PARAM);
-
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Name
- */
-//=============================================================================
-
-char *SMESH_MEDSupport_i::getName() throw(SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return CORBA::string_dup(_name.c_str());
-
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Description
- */
-//=============================================================================
-
-char *SMESH_MEDSupport_i::getDescription() throw(SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return CORBA::string_dup(_description.c_str());
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Mesh
- */
-//=============================================================================
-
-SALOME_MED::GMESH_ptr SMESH_MEDSupport_i::getMesh()throw(SALOME::
- SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
-
- return _subMesh_i->GetMesh()->GetMEDMesh();
-}
-
-//=============================================================================
-/*!
- * CORBA: boolean indicating if support concerns all elements
- */
-//=============================================================================
-
-CORBA::Boolean SMESH_MEDSupport_i::isOnAllElements()throw(SALOME::
- SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- if (_seqNumber == false)
- {
- if (_entity != SALOME_MED::MED_NONE)
- {
- _seqLength = _subMesh_i->GetNumberOfNodes(/*all=*/false);
- _seqNumber = true;
- }
- else
- {
- MESSAGE("Only Node Families are implemented ");
- THROW_SALOME_CORBA_EXCEPTION("Not implemented Yet ",
- SALOME::BAD_PARAM);
- }
- }
- try
- {
- _isOnAllElements = (_seqLength == _subMesh->GetFather()->NbNodes());
- }
- catch(...)
- {
- MESSAGE("unable to acces related Mesh");
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- };
- return _isOnAllElements;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for type of support's entity
- */
-//=============================================================================
-
-SALOME_MED::medEntityMesh SMESH_MEDSupport_i::getEntity()throw(SALOME::
- SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return _entity;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for types of geometry elements
- */
-//=============================================================================
-
-SALOME_MED::medGeometryElement_array *
- SMESH_MEDSupport_i::getTypes()throw(SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- SALOME_MED::medGeometryElement_array_var myseq =
- new SALOME_MED::medGeometryElement_array;
- try
- {
- int mySeqLength = _numberOfGeometricType;
- myseq->length(mySeqLength);
- for (int i = 0; i < mySeqLength; i++)
- {
- myseq[i] = _geometricType[i];
- }
- }
- catch(...)
- {
- MESSAGE("Exception lors de la recherche des differents types");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Support Types",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Number of different types of geometry elements
- * existing in the support
- */
-//=============================================================================
-CORBA::Long SMESH_MEDSupport_i::getNumberOfElements(SALOME_MED::
- medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return _numberOfGeometricType;
-
-}
-
-//=============================================================================
-/*!
- * CORBA: get Nodes
- */
-//=============================================================================
-
-SALOME_TYPES::ListOfLong * SMESH_MEDSupport_i::getNumber(
- SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- if (_subMesh==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
-
- // A changer s'il ne s agit plus seulement de famille de noeuds
- if (geomElement != SALOME_MED::MED_NONE)
- THROW_SALOME_CORBA_EXCEPTION("Not implemented", SALOME::BAD_PARAM);
-
- SALOME_TYPES::ListOfLong_var myseq = new SALOME_TYPES::ListOfLong;
-
- int i = 0;
- myseq->length(_subMesh_i->GetNumberOfNodes(/*all=*/false));
-
- if ( _subMesh->GetSubMeshDS() )
- {
- SMDS_NodeIteratorPtr it = _subMesh->GetSubMeshDS()->GetNodes();
- while(it->more())
- {
- myseq[i] = it->next()->GetID();
- i++;
- };
- }
-
- SCRUTE(myseq->length());
- MESSAGE("End of SMESH_MEDSupport_i::getNumber");
- return myseq._retn();
-
-}
-
-//=============================================================================
-/*!
- * CORBA: get Nodes from file
- */
-//=============================================================================
-
-SALOME_TYPES::ListOfLong * SMESH_MEDSupport_i::getNumberFromFile(
- SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- return getNumber(geomElement);
-}
-
-//=============================================================================
-/*!
- * CORBA: Global Nodes Index (optionnaly designed by the user)
- * CORBA: ??????????????????????????????
- */
-//=============================================================================
-
-SALOME_TYPES::ListOfLong *
- SMESH_MEDSupport_i::getNumberIndex()throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Not implemented for SMESH_i");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Array containing indexes for elements included in the support
- */
-//=============================================================================
-
-CORBA::Long SMESH_MEDSupport_i::getNumberOfGaussPoint(SALOME_MED::
- medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Not implemented for SMESH_i");
- return 0;
-}
-//=============================================================================
-/*!
- * Gives the number of types of elements included in the support
- */
-//=============================================================================
-CORBA::Long SMESH_MEDSupport_i::getNumberOfTypes()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return 0;
-}
-//=============================================================================
-/*!
- * Gives CORBA: Array containing the numbers of Gauss point of elements
- * included in the support
- */
-//=============================================================================
-SALOME_TYPES::ListOfLong* SMESH_MEDSupport_i::getNumbersOfGaussPoint()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
-//=============================================================================
-/*!
- * build the object which will contain all the boundary elements of the mesh.
- */
-//=============================================================================
-void SMESH_MEDSupport_i::getBoundaryElements()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
-}
-//=============================================================================
-/*!
- * Gives information on the support
- */
-//=============================================================================
-SALOME_MED::SUPPORT::supportInfos * SMESH_MEDSupport_i::getSupportGlobal()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
+++ /dev/null
-// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE
-//
-// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
-//
-
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-// File : SMESH_MEDSupport_i.hxx
-// Module : SMESH
-//
-#ifndef _MED_SMESH_MEDSUPPORT_I_HXX_
-#define _MED_SMESH_MEDSUPPORT_I_HXX_
-
-#include "SMESH.hxx"
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(MED)
-#include <string>
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_SubMesh.hxx"
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-
-#include "SMESH_MEDSupport_i.hxx"
-#include "SALOME_GenericObj_i.hh"
-class SMESH_subMesh;
-class SMESH_subMesh_i;
-
-class SMESH_I_EXPORT SMESH_MEDSupport_i:
- public virtual POA_SALOME_MED::SUPPORT, public virtual SALOME::GenericObj_i
-{
- public:
-
-// Constructors and associated internal methods
- SMESH_MEDSupport_i(SMESH_subMesh_i * sm,
- std::string name, std::string description, SALOME_MED::medEntityMesh entity);
- SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s);
-
-// IDL Methods
- char *getName() throw(SALOME::SALOME_Exception);
- char *getDescription() throw(SALOME::SALOME_Exception);
- SALOME_MED::GMESH_ptr getMesh() throw(SALOME::SALOME_Exception);
- CORBA::Boolean isOnAllElements() throw(SALOME::SALOME_Exception);
- SALOME_MED::medEntityMesh getEntity() throw(SALOME::SALOME_Exception);
- CORBA::Long
- getNumberOfElements(SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- CORBA::Long getNumberOfTypes() throw (SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong *
- getNumber(SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- /*!
- * Same function as getNumber.
- */
- SALOME_TYPES::ListOfLong *
- getNumberFromFile(SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong * getNumberIndex()
- throw(SALOME::SALOME_Exception);
-
- CORBA::Long
- getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- SALOME_TYPES::ListOfLong* getNumbersOfGaussPoint()
- throw (SALOME::SALOME_Exception);
-
- SALOME_MED::medGeometryElement_array *getTypes()
- throw(SALOME::SALOME_Exception);
-
- void getBoundaryElements() throw (SALOME::SALOME_Exception);
-
- CORBA::Long getCorbaIndex() throw(SALOME::SALOME_Exception);
-
- SALOME_MED::SUPPORT::supportInfos * getSupportGlobal()
- throw (SALOME::SALOME_Exception);
-
- void createSeq() throw(SALOME::SALOME_Exception);
-
- public: //public field
- SMESH_subMesh_i * _subMesh_i;
- ::SMESH_subMesh * _subMesh;
-
- std::string _name;
- std::string _description;
- bool _isOnAllElements;
- bool _seqNumber;
- int _seqLength;
-
- SALOME_MED::medEntityMesh _entity;
- SALOME_MED::medGeometryElement * _geometricType;
- int _numberOfGeometricType;
-
- protected:
- SMESH_MEDSupport_i();
- ~SMESH_MEDSupport_i();
-};
-
-#endif /* _MED_MEDSUPPORT_I_HXX_ */
TIDSortedElemSet& aMap,
const SMDSAbs_ElementType aType = SMDSAbs_All )
{
- for (int i=0; i<IDs.length(); i++) {
- CORBA::Long ind = IDs[i];
- const SMDS_MeshElement * elem =
- (aType == SMDSAbs_Node ? aMesh->FindNode(ind) : aMesh->FindElement(ind));
- if ( elem && ( aType == SMDSAbs_All || elem->GetType() == aType ))
- aMap.insert( aMap.end(), elem );
- }
+ SMDS_MeshElement::NonNullFilter filter1;
+ SMDS_MeshElement::TypeFilter filter2( aType );
+ SMDS_MeshElement::Filter & filter =
+ ( aType == SMDSAbs_All ) ? (SMDS_MeshElement::Filter&) filter1 : filter2;
+
+ if ( aType == SMDSAbs_Node )
+ for (int i=0; i<IDs.length(); i++) {
+ const SMDS_MeshElement * elem = aMesh->FindNode( IDs[i] );
+ if ( filter( elem ))
+ aMap.insert( aMap.end(), elem );
+ }
+ else
+ for (int i=0; i<IDs.length(); i++) {
+ const SMDS_MeshElement * elem = aMesh->FindElement( IDs[i] );
+ if ( filter( elem ))
+ aMap.insert( aMap.end(), elem );
+ }
}
//================================================================================
/*!
SMESH::SMESH_Mesh_ptr _mesh;
SMESH::long_array* GetIDs() { return new SMESH::long_array( _ids ); }
SMESH::long_array* GetMeshInfo() { return 0; }
+ SMESH::long_array* GetNbElementsByType()
+ {
+ SMESH::long_array_var aRes = new SMESH::long_array();
+ aRes->length(SMESH::NB_ELEMENT_TYPES);
+ for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++)
+ aRes[ i ] = ( i == _type ) ? _ids.length() : 0;
+ return aRes._retn();
+ }
SMESH::SMESH_Mesh_ptr GetMesh() { return SMESH::SMESH_Mesh::_duplicate( _mesh ); }
bool IsMeshInfoCorrect() { return true; }
SMESH::array_of_ElementType* GetTypes()
return SMESH::DownCast<SMESH_MeshEditor_i::_IDSource*>( idSource );
}
+CORBA::Long* SMESH_MeshEditor_i::GetTemporaryIDs( SMESH::SMESH_IDSource_ptr& idSource,
+ int& nbIds)
+{
+ if ( _IDSource* tmpIdSource = SMESH::DownCast<SMESH_MeshEditor_i::_IDSource*>( idSource ))
+ {
+ nbIds = (int) tmpIdSource->_ids.length();
+ return & tmpIdSource->_ids[0];
+ }
+ nbIds = 0;
+ return 0;
+}
+
void SMESH_MeshEditor_i::deleteAuxIDSources()
{
std::list< _IDSource* >::iterator idSrcIt = myAuxIDSources.begin();
TPythonDump pyDump;
TIDSortedElemSet elements, elems0D;
+ prepareIdSource( theObject );
if ( idSourceToSet( theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
getEditor().Create0DElementsOnAllNodes( elements, elems0D );
TPythonDump aTPythonDump; // suppress dump in Reorient()
+ prepareIdSource( theObject );
+
SMESH::long_array_var anElementsId = theObject->GetIDs();
CORBA::Boolean isDone = Reorient(anElementsId);
initData(/*deleteSearchers=*/false);
TIDSortedElemSet elements;
+ prepareIdSource( the2Dgroup );
if ( !idSourceToSet( the2Dgroup, getMeshDS(), elements, SMDSAbs_Face, /*emptyIfIsMesh=*/1))
THROW_SALOME_CORBA_EXCEPTION("No faces in given group", SALOME::BAD_PARAM);
initData();
TPythonDump aTPythonDump; // suppress dump in TriToQuad()
+
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
CORBA::Boolean isDone = TriToQuad(anElementsId, Criterion, MaxAngle);
TPythonDump aTPythonDump; // suppress dump in QuadToTri()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
CORBA::Boolean isDone = QuadToTri(anElementsId, Criterion);
initData();
TIDSortedElemSet faces;
+ prepareIdSource( theObject );
if ( !idSourceToSet( theObject, getMeshDS(), faces, SMDSAbs_Face, /*emptyIfIsMesh=*/true ) &&
faces.empty() )
THROW_SALOME_CORBA_EXCEPTION("No faces given", SALOME::BAD_PARAM);
TPythonDump aTPythonDump; // suppress dump in SplitQuad()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
CORBA::Boolean isDone = SplitQuad(anElementsId, Diag13);
SMESH_TRY;
initData();
+ prepareIdSource( elems );
SMESH::long_array_var anElementsId = elems->GetIDs();
TIDSortedElemSet elemSet;
arrayToSet( anElementsId, getMeshDS(), elemSet, SMDSAbs_Volume );
TPythonDump aTPythonDump; // suppress dump in smooth()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
CORBA::Boolean isDone = smooth (anElementsId, IDsOfFixedNodes, MaxNbOfIterations,
MaxAspectRatio, Method, IsParametric);
<< theNbOfSteps << ", "
<< theTolerance << " )";
}
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
rotationSweep(anElementsId,
theAxis,
<< TVar( theNbOfSteps ) << ", "
<< TVar( theTolerance ) << " )";
}
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
rotationSweep(anElementsId,
theAxis,
<< TVar( theNbOfSteps ) << ", "
<< TVar( theTolerance ) << " )";
}
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
rotationSweep(anElementsId,
theAxis,
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId,
theAxis,
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId,
theAxis,
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId,
theAxis,
CORBA::Long theNbOfSteps)
throw (SALOME::SALOME_Exception)
{
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false );
if (!myIsPreviewMode) {
CORBA::Long theNbOfSteps)
throw (SALOME::SALOME_Exception)
{
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Node );
if ( !myIsPreviewMode ) {
CORBA::Long theNbOfSteps)
throw (SALOME::SALOME_Exception)
{
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Edge );
if ( !myIsPreviewMode ) {
CORBA::Long theNbOfSteps)
throw (SALOME::SALOME_Exception)
{
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false, SMDSAbs_Face );
if ( !myIsPreviewMode ) {
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector, theNbOfSteps, true);
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector,
theNbOfSteps, true, SMDSAbs_Node);
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector,
theNbOfSteps, true, SMDSAbs_Edge);
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionSweep(anElementsId, theStepVector,
theNbOfSteps, true, SMDSAbs_Face);
<< ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )";
}
SMESH::SMESH_MeshEditor::Extrusion_Error anError;
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
extrusionAlongPath( anElementsId,
thePathMesh,
<< ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )";
}
SMESH::SMESH_MeshEditor::Extrusion_Error anError;
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
extrusionAlongPath( anElementsId,
thePathMesh,
<< ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )";
}
SMESH::SMESH_MeshEditor::Extrusion_Error anError;
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
extrusionAlongPath( anElementsId,
thePathMesh,
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId,
thePathMesh,
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId,
thePathMesh,
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( theObject );
SMESH::long_array_var anElementsId = theObject->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId,
thePathMesh,
{
TPythonDump aPythonDump; // it is here to prevent dump of GetGroups()
+ prepareIdSource( Object );
SMESH::long_array_var anElementsId = Object->GetIDs();
SMESH::ListOfGroups * aGroups = extrusionAlongPathX(anElementsId,
Path,
bool emptyIfIsMesh = myIsPreviewMode ? false : true;
+ prepareIdSource( theObject );
if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
mirror(elements, theAxis, theMirrorType, theCopy, false);
}
SMESH::ListOfGroups * aGroups = 0;
TIDSortedElemSet elements;
+ prepareIdSource( theObject );
if ( idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
aGroups = mirror(elements, theMirror, theMirrorType, true, true);
mesh = makeMesh( theMeshName );
mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
TIDSortedElemSet elements;
+ prepareIdSource( theObject );
if ( mesh_i &&
idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
{
bool emptyIfIsMesh = myIsPreviewMode ? false : true;
+ prepareIdSource( theObject );
if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
translate(elements, theVector, theCopy, false);
}
SMESH::ListOfGroups * aGroups = 0;
TIDSortedElemSet elements;
+ prepareIdSource( theObject );
if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
aGroups = translate(elements, theVector, true, true);
mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
TIDSortedElemSet elements;
+ prepareIdSource( theObject );
if ( mesh_i &&
idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
{
}
TIDSortedElemSet elements;
bool emptyIfIsMesh = myIsPreviewMode ? false : true;
+ prepareIdSource( theObject );
if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
rotate(elements,theAxis,theAngle,theCopy,false);
}
SMESH::ListOfGroups * aGroups = 0;
TIDSortedElemSet elements;
+ prepareIdSource( theObject );
if (idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
aGroups = rotate(elements, theAxis, theAngle, true, true);
mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( mesh );
TIDSortedElemSet elements;
+ prepareIdSource( theObject );
if (mesh_i &&
idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, /*emptyIfIsMesh=*/1))
{
theCopy = false;
TIDSortedElemSet elements;
+ prepareIdSource( theObject );
bool emptyIfIsMesh = myIsPreviewMode ? false : true;
if ( !idSourceToSet(theObject, getMeshDS(), elements, SMDSAbs_All, emptyIfIsMesh))
return 0;
initData();
TIDSortedNodeSet nodes;
+ prepareIdSource( theObject );
idSourceToNodeSet( theObject, getMeshDS(), nodes );
::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes;
initData();
TIDSortedNodeSet nodes;
+ prepareIdSource( theObject );
idSourceToNodeSet( theObject, getMeshDS(), nodes );
for ( int i = 0; i < theExceptSubMeshOrGroups.length(); ++i )
if ( !(!group->_is_nil() && group->GetType() == SMESH::NODE) )
{
TIDSortedElemSet elems;
+ prepareIdSource( theObject );
idSourceToSet( theObject, getMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true);
::SMESH_MeshEditor::TListOfListOfElementsID aListOfListOfElementsID;
TIDSortedElemSet elems;
bool elemsOK;
if ( !( elemsOK = CORBA::is_nil( theObject )))
+ {
+ prepareIdSource( theObject );
elemsOK = idSourceToSet( theObject, getMeshDS(), elems,
SMDSAbs_All, /*emptyIfIsMesh=*/true );
+ }
if ( elemsOK )
{
if ( !elems.empty() && (*elems.begin())->GetType() == SMDSAbs_Node )
throw (SALOME::SALOME_Exception)
{
SMESH_TRY;
- TPythonDump pyDump;
+
+ TPythonDump pyDump;
+
TIDSortedElemSet elems;
+ prepareIdSource( theObject );
if ( idSourceToSet( theObject, getMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true ))
{
if ( elems.empty() )
int index = 0;
while (!groupNames.insert(name).second)
- name = SMESH_Comment( thePrefix ) << "_" << index;
+ name = SMESH_Comment( thePrefix ) << "_" << index++;
return name;
}
+//================================================================================
+/*!
+ * \brief Prepare SMESH_IDSource for work
+ */
+//================================================================================
+
+void SMESH_MeshEditor_i::prepareIdSource(SMESH::SMESH_IDSource_ptr theObject)
+{
+ if ( SMESH::Filter_i* filter = SMESH::DownCast<SMESH::Filter_i*>( theObject ))
+ {
+ SMESH::SMESH_Mesh_var mesh = myMesh_i->_this();
+ filter->SetMesh( mesh );
+ }
+}
+
+//================================================================================
+/*!
+ * \brief Duplicates given elements, i.e. creates new elements based on the
+ * same nodes as the given ones.
+ * \param theElements - container of elements to duplicate.
+ * \param theGroupName - a name of group to contain the generated elements.
+ * If a group with such a name already exists, the new elements
+ * are added to the existng group, else a new group is created.
+ * If \a theGroupName is empty, new elements are not added
+ * in any group.
+ * \return a group where the new elements are added. NULL if theGroupName == "".
+ * \sa DoubleNode()
+ */
+//================================================================================
+
+SMESH::SMESH_Group_ptr
+SMESH_MeshEditor_i::DoubleElements(SMESH::SMESH_IDSource_ptr theElements,
+ const char* theGroupName)
+ throw (SALOME::SALOME_Exception)
+{
+ SMESH::SMESH_Group_var newGroup;
+
+ SMESH_TRY;
+ initData();
+
+ TPythonDump pyDump;
+
+ TIDSortedElemSet elems;
+ prepareIdSource( theElements );
+ if ( idSourceToSet( theElements, getMeshDS(), elems, SMDSAbs_All, /*emptyIfIsMesh=*/true))
+ {
+ getEditor().DoubleElements( elems );
+
+ if ( strlen( theGroupName ) && !getEditor().GetLastCreatedElems().IsEmpty() )
+ {
+ // group type
+ SMESH::ElementType type =
+ SMESH::ElementType( getEditor().GetLastCreatedElems().Value(1)->GetType() );
+ // find existing group
+ SMESH::ListOfGroups_var groups = myMesh_i->GetGroups();
+ for ( size_t i = 0; i < groups->length(); ++i )
+ if ( groups[i]->GetType() == type )
+ {
+ CORBA::String_var name = groups[i]->GetName();
+ if ( strcmp( name, theGroupName ) == 0 ) {
+ newGroup = SMESH::SMESH_Group::_narrow( groups[i] );
+ break;
+ }
+ }
+ // create a new group
+ if ( newGroup->_is_nil() )
+ newGroup = myMesh_i->CreateGroup( type, theGroupName );
+ // fill newGroup
+ if ( SMESH_Group_i* group_i = SMESH::DownCast< SMESH_Group_i* >( newGroup ))
+ {
+ SMESHDS_Group* groupDS = static_cast< SMESHDS_Group* >( group_i->GetGroupDS() );
+ const SMESH_SequenceOfElemPtr& aSeq = getEditor().GetLastCreatedElems();
+ for ( int i = 1; i <= aSeq.Length(); i++ )
+ groupDS->SMDSGroup().Add( aSeq(i) );
+ }
+ }
+ }
+ // python dump
+ if ( !newGroup->_is_nil() )
+ pyDump << newGroup << " = ";
+ pyDump << this << ".DoubleElements( "
+ << theElements << ", " << "'" << theGroupName <<"')";
+
+ SMESH_CATCH( SMESH::throwCorbaException );
+
+ return newGroup._retn();
+}
+
//================================================================================
/*!
\brief Creates a hole in a mesh by doubling the nodes of some particular elements
TIDSortedElemSet elements;
SMDSAbs_ElementType elemType = (dim == SMESH::BND_1DFROM2D) ? SMDSAbs_Face : SMDSAbs_Volume;
+ prepareIdSource( idSource );
if ( idSourceToSet( idSource, aMeshDS, elements, elemType,/*emptyIfIsMesh=*/true ))
{
// mesh to fill in
SMESH::SMESH_IDSource_ptr MakeIDSource(const SMESH::long_array& IDsOfElements,
SMESH::ElementType type);
static bool IsTemporaryIDSource( SMESH::SMESH_IDSource_ptr& idSource );
+ static CORBA::Long* GetTemporaryIDs( SMESH::SMESH_IDSource_ptr& idSource, int& nbIds );
CORBA::Boolean RemoveElements(const SMESH::long_array & IDsOfElements)
throw (SALOME::SALOME_Exception);
CORBA::Boolean ChangeElemNodes(CORBA::Long ide, const SMESH::long_array& newIDs)
throw (SALOME::SALOME_Exception);
+ SMESH::SMESH_Group_ptr DoubleElements(SMESH::SMESH_IDSource_ptr theElements,
+ const char* theGroupName)
+ throw (SALOME::SALOME_Exception);
+
CORBA::Boolean DoubleNodes( const SMESH::long_array& theNodes,
const SMESH::long_array& theModifiedElems )
throw (SALOME::SALOME_Exception);
string generateGroupName(const string& thePrefix);
+ void prepareIdSource(SMESH::SMESH_IDSource_ptr theObject);
+
private: //!< fields
SMESH_Mesh_i* myMesh_i;
#include "DriverMED_R_SMESHDS_Mesh.h"
#include "DriverMED_W_SMESHDS_Mesh.h"
+#include "MED_Factory.hxx"
#include "SMDS_EdgePosition.hxx"
#include "SMDS_ElemIterator.hxx"
#include "SMDS_FacePosition.hxx"
#include "SMESHDS_CommandType.hxx"
#include "SMESHDS_Group.hxx"
#include "SMESHDS_GroupOnGeom.hxx"
+#include "SMESH_Controls.hxx"
#include "SMESH_Filter_i.hxx"
#include "SMESH_Gen_i.hxx"
#include "SMESH_Group.hxx"
#include "SMESH_Group_i.hxx"
-#include "SMESH_MEDMesh_i.hxx"
#include "SMESH_MeshEditor.hxx"
#include "SMESH_MeshEditor_i.hxx"
#include "SMESH_MeshPartDS.hxx"
int major, minor, release;
if( !MED::getMEDVersion( theFileName, major, minor, release ) )
major = minor = release = -1;
- _medFileInfo = new SALOME_MED::MedFileInfo();
+ _medFileInfo = new SMESH::MedFileInfo();
_medFileInfo->fileName = theFileName;
_medFileInfo->fileSize = 0;
#ifdef WIN32
// register CORBA object for persistence
int nextId = _gen_i->RegisterObject( subMesh );
- if(MYDEBUG) MESSAGE( "Add submesh to map with id = "<< nextId);
+ if(MYDEBUG) { MESSAGE( "Add submesh to map with id = "<< nextId); }
+ else { nextId = 0; } // avoid "unused variable" warning in release mode
// to track changes of GEOM groups
addGeomGroupData( theSubShapeObject, subMesh );
// register CORBA object for persistence
int nextId = _gen_i->RegisterObject( aGroup );
- if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
+ if(MYDEBUG) { MESSAGE( "Add group to map with id = "<< nextId); }
+ else { nextId = 0; } // avoid "unused variable" warning in release mode
// to track changes of GEOM groups
if ( !theShape.IsNull() ) {
void SMESH_Mesh_i::ExportToMEDX (const char* file,
CORBA::Boolean auto_groups,
SMESH::MED_VERSION theVersion,
- CORBA::Boolean overwrite)
+ CORBA::Boolean overwrite,
+ CORBA::Boolean autoDimension)
throw(SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
string aMeshName = prepareMeshNameAndGroups(file, overwrite);
TPythonDump() << _this() << ".ExportToMEDX( r'"
- << file << "', " << auto_groups << ", " << theVersion << ", " << overwrite << " )";
+ << file << "', " << auto_groups << ", "
+ << theVersion << ", " << overwrite << ", "
+ << autoDimension << " )";
- _impl->ExportMED( file, aMeshName.c_str(), auto_groups, theVersion );
+ _impl->ExportMED( file, aMeshName.c_str(), auto_groups, theVersion, 0, autoDimension );
}
//================================================================================
const char* file,
CORBA::Boolean auto_groups,
::SMESH::MED_VERSION version,
- ::CORBA::Boolean overwrite)
+ ::CORBA::Boolean overwrite,
+ ::CORBA::Boolean autoDimension)
throw (SALOME::SALOME_Exception)
{
Unexpect aCatch(SALOME_SalomeException);
- if ( _preMeshInfo )
- _preMeshInfo->FullLoadFromFile();
+ TPythonDump pyDump;
- PrepareForWriting(file, overwrite);
+ if ( SMESH_Mesh_i * mesh = SMESH::DownCast< SMESH_Mesh_i* >( meshPart ))
+ {
+ mesh->ExportToMEDX( file, auto_groups, version, autoDimension );
+ }
+ else
+ {
+ if ( _preMeshInfo )
+ _preMeshInfo->FullLoadFromFile();
- string aMeshName = "Mesh";
- SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
- if ( !aStudy->_is_nil() ) {
- SALOMEDS::SObject_wrap SO = _gen_i->ObjectToSObject( aStudy, meshPart );
- if ( !SO->_is_nil() ) {
- CORBA::String_var name = SO->GetName();
- aMeshName = name;
+ PrepareForWriting(file, overwrite);
+
+ string aMeshName = "Mesh";
+ SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy();
+ if ( !aStudy->_is_nil() ) {
+ SALOMEDS::SObject_wrap SO = _gen_i->ObjectToSObject( aStudy, meshPart );
+ if ( !SO->_is_nil() ) {
+ CORBA::String_var name = SO->GetName();
+ aMeshName = name;
+ }
}
+ SMESH_MeshPartDS partDS( meshPart );
+ _impl->ExportMED( file, aMeshName.c_str(), auto_groups, version, &partDS, autoDimension );
}
- SMESH_MeshPartDS partDS( meshPart );
- _impl->ExportMED( file, aMeshName.c_str(), auto_groups, version, &partDS );
-
- TPythonDump() << _this() << ".ExportPartToMED( " << meshPart << ", r'" << file << "', "
- << auto_groups << ", " << version << ", " << overwrite << " )";
+ pyDump << _this() << ".ExportPartToMED( " << meshPart << ", r'" << file << "', "
+ << auto_groups << ", " << version << ", " << overwrite << ", "
+ << autoDimension << " )";
}
//================================================================================
//=============================================================================
/*!
- * Return implementation of SALOME_MED::MESH interfaces
+ * Return computation progress [0.,1]
*/
//=============================================================================
-SALOME_MED::MESH_ptr SMESH_Mesh_i::GetMEDMesh()throw(SALOME::SALOME_Exception)
+CORBA::Double SMESH_Mesh_i::GetComputeProgress()
{
- Unexpect aCatch(SALOME_SalomeException);
- if ( _preMeshInfo )
- _preMeshInfo->FullLoadFromFile();
+ SMESH_TRY;
- SMESH_MEDMesh_i *aMedMesh = new SMESH_MEDMesh_i(this);
- SALOME_MED::MESH_var aMesh = aMedMesh->_this();
- return aMesh._retn();
-}
+ return _impl->GetComputeProgress();
-//=============================================================================
+ SMESH_CATCH( SMESH::doNothing );
+ return 0.;
+}
CORBA::Long SMESH_Mesh_i::NbNodes()throw(SALOME::SALOME_Exception)
{
// register CORBA object for persistence
int nextId = _gen_i->RegisterObject( groupVar );
- if(MYDEBUG) MESSAGE( "Add group to map with id = "<< nextId);
+ if(MYDEBUG) { MESSAGE( "Add group to map with id = "<< nextId); }
+ else { nextId = 0; } // avoid "unused variable" warning in release mode
// publishing the groups in the study
if ( !aStudy->_is_nil() ) {
*/
//=============================================================================
-SALOME_MED::MedFileInfo* SMESH_Mesh_i::GetMEDFileInfo()
+SMESH::MedFileInfo* SMESH_Mesh_i::GetMEDFileInfo()
{
- SALOME_MED::MedFileInfo_var res( _medFileInfo );
+ SMESH::MedFileInfo_var res( _medFileInfo );
if ( !res.operator->() ) {
- res = new SALOME_MED::MedFileInfo;
+ res = new SMESH::MedFileInfo;
res->fileName = "";
res->fileSize = res->major = res->minor = res->release = -1;
}
//=============================================================================
/*!
- * \brief Returns statistic of mesh elements
+ * \brief Returns number of mesh elements per each \a EntityType
*/
//=============================================================================
//=============================================================================
/*!
- * \brief Collect statistic of mesh elements given by iterator
+ * \brief Returns number of mesh elements per each \a ElementType
+ */
+//=============================================================================
+
+SMESH::long_array* SMESH_Mesh_i::GetNbElementsByType()
+{
+ SMESH::long_array_var aRes = new SMESH::long_array();
+ aRes->length(SMESH::NB_ELEMENT_TYPES);
+ for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++)
+ aRes[ i ] = 0;
+
+ const SMDS_MeshInfo* meshInfo = 0;
+ if ( _preMeshInfo )
+ meshInfo = _preMeshInfo;
+ else if ( SMESHDS_Mesh* meshDS = _impl->GetMeshDS() )
+ meshInfo = & meshDS->GetMeshInfo();
+
+ if (meshInfo)
+ for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++)
+ aRes[i] = meshInfo->NbElements((SMDSAbs_ElementType)i);
+
+ return aRes._retn();
+}
+
+//=============================================================================
+/*
+ * Collect statistic of mesh elements given by iterator
*/
//=============================================================================
theInfo[ theItr->next()->GetEntityType() ]++;
}
+//=============================================================================
+namespace /* Iterators used in SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_var obj,
+ * SMESH::ElementType type) */
+{
+ using namespace SMESH::Controls;
+ //-----------------------------------------------------------------------------
+ struct PredicateIterator : public SMDS_ElemIterator
+ {
+ SMDS_ElemIteratorPtr _elemIter;
+ PredicatePtr _predicate;
+ const SMDS_MeshElement* _elem;
+
+ PredicateIterator( SMDS_ElemIteratorPtr iterator,
+ PredicatePtr predicate):
+ _elemIter(iterator), _predicate(predicate)
+ {
+ next();
+ }
+ virtual bool more()
+ {
+ return _elem;
+ }
+ virtual const SMDS_MeshElement* next()
+ {
+ const SMDS_MeshElement* res = _elem;
+ _elem = 0;
+ while ( _elemIter->more() && !_elem )
+ {
+ _elem = _elemIter->next();
+ if ( _elem && ( !_predicate->IsSatisfy( _elem->GetID() )))
+ _elem = 0;
+ }
+ return res;
+ }
+ };
+
+ //-----------------------------------------------------------------------------
+ struct IDSourceIterator : public SMDS_ElemIterator
+ {
+ const CORBA::Long* _idPtr;
+ const CORBA::Long* _idEndPtr;
+ SMESH::long_array_var _idArray;
+ const SMDS_Mesh* _mesh;
+ const SMDSAbs_ElementType _type;
+ const SMDS_MeshElement* _elem;
+
+ IDSourceIterator( const SMDS_Mesh* mesh,
+ const CORBA::Long* ids,
+ const int nbIds,
+ SMDSAbs_ElementType type):
+ _idPtr( ids ), _idEndPtr( ids + nbIds ), _mesh( mesh ), _type( type ), _elem( 0 )
+ {
+ if ( _idPtr && nbIds && _mesh )
+ next();
+ }
+ IDSourceIterator( const SMDS_Mesh* mesh,
+ SMESH::long_array* idArray,
+ SMDSAbs_ElementType type):
+ _idPtr( 0 ), _idEndPtr( 0 ), _idArray( idArray), _mesh( mesh ), _type( type ), _elem( 0 )
+ {
+ if ( idArray && _mesh )
+ {
+ _idPtr = &_idArray[0];
+ _idEndPtr = _idPtr + _idArray->length();
+ next();
+ }
+ }
+ virtual bool more()
+ {
+ return _elem;
+ }
+ virtual const SMDS_MeshElement* next()
+ {
+ const SMDS_MeshElement* res = _elem;
+ _elem = 0;
+ while ( _idPtr < _idEndPtr && !_elem )
+ {
+ if ( _type == SMDSAbs_Node )
+ {
+ _elem = _mesh->FindNode( *_idPtr++ );
+ }
+ else if ((_elem = _mesh->FindElement( *_idPtr++ )) &&
+ _elem->GetType() != _type )
+ {
+ _elem = 0;
+ }
+ }
+ return res;
+ }
+ };
+ //-----------------------------------------------------------------------------
+
+ struct NodeOfElemIterator : public SMDS_ElemIterator
+ {
+ TColStd_MapOfInteger _checkedNodeIDs;
+ SMDS_ElemIteratorPtr _elemIter;
+ SMDS_ElemIteratorPtr _nodeIter;
+ const SMDS_MeshElement* _node;
+
+ NodeOfElemIterator( SMDS_ElemIteratorPtr iter ): _elemIter( iter ), _node( 0 )
+ {
+ if ( _elemIter && _elemIter->more() )
+ {
+ _nodeIter = _elemIter->next()->nodesIterator();
+ next();
+ }
+ }
+ virtual bool more()
+ {
+ return _node;
+ }
+ virtual const SMDS_MeshElement* next()
+ {
+ const SMDS_MeshElement* res = _node;
+ _node = 0;
+ while (( _elemIter->more() || _nodeIter->more() ) && !_node )
+ {
+ if ( _nodeIter->more() )
+ {
+ _node = _nodeIter->next();
+ if ( !_checkedNodeIDs.Add( _node->GetID() ))
+ _node = 0;
+ }
+ else
+ {
+ _nodeIter = _elemIter->next()->nodesIterator();
+ }
+ }
+ return res;
+ }
+ };
+}
+
+//=============================================================================
+/*
+ * Return iterator on elements of given type in given object
+ */
+//=============================================================================
+
+SMDS_ElemIteratorPtr SMESH_Mesh_i::GetElements(SMESH::SMESH_IDSource_ptr theObject,
+ SMESH::ElementType theType)
+{
+ SMDS_ElemIteratorPtr elemIt;
+ bool typeOK = false;
+ SMDSAbs_ElementType elemType = SMDSAbs_ElementType( theType );
+
+ SMESH::SMESH_Mesh_var meshVar = theObject->GetMesh();
+ SMESH_Mesh_i* mesh_i = SMESH::DownCast<SMESH_Mesh_i*>( meshVar );
+ if ( !mesh_i ) return elemIt;
+ SMESHDS_Mesh* meshDS = mesh_i->GetImpl().GetMeshDS();
+
+ if ( SMESH::DownCast<SMESH_Mesh_i*>( theObject ))
+ {
+ elemIt = meshDS->elementsIterator( elemType );
+ typeOK = true;
+ }
+ else if ( SMESH_subMesh_i* submesh_i = SMESH::DownCast<SMESH_subMesh_i*>( theObject ))
+ {
+ SMESHDS_SubMesh* sm = ((SMESHDS_Mesh*) meshDS)->MeshElements( submesh_i->GetId() );
+ if ( sm )
+ {
+ elemIt = sm->GetElements();
+ if ( elemType != SMDSAbs_Node )
+ {
+ typeOK = ( elemIt && elemIt->more() && elemIt->next()->GetType() == elemType );
+ elemIt = typeOK ? sm->GetElements() : SMDS_ElemIteratorPtr();
+ }
+ }
+ }
+ else if ( SMESH_GroupBase_i* group_i = SMESH::DownCast<SMESH_GroupBase_i*>( theObject ))
+ {
+ SMESHDS_GroupBase* groupDS = group_i->GetGroupDS();
+ if ( groupDS && ( groupDS->GetType() == elemType || elemType == SMDSAbs_Node ))
+ {
+ elemIt = groupDS->GetElements();
+ typeOK = ( groupDS->GetType() == elemType );
+ }
+ }
+ else if ( SMESH::Filter_i* filter_i = SMESH::DownCast<SMESH::Filter_i*>( theObject ))
+ {
+ if ( filter_i->GetElementType() == theType || elemType == SMDSAbs_Node )
+ {
+ SMESH::Predicate_i* pred_i = filter_i->GetPredicate_i();
+ if ( pred_i && pred_i->GetPredicate() )
+ {
+ SMDSAbs_ElementType filterType = SMDSAbs_ElementType( filter_i->GetElementType() );
+ SMDS_ElemIteratorPtr allElemIt = meshDS->elementsIterator( filterType );
+ elemIt = SMDS_ElemIteratorPtr( new PredicateIterator( allElemIt, pred_i->GetPredicate() ));
+ typeOK = ( filterType == elemType );
+ }
+ }
+ }
+ else
+ {
+ SMESH::array_of_ElementType_var types = theObject->GetTypes();
+ const bool isNodes = ( types->length() == 1 && types[0] == SMESH::NODE );
+ if ( isNodes && elemType != SMDSAbs_Node )
+ return elemIt;
+ if ( SMESH_MeshEditor_i::IsTemporaryIDSource( theObject ))
+ {
+ int nbIds;
+ if ( CORBA::Long* ids = SMESH_MeshEditor_i::GetTemporaryIDs( theObject, nbIds ))
+ elemIt = SMDS_ElemIteratorPtr( new IDSourceIterator( meshDS, ids, nbIds, elemType ));
+ }
+ else
+ {
+ SMESH::long_array_var ids = theObject->GetIDs();
+ elemIt = SMDS_ElemIteratorPtr( new IDSourceIterator( meshDS, ids._retn(), elemType ));
+ }
+ typeOK = ( isNodes == ( elemType == SMDSAbs_Node ));
+ }
+
+ if ( elemIt && elemIt->more() && !typeOK )
+ {
+ if ( elemType == SMDSAbs_Node )
+ {
+ elemIt = SMDS_ElemIteratorPtr( new NodeOfElemIterator( elemIt ));
+ }
+ else
+ {
+ elemIt = SMDS_ElemIteratorPtr();
+ }
+ }
+ return elemIt;
+}
+
//=============================================================================
namespace // Finding concurrent hypotheses
//=============================================================================
//-----------------------------------------------------------------------------
//! Constructors
- SMESH_DimHyp(const SMESH_subMesh* theSubMesh,
- const int theDim,
- const TopoDS_Shape& theShape)
+ SMESH_DimHyp(const SMESH_subMesh* theSubMesh,
+ const int theDim,
+ const TopoDS_Shape& theShape)
{
_subMesh = (SMESH_subMesh*)theSubMesh;
SetShape( theDim, theShape );
const TopoDS_Shape& theShape)
{
_dim = theDim;
- _ownDim = (int)SMESH_Gen::GetShapeDim(theShape);
+ _ownDim = SMESH_Gen::GetShapeDim(theShape);
if (_dim >= _ownDim)
_shapeMap.Add( theShape );
else {
#include CORBA_SERVER_HEADER(SMESH_Group)
#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
#include CORBA_CLIENT_HEADER(GEOM_Gen)
-#include CORBA_CLIENT_HEADER(MED)
#include "SMESH_Hypothesis.hxx"
#include "SMESH_Mesh.hxx"
void ExportToMEDX( const char* file,
CORBA::Boolean auto_groups,
SMESH::MED_VERSION version,
- CORBA::Boolean overwrite ) throw (SALOME::SALOME_Exception);
+ CORBA::Boolean overwrite,
+ CORBA::Boolean autoDimension=true) throw (SALOME::SALOME_Exception);
void ExportToMED ( const char* file,
CORBA::Boolean auto_groups,
SMESH::MED_VERSION version ) throw (SALOME::SALOME_Exception);
const char* file,
CORBA::Boolean auto_groups,
SMESH::MED_VERSION version,
- CORBA::Boolean overwrite) throw (SALOME::SALOME_Exception);
+ CORBA::Boolean overwrite,
+ CORBA::Boolean autoDim=true) throw (SALOME::SALOME_Exception);
void ExportPartToDAT(SMESH::SMESH_IDSource_ptr meshPart,
const char* file) throw (SALOME::SALOME_Exception);
void ExportPartToUNV(SMESH::SMESH_IDSource_ptr meshPart,
const char* file,
CORBA::Boolean isascii) throw (SALOME::SALOME_Exception);
- SALOME_MED::MESH_ptr GetMEDMesh()
- throw (SALOME::SALOME_Exception);
+ CORBA::Double GetComputeProgress();
CORBA::Long NbNodes()
throw (SALOME::SALOME_Exception);
/*!
* Returns information about imported MED file
*/
- virtual SALOME_MED::MedFileInfo* GetMEDFileInfo();
+ virtual SMESH::MedFileInfo* GetMEDFileInfo();
/*!
* Sets list of notebook variables used for Mesh operations separated by ":" symbol
*/
SMESH::string_array* GetLastParameters();
- /*!
- * Collect statistic of mesh elements given by iterator
- */
- static void CollectMeshInfo(const SMDS_ElemIteratorPtr theItr,
- SMESH::long_array& theInfo);
-
/*!
* \brief Return submesh objects list in meshing order
*/
virtual ::CORBA::Boolean SetMeshOrder(const SMESH::submesh_array_array& theSubMeshArray);
+ /*!
+ * Collect statistic of mesh elements given by iterator
+ */
+ static void CollectMeshInfo(const SMDS_ElemIteratorPtr theItr,
+ SMESH::long_array& theInfo);
+ /*!
+ * \brief Return iterator on elements of given type in given object
+ */
+ static SMDS_ElemIteratorPtr GetElements(SMESH::SMESH_IDSource_ptr obj,
+ SMESH::ElementType type);
+
// =========================
// SMESH_IDSource interface
// =========================
virtual SMESH::long_array* GetIDs();
/*!
- * Returns statistic of mesh elements
- * Result array of number enityties
+ * Returns number of mesh elements of each \a EntityType
+ * Result array of number of elements per \a EntityType
* Inherited from SMESH_IDSource
*/
virtual SMESH::long_array* GetMeshInfo();
+ /*!
+ * Returns number of mesh elements of each \a ElementType
+ */
+ virtual SMESH::long_array* GetNbElementsByType();
/*!
* Returns types of elements it contains
*/
std::map<int, SMESH::SMESH_subMesh_ptr> _mapSubMeshIor;
std::map<int, SMESH::SMESH_GroupBase_ptr> _mapGroups;
std::map<int, SMESH::SMESH_Hypothesis_ptr> _mapHypo;
- SALOME_MED::MedFileInfo_var _medFileInfo;
- SMESH_PreMeshInfo* _preMeshInfo; // mesh info before full loading from study file
+ SMESH::MedFileInfo_var _medFileInfo;
+ SMESH_PreMeshInfo* _preMeshInfo; // mesh info before full loading from study file
SMESH_PreMeshInfo* & changePreMeshInfo() { return _preMeshInfo; }
friend class SMESH_PreMeshInfo;
::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
- set<int> nodeIds;
-
- // nodes are bound to shell instead of solid
- TListOfSubMeshes smList;
- if ( all && getSubMeshes( aSubMesh, smList ))
+ if ( aSubMeshDS && aSubMeshDS->IsComplexSubmesh() )
{
- TListOfSubMeshes::iterator sm = smList.begin();
- for ( ; sm != smList.end(); ++sm )
- {
- SMDS_ElemIteratorPtr eIt = (*sm)->GetElements();
- if ( eIt->more() ) {
- while ( eIt->more() ) {
- const SMDS_MeshElement* anElem = eIt->next();
- SMDS_ElemIteratorPtr nIt = anElem->nodesIterator();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
- }
- } else {
- SMDS_NodeIteratorPtr nIt = (*sm)->GetNodes();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
- }
- }
- return nodeIds.size();
+ // sub-mesh on a geom group, always return all nodes
+ return aSubMeshDS->NbNodes();
}
-
- if ( aSubMeshDS == NULL )
- return 0;
-
- if ( all ) { // all nodes of submesh elements
- SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements();
- if ( eIt->more() ) {
- while ( eIt->more() ) {
- const SMDS_MeshElement* anElem = eIt->next();
- SMDS_ElemIteratorPtr nIt = anElem->nodesIterator();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
- }
- } else {
- SMDS_NodeIteratorPtr nIt = aSubMeshDS->GetNodes();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
+ if ( aSubMeshDS && !all )
+ {
+ // return anything we have
+ return aSubMeshDS->NbNodes();
+ }
+ if ( all ) // get nodes from aSubMesh and all child sub-meshes
+ {
+ int nbNodes = 0;
+ SMESH_subMeshIteratorPtr smIt = aSubMesh->getDependsOnIterator( /*includeSelf=*/true );
+ while ( smIt->more() )
+ {
+ aSubMesh = smIt->next();
+ if (( aSubMeshDS = aSubMesh->GetSubMeshDS() ))
+ nbNodes += aSubMeshDS->NbNodes();
}
- return nodeIds.size();
}
- return aSubMeshDS->NbNodes();
+ return aSubMeshDS ? aSubMeshDS->NbNodes() : 0;
}
//=============================================================================
return aShapeObj._retn();
}
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-SALOME_MED::FAMILY_ptr SMESH_subMesh_i::GetFamily()
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- if ( _preMeshInfo )
- _preMeshInfo->FullLoadFromFile();
- SALOME_MED::MESH_var MEDMesh = GetFather()->GetMEDMesh();
-
- SALOME_MED::Family_array_var families =
- MEDMesh->getFamilies(SALOME_MED::MED_NODE);
-
- for ( int i = 0; i < families->length(); i++ ) {
- if ( families[i]->getIdentifier() == ( _localId ) )
- return families[i];
- }
-
- return SALOME_MED::FAMILY::_nil();
-}
-
//=============================================================================
/*!
*
return GetFather()->GetElementType( id, iselem );
}
-
//=============================================================================
-/*!
- * Returns statistic of mesh elements
- * Result array of number enityties
- * Inherited from SMESH_IDSource
+/*
+ * Returns number of mesh elements of each \a EntityType
+ * @return array of number of elements per \a EntityType
*/
//=============================================================================
+
SMESH::long_array* SMESH_subMesh_i::GetMeshInfo()
{
if ( _preMeshInfo )
return aRes._retn();
}
+//=======================================================================
+/*
+ * Returns number of mesh elements of each \a ElementType
+ */
+//=======================================================================
+
+SMESH::long_array* SMESH_subMesh_i::GetNbElementsByType()
+{
+ SMESH::long_array_var aRes = new SMESH::long_array();
+ aRes->length(SMESH::NB_ELEMENT_TYPES);
+ for (int i = 0; i < SMESH::NB_ELEMENT_TYPES; i++)
+ if ( _preMeshInfo )
+ aRes[ i ] = _preMeshInfo->NbElements( SMDSAbs_ElementType( i ));
+ else
+ aRes[ i ] = 0;
+
+ if ( !_preMeshInfo )
+ {
+ aRes[ SMESH::NODE ] = GetNumberOfNodes(true);
+
+ ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
+ if ( SMESHDS_SubMesh* smDS = aSubMesh->GetSubMeshDS() )
+ {
+ SMDS_ElemIteratorPtr eIt = smDS->GetElements();
+ if ( eIt->more() )
+ aRes[ eIt->next()->GetType() ] = smDS->NbElements();
+ }
+ }
+ return aRes._retn();
+}
+
//=======================================================================
//function : GetTypes
#include CORBA_SERVER_HEADER(SMESH_Mesh)
#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
#include CORBA_CLIENT_HEADER(GEOM_Gen)
-#include CORBA_CLIENT_HEADER(MED)
#include "SALOME_GenericObj_i.hh"
#include "SMESH_Mesh_i.hxx"
CORBA::Long GetId();
- SALOME_MED::FAMILY_ptr GetFamily()
- throw (SALOME::SALOME_Exception);
-
// =========================
// interface SMESH_IDSource
*/
virtual SMESH::long_array* GetIDs();
/*!
- * Returns statistic of mesh elements
- * Result array of number enityties
+ * Returns number of mesh elements of each \a EntityType
+ * Result array of number of elements per \a EntityType
* Inherited from SMESH_IDSource
*/
virtual SMESH::long_array* GetMeshInfo();
+ /*!
+ * Returns number of mesh elements of each \a ElementType
+ */
+ virtual SMESH::long_array* GetNbElementsByType();
/*!
* Returns types of elements it contains
*/
# @param version MED format version(MED_V2_1 or MED_V2_2)
# @param overwrite boolean parameter for overwriting/not overwriting the file
# @param meshPart a part of mesh (group, sub-mesh) to export instead of the mesh
+ # @param autoDimension: if @c True (default), a space dimension of a MED mesh can be either
+ # - 1D if all mesh nodes lie on OX coordinate axis, or
+ # - 2D if all mesh nodes lie on XOY coordinate plane, or
+ # - 3D in the rest cases.
+ #
+ # If @a autoDimension is @c False, the space dimension is always 3.
# @ingroup l2_impexp
- def ExportMED(self, f, auto_groups=0, version=MED_V2_2, overwrite=1, meshPart=None):
+ def ExportMED(self, f, auto_groups=0, version=MED_V2_2,
+ overwrite=1, meshPart=None, autoDimension=True):
if meshPart:
if isinstance( meshPart, list ):
meshPart = self.GetIDSource( meshPart, SMESH.ALL )
- self.mesh.ExportPartToMED( meshPart, f, auto_groups, version, overwrite )
+ self.mesh.ExportPartToMED( meshPart, f, auto_groups, version, overwrite, autoDimension)
else:
- self.mesh.ExportToMEDX(f, auto_groups, version, overwrite)
+ self.mesh.ExportToMEDX(f, auto_groups, version, overwrite, autoDimension)
## Exports the mesh in a file in SAUV format
# @param f is the file name
def GetIDSource(self, ids, elemType):
return self.editor.MakeIDSource(ids, elemType)
- ## Gets MED Mesh
- # @return an instance of SALOME_MED::MESH
- # @ingroup l1_auxiliary
- def GetMEDMesh(self):
- return self.mesh.GetMEDMesh()
-
# Get informations about mesh contents:
# ------------------------------------
def GetLastCreatedElems(self):
return self.editor.GetLastCreatedElems()
- ## Clear sequences of nodes and elements created by mesh edition oparations
+ ## Clears sequences of nodes and elements created by mesh edition oparations
# @ingroup l1_auxiliary
def ClearLastCreated(self):
self.editor.ClearLastCreated()
- ## Creates a hole in a mesh by doubling the nodes of some particular elements
+ ## Creates Duplicates given elements, i.e. creates new elements based on the
+ # same nodes as the given ones.
+ # @param theElements - container of elements to duplicate. It can be a Mesh,
+ # sub-mesh, group, filter or a list of element IDs.
+ # @param theGroupName - a name of group to contain the generated elements.
+ # If a group with such a name already exists, the new elements
+ # are added to the existng group, else a new group is created.
+ # If \a theGroupName is empty, new elements are not added
+ # in any group.
+ # @return a group where the new elements are added. None if theGroupName == "".
+ # @ingroup l2_modif_edit
+ def DoubleElements(self, theElements, theGroupName=""):
+ if isinstance( theElements, Mesh ):
+ theElements = theElements.mesh
+ elif isinstance( theElements, list ):
+ theElements = self.GetIDSource( theElements, SMESH.ALL )
+ return self.editor.DoubleElements(theElements, theGroupName)
+
+ ## Creates a hole in a mesh by doubling the nodes of some particular elements
# @param theNodes identifiers of nodes to be doubled
# @param theModifiedElems identifiers of elements to be updated by the new (doubled)
# nodes. If list of element identifiers is empty then nodes are doubled but
# @param thickness total thickness of layers of quadrilaterals
# @param numberOfLayers number of layers
# @param stretchFactor factor (>1.0) of growth of layer thickness towards inside of mesh
- # @param ignoreEdges list of geometrical edge (or their ids) not to generate layers on
+ # @param edges list of geometrical edge (or their ids).
+ # Viscous layers are either generated on these edges or not, depending on
+ # the values of \a isEdgesToIgnore parameter.
+ # @param isEdgesToIgnore if \c True, the Viscous layers are not generated on the
+ # edges specified by the previous parameter (\a edges).
# @ingroup l3_hypos_additi
- def ViscousLayers2D(self, thickness, numberOfLayers, stretchFactor, ignoreEdges=[]):
+ def ViscousLayers2D(self, thickness, numberOfLayers, stretchFactor,
+ edges=[], isEdgesToIgnore=True ):
if not isinstance(self.algo, SMESH._objref_SMESH_2D_Algo):
raise TypeError, "ViscousLayers2D are supported by 2D algorithms only"
if not "ViscousLayers2D" in self.GetCompatibleHypothesis():
raise TypeError, "ViscousLayers2D are not supported by %s"%self.algo.GetName()
- if ignoreEdges and isinstance( ignoreEdges[0], geomBuilder.GEOM._objref_GEOM_Object ):
- ignoreEdges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in ignoreEdges ]
+ if edges and isinstance( edges[0], geomBuilder.GEOM._objref_GEOM_Object ):
+ edges = [ self.mesh.geompyD.GetSubShapeID(self.mesh.geom, f) for f in edges ]
hyp = self.Hypothesis("ViscousLayers2D",
- [thickness, numberOfLayers, stretchFactor, ignoreEdges])
+ [thickness, numberOfLayers, stretchFactor,
+ edges, isEdgesToIgnore])
hyp.SetTotalThickness(thickness)
hyp.SetNumberLayers(numberOfLayers)
hyp.SetStretchFactor(stretchFactor)
- hyp.SetIgnoreEdges(ignoreEdges)
+ hyp.SetEdges(edges, isEdgesToIgnore)
return hyp
## Transform a list of ether edges or tuples (edge, 1st_vertex_of_edge)
{
const UVPtStructVec& edgeUVPtStruct = proxySubMesh[iE]->GetUVPtStructVec();
std::copy( edgeUVPtStruct.begin(), edgeUVPtStruct.end(), & points[iPt] );
+ // check orientation
+ double du1 = edgeUVPtStruct.back().param - edgeUVPtStruct[0].param;
+ double du2 = myLast[iE] - myFirst[iE];
+ if ( du1 * du2 < 0 )
+ {
+ std::reverse( & points[iPt], & points[iPt + edgeUVPtStruct.size()]);
+ for ( size_t i = 0; i < edgeUVPtStruct.size(); ++i )
+ points[iPt+i].normParam = 1. - points[iPt+i].normParam;
+ }
// update normalized params
if ( myEdge.size() > 1 ) {
for ( size_t i = 0; i < edgeUVPtStruct.size(); ++i, ++iPt )
{
UVPtStruct & uvPt = points[iPt];
- uvPt.normParam = prevNormPar + uvPt.normParam * paramSize;
- uvPt.x = uvPt.y = uvPt.normParam;
+ uvPt.normParam = prevNormPar + uvPt.normParam * paramSize;
+ uvPt.x = uvPt.y = uvPt.normParam;
}
--iPt; // to point to the 1st VERTEX of the next EDGE
}
bool StdMeshers_PrismAsBlock::Init(SMESH_MesherHelper* helper,
const Prism_3D::TPrismTopo& thePrism)
{
+ myHelper = helper;
+ SMESHDS_Mesh* meshDS = myHelper->GetMeshDS();
+ SMESH_Mesh* mesh = myHelper->GetMesh();
+
if ( mySide ) {
delete mySide; mySide = 0;
}
vector< TSideFace* > sideFaces( NB_WALL_FACES, 0 );
vector< pair< double, double> > params( NB_WALL_FACES );
- mySide = new TSideFace( sideFaces, params );
+ mySide = new TSideFace( *mesh, sideFaces, params );
- myHelper = helper;
- SMESHDS_Mesh* meshDS = myHelper->GetMeshDS();
SMESH_Block::init();
myShapeIDMap.Clear();
for ( int i = 0; i < nbSplit; ++i ) {
double f = ( isForward ? params[ i ] : params[ nbSplit - i-1 ]);
double l = ( isForward ? params[ i+1 ] : params[ nbSplit - i ]);
- TSideFace* comp = new TSideFace( myHelper, wallFaceIds[ iSide ],
+ TSideFace* comp = new TSideFace( *mesh, wallFaceIds[ iSide ],
thePrism.myWallQuads[ iE ], *botE,
&myParam2ColumnMaps[ iE ], f, l );
mySide->SetComponent( iSide++, comp );
}
}
else {
- TSideFace* comp = new TSideFace( myHelper, wallFaceIds[ iSide ],
+ TSideFace* comp = new TSideFace( *mesh, wallFaceIds[ iSide ],
thePrism.myWallQuads[ iE ], *botE,
&myParam2ColumnMaps[ iE ]);
mySide->SetComponent( iSide++, comp );
list< TopoDS_Edge >::const_iterator botE = thePrism.myBottomEdges.begin();
for ( iE = 0; iE < nbExraFaces; ++iE, ++botE )
{
- components[ iE ] = new TSideFace( myHelper, wallFaceIds[ iSide ],
+ components[ iE ] = new TSideFace( *mesh, wallFaceIds[ iSide ],
thePrism.myWallQuads[ iE ], *botE,
&myParam2ColumnMaps[ iE ]);
double u1 = u0 + edgeLength[ iE ] / sumLen;
params[ iE ] = make_pair( u0 , u1 );
u0 = u1;
}
- mySide->SetComponent( iSide++, new TSideFace( components, params ));
+ mySide->SetComponent( iSide++, new TSideFace( *mesh, components, params ));
// fill the rest faces
for ( ; iE < nbEdges; ++iE, ++botE )
{
- TSideFace* comp = new TSideFace( myHelper, wallFaceIds[ iSide ],
+ TSideFace* comp = new TSideFace( *mesh, wallFaceIds[ iSide ],
thePrism.myWallQuads[ iE ], *botE,
&myParam2ColumnMaps[ iE ]);
mySide->SetComponent( iSide++, comp );
*/
//================================================================================
-StdMeshers_PrismAsBlock::TSideFace::TSideFace(SMESH_MesherHelper* helper,
+StdMeshers_PrismAsBlock::TSideFace::TSideFace(SMESH_Mesh& mesh,
const int faceID,
const Prism_3D::TQuadList& quadList,
const TopoDS_Edge& baseEdge,
const double last):
myID( faceID ),
myParamToColumnMap( columnsMap ),
- myHelper( helper )
+ myHelper( mesh )
{
myParams.resize( 1 );
myParams[ 0 ] = make_pair( first, last );
mySurface = PSurface( new BRepAdaptor_Surface( quadList.front()->face ));
myBaseEdge = baseEdge;
- myIsForward = StdMeshers_PrismAsBlock::IsForwardEdge( myHelper->GetMeshDS(),
+ myIsForward = StdMeshers_PrismAsBlock::IsForwardEdge( myHelper.GetMeshDS(),
*myParamToColumnMap,
myBaseEdge, myID );
if ( quadList.size() > 1 ) // side is vertically composite
{
// fill myShapeID2Surf map to enable finding a right surface by any sub-shape ID
- SMESHDS_Mesh* meshDS = myHelper->GetMeshDS();
+ SMESHDS_Mesh* meshDS = myHelper.GetMeshDS();
TopTools_IndexedDataMapOfShapeListOfShape subToFaces;
Prism_3D::TQuadList::const_iterator quad = quadList.begin();
//================================================================================
/*!
- * \brief Constructor of complex side face
+ * \brief Constructor of a complex side face
*/
//================================================================================
StdMeshers_PrismAsBlock::TSideFace::
-TSideFace(const vector< TSideFace* >& components,
+TSideFace(SMESH_Mesh& mesh,
+ const vector< TSideFace* >& components,
const vector< pair< double, double> > & params)
:myID( components[0] ? components[0]->myID : 0 ),
myParamToColumnMap( 0 ),
myParams( params ),
myIsForward( true ),
myComponents( components ),
- myHelper( components[0] ? components[0]->myHelper : 0 )
+ myHelper( mesh )
{}
//================================================================================
/*!
*/
//================================================================================
-StdMeshers_PrismAsBlock::TSideFace::TSideFace( const TSideFace& other )
+StdMeshers_PrismAsBlock::TSideFace::TSideFace( const TSideFace& other ):
+ myID ( other.myID ),
+ myParamToColumnMap ( other.myParamToColumnMap ),
+ mySurface ( other.mySurface ),
+ myBaseEdge ( other.myBaseEdge ),
+ myShapeID2Surf ( other.myShapeID2Surf ),
+ myParams ( other.myParams ),
+ myIsForward ( other.myIsForward ),
+ myComponents ( other.myComponents.size() ),
+ myHelper ( *other.myHelper.GetMesh() )
{
- myID = other.myID;
- mySurface = other.mySurface;
- myBaseEdge = other.myBaseEdge;
- myParams = other.myParams;
- myIsForward = other.myIsForward;
- myHelper = other.myHelper;
- myParamToColumnMap = other.myParamToColumnMap;
-
- myComponents.resize( other.myComponents.size());
for (int i = 0 ; i < myComponents.size(); ++i )
myComponents[ i ] = new TSideFace( *other.myComponents[ i ]);
}
}
else
{
- TopoDS_Shape s = myHelper->GetSubShapeByNode( nn[0], myHelper->GetMeshDS() );
+ TopoDS_Shape s = myHelper.GetSubShapeByNode( nn[0], myHelper.GetMeshDS() );
if ( s.ShapeType() != TopAbs_EDGE )
- s = myHelper->GetSubShapeByNode( nn[2], myHelper->GetMeshDS() );
+ s = myHelper.GetSubShapeByNode( nn[2], myHelper.GetMeshDS() );
if ( s.ShapeType() == TopAbs_EDGE )
edge = TopoDS::Edge( s );
}
if ( !edge.IsNull() )
{
- double u1 = myHelper->GetNodeU( edge, nn[0] );
- double u3 = myHelper->GetNodeU( edge, nn[2] );
+ double u1 = myHelper.GetNodeU( edge, nn[0] );
+ double u3 = myHelper.GetNodeU( edge, nn[2] );
double u = u1 * ( 1 - hR ) + u3 * hR;
TopLoc_Location loc; double f,l;
Handle(Geom_Curve) curve = BRep_Tool::Curve( edge,loc,f,l );
}
if ( notFaceID2 ) // no nodes of FACE and nodes are on different FACEs
{
- SMESHDS_Mesh* meshDS = myHelper->GetMeshDS();
- TopoDS_Shape face = myHelper->GetCommonAncestor( meshDS->IndexToShape( notFaceID1 ),
+ SMESHDS_Mesh* meshDS = myHelper.GetMeshDS();
+ TopoDS_Shape face = myHelper.GetCommonAncestor( meshDS->IndexToShape( notFaceID1 ),
meshDS->IndexToShape( notFaceID2 ),
- *myHelper->GetMesh(),
+ *myHelper.GetMesh(),
TopAbs_FACE );
if ( face.IsNull() )
throw SALOME_Exception("StdMeshers_PrismAsBlock::TSideFace::Value() face.IsNull()");
}
}
- gp_XY uv1 = myHelper->GetNodeUV( mySurface->Face(), nn[0], nn[2]);
- gp_XY uv2 = myHelper->GetNodeUV( mySurface->Face(), nn[1], nn[3]);
+ gp_XY uv1 = myHelper.GetNodeUV( mySurface->Face(), nn[0], nn[2]);
+ gp_XY uv2 = myHelper.GetNodeUV( mySurface->Face(), nn[1], nn[3]);
gp_XY uv12 = uv1 * ( 1 - vR ) + uv2 * vR;
- gp_XY uv3 = myHelper->GetNodeUV( mySurface->Face(), nn[2], nn[0]);
- gp_XY uv4 = myHelper->GetNodeUV( mySurface->Face(), nn[3], nn[1]);
+ gp_XY uv3 = myHelper.GetNodeUV( mySurface->Face(), nn[2], nn[0]);
+ gp_XY uv4 = myHelper.GetNodeUV( mySurface->Face(), nn[3], nn[1]);
gp_XY uv34 = uv3 * ( 1 - vR ) + uv4 * vR;
gp_XY uv = uv12 * ( 1 - hR ) + uv34 * hR;
}
TopoDS_Shape edge;
const SMDS_MeshNode* node = 0;
- SMESHDS_Mesh * meshDS = myHelper->GetMesh()->GetMeshDS();
+ SMESHDS_Mesh * meshDS = myHelper.GetMesh()->GetMeshDS();
TNodeColumn* column;
switch ( iEdge ) {
case BOTTOM_EDGE:
column = & (( ++myParamToColumnMap->begin())->second );
node = ( iEdge == TOP_EDGE ) ? column->back() : column->front();
- edge = myHelper->GetSubShapeByNode ( node, meshDS );
+ edge = myHelper.GetSubShapeByNode ( node, meshDS );
if ( edge.ShapeType() == TopAbs_VERTEX ) {
column = & ( myParamToColumnMap->begin()->second );
node = ( iEdge == TOP_EDGE ) ? column->back() : column->front();
else
column = & ( myParamToColumnMap->begin()->second );
if ( column->size() > 0 )
- edge = myHelper->GetSubShapeByNode( (*column)[ 1 ], meshDS );
+ edge = myHelper.GetSubShapeByNode( (*column)[ 1 ], meshDS );
if ( edge.IsNull() || edge.ShapeType() == TopAbs_VERTEX )
node = column->front();
break;
// find edge by 2 vertices
TopoDS_Shape V1 = edge;
- TopoDS_Shape V2 = myHelper->GetSubShapeByNode( node, meshDS );
+ TopoDS_Shape V2 = myHelper.GetSubShapeByNode( node, meshDS );
if ( !V2.IsNull() && V2.ShapeType() == TopAbs_VERTEX && !V2.IsSame( V1 ))
{
- TopoDS_Shape ancestor = myHelper->GetCommonAncestor( V1, V2, *myHelper->GetMesh(), TopAbs_EDGE);
+ TopoDS_Shape ancestor = myHelper.GetCommonAncestor( V1, V2, *myHelper.GetMesh(), TopAbs_EDGE);
if ( !ancestor.IsNull() )
return TopoDS::Edge( ancestor );
}
GetColumns(0, col1, col2 );
const SMDS_MeshNode* node0 = col1->second.front();
const SMDS_MeshNode* node1 = col1->second.back();
- TopoDS_Shape v0 = myHelper->GetSubShapeByNode( node0, myHelper->GetMeshDS());
- TopoDS_Shape v1 = myHelper->GetSubShapeByNode( node1, myHelper->GetMeshDS());
+ TopoDS_Shape v0 = myHelper.GetSubShapeByNode( node0, myHelper.GetMeshDS());
+ TopoDS_Shape v1 = myHelper.GetSubShapeByNode( node1, myHelper.GetMeshDS());
if ( v0.ShapeType() == TopAbs_VERTEX ) {
nbInserted += SMESH_Block::Insert( v0, vertIdVec[ 0 ], shapeMap);
}
GetColumns(1, col1, col2 );
node0 = col2->second.front();
node1 = col2->second.back();
- v0 = myHelper->GetSubShapeByNode( node0, myHelper->GetMeshDS());
- v1 = myHelper->GetSubShapeByNode( node1, myHelper->GetMeshDS());
+ v0 = myHelper.GetSubShapeByNode( node0, myHelper.GetMeshDS());
+ v1 = myHelper.GetSubShapeByNode( node1, myHelper.GetMeshDS());
if ( v0.ShapeType() == TopAbs_VERTEX ) {
nbInserted += SMESH_Block::Insert( v0, vertIdVec[ 0 ], shapeMap);
}
{
TParam2ColumnIt u_col1, u_col2;
double r = mySide->GetColumns( U, u_col1, u_col2 );
- gp_XY uv1 = mySide->GetNodeUV( myFace, u_col1->second[ myZ ]);
- gp_XY uv2 = mySide->GetNodeUV( myFace, u_col2->second[ myZ ]);
+ gp_XY uv1 = mySide->GetNodeUV( myFace, u_col1->second[ myZ ], u_col2->second[ myZ ]);
+ gp_XY uv2 = mySide->GetNodeUV( myFace, u_col2->second[ myZ ], u_col1->second[ myZ ]);
return uv1 * ( 1 - r ) + uv2 * r;
}
std::vector< std::pair< double, double> > myParams;
bool myIsForward;
std::vector< TSideFace* > myComponents;
- SMESH_MesherHelper * myHelper;
+ SMESH_MesherHelper myHelper;
public:
- TSideFace( SMESH_MesherHelper* helper,
+ TSideFace( SMESH_Mesh& mesh,
const int faceID,
const Prism_3D::TQuadList& quadList,
const TopoDS_Edge& baseEdge,
TParam2ColumnMap* columnsMap,
const double first = 0.0,
const double last = 1.0);
- TSideFace( const std::vector< TSideFace* >& components,
+ TSideFace( SMESH_Mesh& mesh,
+ const std::vector< TSideFace* >& components,
const std::vector< std::pair< double, double> > & params);
TSideFace( const TSideFace& other );
~TSideFace();
{ return ( NbComponents() > 0 || myParams[0].first != 0. || myParams[0].second != 1. ); }
int FaceID() const { return myID; }
TParam2ColumnMap* GetColumns() const { return myParamToColumnMap; }
- gp_XY GetNodeUV(const TopoDS_Face& F, const SMDS_MeshNode* n) const
- { return myHelper->GetNodeUV( F, n ); }
+ gp_XY GetNodeUV(const TopoDS_Face& F, const SMDS_MeshNode* n, const SMDS_MeshNode* n2=0) const
+ { return ((SMESH_MesherHelper&) myHelper).SetSubShape(F), myHelper.GetNodeUV( F, n, n2 ); }
const TopoDS_Edge & BaseEdge() const { return myBaseEdge; }
int ColumnHeight() const {
if ( NbComponents() ) return GetComponent(0)->GetColumns()->begin()->second.size();
string algoType = algo->GetName();
if ( algoType.substr(0, 11) != "Projection_")
- return gen->Compute( *mesh, shape );
+ return gen->Compute( *mesh, shape, /*shapeOnly=*/true );
// try to compute source mesh
}
}
if ( srcShape.IsNull() ) // no projection source defined
- return gen->Compute( *mesh, shape );
+ return gen->Compute( *mesh, shape, /*shapeOnly=*/true );
if ( srcShape.IsSame( shape ))
RETURN_BAD_RESULT("Projection from self");
srcMesh = mesh;
if ( MakeComputed( srcMesh->GetSubMesh( srcShape ), iterationNb + 1 ) &&
- gen->Compute( *mesh, shape ))
+ gen->Compute( *mesh, shape, /*shapeOnly=*/true ))
return sm->IsMeshComputed();
return false;
Smooth( quad );
return ok;
}
+ if ( n1 != n3 && n2 != n4 )
+ error( COMPERR_WARNING,
+ "To use 'Reduced' transition, "
+ "two opposite sides should have same number of segments, "
+ "but actual number of segments is different on all sides. "
+ "'Standard' transion has been used.");
+ else
+ error( COMPERR_WARNING,
+ "To use 'Reduced' transition, "
+ "two opposite sides should have an even difference in number of segments. "
+ "'Standard' transion has been used.");
}
// set normalized grid on unit square in parametric domain
* Implementation of Reduced algorithm (meshing with quadrangles only)
*/
//=======================================================================
+
bool StdMeshers_Quadrangle_2D::ComputeReduced (SMESH_Mesh & aMesh,
const TopoDS_Shape& aShape,
FaceQuadStruct::Ptr quad)
{
- SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
- const TopoDS_Face& F = TopoDS::Face(aShape);
+ SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
+ const TopoDS_Face& F = TopoDS::Face(aShape);
Handle(Geom_Surface) S = BRep_Tool::Surface(F);
- int i,j,geomFaceID = meshDS->ShapeToIndex(F);
+ int i,j,geomFaceID = meshDS->ShapeToIndex(F);
- int nb = quad->side[0]->NbPoints();
- int nr = quad->side[1]->NbPoints();
- int nt = quad->side[2]->NbPoints();
- int nl = quad->side[3]->NbPoints();
+ int nb = quad->side[0]->NbPoints(); // bottom
+ int nr = quad->side[1]->NbPoints(); // right
+ int nt = quad->side[2]->NbPoints(); // top
+ int nl = quad->side[3]->NbPoints(); // left
// Simple Reduce 10->8->6->4 (3 steps) Multiple Reduce 10->4 (1 step)
//
}
// number of rows and columns
- int nrows = nr1 - 1;
+ int nrows = nr1 - 1;
int ncol_top = nt1 - 1;
int ncol_bot = nb1 - 1;
// number of rows needed to reduce ncol_bot to ncol_top using simple 3->1 "tree" (see below)
- int nrows_tree31 = int( log( (double)(ncol_bot / ncol_top) ) / log((double) 3 )); // = log x base 3
+ int nrows_tree31 =
+ int( ceil( log( double(ncol_bot) / ncol_top) / log( 3.))); // = log x base 3
if ( nrows < nrows_tree31 )
+ {
MultipleReduce = true;
+ error( COMPERR_WARNING,
+ SMESH_Comment("To use 'Reduced' transition, "
+ "number of face rows should be at least ")
+ << nrows_tree31 << ". Actual number of face rows is " << nrows << ". "
+ "'Quadrangle preference (reversed)' transion has been used.");
+ }
}
if (MultipleReduce) { // == ComputeQuadPref QUAD_QUADRANGLE_PREF_REVERSED
// add bottom nodes (first columns)
for (i=2; i<nb; i++)
NodesC.SetValue(i,1,uv_eb[i-1].node);
-
+
// create and add needed nodes
// add linear layers
for (i=2; i<nb; i++) {
// create faces
for (i=1; i<nb; i++) {
for (j=1; j<nbv; j++) {
- SMDS_MeshFace* F =
- myHelper->AddFace(NodesC.Value(i,j), NodesC.Value(i+1,j),
+ SMDS_MeshFace* F =
+ myHelper->AddFace(NodesC.Value(i,j), NodesC.Value(i+1,j),
NodesC.Value(i+1,j+1), NodesC.Value(i,j+1));
- if (F) meshDS->SetMeshElementOnShape(F, geomFaceID);
+ if (F) meshDS->SetMeshElementOnShape(F, geomFaceID);
}
}
- // TODO ???
} // end Multiple Reduce implementation
else { // Simple Reduce (!MultipleReduce)
//=========================================================
static TNodeDistributor* GetDistributor(SMESH_Mesh& aMesh)
{
const int myID = -1000;
- map < int, SMESH_1D_Algo * > & algoMap = aMesh.GetGen()->_map1D_Algo;
- map < int, SMESH_1D_Algo * >::iterator id_algo = algoMap.find( myID );
- if ( id_algo == algoMap.end() )
- return new TNodeDistributor( myID, 0, aMesh.GetGen() );
- return static_cast< TNodeDistributor* >( id_algo->second );
+ TNodeDistributor* myHyp = dynamic_cast<TNodeDistributor*>( aMesh.GetHypothesis( myID ));
+ if ( !myHyp )
+ myHyp = new TNodeDistributor( myID, 0, aMesh.GetGen() );
+ return myHyp;
}
// -----------------------------------------------------------------------------
bool Compute( vector< double > & positions,
// -----------------------------------------------------------------------------
static TNodeDistributor* GetDistributor(SMESH_Mesh& aMesh)
{
- const int myID = -1000;
- map < int, SMESH_1D_Algo * > & algoMap = aMesh.GetGen()->_map1D_Algo;
- map < int, SMESH_1D_Algo * >::iterator id_algo = algoMap.find( myID );
- if ( id_algo == algoMap.end() )
- return new TNodeDistributor( myID, 0, aMesh.GetGen() );
- return static_cast< TNodeDistributor* >( id_algo->second );
+ const int myID = -1001;
+ TNodeDistributor* myHyp = dynamic_cast<TNodeDistributor*>( aMesh.GetHypothesis( myID ));
+ if ( !myHyp )
+ myHyp = new TNodeDistributor( myID, 0, aMesh.GetGen() );
+ return myHyp;
}
// -----------------------------------------------------------------------------
//! Computes distribution of nodes on a straight line ending at pIn and pOut
//
StdMeshers_ViscousLayers::StdMeshers_ViscousLayers(int hypId, int studyId, SMESH_Gen* gen)
:SMESH_Hypothesis(hypId, studyId, gen),
- _nbLayers(1), _thickness(1), _stretchFactor(1)
+ _isToIgnoreShapes(18), _nbLayers(1), _thickness(1), _stretchFactor(1)
{
_name = StdMeshers_ViscousLayers::GetHypType();
_param_algo_dim = -3; // auxiliary hyp used by 3D algos
} // --------------------------------------------------------------------------------
-void StdMeshers_ViscousLayers::SetBndShapesToIgnore(const std::vector<int>& faceIds)
+void StdMeshers_ViscousLayers::SetBndShapes(const std::vector<int>& faceIds, bool toIgnore)
{
- if ( faceIds != _ignoreBndShapeIds )
- _ignoreBndShapeIds = faceIds, NotifySubMeshesHypothesisModification();
-} // --------------------------------------------------------------------------------
-bool StdMeshers_ViscousLayers::IsIgnoredShape(const int shapeID) const
-{
- return ( find( _ignoreBndShapeIds.begin(), _ignoreBndShapeIds.end(), shapeID )
- != _ignoreBndShapeIds.end() );
+ if ( faceIds != _shapeIds )
+ _shapeIds = faceIds, NotifySubMeshesHypothesisModification();
+ if ( _isToIgnoreShapes != toIgnore )
+ _isToIgnoreShapes = toIgnore, NotifySubMeshesHypothesisModification();
} // --------------------------------------------------------------------------------
void StdMeshers_ViscousLayers::SetTotalThickness(double thickness)
{
save << " " << _nbLayers
<< " " << _thickness
<< " " << _stretchFactor
- << " " << _ignoreBndShapeIds.size();
- for ( unsigned i = 0; i < _ignoreBndShapeIds.size(); ++i )
- save << " " << _ignoreBndShapeIds[i];
+ << " " << _shapeIds.size();
+ for ( unsigned i = 0; i < _shapeIds.size(); ++i )
+ save << " " << _shapeIds[i];
+ save << " " << !_isToIgnoreShapes; // negate to keep the behavior in old studies.
return save;
} // --------------------------------------------------------------------------------
std::istream & StdMeshers_ViscousLayers::LoadFrom(std::istream & load)
{
- int nbFaces, faceID;
+ int nbFaces, faceID, shapeToTreat;
load >> _nbLayers >> _thickness >> _stretchFactor >> nbFaces;
- while ( _ignoreBndShapeIds.size() < nbFaces && load >> faceID )
- _ignoreBndShapeIds.push_back( faceID );
+ while ( _shapeIds.size() < nbFaces && load >> faceID )
+ _shapeIds.push_back( faceID );
+ if ( load >> shapeToTreat )
+ _isToIgnoreShapes = !shapeToTreat;
+ else
+ _isToIgnoreShapes = true; // old behavior
return load;
} // --------------------------------------------------------------------------------
bool StdMeshers_ViscousLayers::SetParametersByMesh(const SMESH_Mesh* theMesh,
vector<TopoDS_Shape> ignoreFaces;
for ( unsigned i = 0; i < _sdVec.size(); ++i )
{
- vector<TGeomID> ids = _sdVec[i]._hyp->GetBndShapesToIgnore();
+ vector<TGeomID> ids = _sdVec[i]._hyp->GetBndShapes();
for ( unsigned i = 0; i < ids.size(); ++i )
{
const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[i] );
public:
StdMeshers_ViscousLayers(int hypId, int studyId, SMESH_Gen* gen);
- // Set boundary shapes to exclude from treatment, faces in 3D, edges in 2D
- void SetBndShapesToIgnore(const std::vector<int>& shapeIds);
- std::vector<int> GetBndShapesToIgnore() const { return _ignoreBndShapeIds; }
- bool IsIgnoredShape(const int shapeID) const;
+ // Set boundary shapes, faces in 3D, edges in 2D, either to exclude from
+ // treatment or to make the Viscous Layers on
+ void SetBndShapes(const std::vector<int>& shapeIds, bool toIgnore);
+ std::vector<int> GetBndShapes() const { return _shapeIds; }
+ bool IsToIgnoreShapes() const { return _isToIgnoreShapes; }
// Set total thickness of layers of prisms
void SetTotalThickness(double thickness);
private:
- std::vector<int> _ignoreBndShapeIds;
+ std::vector<int> _shapeIds;
+ bool _isToIgnoreShapes;
int _nbLayers;
double _thickness;
double _stretchFactor;
#include <TColStd_Array1OfReal.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
+#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
+#include <TopTools_ListIteratorOfListOfShape.hxx>
+#include <TopTools_ListOfShape.hxx>
#include <TopTools_MapOfShape.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Edge.hxx>
const StdMeshers_ViscousLayers2D* theHyp);
SMESH_ComputeErrorPtr GetError() const { return _error; }
// does it's job
- SMESH_ProxyMesh::Ptr Compute();
+ SMESH_ProxyMesh::Ptr Compute(const TopoDS_Shape& theShapeHypAssignedTo);
private:
- bool findEdgesWithLayers();
+ bool findEdgesWithLayers(const TopoDS_Shape& theShapeHypAssignedTo);
bool makePolyLines();
bool inflate();
bool fixCollisions();
* \brief Returns StdMeshers_ViscousLayers2D for the FACE
*/
const StdMeshers_ViscousLayers2D* findHyp(SMESH_Mesh& theMesh,
- const TopoDS_Face& theFace)
+ const TopoDS_Face& theFace,
+ TopoDS_Shape* assignedTo=0)
{
SMESH_HypoFilter hypFilter
( SMESH_HypoFilter::HasName( StdMeshers_ViscousLayers2D::GetHypType() ));
const SMESH_Hypothesis * hyp =
- theMesh.GetHypothesis( theFace, hypFilter, /*ancestors=*/true );
+ theMesh.GetHypothesis( theFace, hypFilter, /*ancestors=*/true, assignedTo );
return dynamic_cast< const StdMeshers_ViscousLayers2D* > ( hyp );
}
+ //================================================================================
+ /*!
+ * \brief Returns ids of EDGEs not to create Viscous Layers on
+ * \param [in] theHyp - the hypothesis, holding edges either to ignore or not to.
+ * \param [in] theFace - the FACE whose EDGEs are checked.
+ * \param [in] theMesh - the mesh.
+ * \param [in,out] theEdgeIds - container returning EDGEs to ignore.
+ * \return int - number of found EDGEs of the FACE.
+ */
+ //================================================================================
+
+ int getEdgesToIgnore( const StdMeshers_ViscousLayers2D* theHyp,
+ const TopoDS_Shape& theFace,
+ const SMESHDS_Mesh* theMesh,
+ set< int > & theEdgeIds)
+ {
+ int nbToEdgesIgnore = 0;
+ vector<TGeomID> ids = theHyp->GetBndShapes();
+ if ( theHyp->IsToIgnoreShapes() ) // EDGEs to ignore are given
+ {
+ for ( size_t i = 0; i < ids.size(); ++i )
+ {
+ const TopoDS_Shape& E = theMesh->IndexToShape( ids[i] );
+ if ( !E.IsNull() &&
+ E.ShapeType() == TopAbs_EDGE &&
+ SMESH_MesherHelper::IsSubShape( E, theFace ))
+ {
+ theEdgeIds.insert( ids[i] );
+ ++nbToEdgesIgnore;
+ }
+ }
+ }
+ else // EDGEs to make the Viscous Layers on are given
+ {
+ TopExp_Explorer E( theFace, TopAbs_EDGE );
+ for ( ; E.More(); E.Next(), ++nbToEdgesIgnore )
+ theEdgeIds.insert( theMesh->ShapeToIndex( E.Current() ));
+
+ for ( size_t i = 0; i < ids.size(); ++i )
+ nbToEdgesIgnore -= theEdgeIds.erase( ids[i] );
+ }
+ return nbToEdgesIgnore;
+ }
+
} // namespace VISCOUS_2D
//================================================================================
{
SMESH_ProxyMesh::Ptr pm;
- const StdMeshers_ViscousLayers2D* vlHyp = VISCOUS_2D::findHyp( theMesh, theFace );
+ TopoDS_Shape hypAssignedTo;
+ const StdMeshers_ViscousLayers2D* vlHyp = VISCOUS_2D::findHyp( theMesh, theFace, &hypAssignedTo );
if ( vlHyp )
{
VISCOUS_2D::_ViscousBuilder2D builder( theMesh, theFace, vlHyp );
- pm = builder.Compute();
+ pm = builder.Compute( hypAssignedTo );
SMESH_ComputeErrorPtr error = builder.GetError();
if ( error && !error->IsOK() )
theMesh.GetSubMesh( theFace )->GetComputeError() = error;
_mesh( &theMesh ), _face( theFace ), _hyp( theHyp ), _helper( theMesh )
{
_helper.SetSubShape( _face );
- _helper.SetElementsOnShape(true);
+ _helper.SetElementsOnShape( true );
- //_face.Orientation( TopAbs_FORWARD );
+ _face.Orientation( TopAbs_FORWARD ); // 2D logic works only in this case
_surface = BRep_Tool::Surface( _face );
if ( _hyp )
bool _ViscousBuilder2D::error(const string& text )
{
- cout << "_ViscousBuilder2D::error " << text << endl;
_error->myName = COMPERR_ALGO_FAILED;
_error->myComment = string("Viscous layers builder 2D: ") + text;
if ( SMESH_subMesh* sm = _mesh->GetSubMesh( _face ) )
_error->myAlgo = smError->myAlgo;
smError = _error;
}
- //makeGroupOfLE(); // debug
-
+#ifdef _DEBUG_
+ cout << "_ViscousBuilder2D::error " << text << endl;
+#endif
return false;
}
*/
//================================================================================
-SMESH_ProxyMesh::Ptr _ViscousBuilder2D::Compute()
+SMESH_ProxyMesh::Ptr _ViscousBuilder2D::Compute(const TopoDS_Shape& theShapeHypAssignedTo)
{
_error = SMESH_ComputeError::New(COMPERR_OK);
_faceSideVec = StdMeshers_FaceSide::GetFaceWires( _face, *_mesh, true, _error );
if ( !_error->IsOK() )
return _proxyMesh;
- if ( !findEdgesWithLayers() ) // analysis of a shape
+ if ( !findEdgesWithLayers(theShapeHypAssignedTo) ) // analysis of a shape
return _proxyMesh;
if ( ! makePolyLines() ) // creation of fronts
*/
//================================================================================
-bool _ViscousBuilder2D::findEdgesWithLayers()
+bool _ViscousBuilder2D::findEdgesWithLayers(const TopoDS_Shape& theShapeHypAssignedTo)
{
// collect all EDGEs to ignore defined by hyp
- int nbMyEdgesIgnored = 0;
- vector<TGeomID> ids = _hyp->GetBndShapesToIgnore();
- for ( size_t i = 0; i < ids.size(); ++i )
- {
- const TopoDS_Shape& s = getMeshDS()->IndexToShape( ids[i] );
- if ( !s.IsNull() && s.ShapeType() == TopAbs_EDGE ) {
- _ignoreShapeIds.insert( ids[i] );
- nbMyEdgesIgnored += ( _helper.IsSubShape( s, _face ));
- }
- }
+ int nbMyEdgesIgnored = getEdgesToIgnore( _hyp, _face, getMeshDS(), _ignoreShapeIds );
// check all EDGEs of the _face
int totalNbEdges = 0;
+ TopTools_IndexedDataMapOfShapeListOfShape facesOfEdgeMap;
+ TopExp::MapShapesAndAncestors( theShapeHypAssignedTo,
+ TopAbs_EDGE, TopAbs_FACE, facesOfEdgeMap);
for ( size_t iWire = 0; iWire < _faceSideVec.size(); ++iWire )
{
StdMeshers_FaceSidePtr wire = _faceSideVec[ iWire ];
totalNbEdges += wire->NbEdges();
for ( int iE = 0; iE < wire->NbEdges(); ++iE )
- if ( _helper.NbAncestors( wire->Edge( iE ), *_mesh, TopAbs_FACE ) > 1 )
+ {
+ const TopTools_ListOfShape& faceList = facesOfEdgeMap.FindFromKey( wire->Edge( iE ));
+ if ( faceList.Extent() > 1 )
{
// ignore internal EDGEs (shared by several FACEs)
- TGeomID edgeID = getMeshDS()->ShapeToIndex( wire->Edge( iE ));
+ const TGeomID edgeID = wire->EdgeID( iE );
_ignoreShapeIds.insert( edgeID );
// check if ends of an EDGE are to be added to _noShrinkVert
- PShapeIteratorPtr faceIt = _helper.GetAncestors( wire->Edge( iE ), *_mesh, TopAbs_FACE );
- while ( const TopoDS_Shape* neighbourFace = faceIt->next() )
+ TopTools_ListIteratorOfListOfShape faceIt( faceList );
+ for ( ; faceIt.More(); faceIt.Next() )
{
- if ( neighbourFace->IsSame( _face )) continue;
- SMESH_Algo* algo = _mesh->GetGen()->GetAlgo( *_mesh, *neighbourFace );
+ const TopoDS_Shape& neighbourFace = faceIt.Value();
+ if ( neighbourFace.IsSame( _face )) continue;
+ SMESH_Algo* algo = _mesh->GetGen()->GetAlgo( *_mesh, neighbourFace );
if ( !algo ) continue;
const StdMeshers_ViscousLayers2D* viscHyp = 0;
const list <const SMESHDS_Hypothesis *> & allHyps =
- algo->GetUsedHypothesis(*_mesh, *neighbourFace, /*noAuxiliary=*/false);
+ algo->GetUsedHypothesis(*_mesh, neighbourFace, /*noAuxiliary=*/false);
list< const SMESHDS_Hypothesis *>::const_iterator hyp = allHyps.begin();
for ( ; hyp != allHyps.end() && !viscHyp; ++hyp )
viscHyp = dynamic_cast<const StdMeshers_ViscousLayers2D*>( *hyp );
set<TGeomID> neighbourIgnoreEdges;
- if (viscHyp) {
- vector<TGeomID> ids = _hyp->GetBndShapesToIgnore();
- neighbourIgnoreEdges.insert( ids.begin(), ids.end() );
- }
+ if (viscHyp)
+ getEdgesToIgnore( viscHyp, neighbourFace, getMeshDS(), neighbourIgnoreEdges );
+
for ( int iV = 0; iV < 2; ++iV )
{
TopoDS_Vertex vertex = iV ? wire->LastVertex(iE) : wire->FirstVertex(iE);
PShapeIteratorPtr edgeIt = _helper.GetAncestors( vertex, *_mesh, TopAbs_EDGE );
while ( const TopoDS_Shape* edge = edgeIt->next() )
if ( !edge->IsSame( wire->Edge( iE )) &&
+ _helper.IsSubShape( *edge, neighbourFace ) &&
neighbourIgnoreEdges.count( getMeshDS()->ShapeToIndex( *edge )))
+ {
_noShrinkVert.insert( getMeshDS()->ShapeToIndex( vertex ));
+ break;
+ }
}
}
}
}
+ }
}
+
+ // add VERTEXes w/o layers to _ignoreShapeIds (this is used by toShrinkForAdjacent())
+ for ( size_t iWire = 0; iWire < _faceSideVec.size(); ++iWire )
+ {
+ StdMeshers_FaceSidePtr wire = _faceSideVec[ iWire ];
+ for ( int iE = 0; iE < wire->NbEdges(); ++iE )
+ {
+ TGeomID edge1 = wire->EdgeID( iE );
+ TGeomID edge2 = wire->EdgeID( iE+1 );
+ if ( _ignoreShapeIds.count( edge1 ) && _ignoreShapeIds.count( edge2 ))
+ _ignoreShapeIds.insert( getMeshDS()->ShapeToIndex( wire->LastVertex( iE )));
+ }
+ }
+
return ( nbMyEdgesIgnored < totalNbEdges );
}
}
}
}
- _thickness = Min( _hyp->GetTotalThickness(), maxPossibleThick );
+ if ( maxPossibleThick > 0. )
+ _thickness = Min( _hyp->GetTotalThickness(), maxPossibleThick );
}
// Adjust _LayerEdge's at _PolyLine's extremities
const TopoDS_Edge& E,
const TopoDS_Vertex& V)
{
- if ( const StdMeshers_ViscousLayers2D* vlHyp = findHyp( *_mesh, adjFace ))
+ TopoDS_Shape hypAssignedTo;
+ if ( const StdMeshers_ViscousLayers2D* vlHyp = findHyp( *_mesh, adjFace, &hypAssignedTo ))
{
VISCOUS_2D::_ViscousBuilder2D builder( *_mesh, adjFace, vlHyp );
builder._faceSideVec = StdMeshers_FaceSide::GetFaceWires( adjFace, *_mesh, true, _error );
- builder.findEdgesWithLayers();
+ builder.findEdgesWithLayers( hypAssignedTo );
PShapeIteratorPtr edgeIt = _helper.GetAncestors( V, *_mesh, TopAbs_EDGE );
while ( const TopoDS_Shape* edgeAtV = edgeIt->next() )
}
return false;
}
-
+
//================================================================================
/*!
* \brief Make faces
bool _ViscousBuilder2D::refine()
{
+ // find out orientation of faces to create
+ bool isReverse =
+ ( _helper.GetSubShapeOri( _mesh->GetShapeToMesh(), _face ) == TopAbs_REVERSED );
+
// store a proxyMesh in a sub-mesh
// make faces on each _PolyLine
vector< double > layersHeight;
nbN = innerNodes.size() - ( hasRightNode || hasOwnRightNode );
L._leftNodes .reserve( _hyp->GetNumberLayers() );
L._rightNodes.reserve( _hyp->GetNumberLayers() );
+ int cur = 0, prev = -1; // to take into account orientation of _face
+ if ( isReverse ) std::swap( cur, prev );
for ( int iF = 0; iF < _hyp->GetNumberLayers(); ++iF ) // loop on layers of faces
{
// get accumulated length of intermediate segments
if ( !hasOwnRightNode ) L._rightNodes.push_back( innerNodes.back() );
// create faces
- // TODO care of orientation
for ( size_t i = 1; i < innerNodes.size(); ++i )
- if ( SMDS_MeshElement* f = _helper.AddFace( outerNodes[ i-1 ], outerNodes[ i ],
- innerNodes[ i ], innerNodes[ i-1 ]))
+ if ( SMDS_MeshElement* f = _helper.AddFace( outerNodes[ i+prev ], outerNodes[ i+cur ],
+ innerNodes[ i+cur ], innerNodes[ i+prev ]))
L._newFaces.insert( L._newFaces.end(), f );
outerNodes.swap( innerNodes );
continue;
for ( size_t i = 1; i < lNodes.size(); ++i )
- _helper.AddFace( lNodes[ i-1 ], rNodes[ i-1 ],
- rNodes[ i ], lNodes[ i ]);
+ _helper.AddFace( lNodes[ i+prev ], rNodes[ i+prev ],
+ rNodes[ i+cur ], lNodes[ i+cur ]);
const UVPtStruct& ptOnVertex = points[ isR ? L._lastPntInd : L._firstPntInd ];
- _helper.AddFace( ptOnVertex.node, rNodes[ 0 ], lNodes[ 0 ]);
+ if ( isReverse )
+ _helper.AddFace( ptOnVertex.node, lNodes[ 0 ], rNodes[ 0 ]);
+ else
+ _helper.AddFace( ptOnVertex.node, rNodes[ 0 ], lNodes[ 0 ]);
}
// Fill the _ProxyMeshOfFace
StdMeshersGUI_LayerDistributionParamWdg.h \
StdMeshersGUI_FixedPointsParamWdg.h \
StdMeshersGUI_SubShapeSelectorWdg.h \
- StdMeshersGUI_CartesianParamCreator.h
+ StdMeshersGUI_CartesianParamCreator.h \
+ StdMeshersGUI_RadioButtonsGrpWdg.h
# Libraries targets
lib_LTLIBRARIES = libStdMeshersGUI.la
StdMeshersGUI_LayerDistributionParamWdg.cxx \
StdMeshersGUI_FixedPointsParamWdg.cxx \
StdMeshersGUI_SubShapeSelectorWdg.cxx \
- StdMeshersGUI_CartesianParamCreator.cxx
+ StdMeshersGUI_CartesianParamCreator.cxx \
+ StdMeshersGUI_RadioButtonsGrpWdg.cxx
MOC_FILES = \
StdMeshersGUI_StdHypothesisCreator_moc.cxx \
StdMeshersGUI_LayerDistributionParamWdg_moc.cxx \
StdMeshersGUI_FixedPointsParamWdg_moc.cxx \
StdMeshersGUI_SubShapeSelectorWdg_moc.cxx \
- StdMeshersGUI_CartesianParamCreator_moc.cxx
+ StdMeshersGUI_CartesianParamCreator_moc.cxx \
+ StdMeshersGUI_RadioButtonsGrpWdg_moc.cxx
nodist_libStdMeshersGUI_la_SOURCES= \
$(MOC_FILES)
--- /dev/null
+// Copyright (C) 2007-2013 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 "StdMeshersGUI_RadioButtonsGrpWdg.h"
+
+#include <QVBoxLayout>
+#include <QRadioButton>
+#include <QButtonGroup>
+#include <QStringList>
+
+#define SPACING 6
+#define MARGIN 11
+
+//================================================================================
+/*!
+ * \brief Creates a QGroupBox with a given title
+ */
+//================================================================================
+
+StdMeshersGUI_RadioButtonsGrpWdg::StdMeshersGUI_RadioButtonsGrpWdg( const QString& title )
+ : QGroupBox( title )
+{
+ myButtonGrp = new QButtonGroup( this );
+}
+
+//================================================================================
+/*!
+ * \brief Creates a given nubmer of button labels with given labels (QString's)
+ */
+//================================================================================
+
+void StdMeshersGUI_RadioButtonsGrpWdg::setButtonLabels( const QStringList& buttonLabels )
+{
+ QVBoxLayout* layout = new QVBoxLayout( this );
+ layout->setSpacing(SPACING);
+ layout->setMargin(MARGIN);
+
+ for ( int id = 0; id < buttonLabels.size(); ++id )
+ {
+ QRadioButton* button = new QRadioButton( buttonLabels.at(id), this );
+ layout->addWidget( button );
+ myButtonGrp->addButton( button, id );
+ }
+}
+
+//================================================================================
+/*!
+ * \brief Set checked a radio button with a give id.
+ */
+//================================================================================
+
+void StdMeshersGUI_RadioButtonsGrpWdg::setChecked(int id)
+{
+ if ( QAbstractButton* but = myButtonGrp->button( id ))
+ but->setChecked( true );
+}
+
+//================================================================================
+/*!
+ * \brief Return id (zero based) of a checked radio button
+ */
+//================================================================================
+
+int StdMeshersGUI_RadioButtonsGrpWdg::checkedId () const
+{
+ return myButtonGrp->checkedId();
+}
--- /dev/null
+// Copyright (C) 2007-2013 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
+//
+#ifndef STDMESHERSGUI_RadioButtonsGrpWdg_H
+#define STDMESHERSGUI_RadioButtonsGrpWdg_H
+
+// SMESH includes
+#include "SMESH_StdMeshersGUI.hxx"
+
+// Qt includes
+#include <QGroupBox>
+
+class QButtonGroup;
+class QStringList;
+
+/*!
+ * \brief A QGroupBox holding several radio buttons
+ */
+class STDMESHERSGUI_EXPORT StdMeshersGUI_RadioButtonsGrpWdg : public QGroupBox
+{
+ Q_OBJECT
+
+public:
+ StdMeshersGUI_RadioButtonsGrpWdg (const QString& title);
+
+ void setButtonLabels( const QStringList& buttonLabels );
+
+ void setChecked(int id);
+
+ int checkedId() const;
+
+ QButtonGroup* getButtonGroup() { return myButtonGrp; }
+
+private:
+ QButtonGroup* myButtonGrp;
+};
+
+#endif // STDMESHERSGUI_RadioButtonsGrpWdg_H
#include "StdMeshersGUI_ObjectReferenceParamWdg.h"
#include "StdMeshersGUI_QuadrangleParamWdg.h"
#include "StdMeshersGUI_SubShapeSelectorWdg.h"
+#include "StdMeshersGUI_RadioButtonsGrpWdg.h"
#include <SALOMEDSClient_Study.hxx>
#include <QSlider>
#include <QLabel>
#include <QCheckBox>
+#include <QButtonGroup>
const double VALUE_MAX = 1.0e+15, // COORD_MAX
VALUE_MAX_2 = VALUE_MAX * VALUE_MAX,
h->SetVarParameter( params[2].text(), "SetStretchFactor" );
h->SetStretchFactor ( params[2].myValue.toDouble() );
- if ( StdMeshersGUI_SubShapeSelectorWdg* idsWg =
- widget< StdMeshersGUI_SubShapeSelectorWdg >( 3 ))
+ if ( StdMeshersGUI_SubShapeSelectorWdg* idsWg =
+ widget< StdMeshersGUI_SubShapeSelectorWdg >( 4 ))
{
- h->SetIgnoreEdges( idsWg->GetListOfIDs() );
+ h->SetEdges( idsWg->GetListOfIDs(), params[3].myValue.toInt() );
}
}
else if( hypType()=="QuadrangleParams" )
QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry();
if ( !aMainEntry.isEmpty() )
{
- item.myName = tr( "SMESH_EDGES_WO_LAYERS" );
+ item.myName = tr("TO_IGNORE_EDGES_OR_NOT");
+ p.append( item );
+
+ StdMeshersGUI_RadioButtonsGrpWdg* ignoreWdg = new StdMeshersGUI_RadioButtonsGrpWdg("");
+ ignoreWdg->setButtonLabels ( QStringList()
+ << tr("NOT_TO_IGNORE_EDGES")
+ << tr("TO_IGNORE_EDGES") );
+ ignoreWdg->setChecked( h->GetIsToIgnoreEdges() );
+ connect(ignoreWdg->getButtonGroup(),SIGNAL(buttonClicked(int)),this,SLOT(onValueChanged()));
+ customWidgets()->append( ignoreWdg );
+
+ item.myName =
+ tr( h->GetIsToIgnoreEdges() ? "SMESH_EDGES_WO_LAYERS" : "SMESH_EDGES_WITH_LAYERS" );
p.append( item );
StdMeshersGUI_SubShapeSelectorWdg* idsWg =
idsWg->SetGeomShapeEntry( aMainEntry );
idsWg->SetMainShapeEntry( aMainEntry );
- idsWg->SetListOfIDs( h->GetIgnoreEdges() );
+ idsWg->SetListOfIDs( h->GetEdges() );
idsWg->showPreview( true );
customWidgets()->append ( idsWg );
}
//param.myValue = w->isChecked();
return true;
}
+ if ( widget->inherits( "StdMeshersGUI_RadioButtonsGrpWdg" ))
+ {
+ const StdMeshersGUI_RadioButtonsGrpWdg * w =
+ static_cast<const StdMeshersGUI_RadioButtonsGrpWdg*>( widget );
+ param.myValue = w->checkedId();
+ return true;
+ }
return false;
}
toCopyGroups->setEnabled( true );
}
}
+ else if ( hypType() == "ViscousLayers2D" && paramWidget->inherits("QButtonGroup"))
+ {
+ if ( QLabel* label = getLabel(4) )
+ {
+ bool toIgnore = widget< StdMeshersGUI_RadioButtonsGrpWdg >( 3 )->checkedId();
+ label->setText( tr( toIgnore ? "SMESH_EDGES_WO_LAYERS" : "SMESH_EDGES_WITH_LAYERS" ));
+ }
+ }
}
//================================================================================
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.0" language="en_US">
+<context>
+ <name>StdMeshersGUI_StdHypothesisCreator</name>
+ <message>
+ <source>TO_IGNORE_EDGES_OR_NOT</source>
+ <translation>Specified edges are</translation>
+ </message>
+ <message>
+ <source>NOT_TO_IGNORE_EDGES</source>
+ <translation>Edges with layers (walls)</translation>
+ </message>
+ <message>
+ <source>TO_IGNORE_EDGES</source>
+ <translation>Edges without layers (inlets and oulets)</translation>
+ </message>
+</context>
<context>
<name>@default</name>
<message>
</message>
<message>
<source>SMESH_EDGES_WO_LAYERS</source>
- <translation>Edges without layers
-(inlets and oulets)</translation>
+ <translation>Edges without layers</translation>
+ </message>
+ <message>
+ <source>SMESH_FACES_WITH_LAYERS</source>
+ <translation>Faces with layers
+(walls)</translation>
+ </message>
+ <message>
+ <source>SMESH_EDGES_WITH_LAYERS</source>
+ <translation>Edges with layers</translation>
</message>
<message>
<source>SMESH_MAX_LENGTH_TITLE</source>
*/
//================================================================================
-void StdMeshers_ViscousLayers2D_i::SetIgnoreEdges(const ::SMESH::long_array& edgeIDs)
-throw ( SALOME::SALOME_Exception )
+void StdMeshers_ViscousLayers2D_i::SetEdges(const ::SMESH::long_array& edgeIDs,
+ CORBA::Boolean toIgnore)
+ throw ( SALOME::SALOME_Exception )
{
vector<int> ids( edgeIDs.length() );
for ( unsigned i = 0; i < ids.size(); ++i )
if (( ids[i] = edgeIDs[i] ) < 1 )
THROW_SALOME_CORBA_EXCEPTION( "Invalid edge id", SALOME::BAD_PARAM );
- GetImpl()->SetBndShapesToIgnore( ids );
- SMESH::TPythonDump() << _this() << ".SetIgnoreEdges( " << edgeIDs << " )";
+
+ GetImpl()->SetBndShapes( ids, toIgnore );
+
+ SMESH::TPythonDump() << _this() << ".SetEdges( " << edgeIDs << ", " << toIgnore << " )";
}
//================================================================================
*/
//================================================================================
-SMESH::long_array* StdMeshers_ViscousLayers2D_i::GetIgnoreEdges()
+void StdMeshers_ViscousLayers2D_i::SetIgnoreEdges(const ::SMESH::long_array& edgeIDs)
+ throw ( SALOME::SALOME_Exception )
{
- vector<int> idsVec = GetImpl()->GetBndShapesToIgnore();
+ SMESH::TPythonDump pyDump;
+ this->SetEdges( edgeIDs, true );
+ pyDump<< _this() << ".SetIgnoreEdges( " << edgeIDs << " )";
+}
+
+//================================================================================
+/*!
+ * \brief
+ */
+//================================================================================
+
+SMESH::long_array* StdMeshers_ViscousLayers2D_i::GetEdges()
+{
+ vector<int> idsVec = GetImpl()->GetBndShapes();
SMESH::long_array_var ids = new SMESH::long_array;
ids->length( idsVec.size() );
for ( unsigned i = 0; i < idsVec.size(); ++i )
*/
//================================================================================
+SMESH::long_array* StdMeshers_ViscousLayers2D_i::GetIgnoreEdges()
+{
+ if ( GetImpl()->IsToIgnoreShapes() )
+ return this->GetEdges();
+ return new SMESH::long_array;
+}
+
+//================================================================================
+/*!
+ * \brief
+ */
+//================================================================================
+
+CORBA::Boolean StdMeshers_ViscousLayers2D_i::GetIsToIgnoreEdges()
+{
+ return GetImpl()->IsToIgnoreShapes();
+}
+
+//================================================================================
+/*!
+ * \brief
+ */
+//================================================================================
+
void StdMeshers_ViscousLayers2D_i::SetTotalThickness(::CORBA::Double thickness)
throw ( SALOME::SALOME_Exception )
{
// Destructor
virtual ~StdMeshers_ViscousLayers2D_i();
- void SetIgnoreEdges(const ::SMESH::long_array& edgeIDs) throw ( SALOME::SALOME_Exception );
+ void SetIgnoreEdges(const SMESH::long_array& edgeIDs) throw ( SALOME::SALOME_Exception );
SMESH::long_array* GetIgnoreEdges();
+ void SetEdges(const SMESH::long_array& edgeIDs,
+ CORBA::Boolean toIgnore) throw (SALOME::SALOME_Exception);
+ SMESH::long_array* GetEdges();
+ CORBA::Boolean GetIsToIgnoreEdges();
+
void SetTotalThickness(::CORBA::Double thickness) throw ( SALOME::SALOME_Exception );
::CORBA::Double GetTotalThickness();
for ( unsigned i = 0; i < ids.size(); ++i )
if (( ids[i] = faceIDs[i] ) < 1 )
THROW_SALOME_CORBA_EXCEPTION( "Invalid face id", SALOME::BAD_PARAM );
- GetImpl()->SetBndShapesToIgnore( ids );
+ GetImpl()->SetBndShapes( ids, /*toIgnore=*/true );
SMESH::TPythonDump() << _this() << ".SetIgnoreFaces( " << faceIDs << " )";
}
SMESH::long_array* StdMeshers_ViscousLayers_i::GetIgnoreFaces()
{
- vector<int> idsVec = GetImpl()->GetBndShapesToIgnore();
SMESH::long_array_var ids = new SMESH::long_array;
- ids->length( idsVec.size() );
- for ( unsigned i = 0; i < idsVec.size(); ++i )
- ids[i] = idsVec[i];
+ if ( GetImpl()->IsToIgnoreShapes() )
+ {
+ vector<int> idsVec = GetImpl()->GetBndShapes();
+ ids->length( idsVec.size() );
+ for ( unsigned i = 0; i < idsVec.size(); ++i )
+ ids[i] = idsVec[i];
+ }
return ids._retn();
}
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2013 EDF R&D
+#
+# 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
+#
+
+# Modules Python
+# Modules Eficas
+
+import os, subprocess
+from MGCleanerPlugDialog import Ui_MGCleanerPlugDialog
+from MGCleanerMonViewText import MGCleanerMonViewText
+from PyQt4.QtGui import *
+from PyQt4.QtCore import *
+
+
+class MGCleanerMonPlugDialog(Ui_MGCleanerPlugDialog,QWidget):
+ """
+ """
+ def __init__(self):
+ QWidget.__init__(self)
+ self.setupUi(self)
+ self.connecterSignaux()
+ self.fichierIn=""
+ self.fichierOut=""
+ self.MeshIn=""
+ self.commande=""
+ self.num=1
+ self.__selectedMesh=None
+
+ # complex whith QResources: not used
+ # The icon are supposed to be located in the $SMESH_ROOT_DIR/share/salome/resources/smesh folder,
+ # other solution could be in the same folder than this python module file:
+ # iconfolder=os.path.dirname(os.path.abspath(__file__))
+
+ self.iconfolder=os.environ["SMESH_ROOT_DIR"]+"/share/salome/resources/smesh"
+ #print "MGCleanerMonPlugDialog iconfolder",iconfolder
+ icon = QIcon()
+ icon.addFile(os.path.join(self.iconfolder,"select1.png"))
+ self.PB_LoadHyp.setIcon(icon)
+ self.PB_LoadHyp.setToolTip("hypothesis from Salome Object Browser")
+ self.PB_SaveHyp.setIcon(icon)
+ self.PB_SaveHyp.setToolTip("hypothesis to Salome Object Browser")
+ self.PB_MeshSmesh.setIcon(icon)
+ self.PB_MeshSmesh.setToolTip("source mesh from Salome Object Browser")
+ icon = QIcon()
+ icon.addFile(os.path.join(self.iconfolder,"open.png"))
+ self.PB_ParamsFileExplorer.setIcon(icon)
+ self.PB_Load.setIcon(icon)
+ self.PB_Load.setToolTip("hypothesis from file")
+ self.PB_Save.setIcon(icon)
+ self.PB_Save.setToolTip("hypothesis to file")
+ self.PB_MeshFile.setIcon(icon)
+ self.PB_MeshFile.setToolTip("source mesh from a file in disk")
+
+ #Ces parametres ne sont pas remis à rien par le clean
+ self.paramsFile= os.path.abspath(os.path.join(os.environ["HOME"],".MGCleaner.dat"))
+ self.LE_ParamsFile.setText(self.paramsFile)
+ self.LE_MeshFile.setText("")
+ self.LE_MeshSmesh.setText("")
+
+ v1=QDoubleValidator(self)
+ v1.setBottom(0.)
+ #v1.setTop(10000.)
+ v1.setDecimals(4)
+ self.SP_MinHoleSize.setValidator(v1)
+ self.SP_MinHoleSize.titleForWarning="MinHoleSize"
+
+ v2=QDoubleValidator(self)
+ v2.setBottom(0.)
+ #v2.setTop(10000.)
+ v2.setDecimals(4)
+ self.SP_ToleranceDisplacement.setValidator(v2)
+ self.SP_ToleranceDisplacement.titleForWarning="ToleranceDisplacement"
+
+ v3=QDoubleValidator(self)
+ v3.setBottom(0.)
+ #v3.setTop(10000.)
+ v3.setDecimals(4)
+ self.SP_ResolutionLength.setValidator(v3)
+ self.SP_ResolutionLength.titleForWarning="ResolutionLength"
+
+ v4=QDoubleValidator(self)
+ v4.setBottom(0.)
+ #v4.setTop(10000.)
+ v4.setDecimals(4)
+ self.SP_OverlapDistance.setValidator(v4)
+ self.SP_OverlapDistance.titleForWarning="OverlapDistance"
+
+ self.resize(800, 500)
+ self.clean()
+
+ def connecterSignaux(self) :
+ self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
+ self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
+ self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
+ self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
+
+ self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed)
+ self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
+ self.connect(self.PB_LoadHyp,SIGNAL("clicked()"),self.PBLoadHypPressed)
+ self.connect(self.PB_SaveHyp,SIGNAL("clicked()"),self.PBSaveHypPressed)
+
+ self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
+ self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
+ self.connect(self.LE_MeshSmesh,SIGNAL("returnPressed()"),self.meshSmeshNameChanged)
+ self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
+ self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
+ self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
+
+ #QtCore.QObject.connect(self.checkBox, QtCore.SIGNAL("stateChanged(int)"), self.change)
+ self.connect(self.CB_FillHoles,SIGNAL("stateChanged(int)"),self.SP_MinHoleSize.setEnabled)
+ self.connect(self.CB_ComputedToleranceDisplacement,SIGNAL("stateChanged(int)"),self.SP_ToleranceDisplacement.setDisabled)
+ self.connect(self.CB_ComputedResolutionLength,SIGNAL("stateChanged(int)"),self.SP_ResolutionLength.setDisabled)
+ self.connect(self.CB_ComputedOverlapDistance,SIGNAL("stateChanged(int)"),self.SP_OverlapDistance.setDisabled)
+
+ def PBHelpPressed(self):
+ try:
+ mydir=os.environ["SMESH_ROOT_DIR"]
+ except Exception:
+ QMessageBox.warning( self, "Help", "Help unavailable $SMESH_ROOT_DIR not found")
+ return
+ maDoc=mydir+"/share/doc/salome/gui/SMESH/MGCleaner/_downloads/mg-cleaner_user_manual.pdf"
+ command="xdg-open "+maDoc+";"
+ subprocess.call(command, shell=True)
+
+ def PBOKPressed(self):
+ if not(self.PrepareLigneCommande()):
+ #warning done yet
+ #QMessageBox.warning(self, "Compute", "Command not found")
+ return
+ maFenetre=MGCleanerMonViewText(self, self.commande)
+
+ def enregistreResultat(self):
+ import salome
+ import SMESH
+ from salome.kernel import studyedit
+ from salome.smesh import smeshBuilder
+ smesh = smeshBuilder.New(salome.myStudy)
+
+ if not os.path.isfile(self.fichierOut):
+ QMessageBox.warning(self, "Compute", "Result file "+self.fichierOut+" not found")
+
+ maStudy=studyedit.getActiveStudy()
+ smesh.SetCurrentStudy(maStudy)
+ (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
+ name=str(self.LE_MeshSmesh.text())
+ initialMeshFile=None
+ initialMeshObject=None
+ if name=="":
+ a=str(self.fichierIn)
+ name=os.path.basename(os.path.splitext(a)[0])
+ initialMeshFile=a
+ else:
+ initialMeshObject=maStudy.FindObjectByName(name ,"SMESH")[0]
+
+ meshname = name+"_MGC_"+str(self.num)
+ smesh.SetName(outputMesh.GetMesh(), meshname)
+ outputMesh.Compute() #no algorithms message for "Mesh_x" has been computed with warnings: - global 1D algorithm is missing
+
+ self.editor = studyedit.getStudyEditor()
+ moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
+ HypReMeshEntry = self.editor.findOrCreateItem(
+ moduleEntry, name = "Plugins Hypotheses", icon="mesh_tree_hypo.png") #, comment = "HypoForRemeshing" )
+
+ monStudyBuilder=maStudy.NewBuilder()
+ monStudyBuilder.NewCommand()
+ newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
+ self.editor.setAttributeValue(newStudyIter, "AttributeName", "MGCleaner Parameters_"+str(self.num))
+ self.editor.setAttributeValue(newStudyIter, "AttributeComment", self.getResumeData(separator=" ; "))
+
+ SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0]
+
+ if initialMeshFile!=None:
+ newStudyFileName=monStudyBuilder.NewObject(SOMesh)
+ self.editor.setAttributeValue(newStudyFileName, "AttributeName", "meshFile")
+ self.editor.setAttributeValue(newStudyFileName, "AttributeExternalFileDef", initialMeshFile)
+ self.editor.setAttributeValue(newStudyFileName, "AttributeComment", initialMeshFile)
+
+ if initialMeshObject!=None:
+ newLink=monStudyBuilder.NewObject(SOMesh)
+ monStudyBuilder.Addreference(newLink, initialMeshObject)
+
+ newLink=monStudyBuilder.NewObject(SOMesh)
+ monStudyBuilder.Addreference(newLink, newStudyIter)
+
+ if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
+ self.num+=1
+ return True
+
+ def PBSavePressed(self):
+ from datetime import datetime
+ if not(self.PrepareLigneCommande()): return
+ text = "# MGCleaner hypothesis parameters\n"
+ text += "# Params for mesh : " + self.LE_MeshSmesh.text() +"\n"
+ text += datetime.now().strftime("# Date : %d/%m/%y %H:%M:%S\n")
+ text += "# Command : "+self.commande+"\n"
+ text += self.getResumeData(separator="\n")
+ text += "\n\n"
+
+ try:
+ f=open(self.paramsFile,"a")
+ except:
+ QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
+ return
+ try:
+ f.write(text)
+ except:
+ QMessageBox.warning(self, "File", "Unable to write "+self.paramsFile)
+ return
+ f.close()
+
+ def PBSaveHypPressed(self):
+ """save hypothesis in Object Browser"""
+ import salome
+ import SMESH
+ from salome.kernel import studyedit
+ from salome.smesh import smeshBuilder
+ smesh = smeshBuilder.New(salome.myStudy)
+
+ maStudy=studyedit.getActiveStudy()
+ smesh.SetCurrentStudy(maStudy)
+
+ self.editor = studyedit.getStudyEditor()
+ moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
+ HypReMeshEntry = self.editor.findOrCreateItem(
+ moduleEntry, name = "Plugins Hypotheses", icon="mesh_tree_hypo.png") #, comment = "HypoForRemeshing" )
+
+ monStudyBuilder=maStudy.NewBuilder()
+ monStudyBuilder.NewCommand()
+ newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
+ self.editor.setAttributeValue(newStudyIter, "AttributeName", "MGCleaner Parameters_"+str(self.num))
+ self.editor.setAttributeValue(newStudyIter, "AttributeComment", self.getResumeData(separator=" ; "))
+
+ if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
+ self.num+=1
+ return True
+
+ """
+ import salome_pluginsmanager
+ print "salome_pluginsmanager.plugins",salome_pluginsmanager.plugins
+ print "salome_pluginsmanager.current_plugins_manager",salome_pluginsmanager.current_plugins_manager
+ """
+
+ def SP_toStr(self, widget):
+ """only for a QLineEdit widget"""
+ #cr, pos=widget.validator().validate(res, 0) #n.b. "1,3" is acceptable !locale!
+ try:
+ val=float(widget.text())
+ except:
+ QMessageBox.warning(self, widget.titleForWarning, "float value is incorrect: '"+widget.text()+"'")
+ res=str(widget.validator().bottom())
+ widget.setProperty("text", res)
+ return res
+ valtest=widget.validator().bottom()
+ if valtest!=None:
+ if val<valtest:
+ QMessageBox.warning(self, widget.titleForWarning, "float value is under minimum: "+str(val)+" < "+str(valtest))
+ res=str(valtest)
+ widget.setProperty("text", res)
+ return res
+ valtest=widget.validator().top()
+ if valtest!=None:
+ if val>valtest:
+ QMessageBox.warning(self, widget.titleForWarning, "float value is over maximum: "+str(val)+" > "+str(valtest))
+ res=str(valtest)
+ widget.setProperty("text", res)
+ return res
+ return str(val)
+
+ def getResumeData(self, separator="\n"):
+ text=""
+ if self.RB_Fix1.isChecked():
+ CheckOrFix="fix1pass"
+ else:
+ if self.RB_Fix2.isChecked():
+ CheckOrFix="fix2pass"
+ else:
+ CheckOrFix="check"
+ text+="CheckOrFix="+CheckOrFix+separator
+ text+="PreserveTopology="+str(self.CB_PreserveTopology.isChecked())+separator
+ text+="FillHoles="+str(self.CB_FillHoles.isChecked())+separator
+ v=self.SP_toStr(self.SP_MinHoleSize)
+ text+="MinHoleSize="+v+separator
+ text+="ComputedToleranceDisplacement="+str(self.CB_ComputedToleranceDisplacement.isChecked())+separator
+ v=self.SP_toStr(self.SP_ToleranceDisplacement)
+ text+="ToleranceDisplacement="+v+separator
+ text+="ComputedResolutionLength="+str(self.CB_ComputedResolutionLength.isChecked())+separator
+ v=self.SP_toStr(self.SP_ResolutionLength)
+ text+="ResolutionLength="+v+separator
+ text+="FoldingAngle="+str(self.SP_FoldingAngle.value())+separator
+ text+="RemeshPlanes="+str(self.CB_RemeshPlanes.isChecked())+separator
+ text+="ComputedOverlapDistance="+str(self.CB_ComputedOverlapDistance.isChecked())+separator
+ v=self.SP_toStr(self.SP_OverlapDistance)
+ text+="OverlapDistance="+v+separator
+ text+="OverlapAngle="+str(self.SP_OverlapAngle.value())+separator
+ text+="Verbosity="+str(self.SP_Verbosity.value())+separator
+ return str(text)
+
+ def loadResumeData(self, hypothesis, separator="\n"):
+ text=str(hypothesis)
+ self.clean()
+ for slig in reversed(text.split(separator)):
+ lig=slig.strip()
+ #print "load ResumeData",lig
+ if lig=="": continue #skip blanck lines
+ if lig[0]=="#": break
+ try:
+ tit,value=lig.split("=")
+ if tit=="CheckOrFix":
+ self.RB_Fix1.setChecked(False)
+ self.RB_Fix2.setChecked(False)
+ self.RB_Check.setChecked(False)
+ if value=="fix1pass": self.RB_Fix1.setChecked(True)
+ if value=="fix2pass": self.RB_Fix2.setChecked(True)
+ if value=="check": self.RB_Check.setChecked(True)
+ if tit=="PreserveTopology": self.CB_PreserveTopology.setChecked(value=="True")
+ if tit=="FillHoles": self.CB_FillHoles.setChecked(value=="True")
+ if tit=="MinHoleSize": self.SP_MinHoleSize.setProperty("text", value)
+ if tit=="ComputedToleranceDisplacement": self.CB_ComputedToleranceDisplacement.setChecked(value=="True")
+ if tit=="ToleranceDisplacement": self.SP_ToleranceDisplacement.setProperty("text", value)
+ if tit=="ComputedResolutionLength": self.CB_ComputedResolutionLength.setChecked(value=="True")
+ if tit=="ResolutionLength": self.SP_ResolutionLength.setProperty("text", value)
+ if tit=="FoldingAngle": self.SP_FoldingAngle.setProperty("value", float(value))
+ if tit=="RemeshPlanes": self.CB_RemeshPlanes.setChecked(value=="True")
+ if tit=="ComputedOverlapDistance": self.CB_ComputedOverlapDistance.setChecked(value=="True")
+ if tit=="OverlapDistance": self.SP_OverlapDistance.setProperty("text", value)
+ if tit=="OverlapAngle": self.SP_OverlapAngle.setProperty("value", float(value))
+ if tit=="Verbosity": self.SP_Verbosity.setProperty("value", int(float(value)))
+ except:
+ QMessageBox.warning(self, "load MGCleaner Hypothesis", "Problem on '"+lig+"'")
+
+ def PBLoadPressed(self):
+ """load last hypothesis saved in tail of file"""
+ try:
+ f=open(self.paramsFile,"r")
+ except:
+ QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
+ return
+ try:
+ text=f.read()
+ except:
+ QMessageBox.warning(self, "File", "Unable to read "+self.paramsFile)
+ return
+ f.close()
+ self.loadResumeData(text, separator="\n")
+
+ def PBLoadHypPressed(self):
+ """load hypothesis saved in Object Browser"""
+ #QMessageBox.warning(self, "load Object Browser MGCleaner hypothesis", "TODO")
+ import salome
+ from salome.kernel import studyedit
+ from salome.smesh.smeshstudytools import SMeshStudyTools
+ from salome.gui import helper as guihelper
+ from omniORB import CORBA
+
+ mySObject, myEntry = guihelper.getSObjectSelected()
+ if CORBA.is_nil(mySObject) or mySObject==None:
+ QMessageBox.critical(self, "Hypothese", "select an Object Browser MGCleaner hypothesis")
+ return
+
+ #for i in dir(mySObject): print "dir mySObject",i
+ #print "GetAllAttributes",mySObject.GetAllAttributes()
+ #print "GetComment",mySObject.GetComment()
+ #print "GetName",mySObject.GetName()
+
+ #could be renamed...
+ #if mySObject.GetFather().GetName()!="MGCleaner Hypotheses":
+ # QMessageBox.critical(self, "Hypothese", "not a child of MGCleaner Hypotheses")
+ # return
+
+ text=mySObject.GetComment()
+
+ #a verification
+ if "CheckOrFix=" not in text:
+ QMessageBox.critical(self, "Load Hypothese", "Object Browser selection not a MGCleaner Hypothesis")
+ return
+ self.loadResumeData(text, separator=" ; ")
+ return
+
+ def PBCancelPressed(self):
+ self.close()
+
+ def PBMeshFilePressed(self):
+ fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
+ if fd.exec_():
+ infile = fd.selectedFiles()[0]
+ self.LE_MeshFile.setText(infile)
+ self.fichierIn=infile.toLatin1()
+ self.MeshIn=""
+ self.LE_MeshSmesh.setText("")
+
+ def setParamsFileName(self):
+ fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
+ if fd.exec_():
+ infile = fd.selectedFiles()[0]
+ self.LE_ParamsFile.setText(infile)
+ self.paramsFile=infile.toLatin1()
+
+ def meshFileNameChanged(self):
+ self.fichierIn=str(self.LE_MeshFile.text())
+ #print "meshFileNameChanged", self.fichierIn
+ if os.path.exists(self.fichierIn):
+ self.__selectedMesh=None
+ self.MeshIn=""
+ self.LE_MeshSmesh.setText("")
+ return
+ QMessageBox.warning(self, "Mesh file", "File doesn't exist")
+
+ def meshSmeshNameChanged(self):
+ """only change by GUI mouse selection, otherwise clear"""
+ #self.MeshIn=str(self.LE_MeshSmesh.text())
+ #print "meshSmeshNameChanged", self.MeshIn
+ self.__selectedMesh = None
+ self.MeshIn=""
+ self.LE_MeshSmesh.setText("")
+ self.fichierIn=""
+ return
+
+ def paramsFileNameChanged(self):
+ self.paramsFile=self.LE_ParamsFile.text()
+
+ def PBMeshSmeshPressed(self):
+ from omniORB import CORBA
+ import salome
+ from salome.kernel import studyedit
+ from salome.smesh.smeshstudytools import SMeshStudyTools
+ from salome.gui import helper as guihelper
+ from salome.smesh import smeshBuilder
+ smesh = smeshBuilder.New(salome.myStudy)
+
+ mySObject, myEntry = guihelper.getSObjectSelected()
+ if CORBA.is_nil(mySObject) or mySObject==None:
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return
+ self.smeshStudyTool = SMeshStudyTools()
+ try:
+ self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
+ except:
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return
+ if CORBA.is_nil(self.__selectedMesh):
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return
+ myName = mySObject.GetName()
+ #print "MeshSmeshNameChanged", myName
+ self.MeshIn=myName
+ self.LE_MeshSmesh.setText(myName)
+ self.LE_MeshFile.setText("")
+ self.fichierIn=""
+
+ def prepareFichier(self):
+ self.fichierIn="/tmp/ForMGCleaner_"+str(self.num)+".mesh"
+ self.__selectedMesh.ExportGMF(self.__selectedMesh, self.fichierIn, True)
+
+ def PrepareLigneCommande(self):
+ """
+ #use doc examples of mg-cleaner:
+ ls -al /data/tmplgls/salome/prerequis/install/COMMON_64/MeshGems-1.0/bin
+ source /data/tmplgls/salome/prerequis/install/LICENSE/dlim8.var.sh
+ export PATH=/data/tmplgls/salome/prerequis/install/COMMON_64/MeshGems-1.0/bin/Linux_64:$PATH
+ cp -r /data/tmplgls/salome/prerequis/install/COMMON_64/MeshGems-1.0/examples .
+ cd examples
+ mg-cleaner.exe --help
+ mg-cleaner.exe --in case7.mesh --out case7-test.mesh --check
+ mg-cleaner.exe case7.mesh case7-fix.mesh --fix
+ mg-cleaner.exe --in Porsche.mesh --out Porsche-test.mesh --check
+ mg-cleaner.exe --in Porsche.mesh --out Porschefix.mesh --fix
+ mg-cleaner.exe --in Porsche.mesh --out PorscheNewfix.mesh --fix --resolution_length 0.03
+ """
+
+ #self.commande="mg-cleaner.exe --in " + self.fichierIn + " --out " + self.fichierOut + " --fix2pass"
+ #return True
+ #print "PrepareLigneCommande '"+self.fichierIn+"' '"+self.MeshIn+"'",self.__selectedMesh
+ if self.fichierIn=="" and self.MeshIn=="":
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return False
+ if self.__selectedMesh!=None: self.prepareFichier()
+ if not (os.path.isfile(self.fichierIn)):
+ QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
+ return False
+
+ self.commande="mg-cleaner.exe"
+ verbosity=str(self.SP_Verbosity.value())
+ self.commande+=" --verbose " + verbosity
+ self.commande+=" --in " + self.fichierIn
+ #print "self.fichierIn",self.fichierIn,type(self.fichierIn)
+ deb=os.path.splitext(str(self.fichierIn))
+ self.fichierOut=deb[0] + "_fix.mesh"
+ self.commande+=" --out "+self.fichierOut
+ if self.RB_Fix1.isChecked():
+ self.commande+=" --fix1pass"
+ else:
+ if self.RB_Fix2.isChecked():
+ self.commande+=" --fix2pass"
+ else:
+ self.commande+=" --check"
+ if self.CB_PreserveTopology.isChecked():
+ self.commande+=" --topology respect"
+ else:
+ self.commande+=" --topology ignore"
+ if self.CB_FillHoles.isChecked(): #no fill holes default
+ self.commande+=" --min_hole_size " + self.SP_toStr(self.SP_MinHoleSize)
+ if not self.CB_ComputedToleranceDisplacement.isChecked(): #computed default
+ self.commande+=" --tolerance_displacement " + self.SP_toStr(self.SP_ToleranceDisplacement)
+ if not self.CB_ComputedResolutionLength.isChecked(): #computed default
+ self.commande+=" --resolution_length " + self.SP_toStr(self.SP_ResolutionLength)
+ self.commande+=" --folding_angle " + str(self.SP_FoldingAngle.value())
+ if self.CB_RemeshPlanes.isChecked(): #no remesh default
+ self.commande+=" --remesh_planes"
+ if not self.CB_ComputedOverlapDistance.isChecked(): #computed default
+ self.commande+=" --overlap_distance " + self.SP_toStr(self.SP_OverlapDistance)
+ self.commande+=" --overlap_angle " + str(self.SP_OverlapAngle.value())
+ return True
+
+ def clean(self):
+ self.RB_Check.setChecked(False)
+ self.RB_Fix1.setChecked(False)
+ self.RB_Fix2.setChecked(True)
+ self.CB_PreserveTopology.setChecked(False)
+ self.CB_FillHoles.setChecked(False)
+ self.CB_RemeshPlanes.setChecked(False)
+
+ self.SP_MinHoleSize.setProperty("text", 0)
+ self.SP_ToleranceDisplacement.setProperty("text", 0)
+ self.SP_ResolutionLength.setProperty("text", 0)
+ self.SP_FoldingAngle.setProperty("value", 15)
+ self.SP_OverlapDistance.setProperty("text", 0)
+ self.SP_OverlapAngle.setProperty("value", 15)
+ self.SP_Verbosity.setProperty("value", 3)
+
+ self.CB_ComputedToleranceDisplacement.setChecked(True)
+ self.CB_ComputedResolutionLength.setChecked(True)
+ self.CB_ComputedOverlapDistance.setChecked(True)
+
+__dialog=None
+def getDialog():
+ """
+ This function returns a singleton instance of the plugin dialog.
+ c est obligatoire pour faire un show sans parent...
+ """
+ global __dialog
+ if __dialog is None:
+ __dialog = MGCleanerMonPlugDialog()
+ #else :
+ # __dialog.clean()
+ return __dialog
+
+
+#
+# ==============================================================================
+# For memory
+# ==============================================================================
+#
+def TEST_standalone():
+ """
+ works only if a salome is launched yet with a study loaded
+ to launch standalone python do:
+ ./APPLI/runSession
+ python
+ or (do not works)
+ python ./INSTALL/SMESH/share/salome/plugins/smesh/MGCleanerMonPlugDialog.py
+ """
+ import salome
+ import SMESH
+ from salome.kernel import studyedit
+ salome.salome_init()
+ maStudy=studyedit.getActiveStudy()
+ #etc...a mano...
+
+#
+# ==============================================================================
+# Basic use cases and unit test functions
+# ==============================================================================
+#
+def TEST_MGCleanerMonPlugDialog():
+ import sys
+ from PyQt4.QtGui import QApplication
+ from PyQt4.QtCore import QObject, SIGNAL, SLOT
+ app = QApplication(sys.argv)
+ QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+ dlg=MGCleanerMonPlugDialog()
+ dlg.show()
+ sys.exit(app.exec_())
+
+if __name__ == "__main__":
+ TEST_MGCleanerMonPlugDialog()
+ #TEST_standalone()
+ pass
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2007-2013 EDF R&D
+#
+# 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
+#
+
+# Modules Python
+import string,types,os
+import traceback
+
+from PyQt4 import *
+from PyQt4.QtGui import *
+from PyQt4.QtCore import *
+
+# Import des panels
+
+from MGCleanerViewText import Ui_ViewExe
+
+class MGCleanerMonViewText(Ui_ViewExe, QDialog):
+ """
+ Classe permettant la visualisation de texte
+ """
+ def __init__(self, parent, txt, ):
+ QDialog.__init__(self,parent)
+ self.setupUi(self)
+ self.resize( QSize(1000,600).expandedTo(self.minimumSizeHint()) )
+ #self.connect( self.PB_Ok,SIGNAL("clicked()"), self, SLOT("close()") )
+ self.connect( self.PB_Ok,SIGNAL("clicked()"), self.theClose )
+ self.connect( self.PB_Save,SIGNAL("clicked()"), self.saveFile )
+ self.PB_Save.setToolTip("Save trace in log file")
+ self.PB_Ok.setToolTip("Close view")
+ self.monExe=QProcess(self)
+
+ self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
+ self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
+
+ # Je n arrive pas a utiliser le setEnvironment du QProcess
+ # fonctionne hors Salome mais pas dans Salome ???
+ cmds=''
+ try :
+ LICENCE_FILE=os.environ["DISTENE_LICENCE_FILE_FOR_MGCLEANER"]
+ except:
+ LICENCE_FILE=''
+ try :
+ PATH=os.environ["DISTENE_PATH_FOR_MGCLEANER"]
+ except:
+ PATH=''
+ if LICENCE_FILE != '':
+ cmds+='source '+LICENCE_FILE+'\n'
+ else:
+ cmds+="# $DISTENE_LICENCE_FILE_FOR_MGCLEANER NOT SET\n"
+ if PATH != '':
+ cmds+='export PATH='+PATH+':$PATH\n'
+ else:
+ cmds+="# $DISTENE_PATH_FOR_MGCLEANER NOT SET\n"
+ #cmds+='env\n'
+ cmds+='rm -f '+self.parent().fichierOut+'\n'
+ cmds+=txt+'\n'
+ cmds+='echo END_OF_MGCleaner\n'
+ pid=self.monExe.pid()
+ nomFichier='/tmp/MGCleaner_'+str(pid)+'.sh'
+ f=open(nomFichier,'w')
+ f.write(cmds)
+ f.close()
+
+ maBidouille='sh ' + nomFichier
+ self.monExe.start(maBidouille)
+ self.monExe.closeWriteChannel()
+ self.enregistreResultatsDone=False
+ self.show()
+
+ def saveFile(self):
+ #recuperation du nom du fichier
+ savedir=os.environ['HOME']
+ fn = QFileDialog.getSaveFileName(None, self.trUtf8("Save File"),savedir)
+ if fn.isNull() : return
+ ulfile = os.path.abspath(unicode(fn))
+ try:
+ f = open(fn, 'wb')
+ f.write(str(self.TB_Exe.toPlainText()))
+ f.close()
+ except IOError, why:
+ QMessageBox.critical(self, self.trUtf8('Save File'),
+ self.trUtf8('The file <b>%1</b> could not be saved.<br>Reason: %2')
+ .arg(unicode(fn)).arg(str(why)))
+
+ def readFromStdErr(self):
+ a=self.monExe.readAllStandardError()
+ self.TB_Exe.append(QString.fromUtf8(a.data(),len(a)))
+
+ def readFromStdOut(self) :
+ a=self.monExe.readAllStandardOutput()
+ aa=QString.fromUtf8(a.data(),len(a))
+ self.TB_Exe.append(aa)
+ if "END_OF_MGCleaner" in aa:
+ self.parent().enregistreResultat()
+ self.enregistreResultatsDone=True
+ #self.theClose()
+
+ def theClose(self):
+ if not self.enregistreResultatsDone:
+ self.parent().enregistreResultat()
+ self.enregistreResultatsDone=True
+ self.close()
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MGCleanerPlugDialog</class>
+ <widget class="QWidget" name="MGCleanerPlugDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>800</width>
+ <height>500</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>MGCleaner : Remeshing tool</string>
+ </property>
+ <property name="sizeGripEnabled" stdset="0">
+ <bool>false</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_xx">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PB_OK">
+ <property name="text">
+ <string>Compute</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PB_Cancel">
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PB_SaveHyp">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PB_LoadHyp">
+ <property name="text">
+ <string>Load</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PB_Default">
+ <property name="text">
+ <string>Default</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PB_Help">
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Help</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_xx">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item row="1" column="0">
+ <widget class="QTabWidget" name="TWOptions">
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="simple">
+ <attribute name="title">
+ <string>Simple Remeshing Options</string>
+ </attribute>
+ <widget class="QGroupBox" name="GBOptim">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>140</y>
+ <width>750</width>
+ <height>270</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Options</string>
+ </property>
+
+ <layout class="QHBoxLayout" name="RBLayoutopt">
+
+ <item>
+ <spacer name="horizontalSpacer_xx">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+
+ <item>
+ <layout class="QVBoxLayout" name="RBLayout1">
+ <item>
+ <widget class="QRadioButton" name="RB_Check">
+ <property name="toolTip">
+ <string>Performs checks only (no fixing).
+Writes diagnostics into the output file.
+Default is to fix with two passes.</string>
+ </property>
+ <property name="text">
+ <string>Only checking</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB_Fix1">
+ <property name="toolTip">
+ <string>Analyses and fixes mesh with only the first stage of the cleaning procedure.
+Does not write diagnostics into the output file.
+Default is to fix with two passes.</string>
+ </property>
+ <property name="text">
+ <string>Fix problems with one pass</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB_Fix2">
+ <property name="toolTip">
+ <string>Analyses and fixes mesh with the two stage cleaning procedure.
+Does not write diagnostics into the output file.
+Default is to fix with two passes.</string>
+ </property>
+ <property name="text">
+ <string>Fix problems with two passes</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+
+ <item>
+ <widget class="QCheckBox" name="CB_PreserveTopology">
+ <property name="toolTip">
+ <string>Disables fixing operations which induce topology modifications.
+Default is enable topology modifications.
+(argument --topology)</string>
+ </property>
+ <property name="text">
+ <string>Preserve topology</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="CB_FillHoles">
+ <property name="toolTip">
+ <string>Default is not to fill holes.
+if set: see 'surface size threshold of holes' in 'Advanced remeshing options'.</string>
+ </property>
+ <property name="text">
+ <string>Fill holes</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+
+ <widget class="QCheckBox" name="CB_RemeshPlanes">
+ <property name="toolTip">
+ <string>Inserts vertices on planes to improve mesh quality .
+May be useful for poor quality triangulations (eg .STL or .DXF triangulations).
+Default is not to mesh planes.</string>
+ </property>
+ <property name="text">
+ <string>Remesh planes</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+
+ </layout>
+
+ </item>
+
+ </layout>
+
+ </widget>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>750</width>
+ <height>120</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="title">
+ <string>Original Mesh</string>
+ </property>
+ <widget class="QPushButton" name="PB_MeshFile">
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>70</y>
+ <width>190</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Mesh File GMF format</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLineEdit" name="LE_MeshFile">
+ <property name="geometry">
+ <rect>
+ <x>240</x>
+ <y>70</y>
+ <width>481</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="PB_MeshSmesh">
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>30</y>
+ <width>190</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Mesh Object Browser</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" name="LE_MeshSmesh">
+ <property name="geometry">
+ <rect>
+ <x>240</x>
+ <y>30</y>
+ <width>481</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_8">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>80</y>
+ <width>31</width>
+ <height>18</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>or</string>
+ </property>
+ </widget>
+ </widget>
+ <zorder>groupBox</zorder>
+ <zorder>GBOptim</zorder>
+ </widget>
+ <widget class="QWidget" name="advanced">
+ <attribute name="title">
+ <string>Advanced Remeshing Options</string>
+ </attribute>
+ <widget class="QGroupBox" name="groupBox_5">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>750</width>
+ <height>400</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>You can control</string>
+ </property>
+#1
+ <widget class="QLineEdit" name="SP_MinHoleSize">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>30</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="LA_minHoleSize">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>30</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>sets the surface size threshold below which holes are filled.
+Set 'Fill holes' in 'Simple Remeshing Options'.</string>
+ </property>
+ <property name="text">
+ <string>Surface size threshold of holes to fill (--min_hole_size)</string>
+ </property>
+ </widget>
+#2
+ <widget class="QLineEdit" name="SP_ToleranceDisplacement">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>70</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="LA_toleranceDisplacement">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>70</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>Sets the displacement threshold below which modification is allowed.
+Unused in collision resolution .
+'Tolerance displacement' is set to resolution_length if it is lower.</string>
+ </property>
+ <property name="text">
+ <string>Tolerance displacement threshold of points for modification
+(--tolerance_displacement)</string>
+ </property>
+ </widget>
+
+ <widget class="QCheckBox" name="CB_ComputedToleranceDisplacement">
+ <property name="geometry">
+ <rect>
+ <x>650</x>
+ <y>70</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>If set default value is computed from model.</string>
+ </property>
+ <property name="text">
+ <string>Computed</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+
+#3
+ <widget class="QLineEdit" name="SP_ResolutionLength">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>110</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="LA_resolutionLength">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>110</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>sets the distance threshold above which 2 points are considered distinct.
+Sets the tolerance displacement to 1/5 of this size.
+Default is computed from model.</string>
+ </property>
+ <property name="text">
+ <string>Distance threshold for two points distinct (--resolution_length)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="CB_ComputedResolutionLength">
+ <property name="geometry">
+ <rect>
+ <x>650</x>
+ <y>110</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>If set default value is computed from model.</string>
+ </property>
+ <property name="text">
+ <string>Computed</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+#4
+ <widget class="QDoubleSpinBox" name="SP_FoldingAngle">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>150</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <double>90</double>
+ </property>
+ <property name="minimum">
+ <double>0</double>
+ </property>
+ <property name="singleStep">
+ <double>1</double>
+ </property>
+ <property name="value">
+ <double>15</double>
+ </property>
+ </widget>
+ <widget class="QLabel" name="LA_foldingAngle">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>150</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>Sets the threshold angle below which 2 connected triangles are considered overlapping .
+Reduce this value if model contains sharp angles below this threshold that must be kept.
+Overlap_angle is set to this angle if it is higher.
+Default is 15 degrees.</string>
+ </property>
+ <property name="text">
+ <string>Angle threshold for two connected triangles overlapping (--folding_angle)</string>
+ </property>
+ </widget>
+#5
+ <widget class="QLineEdit" name="SP_OverlapDistance">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>190</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLabel" name="LA_overlapDistance">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>190</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>sets the distance below which 2 unconnected triangles are considered overlapping.
+Reduce this value if too many overlaps are detected.
+Default is computed from model.</string>
+ </property>
+ <property name="text">
+ <string>Distance threshold for two unconnected triangles overlapping
+(--overlap_distance)</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" name="CB_ComputedOverlapDistance">
+ <property name="geometry">
+ <rect>
+ <x>650</x>
+ <y>190</y>
+ <width>100</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>If set default value is computed from model.</string>
+ </property>
+ <property name="text">
+ <string>Computed</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+#6
+ <widget class="QDoubleSpinBox" name="SP_OverlapAngle">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>230</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <double>90</double>
+ </property>
+ <property name="minimum">
+ <double>0</double>
+ </property>
+ <property name="singleStep">
+ <double>1</double>
+ </property>
+ <property name="value">
+ <double>15</double>
+ </property>
+ </widget>
+ <widget class="QLabel" name="LA_overlapAngle">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>230</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>Sets the angle below which 2 unconnected triangles are considered overlapping.
+'Folding angle' is set to this angle if it is lower.
+Default is 15 degrees.</string>
+ </property>
+ <property name="text">
+ <string>Angle threshold for two unconnected triangles overlapping (--overlap_angle)</string>
+ </property>
+ </widget>
+ </widget>
+ </widget>
+ <widget class="QWidget" name="generic">
+ <attribute name="title">
+ <string>Generic Options</string>
+ </attribute>
+ <widget class="QGroupBox" name="groupBox_4">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>10</y>
+ <width>750</width>
+ <height>130</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>MGCleaner Generic Options</string>
+ </property>
+
+ <widget class="QSpinBox" name="SP_Verbosity">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>30</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <number>10</number>
+ </property>
+ <property name="value">
+ <number>3</number>
+ </property>
+ </widget>
+
+ <widget class="QLabel" name="label">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>30</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>sets the verbosity level.
+From 0 (no detail) to 10 (very detailed).
+Default is 3.</string>
+ </property>
+ <property name="text">
+ <string>Verbosity level</string>
+ </property>
+ </widget>
+
+
+ </widget>
+ <widget class="QGroupBox" name="groupBox_6">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>150</y>
+ <width>750</width>
+ <height>170</height>
+ </rect>
+ </property>
+ <property name="title">
+ <string>Plug-in Generic Options</string>
+ </property>
+ <widget class="QLabel" name="label_10">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>40</y>
+ <width>391</width>
+ <height>18</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>File used to save MGCleaner hypothesis parameters :</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="PB_ParamsFileExplorer">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>70</y>
+ <width>30</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ <widget class="QLineEdit" name="LE_ParamsFile">
+ <property name="geometry">
+ <rect>
+ <x>60</x>
+ <y>70</y>
+ <width>661</width>
+ <height>31</height>
+ </rect>
+ </property>
+ </widget>
+
+ <widget class="QPushButton" name="PB_Save">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>110</y>
+ <width>70</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+
+ <widget class="QPushButton" name="PB_Load">
+ <property name="geometry">
+ <rect>
+ <x>120</x>
+ <y>110</y>
+ <width>70</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Load</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+
+ </widget>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ViewExe</class>
+ <widget class="QDialog" name="ViewExe">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>469</width>
+ <height>489</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Run MGCleaner</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QTextBrowser" name="TB_Exe"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QPushButton" name="PB_Ok">
+ <property name="text">
+ <string>Ok</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="PB_Save">
+ <property name="text">
+ <string>Save</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
--- /dev/null
+# -*- coding: utf-8 -*-
+# Copyright (C) 2006-2013 EDF R&D
+#
+# 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
+#
+
+# if you already have plugins defined in a salome_plugins.py file, add this file at the end.
+# if not, copy this file as ${HOME}/Plugins/smesh_plugins.py or ${APPLI}/Plugins/smesh_plugins.py
+
+def MGCleanerLct(context):
+ # get context study, studyId, salomeGui
+ study = context.study
+ studyId = context.studyId
+ sg = context.sg
+
+ import os
+ import subprocess
+ import tempfile
+ from PyQt4 import QtCore
+ from PyQt4 import QtGui
+ from PyQt4.QtGui import QFileDialog
+ from PyQt4.QtGui import QMessageBox
+
+ #prior test to avoid unnecessary user GUI work with ending crash
+ try :
+ os.environ['DISTENE_LICENCE_FILE_FOR_MGCLEANER']
+ except:
+ QMessageBox.warning(None,"Products","Distene's product MeshGem Cleaner is not installed.\nrequired environment variable:\nDISTENE_LICENCE_FILE_FOR_MGCLEANER='/.../dlim8.var.sh'")
+ return
+ import MGCleanerMonPlugDialog
+ window=MGCleanerMonPlugDialog.getDialog()
+ window.show()
+
--- /dev/null
+# Copyright (C) 2007-2013 EDF R&D
+#
+# 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
+#
+
+SUBDIRS = doc
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+UIPY_FILES = MGCleanerPlugDialog.py MGCleanerViewText.py
+
+salomeplugins_PYTHON = \
+ MGCleanerMonPlugDialog.py\
+ MGCleanerMonViewText.py\
+ MGCleanerplug_plugin.py
+
+nodist_salomeplugins_PYTHON = $(UIPY_FILES)
+
+CLEANFILES = $(UIPY_FILES)
+
+EXTRA_DIST += $(UIPY_FILES:%.py=%.ui)
+
+%.py : %.ui
+ $(PYUIC) $< -o $@
--- /dev/null
+Advanced Remeshing Options
+==========================
+
+See tooltips comments for each parameter.
+See also :download:`MG-cleaner user manual <files/mg-cleaner_user_manual.pdf>`.
+
+.. image:: images/Advanced.png
+ :align: center
+
+
+
--- /dev/null
+Generic Options
+=================
+
+These options are not meshing options but allow the user to configure control parameters for MG-Cleaner.
+
+
+- **Verbosity Level**
+
+This parameter (between 0 and 10) indicates the amount of information that MG-Cleaner prints during the run.
+
+
+- **File**
+
+You can change the file used to store your favorite remeshing hypothesis. see paragraph :ref:`hypothesis-label` for further informations.
+
+.. image:: images/Generic.png
+ :align: center
+
--- /dev/null
+# Makefile for Sphinx documentation
+#
+
+include $(top_srcdir)/adm_local/unix/make_common_starter.am
+
+MGCleanerdocdir=$(docdir)/gui/SMESH/MGCleaner
+
+RSTFILES = lct.rst \
+ index.rst \
+ editHypo.rst \
+ Mandatory_params.rst \
+ Generics_params.rst \
+ Advanced_params.rst
+
+EXTRA_DIST += $(RSTFILES) images files
+
+# You can set these variables from the command line.
+SPHINXOPTS =
+SOURCEDIR = $(srcdir)
+SPHINXBUILD = sphinx-build
+PAPER =
+BUILDDIR = _build
+CONF_FILE_DIR = $(top_builddir)/src/Tools/MGCleanerPlug/doc
+
+# Internal variables.
+PAPEROPT_a4 = -D latex_paper_size=a4
+PAPEROPT_letter = -D latex_paper_size=letter
+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees -c $(CONF_FILE_DIR) $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) $(SOURCEDIR)
+
+.PHONY: help clean html latexpdf
+
+help:
+ @echo "Please use \`make <target>' where <target> is one of"
+ @echo " html to make standalone HTML files"
+ @echo " dirhtml to make HTML files named index.html in directories"
+ @echo " singlehtml to make a single large HTML file"
+ @echo " pickle to make pickle files"
+ @echo " json to make JSON files"
+ @echo " htmlhelp to make HTML files and a HTML help project"
+ @echo " qthelp to make HTML files and a qthelp project"
+ @echo " devhelp to make HTML files and a Devhelp project"
+ @echo " epub to make an epub"
+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
+ @echo " text to make text files"
+ @echo " man to make manual pages"
+ @echo " changes to make an overview of all changed/added/deprecated items"
+ @echo " linkcheck to check all external links for integrity"
+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
+
+install-data-local: $(BUILDDIR)/html/index.html
+ -test -z $(MGCleanerdocdir) || mkdir -p $(MGCleanerdocdir) && cp -rf $(BUILDDIR)/html/* $(MGCleanerdocdir) ;
+
+uninstall-local:
+ -test -d $(MGCleanerdocdir) && chmod -R +w $(MGCleanerdocdir) && rm -rf $(MGCleanerdocdir)/*
+
+clean-local:
+ -rm -rf $(BUILDDIR)/*
+
+$(BUILDDIR)/html/index.html:
+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
+ @echo
+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
+
+latexpdf:
+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
+ @echo "Running LaTeX files through pdflatex..."
+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
+
--- /dev/null
+Simple Remeshing Options
+=========================
+
+simple case
+-----------
+
+ All options, but the input mesh, have default values. however, **you have to specified these
+ simple options in order to drive MG-Cleaner and control remeshing parameters**.
+
+ You can access Distene documentation by clicking on Help button.
+
+
+.. image:: images/Simple.png
+ :align: center
+
+
+- **Original Mesh**
+
+ You have to select a Mesh Object from Salome Object Browser or choose a .GMF file.
+
+
+Options
+------------
+
+This is the main remeshing Option.
+
+
--- /dev/null
+# -*- coding: utf-8 -*-
+#
+# MGCleaner PlugIn documentation build configuration file, created by
+# sphinx-quickstart on April 2013.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# All configuration values have a default value; values that are commented out
+# serve to show the default value.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('some/directory'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['.templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General substitutions.
+project = 'MGCleaner Plug-in'
+copyright = '2013, CEA'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = '@VERSION@'
+# The full version, including alpha/beta/rc tags.
+release = '@VERSION@'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directories, that shouldn't be searched
+# for source files.
+#exclude_dirs = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (within the static path) to place at the top of
+# the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+#html_static_path = ['.static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_use_modindex = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'MGCleanerPlug-in doc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+ ('index', 'MGCleanerPlugIn.tex', 'MGCleaner PlugIn Documentation',
+ 'CEA', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
--- /dev/null
+.. _hypothesis-label:
+
+===========================
+How to save MG-Cleaner Parameters
+===========================
+
+MG-Cleaner hypothesis is not meshing hypothesis for Salome, but hypothesis for MG-Cleaner.
+The current set of parameters is automatically written in the salome study object browser when you run computation.
+
+Theses parameters could also be stored in a special file.
+Default file is $HOME/.MGCleaner.dat.
+This ASCII file is appended, and never cleaned.
+
+In frame "Plug-in Generic Options":
+
+- To save the current setting in this file, click on "Save" pushbutton.
+- To load the last set of parameters saved, click on "Load" pushbutton.
+
+At the bottom of the dialog window:
+
+- To save a current setting in the study object browser, click on "Save" pushbutton.
+- To load a current setting from the study object browser, click on "Load" pushbutton.
+- To load the default setting, click on "Default" pushbutton. .
+
+
+**example of .MGCleaner.dat**
+
+
+.. code-block:: python
+
+ # MGCleaner hypothesis parameters
+ # Params for mesh : Mesh_1
+ # Date : 21/05/13 10:44:05
+ # Command : mg-cleaner.exe --verbose 2 --in /tmp/ForMGCleaner_2.mesh --out /tmp/ForMGCleaner_2_fix.mesh --check --topology ignore --tolerance_displacement 0.0 --folding_angle 15.0 --overlap_angle 15.0
+ CheckOrFix=check
+ PreserveTopology=False
+ FillHoles=False
+ MinHoleSize=0.0
+ ComputedToleranceDisplacement=True
+ ToleranceDisplacement=0.0
+ ComputedResolutionLength=False
+ ResolutionLength=0.0
+ FoldingAngle=15.0
+ RemeshPlanes=False
+ ComputedOverlapDistance=True
+ OverlapDistance=0.0
+ OverlapAngle=15.0
+ Verbosity=2
+
+
--- /dev/null
+.. MeshGems-Cleaner documentation master file, created by sphinx-quickstart on Wed Sep 14 11:40:32 2011.
+ You can adapt this file completely to your liking, but it should at least
+ contain the root `toctree` directive.
+
+MeshGems-Cleaner plugin documentation
+=====================================
+
+This documentation covers the usage of MeshGems-Cleaner, also named MG-Cleaner or MGCleaner as plug-in in Salome that can be used within the Salome
+Mesh module for remeshing 2D Surface.
+
+MG-Cleaner plug-in uses Distene commercial software MeshGems-Cleaner, which is an **automatic surface remeshing tool**.
+This plug_in offers only the most common functionnalities of the tool.
+
+.. note::
+ for a complete documentation, see :download:`MG-cleaner user manual <files/mg-cleaner_user_manual.pdf>`.
+
+Contents:
+
+.. toctree::
+ :maxdepth: 2
+
+ lct.rst
+ Mandatory_params.rst
+ Advanced_params.rst
+ Generics_params.rst
+ editHypo.rst
+
+
+
+
--- /dev/null
+Running MGCleaner Plug-in
+=====================
+
+MGCleaner plug-in can be invoked via SMESH Plugin item in Mesh menu bar
+
+.. image:: images/AppelMGCleaner.png
+ :align: center
+
+
+This plug-in works only with the commercial software MeshGemsCleaner. To obtain a license,
+visit www.distene.comm
SUBDIRS = MeshCut padder
if SMESH_ENABLE_GUI
- SUBDIRS += YamsPlug
+ SUBDIRS += YamsPlug MGCleanerPlug
endif
salomeplugins_PYTHON = \
smesh_plugins.py
-DIST_SUBDIRS = MeshCut padder YamsPlug
+DIST_SUBDIRS = MeshCut padder YamsPlug MGCleanerPlug
<rect>
<x>0</x>
<y>0</y>
- <width>927</width>
- <height>700</height>
+ <width>800</width>
+ <height>500</height>
</rect>
</property>
<property name="windowTitle">
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_xx">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
<item>
<widget class="QPushButton" name="PB_OK">
<property name="text">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
- <property name="sizeType">
- <enum>QSizePolicy::Minimum</enum>
- </property>
<property name="sizeHint" stdset="0">
<size>
- <width>60</width>
+ <width>30</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
- <widget class="QPushButton" name="PB_Save">
+ <widget class="QPushButton" name="PB_SaveHyp">
<property name="text">
- <string>Save Params</string>
+ <string>Save</string>
</property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
</widget>
</item>
<item>
- <widget class="QPushButton" name="PB_Load">
+ <widget class="QPushButton" name="PB_LoadHyp">
<property name="text">
- <string>Load Params</string>
+ <string>Load</string>
</property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
</widget>
</item>
<item>
<widget class="QPushButton" name="PB_Default">
<property name="text">
- <string>Default Params</string>
+ <string>Default</string>
</property>
</widget>
</item>
</property>
<property name="sizeHint" stdset="0">
<size>
- <width>338</width>
- <height>25</height>
+ <width>30</width>
+ <height>20</height>
</size>
</property>
</spacer>
</property>
</widget>
</item>
+ <item>
+ <spacer name="horizontalSpacer_xx">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>10</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
</layout>
</item>
<item row="1" column="0">
<widget class="QGroupBox" name="GBOptim">
<property name="geometry">
<rect>
- <x>20</x>
- <y>190</y>
- <width>871</width>
- <height>311</height>
+ <x>10</x>
+ <y>140</y>
+ <width>750</width>
+ <height>270</height>
</rect>
</property>
<property name="title">
<string>Optimisation</string>
</property>
- <widget class="QGroupBox" name="mesRB">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>30</y>
- <width>611</width>
- <height>261</height>
- </rect>
- </property>
- <widget class="QRadioButton" name="RB_0">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>25</y>
- <width>585</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<table style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Quality improvement</span> is done by point smoothing and edge swapping</p></td></tr></table></body></html></string>
- </property>
- <property name="text">
- <string>Quality improvement Only (0)</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- <widget class="QRadioButton" name="RB_G">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>54</y>
- <width>585</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>the given surface triangulation is enriched (no coarsening at all) in such away that the distance
+
+ <layout class="QHBoxLayout" name="RBLayoutopt">
+
+ <item>
+ <spacer name="horizontalSpacer_xx">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Minimum</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+
+ <item>
+ <layout class="QVBoxLayout" name="monRBLayout">
+ <item>
+ <widget class="QRadioButton" name="RB_0">
+ <property name="toolTip">
+ <string>Quality improvement is done by point smoothing and edge swapping.</string>
+ </property>
+ <property name="text">
+ <string>Quality improvement Only (0)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB_G">
+ <property name="toolTip">
+ <string>The given surface triangulation is enriched (no coarsening at all) in such away that the distance
between the elements in the final mesh and those of the initial one is bounded by auser specified tolerance value.
One should use this option, to enrich the mesh where purely
geometrical features may be insuficiently fine, i.e. the resulting mesh will be least as fine as the input.
Mesh and the geometric features will be refined if needed as specified by the other program parameters.
The meshes obtained with those settings may not be suitable for computation.</string>
- </property>
- <property name="text">
- <string>Pure Geometry Enrichment (G)</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- <widget class="QRadioButton" name="RB_U">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>83</y>
- <width>585</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>a uniform subdivision of the given surface triangulation is performed :
+ </property>
+ <property name="text">
+ <string>Pure Geometry Enrichment (G)</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB_U">
+ <property name="toolTip">
+ <string>An uniform subdivision of the given surface triangulation is performed :
each triangle of the given surface triangulation is considered at and
is divided into identical triangles.</string>
- </property>
- <property name="text">
- <string>Uniform Subdivision(U)</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- <widget class="QRadioButton" name="RB_S">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>112</y>
- <width>585</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>a surface sandpapering without shrinkage of the given surface
+ </property>
+ <property name="text">
+ <string>Uniform Subdivision (U)</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB_S">
+ <property name="toolTip">
+ <string>A surface sandpapering without shrinkage of the given surface
triangulation is performed, i.e., the high curvature variations of the
given surface will be smoothed out without shrinking the volume in
doing so. If ridges are defined, they will be kept as they are in the
resulting mesh.
-This option modifies the goemetry.</string>
- </property>
- <property name="text">
- <string>Sand Papering (S)</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- <widget class="QRadioButton" name="RB__2">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>141</y>
- <width>585</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>The given surface triangulation is modified in such a way that the distance between
+This option modifies the geometry.</string>
+ </property>
+ <property name="text">
+ <string>Sandpapering (S)</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB__2">
+ <property name="toolTip">
+ <string>The given surface triangulation is modified in such a way that the distance between
the elements in the final mesh and those of the initial one is bounded by a user specfied tolerance value.
One should use this option, to coarsen when a purely geometrical mesh is needed. (a mesh that keeps
and obeys its geometric features only.) The meshes obtained with this option are usually not suitable
for computation because anisotropic elements may be generated</string>
- </property>
- <property name="text">
- <string>Geometrical Mesh : Coarsening(-2)</string>
- </property>
- </widget>
- <widget class="QRadioButton" name="RB_2">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>170</y>
- <width>585</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>The given surface triangulation is modified in such a way that the distance between
+ </property>
+ <property name="text">
+ <string>Geometrical Mesh : Coarsening (-2)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB_2">
+ <property name="toolTip">
+ <string>The given surface triangulation is modified in such a way that the distance between
the elements in the final mesh and those of the initial one is bounded by a user specfied tolerance value.
One should use this option, to coarsen and enrich when a purely geometrical mesh is needed. (a mesh that keeps
and obeys its geometric features only.) The meshes obtained with this setting are usually not suitable
for computation because anisotropic elements may be generated</string>
- </property>
- <property name="text">
- <string>Geometrical Mesh : Coarsening and Enrichment (2)</string>
- </property>
- </widget>
- <widget class="QRadioButton" name="RB__1">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>199</y>
- <width>585</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>The given surface triangulation is modfied in accordance to a size map.
+ </property>
+ <property name="text">
+ <string>Geometrical Mesh : Coarsening and Enrichment (2)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB__1">
+ <property name="toolTip">
+ <string>The given surface triangulation is modified in accordance to a size map.
The latter can be either the intrinsic size map (computed automatically
and based on the surface properties, i.e. the local curvatures),
or on a given size map (which is then combined to the intrinsic size map).
One should use this option to coarsen the mesh, when a regular mesh
for computation purposes is desired, i.e. a mesh with good aspect ratios or
good quality elements.</string>
- </property>
- <property name="text">
- <string>Mesh for finite element computation : Coarsening (-1)</string>
- </property>
- </widget>
- <widget class="QRadioButton" name="RB_1">
- <property name="geometry">
- <rect>
- <x>17</x>
- <y>228</y>
- <width>585</width>
- <height>22</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>The given surface triangulation is modfied in accordance to a size map.
+ </property>
+ <property name="text">
+ <string>Mesh for finite element computation : Coarsening (-1)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="RB_1">
+ <property name="toolTip">
+ <string>The given surface triangulation is modified in accordance to a size map.
The latter can be either the intrinsic size map (computed automatically
and based on the surface properties, i.e. the local curvatures),
or on a given size map (which is then combined to the intrinsic size map).
-One should use this option to coarsen and enrich the mesh, when a regular mesh
+One should use this option to coarse and enrich the mesh, when a regular mesh
for computation purposes is desired, i.e. a mesh with good aspect ratios or
good quality elements</string>
- </property>
- <property name="text">
- <string>Mesh for finite element computation : Coarsening and Enrichment (1)</string>
- </property>
- </widget>
- </widget>
+ </property>
+ <property name="text">
+ <string>Mesh for finite element computation : Coarsening and Enrichment (1)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+
</widget>
- <widget class="QGroupBox" name="groupBox">
+ <widget class="QGroupBox" name="GBUnit">
<property name="geometry">
<rect>
<x>10</x>
- <y>20</y>
- <width>871</width>
- <height>161</height>
+ <y>420</y>
+ <width>750</width>
+ <height>70</height>
</rect>
</property>
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
+ <property name="toolTip">
+ <string>This parameter enables the user to bound the maximal chordal deviation allowed,
+that is the maximal distance allowed between the detected curve and the plane P
+of the corresponding mesh face.
+In other words, it avoids having faces too far away from the curve they should represent.</string>
</property>
<property name="title">
- <string>Original Mesh</string>
+ <string>Chordal deviation Tolerance</string>
</property>
- <widget class="QWidget" name="layoutWidget">
+ <widget class="QLineEdit" name="SP_Tolerance">
<property name="geometry">
<rect>
- <x>10</x>
+ <x>40</x>
<y>30</y>
- <width>861</width>
- <height>101</height>
+ <width>110</width>
+ <height>24</height>
</rect>
</property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="0" column="1">
- <widget class="QLabel" name="label_7">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- <strikeout>false</strikeout>
- </font>
- </property>
- <property name="frameShape">
- <enum>QFrame::Box</enum>
- </property>
- <property name="text">
- <string>Smesh mesh</string>
- </property>
- <property name="wordWrap">
- <bool>false</bool>
- </property>
- <property name="margin">
- <number>0</number>
- </property>
- </widget>
- </item>
- <item row="0" column="2">
- <widget class="QPushButton" name="PB_MeshSmesh">
- <property name="text">
- <string/>
- </property>
- <property name="icon">
- <iconset>
- <normaloff>../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png</normaloff>../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png</iconset>
- </property>
- <property name="iconSize">
- <size>
- <width>18</width>
- <height>18</height>
- </size>
- </property>
- <property name="checkable">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="3">
- <widget class="QLineEdit" name="LE_MeshSmesh">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_8">
- <property name="text">
- <string>or</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1" colspan="2">
- <widget class="QPushButton" name="PB_MeshFile">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- <property name="text">
- <string>Mesh File (GMF format)</string>
- </property>
- </widget>
- </item>
- <item row="1" column="3">
- <widget class="QLineEdit" name="LE_MeshFile">
- <property name="font">
- <font>
- <pointsize>10</pointsize>
- </font>
- </property>
- </widget>
- </item>
- </layout>
+ <property name="toolTip">
+ <string>If the Units parameter is relative, epsilon max correspond to (per thousand) s*Tolerance/1000, where s is the size of the bounding box of the domain.
+If the Units parameter is absolute, the tolerance parameter is expressed in model units:
+ if P=2 and point coordinates are given in millimeters, the maximal chordal deviation is 2 mm.</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" name="RB_Absolute">
+ <property name="geometry">
+ <rect>
+ <x>220</x>
+ <y>30</y>
+ <width>120</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>Values are expressed in the model units.</string>
+ </property>
+ <property name="text">
+ <string>Absolute units</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QRadioButton" name="RB_Relative">
+ <property name="geometry">
+ <rect>
+ <x>350</x>
+ <y>30</y>
+ <width>120</width>
+ <height>24</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>Values are relative (per thousand) to the bounding box size.</string>
+ </property>
+ <property name="text">
+ <string>Relative units</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
</widget>
</widget>
- <widget class="QDoubleSpinBox" name="SP_Tolerance">
+ <widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
- <x>430</x>
- <y>540</y>
- <width>81</width>
- <height>31</height>
+ <x>10</x>
+ <y>10</y>
+ <width>750</width>
+ <height>120</height>
</rect>
</property>
<property name="font">
<font>
- <stylestrategy>PreferDefault</stylestrategy>
+ <pointsize>10</pointsize>
</font>
</property>
- <property name="mouseTracking">
- <bool>true</bool>
- </property>
- <property name="toolTip">
- <string><html><head/><body><p>If the Units parameter is relative, epsilon max corresponds to 0.001x s x tolerance parameter where s is the size of the bounding box of the domain.</p><p>If the Units parameter (P) is absolute, the tolerance parameter is expressed in model units :</p><p>if P=2 and point coordinates are given in millimetre, it means that the maximal chordal deviation is 2 mm </p></body></html></string>
- </property>
- <property name="decimals">
- <number>0</number>
- </property>
- <property name="minimum">
- <double>1.000000000000000</double>
- </property>
- <property name="maximum">
- <double>1000.000000000000000</double>
- </property>
- <property name="singleStep">
- <double>1.000000000000000</double>
- </property>
- <property name="value">
- <double>10.000000000000000</double>
- </property>
- </widget>
- <widget class="QWidget" name="layoutWidget">
- <property name="geometry">
- <rect>
- <x>30</x>
- <y>500</y>
- <width>801</width>
- <height>37</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_2">
- <item>
- <widget class="QGroupBox" name="GBUnit">
- <property name="toolTip">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html></string>
- </property>
- <property name="title">
- <string>Units </string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QGroupBox" name="GBTolerance_2">
- <property name="toolTip">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Set chordal deviation tolerance:</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">This parameter enables the user to bound the maximal chordal deviation allowed,</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">that is, the maximal distance allowed between the detected curve and the plane P</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">of the corresponding mesh face.</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">In other words, it avoids having faces too far away from the curve </p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">they represent (or should represent).</p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"></p></td></tr></table></body></html></string>
- </property>
- <property name="title">
- <string>Chordal deviation Tolerance</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="layoutWidget">
- <property name="geometry">
- <rect>
- <x>60</x>
- <y>540</y>
- <width>230</width>
- <height>31</height>
- </rect>
- </property>
- <layout class="QHBoxLayout" name="horizontalLayout_5">
- <item>
- <widget class="QRadioButton" name="RB_Absolute">
- <property name="toolTip">
- <string>Values are expressed in the model units.</string>
- </property>
- <property name="text">
- <string>Absolute</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QRadioButton" name="RB_Relative">
- <property name="toolTip">
- <string>Values are relative to the bounding box size.</string>
- </property>
- <property name="text">
- <string>Relative</string>
- </property>
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- <widget class="QLabel" name="label_11">
- <property name="geometry">
- <rect>
- <x>520</x>
- <y>540</y>
- <width>301</width>
- <height>51</height>
- </rect>
- </property>
- <property name="text">
- <string><html><head/><body><p><span style=" font-size:8pt;">0/00 if relative</span></p><p><span style=" font-size:8pt;">Mesh unit if absolute</span></p></body></html></string>
+ <property name="title">
+ <string>Original Mesh</string>
</property>
+ <widget class="QPushButton" name="PB_MeshFile">
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>70</y>
+ <width>190</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ <property name="text">
+ <string>Mesh File GMF format</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+ <widget class="QLineEdit" name="LE_MeshFile">
+ <property name="geometry">
+ <rect>
+ <x>240</x>
+ <y>70</y>
+ <width>481</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ </widget>
+ <widget class="QPushButton" name="PB_MeshSmesh">
+ <property name="geometry">
+ <rect>
+ <x>40</x>
+ <y>30</y>
+ <width>190</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Mesh Object Browser</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ <property name="checkable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QLineEdit" name="LE_MeshSmesh">
+ <property name="geometry">
+ <rect>
+ <x>240</x>
+ <y>30</y>
+ <width>481</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="font">
+ <font>
+ <pointsize>10</pointsize>
+ </font>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_8">
+ <property name="geometry">
+ <rect>
+ <x>10</x>
+ <y>80</y>
+ <width>31</width>
+ <height>18</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>or</string>
+ </property>
+ </widget>
</widget>
- <zorder>layoutWidget</zorder>
- <zorder>layoutWidget</zorder>
<zorder>groupBox</zorder>
<zorder>GBOptim</zorder>
- <zorder>SP_Tolerance</zorder>
- <zorder>label_11</zorder>
</widget>
<widget class="QWidget" name="advanced">
<attribute name="title">
- <string>Advanced Remeshing Options</string>
+ <string>Advanced Remeshing Options</string>
</attribute>
- <widget class="QGroupBox" name="groupBox_2">
+ <widget class="QGroupBox" name="groupBox_5">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
- <width>761</width>
- <height>71</height>
+ <width>750</width>
+ <height>120</height>
</rect>
</property>
<property name="title">
- <string>You can disable :</string>
+ <string>You can set/unset</string>
</property>
<widget class="QCheckBox" name="CB_Ridge">
<property name="geometry">
<rect>
- <x>100</x>
+ <x>30</x>
<y>20</y>
<width>271</width>
- <height>23</height>
+ <height>25</height>
</rect>
</property>
<property name="toolTip">
- <string>if not set (ridge detection disabled), Yams will not try to detect any new ridge edge by its own mechanism :
+ <string>If not set (ridge detection disabled), Yams will not try to detect any new ridge edge by its own mechanism :
it will consider as ridge only the ridges given in the mesh.
-All non-ridge edges that would have been detected as ridge by the Ridge angle paramaeter
+All non-ridge edges that would have been detected as ridge by the ridge angle parameter
(see below) will be considered as part of the same continuous patch.
This option should not be checked when all the known ridges of the mesh are given and
when all other possible ridges are not geometric ridges to take into account.</string>
<widget class="QCheckBox" name="CB_Point">
<property name="geometry">
<rect>
- <x>100</x>
- <y>40</y>
+ <x>30</x>
+ <y>50</y>
<width>271</width>
- <height>23</height>
+ <height>25</height>
</rect>
</property>
<property name="toolTip">
<bool>true</bool>
</property>
</widget>
+
+ <widget class="QCheckBox" name="CB_SplitEdge">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>80</y>
+ <width>271</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>If set, Yams creates new vertices placed on the curved surface and adds them to elements.
+It means one extra vertex on edge (P2 or quadratic triangles).
+New created vertices are saved in the .mesh file under keyword section 'Vertices'</string>
+ </property>
+ <property name="text">
+ <string>split edge</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+
+
</widget>
<widget class="QGroupBox" name="groupBox_5">
<property name="geometry">
<rect>
<x>10</x>
- <y>90</y>
- <width>841</width>
- <height>391</height>
+ <y>140</y>
+ <width>750</width>
+ <height>270</height>
</rect>
</property>
<property name="title">
- <string>You can control </string>
+ <string>You can control</string>
</property>
+##1
<widget class="QDoubleSpinBox" name="SP_Geomapp">
<property name="geometry">
<rect>
- <x>10</x>
+ <x>30</x>
<y>30</y>
- <width>91</width>
- <height>23</height>
+ <width>100</width>
+ <height>25</height>
</rect>
</property>
<property name="maximum">
- <double>0.890000000000000</double>
+ <double>0.89</double>
</property>
<property name="singleStep">
- <double>0.010000000000000</double>
+ <double>0.01</double>
</property>
<property name="value">
- <double>0.040000000000000</double>
+ <double>0.04</double>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
- <x>120</x>
- <y>20</y>
- <width>731</width>
- <height>61</height>
+ <x>140</x>
+ <y>30</y>
+ <width>630</width>
+ <height>30</height>
</rect>
</property>
<property name="toolTip">
<string>This field (as well as tolerance) enables the user to control the accuracy of the
piecewise linear approximation of the surface. This parameter enables the user to
-control the maximal angle allowed between two adjacent faces. It can be used to
+control the maximal angle allowed between two adjacent faces. It can be used to
bound the maximal deviation of the mesh faces from the tangent planes at mesh vertices.
In other words, it avoids having sharp angles between faces representing a smooth curve.
This parameter enables the user to specify the maximal chordal deviation "max relatively to the curvature.
Following that criterion:
-- if the chordal deviation epsilon is smaller than epsilon max *r, it is acceptable to remove the considered point;
+- if the chordal deviation epsilon is smaller than epsilon max*r, it is acceptable to remove the considered point;
- if the chordal deviation epsilon is greater than epsiolon max*r, the considered mesh face should be redefined
-by adding a point on the curve.
+ by adding a point on the curve.
One can see that the smaller the radius r, the harder it is to satisfy this criterion:
epsilon max is a real value corresponding to a percentage, the ratio between the chordal deviation to
the local curvature. This field is used only for optimisation style -O values of -1, 0 and 1.
The default value for "max is set to 0:04 which leads to angles of less than 33 degrees between two adjacent
-faces .</string>
+faces.</string>
</property>
<property name="text">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Geometrical approximation : Maximum angle (1-cos(angle)) allowed </span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">between a face and a curve </span><span style=" font-family:'Sans Serif'; font-size:8pt;">(not separated by a ridge).</span><span style=" font-family:'Sans Serif';">)</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';"><br /></p></td></tr></table></body></html></string>
+ <string>Geometrical approximation:
+Maximum angle allowed between a face and a curve (not separated by a ridge).</string>
+ </property>
+ </widget>
+##2
+ <widget class="QDoubleSpinBox" name="SP_Ridge">
+ <property name="geometry">
+ <rect>
+ <x>30</x>
+ <y>70</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <double>90.</double>
+ </property>
+ <property name="value">
+ <double>45.</double>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
- <x>120</x>
- <y>80</y>
- <width>691</width>
- <height>71</height>
+ <x>140</x>
+ <y>70</y>
+ <width>630</width>
+ <height>30</height>
</rect>
</property>
<property name="text">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">Ridge angle:</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">if the angle between the normal vectors of two adjacent faces</span></p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans Serif';">exceeds this value, the edge common to the faces is a ridge</span></p>
-<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif';"><br /></p></td></tr></table></body></html></string>
+ <string>If the angle between the normal vectors of two adjacent faces exceeds this value,
+the edge common to the faces is a ridge.</string>
</property>
</widget>
- <widget class="QDoubleSpinBox" name="SP_Ridge">
+##3
+ <widget class="QDoubleSpinBox" name="SP_MaxSize">
<property name="geometry">
<rect>
- <x>10</x>
- <y>100</y>
- <width>91</width>
- <height>23</height>
+ <x>30</x>
+ <y>110</y>
+ <width>100</width>
+ <height>25</height>
</rect>
</property>
+ <property name="minimum">
+ <double>0.01</double>
+ </property>
<property name="maximum">
- <double>90.000000000000000</double>
+ <double>100.</double>
+ </property>
+ <property name="singleStep">
+ <double>0.1</double>
</property>
<property name="value">
- <double>45.000000000000000</double>
+ <double>100.</double>
</property>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
- <x>120</x>
- <y>160</y>
- <width>681</width>
- <height>61</height>
+ <x>140</x>
+ <y>110</y>
+ <width>630</width>
+ <height>30</height>
</rect>
</property>
<property name="toolTip">
- <string>This parameter allows the user to prescribe a maximal size hmax
+ <string>This parameter allows the user to prescribe a maximal size hmax
for the mesh elements i.e., the lengths of the edges with respect to the specified
size map. The corresponding values are either relative or absolute depending on the choosen parameter.
The default values are automatically set based on the surface geometry (curvature dependent) and its
size may be slightly bigger than the prescribed ones.</string>
</property>
<property name="text">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Maximal size allowed around vertices:</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the lengths of the edges with respect to the specified size map.</p></td></tr></table></body></html></string>
- </property>
- </widget>
- <widget class="QLabel" name="label_3">
- <property name="geometry">
- <rect>
- <x>120</x>
- <y>290</y>
- <width>691</width>
- <height>91</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>This parameter enables the user to control the element size variation in the triangulation.
-Yams will avoid getting two adjacent edges which sizes differ by a factor bigger than this parameter.
-To avoid rapid size variations, a size correction procedure is applied to the size map.
-In other words: if two adjacent edges are respectively e1 and e2 long
-if e2 > parameter * e1 then e02 the new size for the second edge will be set to parameter* e1.
-This procedure is de-activated if yams computes a mesh for finite element with only coarsening.
-The default value is 1.3, which is the usual value set for computational meshes.</string>
- </property>
- <property name="text">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Mesh Gradation ie the element size variation in the triangulation:</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Yams will avoid having two adjacent edges which sizes </p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">vary more than the given gradation.</p></td></tr></table></body></html></string>
- </property>
- </widget>
- <widget class="QDoubleSpinBox" name="SP_Gradation">
- <property name="geometry">
- <rect>
- <x>10</x>
- <y>300</y>
- <width>91</width>
- <height>23</height>
- </rect>
- </property>
- <property name="singleStep">
- <double>0.010000000000000</double>
- </property>
- <property name="value">
- <double>1.300000000000000</double>
+ <string>Maximal size allowed around vertices,
+the lengths of the edges with respect to the specified size map.</string>
</property>
</widget>
- <widget class="QDoubleSpinBox" name="SP_MaxSize">
+##4
+ <widget class="QDoubleSpinBox" name="SP_MinSize">
<property name="geometry">
<rect>
- <x>10</x>
- <y>170</y>
- <width>91</width>
- <height>23</height>
+ <x>30</x>
+ <y>150</y>
+ <width>100</width>
+ <height>25</height>
</rect>
</property>
<property name="minimum">
- <double>0.010000000000000</double>
+ <double>0.</double>
</property>
<property name="maximum">
- <double>100.000000000000000</double>
+ <double>100.</double>
</property>
<property name="singleStep">
- <double>0.100000000000000</double>
+ <double>0.1</double>
</property>
<property name="value">
- <double>100.000000000000000</double>
+ <double>5.</double>
</property>
</widget>
<widget class="QLabel" name="label_9">
<property name="geometry">
<rect>
- <x>120</x>
- <y>230</y>
- <width>661</width>
- <height>51</height>
+ <x>140</x>
+ <y>150</y>
+ <width>630</width>
+ <height>30</height>
</rect>
</property>
<property name="toolTip">
- <string>This parameter allows the user to prescribe a maximal size hmax
+ <string>This parameter allows the user to prescribe a maximal size hmax
for the mesh elements i.e., the lengths of the edges with respect to the specified
size map. The corresponding values are either relative or absolute depending on the choosen parameter.
The default values are automatically set based on the surface geometry (curvature dependent) and its
size may be slightly bigger than the prescribed ones.</string>
</property>
<property name="text">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Minimal size allowed around vertices:</p>
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">the lengths of the edges with respect to the specified size map.</p></td></tr></table></body></html></string>
+ <string>Minimal size allowed around vertices,
+the lengths of the edges with respect to the specified size map.</string>
</property>
</widget>
- <widget class="QDoubleSpinBox" name="SP_MinSize">
+##5
+ <widget class="QDoubleSpinBox" name="SP_Gradation">
<property name="geometry">
<rect>
- <x>10</x>
- <y>230</y>
- <width>91</width>
- <height>23</height>
+ <x>30</x>
+ <y>190</y>
+ <width>100</width>
+ <height>25</height>
</rect>
</property>
- <property name="minimum">
- <double>0.000000000000000</double>
- </property>
- <property name="maximum">
- <double>100.000000000000000</double>
- </property>
<property name="singleStep">
- <double>0.100000000000000</double>
+ <double>0.01</double>
</property>
<property name="value">
- <double>5.000000000000000</double>
+ <double>1.3</double>
+ </property>
+ </widget>
+ <widget class="QLabel" name="label_3">
+ <property name="geometry">
+ <rect>
+ <x>140</x>
+ <y>190</y>
+ <width>630</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="toolTip">
+ <string>This parameter enables the user to control the element size variation in the triangulation.
+Yams will avoid getting two adjacent edges which sizes differ by a factor bigger than this parameter.
+To avoid rapid size variations, a size correction procedure is applied to the size map.
+In other words: if two adjacent edges are respectively e1 and e2 long
+if e2 > parameter * e1 then e02 the new size for the second edge will be set to parameter* e1.
+This procedure is de-activated if yams computes a mesh for finite element with only coarsening.
+The default value is 1.3, which is the usual value set for computational meshes.</string>
+ </property>
+ <property name="text">
+ <string>Mesh Gradation: the element size variation in the triangulation.
+Yams will avoid having two adjacent edges which sizes vary more than the given gradation.</string>
</property>
</widget>
- </widget>
- <widget class="QGroupBox" name="groupBox_3">
- <property name="geometry">
- <rect>
- <x>20</x>
- <y>490</y>
- <width>751</width>
- <height>31</height>
- </rect>
- </property>
- <property name="title">
- <string>You can enable :</string>
- </property>
- </widget>
- <widget class="QCheckBox" name="CB_SplitEdge">
- <property name="geometry">
- <rect>
- <x>70</x>
- <y>530</y>
- <width>271</width>
- <height>23</height>
- </rect>
- </property>
- <property name="toolTip">
- <string>if set, Yams creates new vertices placed on the curved surface and adds them to elements.
-It means one extra vertex on edge (P2 or quadratic triangles).
-New created vertices are saved in the .mesh file under keyword section Vertices</string>
- </property>
- <property name="text">
- <string>split edge</string>
- </property>
- <property name="checked">
- <bool>false</bool>
- </property>
</widget>
</widget>
<widget class="QWidget" name="generic">
<property name="geometry">
<rect>
<x>10</x>
- <y>30</y>
- <width>741</width>
- <height>131</height>
+ <y>10</y>
+ <width>750</width>
+ <height>130</height>
</rect>
</property>
<property name="title">
<string>Yams Generic Options</string>
</property>
- <widget class="QWidget" name="layoutWidget">
+
+ <widget class="QSpinBox" name="SP_Verbosity">
<property name="geometry">
<rect>
- <x>40</x>
+ <x>20</x>
<y>30</y>
- <width>441</width>
- <height>34</height>
+ <width>100</width>
+ <height>25</height>
</rect>
</property>
- <layout class="QHBoxLayout" name="horizontalLayout_3">
- <item>
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Verbosity Level</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_2">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>28</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QSpinBox" name="SP_Verbosity">
<property name="maximum">
<number>10</number>
</property>
<property name="value">
- <number>7</number>
+ <number>3</number>
</property>
</widget>
- </item>
- </layout>
- </widget>
- <widget class="QWidget" name="layoutWidget_2">
+
+ <widget class="QLabel" name="label">
<property name="geometry">
<rect>
- <x>40</x>
- <y>70</y>
- <width>441</width>
- <height>34</height>
+ <x>130</x>
+ <y>30</y>
+ <width>600</width>
+ <height>30</height>
</rect>
</property>
- <layout class="QHBoxLayout" name="horizontalLayout_4">
- <item>
- <widget class="QLabel" name="label_6">
- <property name="minimumSize">
- <size>
- <width>225</width>
- <height>25</height>
- </size>
- </property>
+ <property name="toolTip">
+ <string>sets the verbosity level.
+From 0 (no detail) to 10 (very detailed).
+Default is 3.</string>
+ </property>
<property name="text">
- <string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
-<html><head><meta name="qrichtext" content="1" /><style type="text/css">
-p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'Sans Serif'; font-size:10pt; font-weight:400; font-style:normal;">
-<table border="0" style="-qt-table-type: root; margin-top:4px; margin-bottom:4px; margin-left:4px; margin-right:4px;">
-<tr>
-<td style="border: none;">
-<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Memory size (in Mbytes)</p></td></tr></table></body></html></string>
+ <string>Verbosity level</string>
</property>
</widget>
- </item>
- <item>
- <spacer name="horizontalSpacer_3">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
+
+ <widget class="QSpinBox" name="SP_Memory">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>70</y>
+ <width>100</width>
+ <height>25</height>
+ </rect>
+ </property>
+ <property name="maximum">
+ <number>100000</number>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>28</width>
- <height>20</height>
- </size>
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+
+ <widget class="QLabel" name="label_6">
+ <property name="geometry">
+ <rect>
+ <x>130</x>
+ <y>70</y>
+ <width>600</width>
+ <height>30</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Memory size (in Mbytes)</string>
</property>
- </spacer>
- </item>
- <item>
- <widget class="QSpinBox" name="SP_Memory">
<property name="toolTip">
<string>The program requires roughly about 370 bytes per point. It is thus possible to estimate a priori
the required memory size to complete a job. As an example of memory space needed, a mesh
memory allowed, it will stop inserting points and, if possible, the current mesh will be saved as it is,
valid and conformal, provided the input mesh was valid and conformal.
Specify the memory if:
-- the automatically allocated memory reveals insufficient when the user asked to enrich the given mesh;
+- the automatically allocated memory reveals insufficient when the user asked to enrich the given mesh.
- you want to limit the amount of memory used by the program.
If the input mesh size requires more memory than requested or if the allocated memory (user defined or not)
exceeds the machine capabilities, the tool will stop because of insufficient memory.</string>
</property>
- <property name="maximum">
- <number>100000</number>
- </property>
- <property name="value">
- <number>0</number>
- </property>
</widget>
- </item>
- </layout>
- </widget>
+
</widget>
<widget class="QGroupBox" name="groupBox_6">
<property name="geometry">
<rect>
<x>10</x>
- <y>230</y>
- <width>741</width>
- <height>141</height>
+ <y>150</y>
+ <width>750</width>
+ <height>170</height>
</rect>
</property>
<property name="title">
- <string>Plug-In Generic Options</string>
+ <string>Plug-in Generic Options</string>
</property>
<widget class="QLabel" name="label_10">
<property name="geometry">
</rect>
</property>
<property name="text">
- <string>File used to save Yams Params :</string>
+ <string>File used to save Yams hypothesis parameters :</string>
</property>
</widget>
<widget class="QPushButton" name="PB_ParamsFileExplorer">
<property name="text">
<string/>
</property>
- <property name="icon">
- <iconset>
- <normaloff>../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png</normaloff>../../../../../../../../SalomeSrc/SMESH_V6_main/src/Tools/YamsPlug/open.png</iconset>
- </property>
</widget>
<widget class="QLineEdit" name="LE_ParamsFile">
<property name="geometry">
</rect>
</property>
</widget>
+
+ <widget class="QPushButton" name="PB_Save">
+ <property name="geometry">
+ <rect>
+ <x>20</x>
+ <y>110</y>
+ <width>70</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Save</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+
+ <widget class="QPushButton" name="PB_Load">
+ <property name="geometry">
+ <rect>
+ <x>120</x>
+ <y>110</y>
+ <width>70</width>
+ <height>31</height>
+ </rect>
+ </property>
+ <property name="text">
+ <string>Load</string>
+ </property>
+ <property name="iconSize">
+ <size>
+ <width>18</width>
+ <height>18</height>
+ </size>
+ </property>
+ </widget>
+
</widget>
</widget>
</widget>
- **File**
-You can change the file used to store the remeshing hypothesis. see paragraph :ref:`hypothesis-label` for further informations.
+You can change the file used to store remeshing hypotheses. see paragraph :ref:`hypothesis-label` for further informations.
.. image:: images/Generic.png
:align: center
Generics_params.rst \
Advanced_params.rst
-EXTRA_DIST += $(RSTFILES) images
+EXTRA_DIST += $(RSTFILES) images files
# You can set these variables from the command line.
SPHINXOPTS =
- **Mesh for finite element computation : Coarsening**
- The given surface triangulation is modfied in accordance to a size map. The latter is the intrinsic size map (computed automatically and based on the surface properties, i.e. the local curvatures). One should use this option to coarsen the mesh, when a regular mesh for computation purposes is desired, i.e. a mesh with good aspect ratios or good quality elements.
+ The given surface triangulation is modified in accordance to a size map. The latter is the intrinsic size map (computed automatically and based on the surface properties, i.e. the local curvatures). One should use this option to coarsen the mesh, when a regular mesh for computation purposes is desired, i.e. a mesh with good aspect ratios or good quality elements.
It is equivalent to Yams's batch option -1.
How to save Yams Parameters
===========================
-As Yams hypothesis are not meshing hypothesis for Salome (but hypothesis for yams), parameters
-are stored in a special file. Default file is $HOME/.yams.dat. It is strongly recommended that you
-change this name if you want to preserve the way you obtain a mesh : This file is never cleaned.
-All sets of parameters are logged in it.
+Yams hypothesis is not meshing hypothesis for Salome, but hypothesis for yams.
+The current set of parameters is automatically written in the salome study object browser when you run computation.
+Theses parameters could also be stored in a special file.
+Default file is $HOME/.yams.dat.
+This ASCII file is appended, and never cleaned.
-- To save the current setting, click on "Save Params" pushbutton.
-- A set of parameters is automatically written in the .yams.dat file when you run computation.
-- Restoring the default settings can be done by pushing "Default Params".
-- "Loading Params" will reload the last set of parameters
+In frame "Plug-in Generic Options":
+- To save the current setting in this file, click on "Save" pushbutton.
+- To load the last set of parameters saved, click on "Load" pushbutton.
+
+At the bottom of the dialog window:
+
+- To save a current setting in the study object browser, click on "Save" pushbutton.
+- To load a current setting from the study object browser, click on "Load" pushbutton.
+- To load the default setting, click on "Default" pushbutton. .
**example of .yams.dat**
.. code-block:: python
- # Save intermediate params
- # Params for mesh :
- Optimisation ='Quality improvement Only (0)'
- Units ='Relative'
- Chordal_Tolerance_Deviation=1.0
- Ridge_Detection=True
- Split_Edge=False
- Point_Smoothing=True
- Geometrical_Approximation=0.04
- Ridge_Angle=45.0
- Maximum_Size=-2.0
- Minimum_Size=-2.0
- Mesh_Gradation=1.3
- Verbosity=3
- Memory=0
-
-
-
- # Params for Hypothese : monHypo_Yams_0
+ # YAMS hypothesis parameters
# Params for mesh : Mesh_1
- Optimisation ='Quality improvement Only (0)'
- Units ='Relative'
- Chordal_Tolerance_Deviation=1.0
- Ridge_Detection=True
- Split_Edge=False
- Point_Smoothing=True
- Geometrical_Approximation=0.04
- Ridge_Angle=45.0
- Maximum_Size=-2.0
- Minimum_Size=-2.0
- Mesh_Gradation=1.3
+ # Date : 23/05/13 14:23:18
+ # Command : yams -v 3 -O 0 -Drelative,tolerance=0.100000,maxsize=0.010000,minsize=0.000000 /tmp/ForYams_1.mesh
+ Optimisation=Quality improvement Only (0)
+ Units=Relative
+ ChordalToleranceDeviation=0.1
+ RidgeDetection=True
+ SplitEdge=False
+ PointSmoothing=True
+ GeometricalApproximation=0.04
+ RidgeAngle=45.0
+ MaximumSize=0.01
+ MinimumSize=0.0
+ MeshGradation=1.3
Verbosity=3
Memory=0
+
+
Yams plug-in uses Distene commercial software Yams, which is an **automatic surface remeshing tool**.
This plug_in offers only the most common functionnalities of the tool.
+.. note::
+ for a complete documentation, see :download:`Yams whitepaper <files/YamsWhitePaper_3.2.pdf>`.
Contents:
lct.rst
Mandatory_params.rst
- Generics_params.rst
Advanced_params.rst
+ Generics_params.rst
editHypo.rst
Running Yams Plug-in
=====================
-Yamms plug-in can be invoked via SMESH Plugin item in Mesh menu bar
+Yams plug-in can be invoked via SMESH Plugin item in Mesh menu bar
.. image:: images/AppelYams.png
:align: center
-# -*- coding: iso-8859-1 -*-
+# -*- coding: utf-8 -*-
# Copyright (C) 2007-2013 EDF R&D
#
# This library is free software; you can redistribute it and/or
# Import des panels
-# ------------------------------- #
from ViewText import Ui_ViewExe
-class MonViewText(Ui_ViewExe,QDialog):
-# ------------------------------- #
+
+class MonViewText(Ui_ViewExe, QDialog):
"""
Classe permettant la visualisation de texte
"""
- def __init__(self,parent,txt):
+ def __init__(self, parent, txt):
QDialog.__init__(self,parent)
- self.pere=parent
self.setupUi(self)
- self.resize( QSize(600,600).expandedTo(self.minimumSizeHint()) )
- self.connect( self.PB_Ok,SIGNAL("clicked()"), self, SLOT("close()") )
+ self.resize( QSize(1000,600).expandedTo(self.minimumSizeHint()) )
+ #self.connect( self.PB_Ok,SIGNAL("clicked()"), self, SLOT("close()") )
+ self.connect( self.PB_Ok,SIGNAL("clicked()"), self.theClose )
self.connect( self.PB_Save,SIGNAL("clicked()"), self.saveFile )
self.monExe=QProcess(self)
-
self.connect(self.monExe, SIGNAL("readyReadStandardOutput()"), self.readFromStdOut )
self.connect(self.monExe, SIGNAL("readyReadStandardError()"), self.readFromStdErr )
- self.connect(self.monExe, SIGNAL("finished(int )"), self.exeFinished )
# Je n arrive pas a utiliser le setEnvironment du QProcess
# fonctionne hors Salome mais pas dans Salome ???
- LICENCE=os.environ['DISTENE_LICENCE_FILE_FOR_YAMS']
- txt='export DISTENE_LICENSE_FILE='+LICENCE+';'+ txt
+ cmds=''
+ try :
+ LICENCE_FILE=os.environ["DISTENE_LICENCE_FILE_FOR_YAMS"]
+ except:
+ LICENCE_FILE=''
+ try :
+ PATH=os.environ["DISTENE_PATH_FOR_YAMS"]
+ except:
+ PATH=''
+ if LICENCE_FILE != '':
+ cmds+='source '+LICENCE_FILE+'\n'
+ else:
+ cmds+="# $DISTENE_LICENCE_FILE_FOR_YAMS NOT SET\n"
+ if PATH != '':
+ cmds+='export PATH='+PATH+':$PATH\n'
+ else:
+ cmds+="# $DISTENE_PATH_FOR_YAMS NOT SET\n"
+ #cmds+='env\n'
+ cmds+='rm -f '+self.parent().fichierOut+'\n'
+ cmds+=txt+'\n'
+ cmds+='echo END_OF_Yams\n'
pid=self.monExe.pid()
- nomFichier='/tmp/yam_'+str(pid)+'.py'
+ nomFichier='/tmp/Yams_'+str(pid)+'.sh'
f=open(nomFichier,'w')
- f.write(txt)
+ f.write(cmds)
f.close()
maBidouille='sh ' + nomFichier
self.monExe.start(maBidouille)
self.monExe.closeWriteChannel()
+ self.enregistreResultatsDone=False
self.show()
- def exeFinished(self):
- self.pere.enregistreResultat()
-
def saveFile(self):
#recuperation du nom du fichier
savedir=os.environ['HOME']
def readFromStdErr(self):
a=self.monExe.readAllStandardError()
- self.TB_Exe.append(QString.fromUtf8(a.data(),len(a))) ;
+ self.TB_Exe.append(QString.fromUtf8(a.data(),len(a)))
def readFromStdOut(self) :
a=self.monExe.readAllStandardOutput()
- self.TB_Exe.append(QString.fromUtf8(a.data(),len(a))) ;
+ aa=QString.fromUtf8(a.data(),len(a))
+ self.TB_Exe.append(aa)
+ if "END_OF_Yams" in aa:
+ self.parent().enregistreResultat()
+ self.enregistreResultatsDone=True
+ #self.theClose()
+
+ def theClose(self):
+ if not self.enregistreResultatsDone:
+ self.parent().enregistreResultat()
+ self.enregistreResultatsDone=True
+ self.close()
# -*- coding: utf-8 -*-
-# Copyright (C) 2007-2013 EDF R&D
+# Copyright (C) 2007-2013 EDF R&D
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
#
# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
#
+
# Modules Python
# Modules Eficas
"""
"""
def __init__(self):
- QWidget.__init__(self)
- self.setupUi(self)
- self.connecterSignaux()
- self.fichierIn=""
- self.fichierOut=""
- self.MeshIn=""
- self.num=1
-
-# Ces parametres ne sont pas remis à rien par le clean
- self.paramsFile= os.path.abspath(os.path.join(os.environ['HOME'],'.yams.dat'))
- self.LE_ParamsFile.setText(self.paramsFile)
- self.LE_MeshFile.setText("")
- self.LE_MeshSmesh.setText("")
+ QWidget.__init__(self)
+ self.setupUi(self)
+ self.connecterSignaux()
+ self.fichierIn=""
+ self.fichierOut=""
+ self.MeshIn=""
+ self.commande=""
+ self.num=1
+ self.__selectedMesh=None
+
+ # complex whith QResources: not used
+ # The icon are supposed to be located in the $SMESH_ROOT_DIR/share/salome/resources/smesh folder,
+ # other solution could be in the same folder than this python module file:
+ # iconfolder=os.path.dirname(os.path.abspath(__file__))
+
+ self.iconfolder=os.environ["SMESH_ROOT_DIR"]+"/share/salome/resources/smesh"
+ #print "monYamsPlugDialog iconfolder",iconfolder
+ icon = QIcon()
+ icon.addFile(os.path.join(self.iconfolder,"select1.png"))
+ self.PB_LoadHyp.setIcon(icon)
+ self.PB_LoadHyp.setToolTip("hypothesis from Salome Object Browser")
+ self.PB_SaveHyp.setIcon(icon)
+ self.PB_SaveHyp.setToolTip("hypothesis to Salome Object Browser")
+ self.PB_MeshSmesh.setIcon(icon)
+ self.PB_MeshSmesh.setToolTip("source mesh from Salome Object Browser")
+ icon = QIcon()
+ icon.addFile(os.path.join(self.iconfolder,"open.png"))
+ self.PB_ParamsFileExplorer.setIcon(icon)
+ self.PB_Load.setIcon(icon)
+ self.PB_Load.setToolTip("hypothesis from file")
+ self.PB_Save.setIcon(icon)
+ self.PB_Save.setToolTip("hypothesis to file")
+ self.PB_MeshFile.setIcon(icon)
+ self.PB_MeshFile.setToolTip("source mesh from a file in disk")
+
+ #Ces parametres ne sont pas remis à rien par le clean
+ self.paramsFile= os.path.abspath(os.path.join(os.environ["HOME"],".yams.dat"))
+ self.LE_ParamsFile.setText(self.paramsFile)
+ self.LE_MeshFile.setText("")
+ self.LE_MeshSmesh.setText("")
+
+ v1=QDoubleValidator(self)
+ v1.setBottom(0.)
+ #v1.setTop(1000.) #per thousand... only if relative
+ v1.setDecimals(2)
+ self.SP_Tolerance.setValidator(v1)
+ self.SP_Tolerance.titleForWarning="Chordal Tolerance"
+
+ self.resize(800, 600)
+ self.clean()
def connecterSignaux(self) :
- self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
- self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
- self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
- self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed)
- self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
- self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
- self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
- self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
- self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
- self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
- self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
-
+ self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
+ self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
+ self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
+ self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
+
+ self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed)
+ self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
+ self.connect(self.PB_LoadHyp,SIGNAL("clicked()"),self.PBLoadHypPressed)
+ self.connect(self.PB_SaveHyp,SIGNAL("clicked()"),self.PBSaveHypPressed)
+
+ self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
+ self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
+ self.connect(self.LE_MeshSmesh,SIGNAL("returnPressed()"),self.meshSmeshNameChanged)
+ self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
+ self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
+ self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
def PBHelpPressed(self):
- try :
- maDoc=os.environ['DISTENE_YAMS_DOC_PDF']
- except Exception:
- QMessageBox.warning( self, "Help unavailable", str(maDoc) + " not found")
- command="xdg-open "+maDoc+";"
- subprocess.call(command, shell=True)
-
+ try :
+ mydir=os.environ["SMESH_ROOT_DIR"]
+ except Exception:
+ QMessageBox.warning(self, "Help", "Help unavailable $SMESH_ROOT_DIR not found")
+ return
+ maDoc=mydir+"/share/doc/salome/gui/SMESH/yams/_downloads/YamsWhitePaper_3.2.pdf"
+ command="xdg-open "+maDoc+";"
+ subprocess.call(command, shell=True)
def PBOKPressed(self):
- if not(self.PrepareLigneCommande()) : return
- self.PBSavePressed(NomHypo=True)
- maFenetre=MonViewText(self,self.commande)
+ if not(self.PrepareLigneCommande()):
+ #warning done yet
+ #QMessageBox.warning(self, "Compute", "Command not found")
+ return
+ maFenetre=MonViewText(self,self.commande)
def enregistreResultat(self):
- if not(os.path.isfile(self.fichierOut)) : return
- import smesh
- import SMESH
- import salome
- from salome.kernel import studyedit
-
- maStudy=studyedit.getActiveStudy()
- smesh.SetCurrentStudy(maStudy)
- (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
- meshname = 'yams'+str(self.num)
- smesh.SetName(outputMesh.GetMesh(), meshname)
- outputMesh.Compute()
-
-
- self.editor = studyedit.getStudyEditor() #
- moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
- HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = 'HypoForRemesh',
- comment = 'HypoForRemshing')
- monStudyBuilder=maStudy.NewBuilder();
- monStudyBuilder.NewCommand();
- newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
- aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName")
- hypoName = 'monHypo_Yams_'+str(self.num)
- aNameAttrib.SetValue(hypoName)
- aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment")
- aCommentAttrib.SetValue(str(self.commande))
-
- SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0]
- newLink=monStudyBuilder.NewObject(SOMesh)
- monStudyBuilder.Addreference(newLink, newStudyIter);
- if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
- self.num+=1
- return True
-
- def PBSavePressed(self,NomHypo=False):
- if NomHypo : text = '# Params for Hypothese : monHypo_Yams_'+str(self.num - 1)+"\n"
- else : text = '# Save intermediate params \n'
- text += "# Params for mesh : " + self.LE_MeshSmesh.text() +'\n'
- for RB in self.GBOptim.findChildren(QRadioButton,):
- if RB.isChecked()==True:
- text+="Optimisation ='"+RB.text()+"'\n"
- break
- for RB in self.GBUnit.findChildren(QRadioButton,):
- if RB.isChecked()==True:
- text+="Units ='"+RB.text()+"'\n"
- text+='Chordal_Tolerance_Deviation='+str(self.SP_Tolerance.value())+'\n'
-
- text+='Ridge_Detection=' + str(self.CB_Ridge.isChecked())+'\n'
- text+='Split_Edge=' + str(self.CB_SplitEdge.isChecked())+'\n'
- text+='Point_Smoothing=' + str(self.CB_Point.isChecked())+'\n'
- text+='Geometrical_Approximation='+ str(self.SP_Geomapp.value()) +'\n'
- text+='Ridge_Angle=' + str(self.SP_Ridge.value()) +'\n'
- text+='Maximum_Size=' + str(self.SP_MaxSize.value()) +'\n'
- text+='Minimum_Size=' + str(self.SP_MaxSize.value()) +'\n'
- text+='Mesh_Gradation=' + str(self.SP_Gradation.value())+'\n'
-
- text+='Verbosity=' + str(self.SP_Verbosity.value())+'\n'
- text+='Memory=' + str(self.SP_Memory.value())+'\n'
- text+='\n\n'
-
- try :
- f=open(self.paramsFile,'a')
- except :
- QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
- return
- try :
- f.write(text)
- except :
- QMessageBox.warning( self, "File", "Unable to write "+self.paramsFile)
- return
- f.close()
+ import salome
+ import SMESH
+ from salome.kernel import studyedit
+ from salome.smesh import smeshBuilder
+ smesh = smeshBuilder.New(salome.myStudy)
+
+ if not os.path.isfile(self.fichierOut):
+ QMessageBox.warning(self, "Compute", "Result file "+self.fichierOut+" not found")
+
+ maStudy=studyedit.getActiveStudy()
+ smesh.SetCurrentStudy(maStudy)
+ (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
+ name=str(self.LE_MeshSmesh.text())
+ initialMeshFile=None
+ initialMeshObject=None
+ if name=="":
+ a=str(self.fichierIn)
+ name=os.path.basename(os.path.splitext(a)[0])
+ initialMeshFile=a
+ else:
+ initialMeshObject=maStudy.FindObjectByName(name ,"SMESH")[0]
+
+ meshname = name+"_YAMS_"+str(self.num)
+ smesh.SetName(outputMesh.GetMesh(), meshname)
+ outputMesh.Compute() #no algorithms message for "Mesh_x" has been computed with warnings: - global 1D algorithm is missing
+
+ self.editor = studyedit.getStudyEditor()
+ moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
+ HypReMeshEntry = self.editor.findOrCreateItem(
+ moduleEntry, name = "Plugins Hypotheses", icon="mesh_tree_hypo.png") #, comment = "HypoForRemeshing" )
+
+ monStudyBuilder=maStudy.NewBuilder()
+ monStudyBuilder.NewCommand()
+ newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
+ self.editor.setAttributeValue(newStudyIter, "AttributeName", "YAMS Parameters_"+str(self.num))
+ self.editor.setAttributeValue(newStudyIter, "AttributeComment", self.getResumeData(separator=" ; "))
+
+ SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0]
+
+ if initialMeshFile!=None:
+ newStudyFileName=monStudyBuilder.NewObject(SOMesh)
+ self.editor.setAttributeValue(newStudyFileName, "AttributeName", "meshFile")
+ self.editor.setAttributeValue(newStudyFileName, "AttributeExternalFileDef", initialMeshFile)
+ self.editor.setAttributeValue(newStudyFileName, "AttributeComment", initialMeshFile)
+
+ if initialMeshObject!=None:
+ newLink=monStudyBuilder.NewObject(SOMesh)
+ monStudyBuilder.Addreference(newLink, initialMeshObject)
+
+ newLink=monStudyBuilder.NewObject(SOMesh)
+ monStudyBuilder.Addreference(newLink, newStudyIter)
+
+ if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
+ self.num+=1
+ return True
+
+ def PBSavePressed(self):
+ from datetime import datetime
+ if not(self.PrepareLigneCommande()): return
+ text = "# YAMS hypothesis parameters\n"
+ text += "# Params for mesh : " + self.LE_MeshSmesh.text() +"\n"
+ text += datetime.now().strftime("# Date : %d/%m/%y %H:%M:%S\n")
+ text += "# Command : "+self.commande+"\n"
+ text += self.getResumeData(separator="\n")
+ text += "\n\n"
+
+ try:
+ f=open(self.paramsFile,"a")
+ except:
+ QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
+ return
+ try:
+ f.write(text)
+ except:
+ QMessageBox.warning(self, "File", "Unable to write "+self.paramsFile)
+ return
+ f.close()
+
+ def PBSaveHypPressed(self):
+ """save hypothesis in Object Browser"""
+ import salome
+ import SMESH
+ from salome.kernel import studyedit
+ from salome.smesh import smeshBuilder
+ smesh = smeshBuilder.New(salome.myStudy)
+
+ maStudy=studyedit.getActiveStudy()
+ smesh.SetCurrentStudy(maStudy)
+
+ self.editor = studyedit.getStudyEditor()
+ moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
+ HypReMeshEntry = self.editor.findOrCreateItem(
+ moduleEntry, name = "Plugins Hypotheses", icon="mesh_tree_hypo.png") #, comment = "HypoForRemeshing" )
+
+ monStudyBuilder=maStudy.NewBuilder()
+ monStudyBuilder.NewCommand()
+ newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
+ self.editor.setAttributeValue(newStudyIter, "AttributeName", "YAMS Parameters_"+str(self.num))
+ self.editor.setAttributeValue(newStudyIter, "AttributeComment", self.getResumeData(separator=" ; "))
+
+ if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
+ self.num+=1
+ return True
+
+ def SP_toStr(self, widget):
+ """only for a QLineEdit widget"""
+ #cr, pos=widget.validator().validate(res, 0) #n.b. "1,3" is acceptable !locale!
+ try:
+ val=float(widget.text())
+ except:
+ QMessageBox.warning(self, widget.titleForWarning, "float value is incorrect: '"+widget.text()+"'")
+ res=str(widget.validator().bottom())
+ widget.setProperty("text", res)
+ return res
+ valtest=widget.validator().bottom()
+ if valtest!=None:
+ if val<valtest:
+ QMessageBox.warning(self, widget.titleForWarning, "float value is under minimum: "+str(val)+" < "+str(valtest))
+ res=str(valtest)
+ widget.setProperty("text", res)
+ return res
+ valtest=widget.validator().top()
+ if valtest!=None:
+ if val>valtest:
+ QMessageBox.warning(self, widget.titleForWarning, "float value is over maximum: "+str(val)+" > "+str(valtest))
+ res=str(valtest)
+ widget.setProperty("text", res)
+ return res
+ return str(val)
+
+ def getResumeData(self, separator="\n"):
+ text=""
+ for RB in self.GBOptim.findChildren(QRadioButton,):
+ if RB.isChecked()==True:
+ text+="Optimisation="+RB.text()+separator
+ break
+ if self.RB_Absolute.isChecked():
+ text+="Units=absolute"+separator
+ else:
+ text+="Units=relative"+separator
+ v=self.SP_toStr(self.SP_Tolerance)
+ text+="ChordalToleranceDeviation="+v+separator
+ text+="RidgeDetection="+str(self.CB_Ridge.isChecked())+separator
+ text+="SplitEdge="+str(self.CB_SplitEdge.isChecked())+separator
+ text+="PointSmoothing="+str(self.CB_Point.isChecked())+separator
+ text+="GeometricalApproximation="+str(self.SP_Geomapp.value())+separator
+ text+="RidgeAngle="+str(self.SP_Ridge.value())+separator
+ text+="MaximumSize="+str(self.SP_MaxSize.value())+separator
+ text+="MinimumSize="+str(self.SP_MinSize.value())+separator
+ text+="MeshGradation="+str(self.SP_Gradation.value())+separator
+ text+="Verbosity="+str(self.SP_Verbosity.value())+separator
+ text+="Memory="+str(self.SP_Memory.value())+separator
+ return str(text)
+
+ def loadResumeData(self, hypothesis, separator="\n"):
+ text=str(hypothesis)
+ self.clean()
+ for slig in reversed(text.split(separator)):
+ lig=slig.strip()
+ #print "load ResumeData",lig
+ if lig=="": continue #skip blanck lines
+ if lig[0]=="#": break
+ try:
+ tit,value=lig.split("=")
+ if tit=="Optimisation":
+ #no need: exlusives QRadioButton
+ #for RB in self.GBOptim.findChildren(QRadioButton,):
+ # RB.setChecked(False)
+ for RB in self.GBOptim.findChildren(QRadioButton,):
+ if RB.text()==value :
+ RB.setChecked(True)
+ break
+ if tit=="Units":
+ if value=="absolute":
+ self.RB_Absolute.setChecked(True)
+ self.RB_Relative.setChecked(False)
+ else:
+ self.RB_Absolute.setChecked(False)
+ self.RB_Relative.setChecked(True)
+ if tit=="ChordalToleranceDeviation": self.SP_Tolerance.setProperty("text", float(value))
+ if tit=="RidgeDetection": self.CB_Ridge.setChecked(value=="True")
+ if tit=="SplitEdge": self.CB_SplitEdge.setChecked(value=="True")
+ if tit=="PointSmoothing": self.CB_Point.setChecked(value=="True")
+ if tit=="GeometricalApproximation": self.SP_Geomapp.setProperty("value", float(value))
+ if tit=="RidgeAngle": self.SP_Ridge.setProperty("value", float(value))
+ if tit=="MaximumSize": self.SP_MaxSize.setProperty("value", float(value))
+ if tit=="MinimumSize": self.SP_MinSize.setProperty("value", float(value))
+ if tit=="MeshGradation": self.SP_Gradation.setProperty("value", float(value))
+ if tit=="Verbosity": self.SP_Verbosity.setProperty("value", int(float(value)))
+ if tit=="Memory": self.SP_Memory.setProperty("value", float(value))
+ except:
+ QMessageBox.warning(self, "load YAMS Hypothesis", "Problem on '"+lig+"'")
def PBLoadPressed(self):
- try :
- f=open(self.paramsFile,'r')
- except :
- QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
- return
- try :
- text=f.read()
- except :
- QMessageBox.warning( self, "File", "Unable to read "+self.paramsFile)
- return
- f.close()
- d={}
- exec text in d
- for RB in self.GBOptim.findChildren(QRadioButton,):
- if d['Optimisation']== RB.text():
- RB.setChecked(True)
- break
- for RB in self.GBUnit.findChildren(QRadioButton,):
- if d['Units']== RB.text():
- RB.setChecked(True)
- break
- self.SP_Tolerance.setValue(d['Chordal_Tolerance_Deviation'])
-
- self.CB_Ridge.setChecked(d['Ridge_Detection'])
- self.CB_Point.setChecked(d['Point_Smoothing'])
- self.CB_SplitEdge.setChecked(d['Split_Edge'])
- self.SP_Geomapp.setValue(d['Geometrical_Approximation'])
- self.SP_Ridge.setValue(d['Ridge_Angle'])
- self.SP_MaxSize.setValue(d['Maximum_Size'])
- self.SP_MinSize.setValue(d['Minimum_Size'])
- self.SP_Gradation.setValue(d['Mesh_Gradation'])
-
- self.SP_Verbosity.setValue(d['Verbosity'])
- self.SP_Memory.setValue(d['Memory'])
-
-
+ """load last hypothesis saved in tail of file"""
+ try:
+ f=open(self.paramsFile,"r")
+ except:
+ QMessageBox.warning(self, "File", "Unable to open "+self.paramsFile)
+ return
+ try:
+ text=f.read()
+ except:
+ QMessageBox.warning(self, "File", "Unable to read "+self.paramsFile)
+ return
+ f.close()
+ self.loadResumeData(text, separator="\n")
+
+ def PBLoadHypPressed(self):
+ """load hypothesis saved in Object Browser"""
+ #QMessageBox.warning(self, "load Object Browser YAMS hypothesis", "TODO")
+ import salome
+ from salome.kernel import studyedit
+ from salome.smesh.smeshstudytools import SMeshStudyTools
+ from salome.gui import helper as guihelper
+ from omniORB import CORBA
+
+ mySObject, myEntry = guihelper.getSObjectSelected()
+ if CORBA.is_nil(mySObject) or mySObject==None:
+ QMessageBox.critical(self, "Hypothese", "select an Object Browser YAMS hypothesis")
+ return
+
+ text=mySObject.GetComment()
+
+ #a verification
+ if "Optimisation=" not in text:
+ QMessageBox.critical(self, "Load Hypothese", "Object Browser selection not a YAMS Hypothesis")
+ return
+ self.loadResumeData(text, separator=" ; ")
+ return
+
def PBCancelPressed(self):
- self.close()
+ self.close()
def PBMeshFilePressed(self):
- fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
- if fd.exec_():
- infile = fd.selectedFiles()[0]
- self.LE_MeshFile.setText(infile)
- self.fichierIn=infile.toLatin1()
+ fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
+ if fd.exec_():
+ infile = fd.selectedFiles()[0]
+ self.LE_MeshFile.setText(infile)
+ self.fichierIn=infile.toLatin1()
+ self.MeshIn=""
+ self.LE_MeshSmesh.setText("")
def setParamsFileName(self):
- fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
- if fd.exec_():
- infile = fd.selectedFiles()[0]
- self.LE_ParamsFile.setText(infile)
- self.paramsFile=infile.toLatin1()
-
+ fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
+ if fd.exec_():
+ infile = fd.selectedFiles()[0]
+ self.LE_ParamsFile.setText(infile)
+ self.paramsFile=infile.toLatin1()
def meshFileNameChanged(self):
- self.fichierIn=self.LE_MeshFile.text()
- if os.path.exists(self.fichierIn): return
- QMessageBox.warning( self, "Unknown File", "File doesn't exist")
+ self.fichierIn=str(self.LE_MeshFile.text())
+ #print "meshFileNameChanged", self.fichierIn
+ if os.path.exists(self.fichierIn):
+ self.__selectedMesh=None
+ self.MeshIn=""
+ self.LE_MeshSmesh.setText("")
+ return
+ QMessageBox.warning(self, "Mesh file", "File doesn't exist")
+
+ def meshSmeshNameChanged(self):
+ """only change by GUI mouse selection, otherwise clear"""
+ self.__selectedMesh = None
+ self.MeshIn=""
+ self.LE_MeshSmesh.setText("")
+ self.fichierIn=""
+ return
def paramsFileNameChanged(self):
- self.paramsFile=self.LE_ParamsFile.text()
+ self.paramsFile=self.LE_ParamsFile.text()
def PBMeshSmeshPressed(self):
- import salome
- import smesh
- from salome.kernel import studyedit
- from salome.smesh.smeshstudytools import SMeshStudyTools
- from salome.gui import helper as guihelper
- from omniORB import CORBA
-
- mySObject, myEntry = guihelper.getSObjectSelected()
- if CORBA.is_nil(mySObject) or mySObject==None:
- QMessageBox.critical(self, "Mesh", "select an input mesh")
- return
- self.smeshStudyTool = SMeshStudyTools()
+ from omniORB import CORBA
+ import salome
+ from salome.kernel import studyedit
+ from salome.smesh.smeshstudytools import SMeshStudyTools
+ from salome.gui import helper as guihelper
+ from salome.smesh import smeshBuilder
+ smesh = smeshBuilder.New(salome.myStudy)
+
+ mySObject, myEntry = guihelper.getSObjectSelected()
+ if CORBA.is_nil(mySObject) or mySObject==None:
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return
+ self.smeshStudyTool = SMeshStudyTools()
+ try:
self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
- if CORBA.is_nil(self.__selectedMesh):
- QMessageBox.critical(self, "Mesh", "select an input mesh")
- return
- myName = mySObject.GetName()
- self.MeshIn=myName
- self.LE_MeshSmesh.setText(myName)
+ except:
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return
+ if CORBA.is_nil(self.__selectedMesh):
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return
+ myName = mySObject.GetName()
+ #print "MeshSmeshNameChanged", myName
+ self.MeshIn=myName
+ self.LE_MeshSmesh.setText(myName)
+ self.LE_MeshFile.setText("")
+ self.fichierIn=""
def prepareFichier(self):
- self.fichierIn="/tmp/PourYam_"+str(self.num)+".mesh"
- import SMESH
- self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn, True)
+ self.fichierIn="/tmp/ForYams_"+str(self.num)+".mesh"
+ self.__selectedMesh.ExportGMF(self.__selectedMesh, self.fichierIn, True)
def PrepareLigneCommande(self):
- self.commande="yams "
- verbosity=str(self.SP_Verbosity.value())
- self.commande+="-v "+verbosity
- for obj in self.mesRB.children():
- try :
- if obj.isChecked():
- self.style=obj.objectName().remove(0,3)
- self.style.replace("_","-")
- break
- except :
- pass
- self.commande+=" -O "+self.style.toLatin1()
- if self.fichierIn=="" and self.MeshIn=="" :
- QMessageBox.critical(self, "Mesh", "select an input mesh")
- return False
- if self.MeshIn!="" : self.prepareFichier()
- if not (os.path.isfile(self.fichierIn)):
- QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
- return False
-
- deb=os.path.splitext(self.fichierIn)
- self.fichierOut=deb[0]+'.d.meshb'
-
- if self.RB_Absolute.isChecked()==True :
- self.commande+=' -Dabsolute'
- else :
- self.commande+=' -Drelative'
- self.commande+=',tolerance=%f'%self.SP_Tolerance.value()
- if self.CB_Ridge.isChecked()==False : self.commande+=',-nr'
- if self.CB_Point.isChecked()==False : self.commande+=',-ns'
- if self.SP_Geomapp.value()!=0.04 : self.commande+=',geomapp=%f'%self.SP_Geomapp.value()
- if self.SP_Ridge.value()!=45.0 : self.commande+=',ridge=%f'%self.SP_Ridge.value()
- if self.SP_MaxSize.value()!=100 : self.commande+=',maxsize=%f'%self.SP_MaxSize.value()
- if self.SP_MinSize.value()!=5 : self.commande+=',minsize=%f'%self.SP_MinSize.value()
- if self.SP_Gradation.value()!=1.3 : self.commande+=',gradation=%f'%self.SP_MaxSize.value()
- if self.CB_SplitEdge.isChecked()==True : self.commande+=',splitedge=1'
-
- if self.SP_Verbosity.value()!=3 : self.commande+=' -v %d'%self.SP_Verbosity.value()
- if self.SP_Memory.value()!=0 : self.commande+=' -m %d'%self.SP_Memory.value()
-
- self.commande+=" "+self.fichierIn
- return True
+ if self.fichierIn=="" and self.MeshIn=="":
+ QMessageBox.critical(self, "Mesh", "select an input mesh")
+ return False
+ if self.__selectedMesh!=None: self.prepareFichier()
+ if not (os.path.isfile(self.fichierIn)):
+ QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
+ return False
+
+ self.commande="yams"
+ verbosity=str(self.SP_Verbosity.value())
+ self.commande+=" -v "+verbosity
+ for obj in self.GBOptim.findChildren(QRadioButton,):
+ try:
+ if obj.isChecked():
+ self.style=obj.objectName().remove(0,3)
+ self.style.replace("_","-")
+ break
+ except:
+ pass
+ self.commande+=" -O "+self.style.toLatin1()
+
+ deb=os.path.splitext(self.fichierIn)
+ self.fichierOut=deb[0] + ".d.meshb"
+
+ if self.RB_Absolute.isChecked()==True :
+ self.commande+=" -Dabsolute"
+ else :
+ self.commande+=" -Drelative"
+
+ v=self.SP_toStr(self.SP_Tolerance)
+ self.commande+=",tolerance="+v
+ if self.CB_Ridge.isChecked()==False : self.commande+=",-nr"
+ if self.CB_Point.isChecked()==False : self.commande+=",-ns"
+ if self.SP_Geomapp.value()!=0.04 : self.commande+=",geomapp=%f"%self.SP_Geomapp.value()
+ if self.SP_Ridge.value()!=45.0 : self.commande+=",ridge=%f"%self.SP_Ridge.value()
+ if self.SP_MaxSize.value()!=100 : self.commande+=",maxsize=%f"%self.SP_MaxSize.value()
+ if self.SP_MinSize.value()!=5 : self.commande+=",minsize=%f"%self.SP_MinSize.value()
+ if self.SP_Gradation.value()!=1.3 : self.commande+=",gradation=%f"%self.SP_MaxSize.value()
+ if self.CB_SplitEdge.isChecked()==True : self.commande+=",splitedge=1"
+
+ if self.SP_Verbosity.value()!=3 : self.commande+=" -v %d"%self.SP_Verbosity.value()
+ if self.SP_Memory.value()!=0 : self.commande+=" -m %d"%self.SP_Memory.value()
+
+ self.commande+=" "+self.fichierIn
+ return True
def clean(self):
- self.RB_0.setChecked(True)
- self.RB_G.setChecked(False)
- self.RB_U.setChecked(False)
- self.RB_S.setChecked(False)
- self.RB_2.setChecked(False)
- self.RB_1.setChecked(False)
- self.RB_Absolute.setChecked(False)
- self.RB_Relative.setChecked(True)
- self.SP_Tolerance.setProperty("value", 0.1)
- self.SP_Geomapp.setProperty("value", 0.04)
- self.SP_Ridge.setProperty("value", 45.0)
- self.SP_Gradation.setProperty("value", 1.3)
- self.CB_Ridge.setChecked(True)
- self.CB_Point.setChecked(True)
- self.CB_SplitEdge.setChecked(False)
- self.SP_MaxSize.setProperty("value", -2.0)
- self.SP_MinSize.setProperty("value", -2.0)
- self.SP_Verbosity.setProperty("value", 3)
- self.SP_Memory.setProperty("value", 0)
-
+ self.RB_0.setChecked(True)
+ #no need: exlusives QRadioButton
+ #self.RB_G.setChecked(False)
+ #self.RB_U.setChecked(False)
+ #self.RB_S.setChecked(False)
+ #self.RB_2.setChecked(False)
+ #self.RB_1.setChecked(False)
+ self.RB_Relative.setChecked(True)
+ #no need: exlusives QRadioButton
+ #self.RB_Absolute.setChecked(False)
+ self.SP_Tolerance.setProperty("text", "10.")
+ self.SP_Geomapp.setProperty("value", 0.04)
+ self.SP_Ridge.setProperty("value", 45.0)
+ self.SP_Gradation.setProperty("value", 1.3)
+ self.CB_Ridge.setChecked(True)
+ self.CB_Point.setChecked(True)
+ self.CB_SplitEdge.setChecked(False)
+ self.SP_MaxSize.setProperty("value", -2.0)
+ self.SP_MinSize.setProperty("value", -2.0)
+ self.SP_Verbosity.setProperty("value", 3)
+ self.SP_Memory.setProperty("value", 0)
__dialog=None
def getDialog():
- """
- This function returns a singleton instance of the plugin dialog.
- c est obligatoire pour faire un show sans parent...
- """
- global __dialog
- if __dialog is None:
- __dialog = MonYamsPlugDialog()
- #else :
- # __dialog.clean()
- return __dialog
+ """
+ This function returns a singleton instance of the plugin dialog.
+ c est obligatoire pour faire un show sans parent...
+ """
+ global __dialog
+ if __dialog is None:
+ __dialog = MonYamsPlugDialog()
+ #else :
+ # __dialog.clean()
+ return __dialog
+#
+# ==============================================================================
+# Basic use cases and unit test functions
+# ==============================================================================
+#
+def TEST_MonYamsPlugDialog():
+ import sys
+ from PyQt4.QtGui import QApplication
+ from PyQt4.QtCore import QObject, SIGNAL, SLOT
+ app = QApplication(sys.argv)
+ QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
+
+ dlg=MonYamsPlugDialog()
+ dlg.show()
+ sys.exit(app.exec_())
+
+if __name__ == "__main__":
+ TEST_MonYamsPlugDialog()
+ pass
+# -*- coding: utf-8 -*-
# Copyright (C) 2006-2013 EDF R&D
#
# This library is free software; you can redistribute it and/or
from PyQt4.QtGui import QFileDialog
from PyQt4.QtGui import QMessageBox
+ #prior test to avoid unnecessary user GUI work with ending crash
try :
os.environ['DISTENE_LICENCE_FILE_FOR_YAMS']
except:
- QMessageBox.warning(None,"Products","Distene's products are not installed")
+ QMessageBox.warning(None,"Products","Distene's product Yams is not installed.\nrequired environment variable:\nDISTENE_LICENCE_FILE_FOR_YAMS='/.../dlim8.var.sh'")
return
import monYamsPlugDialog
- window=monYamsPlugDialog.getDialog()
+ window=monYamsPlugDialog.getDialog()
window.show()
environment variable PADDERHOME that localizes the installation root
of the SpherePadder external program. This installation process
creates a configuration file padder.cfg located in the folder
-<SMESH_ROOT_DIR>/share/salome/plugins/smesh, where <SMESH_ROOT_DIR> is
+\<SMESH_ROOT_DIR\>/share/salome/plugins/smesh, where \<SMESH_ROOT_DIR\> is
the installation root directory of the SMESH module.
In the case where you have to specify a different configuration than
\endcode
You can check the configuration by testing that you can connect to the
-host <hostname> with the login <username> without being asked a
+host \<hostname\> with the login \<username\> without being asked a
password:
\code
# For testing SMESH
#
libSPADDERPluginTesterEngine_la_CXXFLAGS += \
- @GEOM_CXXFLAGS@ @MED_CXXFLAGS@ \
+ @GEOM_CXXFLAGS@ \
-I$(top_builddir)/idl \
-I$(top_srcdir)/src/SMESH \
-I$(top_srcdir)/src/SMESH_I \
beginService("SPADDERPluginTester_i::testplugin");
Engines::SalomeLauncher_ptr salomeLauncher = KERNEL::getSalomeLauncher();
+ salomeLauncher = NULL;
endService("SPADDERPluginTester_i::testplugin");
return true;
from spadderPlugin import runSpadderPlugin
from meshcut_plugin import MeshCut
from yamsplug_plugin import YamsLct
+from MGCleanerplug_plugin import MGCleanerLct
salome_pluginsmanager.AddFunction('PADDER mesher',
'Create a mesh with PADDER',
salome_pluginsmanager.AddFunction('ReMesh with Yams',
'Run Yams',
YamsLct)
+
+salome_pluginsmanager.AddFunction('ReMesh with MGCleaner',
+ 'Run MGCleaner',
+ MGCleanerLct)
+