0020749: EDF 1291 SMESH : Create 2D Mesh from 3D improvement

update doc
This commit is contained in:
eap 2010-10-20 14:20:45 +00:00
parent 6ca4eb029d
commit cf145e36af
4 changed files with 213 additions and 12 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -1,22 +1,60 @@
/*! /*!
\page make_2dmesh_from_3d_page Create 2D mesh from 3D \page make_2dmesh_from_3d_page Generate boundary elements
\n This functionality allows to generate 2D mesh elements as a skin \n This functionality allows to generate mesh elements on borders of
on the existing 3D mesh elements. elements of higher dimension.
<em>To generate 2D mesh:</em>
<em>To generate border elements:</em>
<ol> <ol>
<li>From the Modification menu choose "Create 2D mesh from 3D" <li>From the Modification menu choose "Create boundary elements"
item, or choose from the popup menu. item, or choose from the popup menu.
\image html 2d_from_3d_menu.png \image html 2d_from_3d_menu.png
The following dialog box will appear:
The algorithm detects boundary volume faces without connections to \image html 2d_from_3d_dlg.png
other volumes and creates 2D mesh elements on face nodes. If the mesh </li>
already contains 2D elements on the detected nodes, new elements are not <li>Check in the dialog box one of three radio buttons corresponding to
created. The the resulting dialog shows mesh information statistics the type of operation you would like to perform.</li>
about the newly created 2D mesh elements. <li>Fill the other fields available in the dialog box.</li>
<li>Click the \b Apply or <b>Apply and Close</b> button to perform the operation.</li>
</ol> </ol>
\n "Create boundary elements" dialog allows creation of boundary elements
of three types.
<ul>
<li><b>2D from 3D</b> creates mesh faces on free facets of volume elements</li>
<li><b>1D from 2D</b> creates mesh edges on free edges of mesh faces</li>
<li><b>1D from 3D</b> creates mesh edges on all borders of free facets of volume elements</li>
</ul>
Here <em>free facet</em> means a facet shared by only one volume, <em>free edge</em>
means an edge shared by only one mesh face.
In this dialog:
<ul>
<li>specify <b>Mesh, submesh or group</b> to analyze the boundary.</li>
<li>specify <b>Target</b> mesh where boundary elements will
be created.
<ul>
<li><b>This mesh</b> adds elements in the selected mesh or the mesh
the selected submesh or group belongs to.</li>
<li><b>New mesh</b> add elements to a new mesh. The new mesh appears
in the Object Browser with the name specified in the adjacent box
that you can change. </li>
</ul></li>
<li>activate <b>Copy source mesh</b> checkbox to copy 2D or 3D
elements (depending on operation type) belonging to the object
specified in <b>Mesh, submesh or group</b> field to the new
mesh.</li>
<li>deactivate <b>Copy missing elements only</b> checkbox to copy
boundary elements already present in the mesh being checked to the
new mesh.</li>
<li>activate <b>Create group</b> checkbox to create a group where
missing boundary elements are added to. The new group appears
in the Object Browser with the name specified in the adjacent box
that you can change. </li>
</ul>
<br><b>See Also</b> a sample TUI Script of a \ref tui_make_2dmesh_from_3d "Create boundary elements" operation.
*/ */

View File

@ -47,7 +47,7 @@ of the selected node or edge.</li>
<li>Apply \subpage pattern_mapping_page "pattern mapping".</li> <li>Apply \subpage pattern_mapping_page "pattern mapping".</li>
<li>\subpage convert_to_from_quadratic_mesh_page "Convert regular mesh to quadratic", <li>\subpage convert_to_from_quadratic_mesh_page "Convert regular mesh to quadratic",
or vice versa.</li> or vice versa.</li>
<li>\subpage make_2dmesh_from_3d_page "Create 2D mesh from 3D".</li> <li>\subpage make_2dmesh_from_3d_page "Generate boundary elements".</li>
</ul> </ul>

View File

