5 def GetNewNodes(mesh,Elems,OldNodes):
7 Auxilary function, which return list of nodes from
8 given Elems avoided nodes from OldNodes
12 nbn = mesh.GetElemNbNodes(i)
13 for j in range(0,nbn):
14 nn = mesh.GetElemNode(i,j)
16 for k in range(0,len(newnodes)):
22 for k in range(0,len(OldNodes)):
35 mesh = smesh.smesh.CreateEmptyMesh()
37 ed = mesh.GetMeshEditor()
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)
54 # since result has coincident nodes and faces
55 # we have to make merge
56 nodes = ed.FindCoincidentNodes(0.001)
58 ed.MergeEqualElements()
60 # make extrusion faces along 0z
61 faces = mesh.GetElementsByType(SMESH.FACE)
66 dir3 = SMESH.DirStruct(SMESH.PointStruct(0,0,zstep))
67 newfaces = [] # list for keeping created top faces
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()
77 nbn = mesh.GetElemNbNodes(j)
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
91 print "len(nfaces)!=nbf"
93 newfaces.append(nfaces)
94 # update faces for before next step of extrusion
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)
106 # create two edges and rotate them for creation
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()
118 nbn = mesh.GetElemNbNodes(i)
119 if nbn>2: faces1.append(i)
123 # create other two edges and rotate them for creation
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()
135 nbn = mesh.GetElemNbNodes(i)
136 if nbn>2: faces2.append(i)
140 # there are coincident nodes after rotation
141 # therefore we have to merge nodes
142 nodes = ed.FindCoincidentNodes(0.001)
147 nbrs = nbcircs*nbrsteps
148 dz = nbzsteps*zstep/nbrs
150 # create first spiral
152 newnodes = GetNewNodes(mesh,faces1,oldnodes)
156 ed.RotationSweep(faces1,axisr1, math.pi*2/nbrsteps, nbrs, tol)
157 res = ed.GetLastCreatedElems()
159 for i in range(0,nbrs):
161 for j in range(0,nbf1): volumes.append(res[i+j*nbrs])
162 newnodes = GetNewNodes(mesh,volumes,oldnodes)
164 xyz = mesh.GetNodeXYZ(j)
165 ed.MoveNode(j,xyz[0],xyz[1],xyz[2]+dz*(i+1))
170 # create second spiral
172 newnodes = GetNewNodes(mesh,faces2,oldnodes)
176 ed.RotationSweep(faces2,axisr1, math.pi*2/nbrsteps, nbrs, tol)
177 res = ed.GetLastCreatedElems()
179 for i in range(0,nbrs):
181 for j in range(0,nbf2): volumes.append(res[i+j*nbrs])
182 newnodes = GetNewNodes(mesh,volumes,oldnodes)
184 xyz = mesh.GetNodeXYZ(j)
185 ed.MoveNode(j,xyz[0],xyz[1],xyz[2]+dz*(i+1))