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