Salome HOME
Merge from V6_main_20120808 08Aug12
[modules/smesh.git] / doc / salome / gui / SMESH / input / tui_use_existing_faces.doc
1 /*!
2
3 \page tui_use_existing_faces Use existing faces
4
5 This sample demonstrates how to use <b>Use existing faces</b> algorithm,
6 which is actulally just a stub allowing to use your own 2D algoritm
7 implemented in Python.
8
9
10 \code
11 import smesh, geompy
12 import numpy as np
13
14 # define my 2D algorithm
15 def my2DMeshing( geomFace ):
16
17     # find gravity center of geomFace
18     gcXYZ = geompy.PointCoordinates( geompy.MakeCDG( geomFace ))
19
20     # define order and orientation of edges
21     sortedEdges = []
22     geomEdges = geompy.SubShapeAll( geomFace, geompy.ShapeType["EDGE"])
23     sortedEdges.append(( geomEdges.pop(0), True ))
24     while geomEdges:
25         prevEdge_rev = sortedEdges[ -1 ]
26         prevVV = geompy.SubShapeAll( prevEdge_rev[0], geompy.ShapeType["VERTEX"])
27         prevV2 = prevVV[ prevEdge_rev[1] ]
28         found = False
29         for iE in range( len( geomEdges )):
30             v1,v2 = geompy.SubShapeAll( geomEdges[ iE ], geompy.ShapeType["VERTEX"])
31             same1,same2 = [( geompy.MinDistance( prevV2, v ) < 1e-7 ) for v in [v1,v2] ]
32             if not same1 and not same2: continue
33             sortedEdges.append(( geomEdges.pop( iE ), same1 ))
34             found = True
35             break
36         assert found
37     sortedEdges.reverse()
38
39     # put nodes on edges in a right order
40     nodes = []
41     for edge, isForward in sortedEdges:
42         v1,v2 = geompy.SubShapeAll( edge, geompy.ShapeType["VERTEX"])
43         edgeNodes = mesh.GetSubMeshNodesId( v2,   all=False ) + \
44                     mesh.GetSubMeshNodesId( edge, all=False ) + \
45                     mesh.GetSubMeshNodesId( v1,   all=False )
46         if not isForward: edgeNodes.reverse()
47         nodes.extend( edgeNodes[:-1] )
48
49     # create nodes inside the geomFace
50     r1 = 0.6
51     r2 = 1 - r1
52     nodesInside = []
53     for n in nodes:
54         nXYZ = mesh.GetNodeXYZ( n )
55         newXYZ = np.add( np.multiply( r1, gcXYZ ), np.multiply( r2, nXYZ ))
56         nodesInside.append( mesh.AddNode( newXYZ[0], newXYZ[1], newXYZ[2] ))
57         mesh.SetNodeOnFace( nodesInside[-1], geomFace, 0, 0 )
58
59     # find out orientation of faces to create
60     #    geomFace normal
61     faceNorm = geompy.GetNormal( geomFace )
62     v1,v2 = [ geompy.PointCoordinates( v ) \
63               for v in geompy.SubShapeAll( faceNorm, geompy.ShapeType["VERTEX"]) ]
64     faceNormXYZ = np.subtract( v2, v1 )
65     outDirXYZ   = np.subtract( v1, [ 50, 50, 50 ] )
66     if np.dot( faceNormXYZ, outDirXYZ ) < 0: # reversed face
67         faceNormXYZ = np.multiply( -1., faceNormXYZ )
68     #   mesh face normal
69     e1 = np.subtract( mesh.GetNodeXYZ( nodes[0] ), mesh.GetNodeXYZ( nodes[1] ))
70     e2 = np.subtract( mesh.GetNodeXYZ( nodes[0] ), mesh.GetNodeXYZ( nodesInside[0] ))
71     meshNorm = np.cross( e1, e2 )
72     #   faces orientation
73     reverse = ( np.dot( faceNormXYZ, meshNorm ) < 0 )
74
75     # create mesh faces
76     iN = len( nodes )
77     while iN:
78         n1, n2, n3, n4 = nodes[iN-1], nodes[iN-2], nodesInside[iN-2], nodesInside[iN-1]
79         iN -= 1
80         if reverse:
81             f = mesh.AddFace( [n1, n2, n3, n4] )
82         else:
83             f = mesh.AddFace( [n4, n3, n2, n1] )
84         # new faces must be assigned to geometry to allow 3D algorithm finding them
85         mesh.SetMeshElementOnShape( f, geomFace )
86
87     if reverse:
88         nodesInside.reverse()
89     polygon = mesh.AddPolygonalFace( nodesInside )
90     mesh.SetMeshElementOnShape( polygon, geomFace )
91
92     return
93
94 # create geometry and get faces to mesh with my2DMeshing()
95 box = geompy.MakeBoxDXDYDZ( 100, 100, 100 )
96 f1 = geompy.SubShapeAll( box, geompy.ShapeType["FACE"])[0]
97 f2 = geompy.GetOppositeFace( box, f1 )
98 geompy.addToStudy( box, "box" )
99 geompy.addToStudy( f1, "f1" )
100 geompy.addToStudy( f2, "f2" )
101
102 # compute 1D mesh
103 mesh = smesh.Mesh( box )
104 mesh.Segment().NumberOfSegments( 5 )
105 mesh.Compute()
106
107 # compute 2D mesh
108 mesh.Quadrangle()
109 mesh.UseExistingFaces(f1) # UseExistingFaces() allows using my2DMeshing()
110 mesh.UseExistingFaces(f2)
111 my2DMeshing( f1 )
112 my2DMeshing( f2 )
113 assert mesh.Compute()
114
115 # compute 3D mesh
116 mesh.Prism()
117 assert mesh.Compute()
118
119 \endcode
120
121 Resulting mesh:
122 \image html use_existing_face_sample_mesh.png
123
124 */