1 # -*- coding: iso-8859-1 -*-
7 from salome.geom import geomBuilder
12 def demidisk(study, r1, a1, roty=0, solid_thickness=0): # TODO retablir l'épaisseur de solide à 0 par défaut
13 if solid_thickness < 1e-7:
18 geompy = geomBuilder.New(study)
20 O = geompy.MakeVertex(0, 0, 0)
21 OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
22 OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
23 OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
27 v0 = geompy.MakeVertex(0, 0, 0)
28 v[0] = geompy.MakeVertex(0, r1/2.0, 0)
29 v[1] = geompy.MakeVertex(0, r1, 0)
30 l[1] = geompy.MakeLineTwoPnt(v[0], v[1])
31 l[2] = geompy.MakeRotation(l[1], OX, a1*math.pi/180.0)
32 v[4] = geompy.MakeRotation(v[0], OX, a1*math.pi/180.0)
33 v[6] = geompy.MakeRotation(v[1], OX, a1*math.pi/180.0)
35 v[2] = geompy.MakeVertex(0, -r1/2.0, 0)
36 v[3] = geompy.MakeVertex(0, -r1, 0)
37 l[3] = geompy.MakeLineTwoPnt(v[2], v[3])
38 l[4] = geompy.MakeRotation(l[3], OX, -a1*math.pi/180.0)
39 v[5] = geompy.MakeRotation(v[2], OX, -a1*math.pi/180.0)
40 v[7] = geompy.MakeRotation(v[3], OX, -a1*math.pi/180.0)
42 l[5] = geompy.MakeLineTwoPnt(v[4], v[5])
43 l[6] = geompy.MakeLineTwoPnt(v[0], v[4])
44 l[7] = geompy.MakeLineTwoPnt(v[2], v[5])
46 v7 = geompy.MakeVertex(0, 0, r1)
47 arc1 = geompy.MakeArc(v[1], v7, v[3])
48 l[0] = geompy.MakeLineTwoPnt(v[1], v[3])
49 face1 = geompy.MakeFaceWires([arc1, l[0]], 1)
52 v0 = geompy.MakeVertex(0, r1 + solid_thickness, 0)
53 l0 = geompy.MakeLineTwoPnt(v[1], v0)
54 l2 = geompy.MakeRotation(l0, OX, a1*math.pi/180.0)
55 l3 = geompy.MakeRotation(l0, OX, math.pi - (a1*math.pi/180.0))
56 face2 = geompy.MakeRevolution(l0, OX, a1*math.pi/180.0)
57 face3 = geompy.MakeRevolution(l2, OX, math.pi - 2*a1*math.pi/180.0)
58 face4 = geompy.MakeRevolution(l3, OX, a1*math.pi/180.0)
59 part0 = geompy.MakePartition([face1], [l[2], l[4], l[5], l[6], l[7]], [], [], geompy.ShapeType["FACE"], 0, [], 0, True)
60 compound1 = geompy.MakeCompound([part0, face2, face3, face4])
61 part1 = geompy.MakeGlueEdges(compound1,1e-7)
63 part1 = geompy.MakePartition([face1], [l[2], l[4], l[5], l[6], l[7]], [], [], geompy.ShapeType["FACE"], 0, [], 0, True)
66 vrot = [ geompy.MakeRotation(vert, OY, roty*math.pi/180.0) for vert in v ]
67 lrot = [ geompy.MakeRotation(lin, OY, roty*math.pi/180.0) for lin in l ]
68 arc = geompy.MakeRotation(arc1, OY, roty*math.pi/180.0)
69 part = geompy.MakeRotation(part1, OY, roty*math.pi/180.0)
70 return vrot, lrot, arc, part
72 return v, l, arc1, part1
74 def pointsProjetes(study, vref, face):
75 geompy = geomBuilder.New(study)
76 vface = geompy.ExtractShapes(face, geompy.ShapeType["VERTEX"], True)
77 vord = range(len(vref))
78 plan = geompy.MakePlaneThreePnt(vref[0], vref[1], vref[-1], 10000)
79 vproj = [ geompy.MakeProjection(vert, plan) for vert in vface ]
80 for i,v in enumerate(vproj):
81 dist = [ (geompy.MinDistance(v, vr), j) for j,vr in enumerate(vref) ]
84 if dist[0][0] < 1.e-3:
85 vord[dist[0][1]] = vface[i]
88 def arcsProjetes(study, vf, face):
89 geompy = geomBuilder.New(study)
90 lface = geompy.ExtractShapes(face, geompy.ShapeType["EDGE"], True)
92 ends = [vf[1], vf[6], vf[7], vf[3]]
95 pts = geompy.ExtractShapes(lf, geompy.ShapeType["VERTEX"], True)
96 if (((geompy.MinDistance(pts[0], ends[i]) < 0.001) and (geompy.MinDistance(pts[1], ends[i+1]) < 0.001)) or
97 ((geompy.MinDistance(pts[1], ends[i]) < 0.001) and (geompy.MinDistance(pts[0], ends[i+1]) < 0.001))):
104 def build_shape(study, r1, r2, h1, h2):
105 geompy = geomBuilder.New(study)
107 O = geompy.MakeVertex(0, 0, 0)
108 OX = geompy.MakeVectorDXDYDZ(1, 0, 0)
109 OY = geompy.MakeVectorDXDYDZ(0, 1, 0)
110 OZ = geompy.MakeVectorDXDYDZ(0, 0, 1)
114 ratio = float(r2)/float(r1)
115 if ratio > (1.0 -seuilmax):
116 a1 = 45.0*(1.0 -ratio)/seuilmax
119 # --- sections droites des deux demi cylindres avec le partionnement
121 v1, l1, arc1, part1 = demidisk(study, r1, a1)
122 v2, l2, arc2, part2 = demidisk(study, r2, a1, 90.0)
124 # --- extrusion des sections --> demi cylindres de travail, pour en extraire les sections utilisées au niveau du Té
125 # et enveloppe cylindrique du cylindre principal
127 demicyl1 = geompy.MakePrismVecH(part1, OX, h1)
128 demicyl2 = geompy.MakePrismVecH(part2, OZ, h2)
129 arcextru = geompy.MakePrismVecH(arc1, OX, h1)
132 res = geompy.MakeCompound([demicyl1,demicyl2])
136 # --- plan de coupe à 45° sur le cylindre principal,
137 # section à 45° du cylndre principal,
138 # section du cylindre secondaire par l'enveloppe cylindique du cylindre principal
140 plan1 = geompy.MakePlane(O, OX, 4*r1)
141 planr = geompy.MakeRotation(plan1, OY, 45*math.pi/180.0)
142 geompy.addToStudy(planr, 'planr')
144 sect45 = geompy.MakeCommonList([demicyl1, planr], True)
145 geompy.addToStudy(sect45, 'sect45')
147 sect90 = geompy.MakeCommonList([demicyl2, arcextru], True)
148 geompy.addToStudy(sect90, 'sect90')
150 # --- liste ordonnée des points projetés sur les deux sections
152 vord45 = pointsProjetes(study, v1, sect45)
153 vord90 = pointsProjetes(study, v2, sect90)
154 for i,v in enumerate(vord45):
155 geompy.addToStudyInFather(sect45, v, 'v%d'%i)
156 for i,v in enumerate(vord90):
157 geompy.addToStudyInFather(sect90, v, 'v%d'%i)
159 # --- identification des projections des trois arcs de cercle, sur les deux sections.
161 lord45 = arcsProjetes(study, vord45, sect45)
162 lord90 = arcsProjetes(study, vord90, sect90)
163 for i,l in enumerate(lord45):
164 geompy.addToStudyInFather(sect45, l, 'l%d'%i)
165 for i,l in enumerate(lord90):
166 geompy.addToStudyInFather(sect90, l, 'l%d'%i)
168 # --- abaissement des quatre points centraux de la section du cylindre secondaire
171 for i in (0, 2, 4, 5):
172 vord90[i] = geompy.TranslateDXDYDZ(vord90[i], 0, 0, dz, True)
173 geompy.addToStudyInFather(sect90, vord90[i], 'vm%d'%i)
175 # --- création des deux arêtes curvilignes sur l'enveloppe cylindrique du cylindre principal, à la jonction
177 curv = [None for i in range(4)] # liaisons entre les points 1, 3, 6 et 7 des 2 sections
179 curv[0] = geompy.MakeArcCenter(O, vord90[1] , vord45[1], False)
180 curv[1] = geompy.MakeArcCenter(O, vord90[3] , vord45[3], False)
182 lipts = ((6, 6, 4), (7, 7, 5))
183 for i, ipts in enumerate(lipts):
188 plan = geompy.MakePlaneThreePnt(p0, p1, p2, 10000)
189 #geompy.addToStudy(plan, "plan%d"%i)
190 section = geompy.MakeSection(plan, arcextru, True)
191 secpart = geompy.MakePartition([section], [sect45, sect90], [], [], geompy.ShapeType["EDGE"], 0, [], 0, True)
192 geompy.addToStudy(secpart, "secpart%d"%i)
193 lsec = geompy.ExtractShapes(secpart, geompy.ShapeType["EDGE"], True)
194 #print "len(lsec)", len(lsec)
196 # TODO : revoir ça dans le cas avec solide
198 pts = geompy.ExtractShapes(l, geompy.ShapeType["VERTEX"], True)
199 if (((geompy.MinDistance(pts[0], p0) < 0.001) and (geompy.MinDistance(pts[1], p1) < 0.001)) or
200 ((geompy.MinDistance(pts[1], p0) < 0.001) and (geompy.MinDistance(pts[0], p1) < 0.001))):
204 # RNC : commente temporairement
205 #for i,l in enumerate(curv):
206 # geompy.addToStudyInFather(arcextru, l, "curv%d"%i)
208 # --- creation des arêtes droites manquantes, des faces et volumes pour les quatre volumes de la jonction
210 edges = [None for i in range(8)]
211 edges[0] = geompy.MakeLineTwoPnt(vord45[0], vord90[0])
213 edges[2] = geompy.MakeLineTwoPnt(vord45[2], vord90[2])
215 edges[4] = geompy.MakeLineTwoPnt(vord45[4], vord90[4])
216 edges[5] = geompy.MakeLineTwoPnt(vord45[5], vord90[5])
219 #for i,l in enumerate(edges):
221 # geompy.addToStudy( l, "edge%d"%i)
223 ed45 = [None for i in range(8)]
224 ed45[0] = geompy.MakeLineTwoPnt(vord45[0], vord45[2])
225 ed45[1] = geompy.MakeLineTwoPnt(vord45[0], vord45[1])
226 ed45[2] = geompy.MakeLineTwoPnt(vord45[4], vord45[6])
227 ed45[3] = geompy.MakeLineTwoPnt(vord45[2], vord45[3])
228 ed45[4] = geompy.MakeLineTwoPnt(vord45[5], vord45[7])
229 ed45[5] = geompy.MakeLineTwoPnt(vord45[4], vord45[5])
230 ed45[6] = geompy.MakeLineTwoPnt(vord45[0], vord45[4])
231 ed45[7] = geompy.MakeLineTwoPnt(vord45[2], vord45[5])
232 for i,l in enumerate(ed45):
233 geompy.addToStudyInFather(sect45, l, "ed45_%d"%i)
235 ed90 = [None for i in range(8)]
236 ed90[0] = geompy.MakeLineTwoPnt(vord90[0], vord90[2])
237 ed90[1] = geompy.MakeLineTwoPnt(vord90[0], vord90[1])
238 ed90[2] = geompy.MakeLineTwoPnt(vord90[4], vord90[6])
239 ed90[3] = geompy.MakeLineTwoPnt(vord90[2], vord90[3])
240 ed90[4] = geompy.MakeLineTwoPnt(vord90[5], vord90[7])
241 ed90[5] = geompy.MakeLineTwoPnt(vord90[4], vord90[5])
242 ed90[6] = geompy.MakeLineTwoPnt(vord90[0], vord90[4])
243 ed90[7] = geompy.MakeLineTwoPnt(vord90[2], vord90[5])
244 for i,l in enumerate(ed90):
245 geompy.addToStudyInFather(sect90, l, "ed90_%d"%i)
248 faci.append(geompy.MakeFaceWires([ed45[6], edges[0], ed90[6], edges[4]], 0))
249 faci.append(geompy.MakeFaceWires([ed45[7], edges[2], ed90[7], edges[5]], 0))
250 faci.append(geompy.MakeFaceWires([ed45[2], edges[4], ed90[2], edges[6]], 0))
251 faci.append(geompy.MakeFaceWires([ed45[5], edges[4], ed90[5], edges[5]], 0))
252 faci.append(geompy.MakeFaceWires([ed45[4], edges[5], ed90[4], edges[7]], 0))
253 faci.append(geompy.MakeFaceWires([ed90[0], ed90[6], ed90[5], ed90[7]], 0))
254 faci.append(geompy.MakeFaceWires([ed90[1], ed90[6], ed90[2], lord90[0]], 0))
255 faci.append(geompy.MakeFaceWires([ed90[2], ed90[5], ed90[4], lord90[1]], 0))
256 faci.append(geompy.MakeFaceWires([ed90[3], ed90[7], ed90[4], lord90[2]], 0))
257 for i,f in enumerate(faci):
258 geompy.addToStudy(f, "faci_%d"%i)
260 # --- extrusion droite des faces de jonction, pour reconstituer les demi cylindres
262 extru1 = geompy.MakePrismVecH(sect45, OX, h1+10)
264 base2 = geompy.MakePartition(faci[5:], [], [], [], geompy.ShapeType["FACE"], 0, [], 0, True)
265 extru2 = geompy.MakePrismVecH(base2, OZ, h2)
267 # --- partition et coupe
269 demiDisque = geompy.MakeFaceWires([arc1, l1[0]], 1)
270 demiCylindre = geompy.MakePrismVecH(demiDisque, OX, h1)
272 box = geompy.MakeBox(0, -2*(r1+h1), -2*(r1+h1), 2*(r1+h1), 2*(r1+h1), 2*(r1+h1))
273 rot = geompy.MakeRotation(box, OY, 45*math.pi/180.0)
275 garder = geompy.MakeCutList(demiCylindre, [extru2, rot], True)
276 raccord = geompy.MakePartition([garder], faci, [], [], geompy.ShapeType["SOLID"], 0, [], 0, True)
277 assemblage = geompy.MakePartition([raccord, extru1, extru2], [], [], [], geompy.ShapeType["SOLID"], 0, [], 0, True)
279 box = geompy.MakeBox(-1, -(r1+r2), -1, h1, r1+r2, h2)
280 geompy.addToStudy(box, "box")
281 final = geompy.MakeCommonList([box, assemblage], True)
283 # --- Partie inférieure
284 v3, l3, arc3, part3 = demidisk(study, r1, a1, 180.0)
285 geompy.addToStudy(part3,"part3")
286 extru3 = geompy.MakePrismVecH(part3, OX, h1)
287 geompy.addToStudy(extru3,"extru3")
291 compound = geompy.MakeCompound([final, extru3])
292 plane = geompy.MakePlane(O,OX,2000)
293 compound_mirrored = geompy.MakeMirrorByPlane(compound, plane)
294 final = geompy.MakeCompound([compound, compound_mirrored])
298 if __name__=="__main__":
299 """For testing purpose"""
301 theStudy = salome.myStudy
302 geompy = geomBuilder.New(theStudy)
303 res = build_shape(theStudy, 80, 20, 100, 100)
304 geompy.addToStudy(res, "res")