Salome HOME
ad5698f383617bbdd52eea1ec81bf6e417f641f2
[modules/smesh.git] / src / SMESH_SWIG / SMESH_AdvancedEditor.py
1 import smesh
2 import SMESH
3 import math
4
5 def GetNewNodes(mesh,Elems,OldNodes):
6     """
7     Auxilary function, which return list of nodes from
8     given Elems avoided nodes from OldNodes
9     """
10     newnodes = []
11     for i in Elems:
12         nbn = mesh.GetElemNbNodes(i)
13         for j in range(0,nbn):
14             nn = mesh.GetElemNode(i,j)
15             isold = 0
16             for k in range(0,len(newnodes)):
17                 if nn==newnodes[k]:
18                     isold = 1
19                     break
20                 pass
21             if isold: continue
22             for k in range(0,len(OldNodes)):
23                 if nn==OldNodes[k]:
24                     isold = 1
25                     break
26                 pass
27             if isold: continue
28             newnodes.append(nn)
29             pass
30         pass
31     return newnodes
32             
33     
34 # create empty mesh
35 mesh = smesh.smesh.CreateEmptyMesh()
36
37 ed = mesh.GetMeshEditor()
38 tol = 0.001
39
40 # create a cross from quadrangle faces
41 # 1. create first edge and make extrusion along 0x
42 n1 = ed.AddNode(55,-5,0)
43 n2 = ed.AddNode(55,5,0)
44 e1 = ed.AddEdge([n1,n2])
45 dir1 = SMESH.DirStruct(SMESH.PointStruct(-10,0,0))
46 ed.ExtrusionSweep([e1],dir1,11)
47 # 2. create second edge and make extrusion along 0y
48 n3 = ed.AddNode(-5,-55,0)
49 n4 = ed.AddNode(5,-55,0)
50 e2 = ed.AddEdge([n3,n4])
51 dir2 = SMESH.DirStruct(SMESH.PointStruct(0,10,0))
52 ed.ExtrusionSweep([e2],dir2,11)
53
54 # since result has coincident nodes and faces
55 # we have to make merge
56 nodes = ed.FindCoincidentNodes(0.001)
57 ed.MergeNodes(nodes)
58 ed.MergeEqualElements()
59
60 # make extrusion faces along 0z
61 faces = mesh.GetElementsByType(SMESH.FACE)
62 nbf = len(faces)
63 maxang = 2.0
64 zstep = 5
65 nbzsteps = 50
66 dir3 = SMESH.DirStruct(SMESH.PointStruct(0,0,zstep))
67 newfaces = [] # list for keeping created top faces
68               # during extrusion
69
70 for i in range(0,nbzsteps):
71     ed.ExtrusionSweep(faces,dir3,1)
72     # find top faces after each extrusion and keep them
73     res = ed.GetLastCreatedElems()
74     nbr = len(res)
75     nfaces = []
76     for j in res:
77         nbn = mesh.GetElemNbNodes(j)
78         if nbn!=4: continue
79         nn1 = mesh.GetElemNode(j,0)
80         xyz1 = mesh.GetNodeXYZ(nn1)
81         nn2 = mesh.GetElemNode(j,1)
82         xyz2 = mesh.GetNodeXYZ(nn2)
83         nn3 = mesh.GetElemNode(j,2)
84         xyz3 = mesh.GetNodeXYZ(nn3)
85         if abs(xyz1[2]-xyz2[2])<tol and abs(xyz1[2]-xyz3[2])<tol :
86             # this face is a top face
87             nfaces.append(j)
88             pass
89         pass
90     if len(nfaces)!=nbf:
91         print "len(nfaces)!=nbf"
92         break
93     newfaces.append(nfaces)
94     # update faces for before next step of extrusion
95     faces = nfaces
96     pass
97     
98 # rotate faces from newfaces
99 axisr1 = SMESH.AxisStruct(0,0,0,0,0,1)
100 for i in range(0,nbzsteps):
101     ang = maxang*(1-math.cos((i+1)*math.pi/nbzsteps))
102     ed.Rotate(newfaces[i],axisr1,ang,0)
103
104
105 # create circles
106 # create two edges and rotate them for creation
107 # full circle
108 n5 = ed.AddNode(65,0,0)
109 n6 = ed.AddNode(67.5,0,0)
110 n7 = ed.AddNode(70,0,0)
111 e56 = ed.AddEdge([n5,n6])
112 e67 = ed.AddEdge([n6,n7])
113 axisr2 = SMESH.AxisStruct(65,0,0,0,1,0)
114 ed.RotationSweep([e56,e67],axisr2, math.pi/6, 12, tol)
115 res = ed.GetLastCreatedElems()
116 faces1 = []
117 for i in res:
118     nbn = mesh.GetElemNbNodes(i)
119     if nbn>2: faces1.append(i)
120     pass
121 nbf1 = len(faces1)
122
123 # create other two edges and rotate them for creation
124 # other full circle
125 n8 = ed.AddNode(-65,0,0)
126 n9 = ed.AddNode(-67.5,0,0)
127 n10 = ed.AddNode(-70,0,0)
128 e8 = ed.AddEdge([n8,n9])
129 e9 = ed.AddEdge([n9,n10])
130 axisr3 = SMESH.AxisStruct(-65,0,0,0,-1,0)
131 ed.RotationSweep([e8,e9],axisr3, math.pi/6, 12, tol)
132 res = ed.GetLastCreatedElems()
133 faces2 = []
134 for i in res:
135     nbn = mesh.GetElemNbNodes(i)
136     if nbn>2: faces2.append(i)
137     pass
138 nbf2 = len(faces2)
139
140 # there are coincident nodes after rotation
141 # therefore we have to merge nodes
142 nodes = ed.FindCoincidentNodes(0.001)
143 ed.MergeNodes(nodes)
144
145 nbcircs = 2
146 nbrsteps = 24
147 nbrs = nbcircs*nbrsteps
148 dz = nbzsteps*zstep/nbrs
149
150 # create first spiral
151 oldnodes = []
152 newnodes = GetNewNodes(mesh,faces1,oldnodes)
153 oldnodes = newnodes
154
155 nodes = []
156 ed.RotationSweep(faces1,axisr1, math.pi*2/nbrsteps, nbrs, tol)
157 res = ed.GetLastCreatedElems()
158
159 for i in range(0,nbrs):
160     volumes = []
161     for j in range(0,nbf1): volumes.append(res[i+j*nbrs])
162     newnodes = GetNewNodes(mesh,volumes,oldnodes)
163     for j in newnodes:
164         xyz = mesh.GetNodeXYZ(j)
165         ed.MoveNode(j,xyz[0],xyz[1],xyz[2]+dz*(i+1))
166         pass
167     oldnodes = newnodes
168     pass
169
170 # create second spiral
171 oldnodes = []
172 newnodes = GetNewNodes(mesh,faces2,oldnodes)
173 oldnodes = newnodes
174
175 nodes = []
176 ed.RotationSweep(faces2,axisr1, math.pi*2/nbrsteps, nbrs, tol)
177 res = ed.GetLastCreatedElems()
178
179 for i in range(0,nbrs):
180     volumes = []
181     for j in range(0,nbf2): volumes.append(res[i+j*nbrs])
182     newnodes = GetNewNodes(mesh,volumes,oldnodes)
183     for j in newnodes:
184         xyz = mesh.GetNodeXYZ(j)
185         ed.MoveNode(j,xyz[0],xyz[1],xyz[2]+dz*(i+1))
186         pass
187     oldnodes = newnodes
188     pass
189
190