@ -421,4 +421,167 @@ if salome.sg.hasDesktop():
salome.sg.updateObjBrowser(0) salome.sg.updateObjBrowser(0)
\endcode \endcode
<br>
\anchor tui_make_2dmesh_from_3d
<h3>Create boundary elements</h3>
\code
# The goal of this feature is to enable the following use cases:
# 1) The mesh MESH1 with 3D cells does not have or have only a part of its skin (2D cells):
# 1.1) Add the 2D skin (missing 2D cells) to MESH1 (what it's done now by the algorithm).
# 1.2) Create new 3D Mesh MESH2 that consists of MESH1 and added 2D skin cells.
# 1.3) Create new 2D Mesh MESH3 that consists of only the 2D skin cells.
# 2) The mesh MESH1 with 3D cells has all its skin (2D cells):
# Create new 2D Mesh MESH3 that consists of only the 2D skin cells.
#
# In all cases an option to create a group containing these 2D skin cells should be available.
from smesh import *
box = geompy.MakeBoxDXDYDZ(1,1,1)
geompy.addToStudy(box,"box")
boxFace = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])[0]
geompy.addToStudyInFather(box,boxFace,"boxFace")
MESH1 = Mesh(box,"MESH1")
MESH1.AutomaticHexahedralization()
init_nb_edges = MESH1.NbEdges()
init_nb_faces = MESH1.NbFaces()
init_nb_volumes = MESH1.NbVolumes()
# =========================================================================================
# 1) The mesh MESH1 with 3D cells does not have or have only a part of its skin (2D cells)
# =========================================================================================
# remove some faces
all_faces = MESH1.GetElementsByType(SMESH.FACE)
rm_faces = all_faces[:init_nb_faces/5] + all_faces[4*init_nb_faces/5:]
MESH1.RemoveElements(rm_faces)
assert(MESH1.NbFaces() == init_nb_faces-len(rm_faces))
# 1.1) Add the 2D skin (missing 2D cells) to MESH1
# -------------------------------------------------
# add missing faces
# 1.1.1) to the whole mesh
m,g = MESH1.MakeBoundaryMesh(MESH1)
assert(init_nb_faces == MESH1.NbFaces())
assert(init_nb_edges == MESH1.NbEdges())
assert(m)
assert(not g)
# 1.1.2) to some elements
MESH1.RemoveElements(rm_faces)
MESH1.MakeBoundaryMesh([])
assert(init_nb_faces != MESH1.NbFaces())
volumes = MESH1.GetElementsByType(SMESH.VOLUME)
for v in volumes:
MESH1.MakeBoundaryMesh([v])
assert(init_nb_faces == MESH1.NbFaces())
assert(init_nb_edges == MESH1.NbEdges())
# 1.1.3) to group of elements
volGroup1 = MESH1.CreateEmptyGroup(SMESH.VOLUME, "volGroup1")
volGroup1.Add( volumes[: init_nb_volumes/2])
volGroup2 = MESH1.CreateEmptyGroup(SMESH.VOLUME, "volGroup2")
volGroup1.Add( volumes[init_nb_volumes/2:])
MESH1.RemoveElements(rm_faces)
MESH1.MakeBoundaryMesh(volGroup1)
MESH1.MakeBoundaryMesh(volGroup2)
assert(init_nb_faces == MESH1.NbFaces())
assert(init_nb_edges == MESH1.NbEdges())
# 1.1.4) to submesh.
# The submesh has no volumes, so check if it pass w/o a crash and does not create
# missing faces
faceSubmesh = MESH1.GetSubMesh( boxFace, "boxFace" )
MESH1.RemoveElements(rm_faces)
MESH1.MakeBoundaryMesh(faceSubmesh)
assert(init_nb_faces != MESH1.NbFaces())
# check group creation
MESH1.RemoveElements(rm_faces)
groupName = "added to mesh"
m,group = MESH1.MakeBoundaryMesh(MESH1,groupName=groupName)
assert(group)
assert(group.GetName() == groupName)
assert(group.Size() == len(rm_faces))
# 1.2) Create new 3D Mesh MESH2 that consists of MESH1 and added 2D skin cells.
# ------------------------------------------------------------------------------
MESH1.RemoveElements(rm_faces)
meshName = "MESH2"
MESH2,group = MESH1.MakeBoundaryMesh(MESH1,meshName=meshName,toCopyElements=True)
assert(MESH2)
assert(MESH2.GetName() == meshName)
assert(MESH2.NbVolumes() == MESH1.NbVolumes())
assert(MESH2.NbFaces() == len(rm_faces))
# check group creation
MESH1.RemoveElements(rm_faces)
MESH2,group = MESH1.MakeBoundaryMesh(MESH1,meshName="MESH2_0",
groupName=groupName,toCopyElements=True)
assert(group)
assert(group.GetName() == groupName)
assert(group.Size() == len(rm_faces))
assert(group.GetMesh()._is_equivalent(MESH2.GetMesh()))
# 1.3) Create new 2D Mesh MESH3 that consists of only the 2D skin cells.
# -----------------------------------------------------------------------
MESH1.RemoveElements(rm_faces)
meshName = "MESH3"
MESH3,group = MESH1.MakeBoundaryMesh(MESH1,meshName=meshName,toCopyExistingBondary=True)
assert(MESH3)
assert(not group)
assert(MESH3.GetName() == meshName)
assert(MESH3.NbVolumes() == 0)
assert(MESH3.NbFaces() == init_nb_faces)
# check group creation
MESH1.RemoveElements(rm_faces)
MESH3,group = MESH1.MakeBoundaryMesh(MESH1,meshName=meshName,
groupName=groupName, toCopyExistingBondary=True)
assert(group)
assert(group.GetName() == groupName)
assert(group.Size() == len(rm_faces))
assert(group.GetMesh()._is_equivalent(MESH3.GetMesh()))
assert(MESH3.NbFaces() == init_nb_faces)
# ==================================================================
# 2) The mesh MESH1 with 3D cells has all its skin (2D cells)
# Create new 2D Mesh MESH3 that consists of only the 2D skin cells.
# ==================================================================
MESH1.MakeBoundaryMesh(MESH1)
MESH3,group = MESH1.MakeBoundaryMesh(MESH1,meshName=meshName,toCopyExistingBondary=True)
assert(MESH3)
assert(not group)
assert(MESH3.NbVolumes() == 0)
assert(MESH3.NbFaces() == init_nb_faces)
# check group creation
MESH3,group = MESH1.MakeBoundaryMesh(MESH1,meshName=meshName,
groupName=groupName, toCopyExistingBondary=True)
assert(group)
assert(group.GetName() == groupName)
assert(group.Size() == 0)
assert(group.GetMesh()._is_equivalent(MESH3.GetMesh()))
assert(MESH3.NbFaces() == init_nb_faces)
# ================
# Make 1D from 2D
# ================
MESH1.Clear()
MESH1.Compute()
MESH1.RemoveElements( MESH1.GetElementsByType(SMESH.EDGE))
rm_faces = faceSubmesh.GetIDs()[:2] # to remove few adjacent faces
nb_missing_edges = 2 + 2*len(rm_faces)
MESH1.RemoveElements(rm_faces)
mesh,group = MESH1.MakeBoundaryMesh(MESH1, BND_1DFROM2D)
assert( MESH1.NbEdges() == nb_missing_edges )
\endcode
*/ */