1 # Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
22 # File : SMESH_fix_volute.py
23 # Author : Paul RASCLE, EDF
34 ##import SMESH_BasicHypothesis_idl
38 # -----------------------------------------------------------------------------
40 def MakeFace(lstEdges) :
42 Creates a face from 4 edges
45 for edge in lstEdges :
46 lstWire.append(edge._get_Name())
47 wire = geompy.MakeWire(lstWire)
48 face = geompy.MakeFace(wire, 1)
51 def MakeShell(lstFaces) :
53 Creates a shell from 6 faces
56 for face in lstFaces :
57 lstShell.append(face._get_Name())
58 shell = geompy.MakeSewing(lstShell, 0.00001)
61 def MakeCompound(lstShells) :
63 Creates a compound from several shells
66 for shell in lstShells :
67 lstCompound.append(shell._get_Name())
68 compound = geompy.MakeCompound(lstCompound)
71 # -----------------------------------------------------------------------------
73 geom = salome.lcc.FindOrLoadComponent("FactoryServer", "Geometry")
74 myBuilder = salome.myStudy.NewBuilder()
76 ShapeTypeCompSolid = 1
88 ##epaisseurPlq = 0.150
90 ##hauteurFlanc = 0.380
91 ##epaisseurFlanc = 0.112
92 ##rayonConge = 0.150 - epaisseurFlanc
94 ##epaisseurFond = 0.162
96 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
106 rayonConge = 150 - epaisseurFlanc
110 posAxeTrou = hauteurFlanc -(180 + rayonTrou)
114 # ---- points, directions de base
116 p0 = geom.MakePointStruct(0., 0., 0.)
117 px = geom.MakePointStruct(100., 0., 0.)
118 vx = geom.MakeDirection(px)
119 py = geom.MakePointStruct(0., 100., 0.)
120 vy = geom.MakeDirection(py)
121 pz = geom.MakePointStruct(0., 0., 100.)
122 vz = geom.MakeDirection(pz)
124 # ---- volumes de controle
126 volglob = geom.MakeBox( 0., 0., 0.,
129 hauteurFlanc + epaisseurPlq +marge)
130 idvolglob = geompy.addToStudy(volglob, "volglob")
131 volhaut = geom.MakeBox(-marge,
132 0.5*(largeurPlq - epaisseurFond),
133 hauteurFlanc + epaisseurPlq,
136 hauteurFlanc + epaisseurPlq +2*marge)
137 idvolhaut = geompy.addToStudy(volhaut, "volhaut")
141 #plaque = geom.MakeBox( 0., 0., 0., longueurPlq, largeurPlq, epaisseurPlq )
142 plaque = geom.MakeBox( -marge, -marge/2, 0.,
143 longueurPlq +2*marge, largeurPlq, epaisseurPlq )
146 fond = geom.MakeBox( rayonConge,
147 largeurPlq - epaisseurFond,
149 longueurPlq - rayonConge,
151 epaisseurPlq + hauteurFlanc +marge/2)
155 pAxe1 = geom.MakePointStruct( 0.5*longueurPlq,
157 epaisseurPlq + posAxeTrou)
158 cylFond = geom.MakeCylinder(pAxe1, vy, rayonTrou, 1.1*largeurPlq)
159 fondTroue = geom.MakeBoolean(fond, cylFond, 2)
161 piece = geom.MakeBoolean(plaque, fondTroue, 3)
162 idPiece = geompy.addToStudy(piece, "piece")
166 cote1 = geom.MakeBox(rayonConge,
169 epaisseurFlanc + rayonConge,
170 largeurPlq - epaisseurFond,
171 hauteurFlanc + epaisseurPlq +marge/2)
172 piece = geom.MakeBoolean(piece, cote1, 3)
174 cote2 = geom.MakeBox(longueurPlq -epaisseurFlanc -rayonConge,
177 longueurPlq -rayonConge,
178 largeurPlq - epaisseurFond,
179 hauteurFlanc + epaisseurPlq +marge/2)
180 piece = geom.MakeBoolean(piece, cote2, 3)
181 idPiece = geompy.addToStudy(piece, "piece1")
183 # ---- ellipse du flanc
185 he = hauteurFlanc -2*rayonConge
186 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
188 cose = math.sqrt(1.-sine*sine)
189 pe = geom.MakePointStruct(sine, 0., cose)
190 ve = geom.MakeDirection(pe)
191 cyl0 = geom.MakeCylinder(p0, ve, re, 2*he)
192 axecy = geom.MakeAxisStruct(0., 0., 0.,sine, 0., cose)
193 cyl1 = geom.MakeRotation(cyl0, axecy, 0.5)
194 cyle = geom.MakeTranslation(cyl1,
195 -marge*sine, 0., -marge*cose)
196 boxe = geom.MakeBox(0., 0., 0., 3*he, -2*re, 3*he)
197 #idcyle = geompy.addToStudy(cyle, "cyle")
198 #idboxe = geompy.addToStudy(boxe, "boxe")
199 cylcoup = geom.MakeBoolean(cyle, boxe, 2)
200 idcylcoup = geompy.addToStudy(cylcoup, "cylcoup")
202 aretes = geompy.SubShapeAll(cylcoup, ShapeTypeEdge)
203 # OCC3.1 : aretes[3], OCC4.0 aretes[5]
204 shape = geom.MakeCopy(aretes[5])
205 aShape = geom.MakeTranslation(shape,
206 0., rayonConge +re, epaisseurPlq +2*rayonConge)
208 # ---- segments face objet decoupe des flancs
210 pf1 = geom.MakePointStruct(0.,
212 hauteurFlanc + epaisseurPlq +marge)
213 pf2 = geom.MakePointStruct(0.,
214 0.5*(largeurPlq - epaisseurFond),
215 hauteurFlanc + epaisseurPlq +marge)
216 pf3 = geom.MakePointStruct(0.,
217 0.5*(largeurPlq - epaisseurFond),
218 hauteurFlanc + epaisseurPlq)
219 pf4 = geom.MakePointStruct(0.,
221 epaisseurPlq +2*rayonConge)
222 pf5 = geom.MakePointStruct(0.,
225 pf6 = geom.MakePointStruct(0.,
229 vf1 = geom.MakeEdge(pf1,pf2)
230 vf2 = geom.MakeEdge(pf2,pf3)
231 vf4 = geom.MakeEdge(pf4,pf5)
232 vf5 = geom.MakeEdge(pf5,pf6)
233 vf6 = geom.MakeEdge(pf6,pf1)
235 id1 = geompy.addToStudy(vf1,"vf1")
236 id2 = geompy.addToStudy(vf2,"vf2")
237 ids = geompy.addToStudy(aShape,"aShape")
238 id4 = geompy.addToStudy(vf4,"vf4")
239 id5 = geompy.addToStudy(vf5,"vf5")
240 id6 = geompy.addToStudy(vf6,"vf6")
242 faceDec = MakeFace([vf1,vf2,aShape,vf4,vf5,vf6])
243 idf = geompy.addToStudy(faceDec,"faceDec")
245 # forme de decoupe par extrusion
247 pfe = geom.MakePointStruct(longueurPlq+4*marge, 0., 0.)
248 decoupe = geom.MakePrism(faceDec, p0, pfe)
249 decoupe = geom.MakeTranslation(decoupe, -2*marge, 0., 0.)
250 idec = geompy.addToStudy(decoupe, "decoupe")
252 # decoupe piece1 par decoupe
254 piece2 = geom.MakeBoolean(piece, decoupe, 2)
255 idpiece = geompy.addToStudy(piece2, "piece2")
259 conges = geompy.SubShapeAllSorted(piece2, ShapeTypeEdge)
262 # boucle pour trouver les bons indices
265 # print ind, ff._get_Index()
266 # name = "edge%d"%(ind)
267 # geompy.addToStudy(ff, name)
271 index1 = conges[7]._get_Index()
272 index2 = conges[11]._get_Index()
273 index3 = conges[36]._get_Index()
274 index4 = conges[43]._get_Index()
276 #piece3 = geompy.MakeFillet (piece2, rayonConge, ShapeTypeEdge, [3,4,8,9])
277 piece3 = geompy.MakeFillet (piece2, rayonConge, ShapeTypeEdge, [index1[0],index2[0],index3[0],index4[0]])
279 idPiece = geompy.addToStudy(piece3, "piece3")
281 # partie incluse dans le volume de controle (devient non valide)
283 piece4 = geom.MakeBoolean(piece3, volglob, 1)
284 idPiece = geompy.addToStudy(piece4, "piece4")
286 # enlever volume haut
288 piece = geom.MakeBoolean(piece4, volhaut, 2)
289 idpiece = geompy.addToStudy(piece, "piece")
291 # -----------------------------------------------------------------------------
292 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
293 # -----------------------------------------------------------------------------
299 x1 = rayonConge + epaisseurFlanc
301 x2 = longueurPlq - rayonConge - epaisseurFlanc
302 x3h = longueurPlq - rayonConge
309 y1 = largeurPlq - epaisseurFond
312 y2p = largeurPlq + marge
317 z1m = epaisseurPlq -marge
319 z2 = epaisseurPlq + rayonConge
320 z3 = epaisseurPlq + 2*rayonConge
321 z4 = epaisseurPlq + hauteurFlanc
322 z4p = epaisseurPlq + hauteurFlanc + marge
324 zc = epaisseurPlq + posAxeTrou
325 zc2 = epaisseurPlq + (posAxeTrou -rayonTrou)/3
326 zc3 = epaisseurPlq + 2*(posAxeTrou -rayonTrou)/3
328 # ---- decoupe du fond
330 p11 = geom.MakePointStruct(x1, y1m, z1)
331 p12 = geom.MakePointStruct(x1, y1m, z2)
332 p13 = geom.MakePointStruct(x1, y1m, z3)
333 p14 = geom.MakePointStruct(x1, y1m, z4)
334 pc1 = geom.MakePointStruct(xc, y1m, z1)
335 pc2 = geom.MakePointStruct(xc, y1m, zc2)
336 pc3 = geom.MakePointStruct(xc, y1m, zc3)
337 pcc = geom.MakePointStruct(xc, y1m, zc)
338 pc4 = geom.MakePointStruct(xc, y1m, z4)
339 p21 = geom.MakePointStruct(x2, y1m, z1)
340 p22 = geom.MakePointStruct(x2, y1m, z2)
341 p23 = geom.MakePointStruct(x2, y1m, z3)
342 p24 = geom.MakePointStruct(x2, y1m, z4)
343 pcf = geom.MakePointStruct(xc, y2p, zc)
345 arc2 = geom.MakeArc(p12,pc2,p22)
346 arc3 = geom.MakeArc(p13,pc3,p23)
348 segz1 = geom.MakeVector(p11,p21)
349 #segz4 = geom.MakeVector(p14,p24)
350 segz41 = geom.MakeVector(p14,pc4)
351 segz42 = geom.MakeVector(pc4,p24)
352 segx11 = geom.MakeVector(p11,p12)
353 segx12 = geom.MakeVector(p12,p13)
354 segx13 = geom.MakeVector(p13,p14)
355 segxc2 = geom.MakeVector(pc1,pc2)
356 segxc3 = geom.MakeVector(pc2,pc3)
357 segxc4 = geom.MakeVector(pcc,pc4)
358 segx21 = geom.MakeVector(p21,p22)
359 segx22 = geom.MakeVector(p22,p23)
360 segx23 = geom.MakeVector(p23,p24)
361 segx1c1 = geom.MakeVector(p13,pcc)
362 segx1c2 = geom.MakeVector(p14,pcc)
363 segx2c1 = geom.MakeVector(p23,pcc)
364 segx2c2 = geom.MakeVector(p24,pcc)
367 facef.append(MakeFace([segx13,segx1c2,segx1c1]))
368 facef.append(MakeFace([segx23,segx2c2,segx2c1]))
369 facef.append(MakeFace([segx2c2,segxc4,segz42]))
370 facef.append(MakeFace([segx1c2,segz41,segxc4]))
371 facef.append(MakeFace([segx1c1,arc3,segx2c1]))
372 facef.append(MakeFace([segx12,arc2,segx22,arc3]))
373 facef.append(MakeFace([segx11,segz1,segx21,arc2]))
377 decf.append(geom.MakePrism(face,pcc,pcf))
379 axeCyl = geom.MakeAxisStruct( 0.5*longueurPlq,
381 epaisseurPlq + posAxeTrou,
385 cylFond2 = geom.MakeRotation(geom.MakeCopy(cylFond),axeCyl,math.pi)
386 idcylfond2 = geompy.addToStudy(cylFond2,"cylFond2")
390 fondec.append(geom.MakeBoolean(decf[id],cylFond2,2))
391 fondec.append(geom.MakeBoolean(decf[4],cylFond,2))
393 fondec.append(decf[id])
397 idfo = geompy.addToStudy(ff, "ff%d"%(iff))
400 # ----- autres blocs de decoupe
402 bcong1=geom.MakeBox(x0,y0,z1, x1,y1,z2)
403 bcong2=geom.MakeBox(x0,y1,z1, x1,y2,z2)
404 bcong3=geom.MakeBox(x2,y0,z1, x3,y1,z2)
405 bcong4=geom.MakeBox(x2,y1,z1, x3,y2,z2)
407 pcylx0 = geom.MakePointStruct(0., -marge, z2)
408 cylcongx0 = geom.MakeCylinder(pcylx0, vy, rayonConge, largeurPlq +2*marge)
409 idcylcongx0 = geompy.addToStudy(cylcongx0,"cylcongx0")
410 pcylx3 = geom.MakePointStruct(longueurPlq, -marge, z2)
411 cylcongx3 = geom.MakeCylinder(pcylx3, vy, rayonConge, largeurPlq +2*marge)
412 idcylcongx3 = geompy.addToStudy(cylcongx3,"cylcongx3")
413 pcyly0 = geom.MakePointStruct(-marge, 0., z2)
414 cylcongy0 = geom.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq +2*marge)
415 idcylcongy0 = geompy.addToStudy(cylcongy0,"cylcongy0")
417 bcong1=geom.MakeBoolean(bcong1,cylcongx0,2)
418 bcong2=geom.MakeBoolean(bcong2,cylcongx0,2)
419 bcong1=geom.MakeBoolean(bcong1,cylcongy0,2)
420 bcong3=geom.MakeBoolean(bcong3,cylcongx3,2)
421 bcong4=geom.MakeBoolean(bcong4,cylcongx3,2)
422 bcong3=geom.MakeBoolean(bcong3,cylcongy0,2)
424 pf1 = geom.MakePointStruct(0., y0h, z3)
425 pf2 = geom.MakePointStruct(0., y1, z3)
426 pf3 = geom.MakePointStruct(0., y1, z4)
427 pf4 = geom.MakePointStruct(0.,0.5*(largeurPlq - epaisseurFond) , z4)
428 vf1 = geom.MakeEdge(pf1,pf2)
429 vf2 = geom.MakeEdge(pf2,pf3)
430 vf3 = geom.MakeEdge(pf3,pf4)
431 faceFlanc = MakeFace([vf1,vf2,vf3,aShape])
432 idfaceFlanc = geompy.addToStudy(faceFlanc,"faceFlanc")
433 pfe = geom.MakePointStruct(epaisseurFlanc, 0., 0.)
434 flanc1 = geom.MakePrism(faceFlanc, p0, pfe)
435 flanc2 = geom.MakeCopy(flanc1)
436 flanc1 = geom.MakeTranslation(flanc1,
438 flanc2 = geom.MakeTranslation(flanc2,
439 longueurPlq-rayonConge-epaisseurFlanc,0.,0.)
441 # ---- constitution et decoupe des blocs
442 boxfond2 = geom.MakeBox(x0, y1, z0, x3, y2, z4p)
443 idboxfond2 = geompy.addToStudy(boxfond2,"boxfond2")
447 blocs.append(geom.MakeBoolean(boxfond2, dec, 1))
448 blocs.append(geom.MakeBox(x0,y1,z0, x1,y2,z1))
449 blocs.append(geom.MakeBox(x1,y1,z0, x2,y2,z1))
450 blocs.append(geom.MakeBox(x2,y1,z0, x3,y2,z1))
451 blocs.append(geom.MakeBox(x0,y0,z0, x1,y1,z1))
452 blocs.append(geom.MakeBox(x1,y0,z0, x2,y1,z1))
453 blocs.append(geom.MakeBox(x2,y0,z0, x3,y1,z1))
458 blocs.append(geom.MakeBox(x0h,y1, z2, x1, y2, z3))
459 blocs.append(geom.MakeBox(x2, y1, z2, x3h,y2, z3))
460 blocs.append(geom.MakeBox(x0h,y0h,z2, x1, y1, z3))
461 blocs.append(geom.MakeBox(x2, y0h,z2, x3h,y1, z3))
462 blocs.append(geom.MakeBox(x0h,y1, z3, x1, y2, z4))
463 blocs.append(geom.MakeBox(x2, y1, z3, x3h,y2, z4))
467 compbloc = MakeCompound(blocs)
468 idcomp = geompy.addToStudy(compbloc,"compbloc")
470 # ---- eliminer les faces en double, solid-->shell
472 compshell = geom.MakeGlueFaces(compbloc,tol3d)
473 idcomp = geompy.addToStudy(compshell,"compshell")