Salome HOME
sources v1.2
[modules/smesh.git] / src / SMESH_SWIG / SMESH_fixation.py
1 #  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
3
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. 
8
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. 
13
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 
17
18 #  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
19 #
20 #
21 #
22 #  File   : SMESH_fix_volute.py
23 #  Author : Paul RASCLE, EDF
24 #  Module : SMESH
25 #  $Header$
26
27 import salome
28 from salome import sg
29
30 import geompy
31
32 ##import SMESH
33 ##import smeshpy
34 ##import SMESH_BasicHypothesis_idl
35
36 import math
37
38 # -----------------------------------------------------------------------------
39
40 def MakeFace(lstEdges) :
41     """
42     Creates a face from 4 edges
43     """
44     lstWire = []
45     for edge in lstEdges :
46         lstWire.append(edge._get_Name())
47     wire = geompy.MakeWire(lstWire)
48     face = geompy.MakeFace(wire, 1)
49     return face
50
51 def MakeShell(lstFaces) :
52     """
53     Creates a shell from 6 faces
54     """
55     lstShell = []
56     for face in lstFaces :
57         lstShell.append(face._get_Name())
58     shell = geompy.MakeSewing(lstShell, 0.00001)
59     return shell
60
61 def MakeCompound(lstShells) :
62     """
63     Creates a compound from several shells
64     """
65     lstCompound = []
66     for shell in lstShells :
67         lstCompound.append(shell._get_Name())
68     compound = geompy.MakeCompound(lstCompound)
69     return compound
70
71 # -----------------------------------------------------------------------------
72
73 geom = salome.lcc.FindOrLoadComponent("FactoryServer", "Geometry")
74 myBuilder = salome.myStudy.NewBuilder()
75
76 ShapeTypeCompSolid = 1
77 ShapeTypeSolid     = 2
78 ShapeTypeShell     = 3
79 ShapeTypeFace      = 4
80 ShapeTypeWire      = 5
81 ShapeTypeEdge      = 6
82 ShapeTypeVertex    = 7
83
84 # ---- dimensions
85
86 ##longueurPlq  = 0.686
87 ##largeurPlq   = 0.573
88 ##epaisseurPlq = 0.150
89
90 ##hauteurFlanc   = 0.380
91 ##epaisseurFlanc = 0.112
92 ##rayonConge   = 0.150 - epaisseurFlanc
93
94 ##epaisseurFond = 0.162
95 ##rayonTrou = 0.075
96 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
97 ##marge = 0.01
98 ##tol3d = 1.e-5
99
100 longueurPlq  = 686
101 largeurPlq   = 573
102 epaisseurPlq = 150
103
104 hauteurFlanc   = 380
105 epaisseurFlanc = 112
106 rayonConge   = 150 - epaisseurFlanc
107
108 epaisseurFond = 162
109 rayonTrou = 75
110 posAxeTrou = hauteurFlanc -(180 + rayonTrou)
111 marge = 10
112 tol3d = 1.e-3
113
114 # ---- points, directions de base
115
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)
123
124 # ---- volumes de controle
125
126 volglob = geom.MakeBox( 0., 0., 0.,
127                         longueurPlq,
128                         largeurPlq,
129                         hauteurFlanc + epaisseurPlq +marge)
130 idvolglob = geompy.addToStudy(volglob, "volglob")
131 volhaut = geom.MakeBox(-marge,
132                        0.5*(largeurPlq - epaisseurFond), 
133                        hauteurFlanc + epaisseurPlq,
134                        longueurPlq+marge,
135                        largeurPlq+marge,
136                        hauteurFlanc + epaisseurPlq +2*marge)
137 idvolhaut = geompy.addToStudy(volhaut, "volhaut")
138
139 # ---- base
140
141 #plaque = geom.MakeBox( 0., 0., 0., longueurPlq, largeurPlq, epaisseurPlq )
142 plaque = geom.MakeBox( -marge, -marge/2, 0.,
143                        longueurPlq +2*marge, largeurPlq, epaisseurPlq )
144 # ---- fond
145
146 fond = geom.MakeBox( rayonConge,
147                      largeurPlq - epaisseurFond,
148                      epaisseurPlq,
149                      longueurPlq - rayonConge,
150                      largeurPlq,
151                      epaisseurPlq + hauteurFlanc +marge/2)
152
153 # ---- trou du fond
154
155 pAxe1 = geom.MakePointStruct( 0.5*longueurPlq,
156                               0.,
157                               epaisseurPlq + posAxeTrou)
158 cylFond = geom.MakeCylinder(pAxe1, vy, rayonTrou, 1.1*largeurPlq)
159 fondTroue = geom.MakeBoolean(fond, cylFond, 2)
160
161 piece = geom.MakeBoolean(plaque, fondTroue, 3)
162 idPiece = geompy.addToStudy(piece, "piece")
163
164 # ---- cotes
165
166 cote1 = geom.MakeBox(rayonConge,
167                      -marge/2,
168                      epaisseurPlq,
169                      epaisseurFlanc + rayonConge,
170                      largeurPlq - epaisseurFond,
171                      hauteurFlanc + epaisseurPlq +marge/2)
172 piece = geom.MakeBoolean(piece, cote1, 3)
173                      
174 cote2 = geom.MakeBox(longueurPlq -epaisseurFlanc -rayonConge,
175                      -marge/2,
176                      epaisseurPlq,
177                      longueurPlq -rayonConge,
178                      largeurPlq - epaisseurFond,
179                      hauteurFlanc + epaisseurPlq +marge/2)
180 piece = geom.MakeBoolean(piece, cote2, 3)
181 idPiece = geompy.addToStudy(piece, "piece1")
182
183 # ---- ellipse du flanc
184
185 he = hauteurFlanc -2*rayonConge
186 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
187 sine = re/he
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")
201 aretes = []
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)
207
208 # ---- segments face objet decoupe des flancs
209
210 pf1 = geom.MakePointStruct(0.,
211                            -marge,
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.,
220                            rayonConge,
221                            epaisseurPlq +2*rayonConge)
222 pf5 = geom.MakePointStruct(0.,
223                            rayonConge,
224                            epaisseurPlq)
225 pf6 = geom.MakePointStruct(0.,
226                            -marge,
227                            epaisseurPlq)
228
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)
234
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")
241
242 faceDec = MakeFace([vf1,vf2,aShape,vf4,vf5,vf6])
243 idf = geompy.addToStudy(faceDec,"faceDec")
244
245 # forme de decoupe par extrusion
246
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")
251
252 # decoupe piece1 par decoupe
253
254 piece2 = geom.MakeBoolean(piece, decoupe, 2)
255 idpiece = geompy.addToStudy(piece2, "piece2")
256
257 # conges 
258 conges = []
259 conges = geompy.SubShapeAllSorted(piece2, ShapeTypeEdge)
260
261
262 # boucle pour trouver les bons indices
263 #ind = 0
264 #for ff in conges:
265 #       print ind, ff._get_Index()
266 #       name = "edge%d"%(ind)
267 #       geompy.addToStudy(ff, name)
268 #       ind = ind + 1
269
270
271 index1 = conges[7]._get_Index()
272 index2 = conges[11]._get_Index()
273 index3 = conges[36]._get_Index()
274 index4 = conges[43]._get_Index()
275
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]])
278
279 idPiece = geompy.addToStudy(piece3, "piece3")
280
281 # partie incluse dans le volume de controle (devient non valide)
282
283 piece4 = geom.MakeBoolean(piece3, volglob, 1)
284 idPiece = geompy.addToStudy(piece4, "piece4")
285
286 # enlever volume haut
287
288 piece = geom.MakeBoolean(piece4, volhaut, 2)
289 idpiece = geompy.addToStudy(piece, "piece")
290
291 # -----------------------------------------------------------------------------
292 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
293 # -----------------------------------------------------------------------------
294
295 # ---- cotes x
296
297 x0 = 0.
298 x0h = rayonConge
299 x1 = rayonConge + epaisseurFlanc
300 xc = longueurPlq/2
301 x2 = longueurPlq - rayonConge - epaisseurFlanc
302 x3h = longueurPlq - rayonConge
303 x3 = longueurPlq
304
305 # ---- cotes y
306
307 y0 = 0.
308 y0h = rayonConge
309 y1 = largeurPlq - epaisseurFond
310 y1m = y1 -marge
311 y2 = largeurPlq
312 y2p = largeurPlq + marge
313
314 # ---- cotes z
315
316 z0 = 0.
317 z1m = epaisseurPlq -marge
318 z1 = epaisseurPlq
319 z2 = epaisseurPlq + rayonConge
320 z3 = epaisseurPlq + 2*rayonConge
321 z4 = epaisseurPlq + hauteurFlanc
322 z4p = epaisseurPlq + hauteurFlanc + marge
323
324 zc = epaisseurPlq + posAxeTrou
325 zc2 = epaisseurPlq + (posAxeTrou -rayonTrou)/3
326 zc3 = epaisseurPlq + 2*(posAxeTrou -rayonTrou)/3
327
328 # ---- decoupe du fond
329
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)
344
345 arc2 = geom.MakeArc(p12,pc2,p22)
346 arc3 = geom.MakeArc(p13,pc3,p23)
347
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)
365
366 facef = []
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]))
374
375 decf =[]
376 for face in facef:
377     decf.append(geom.MakePrism(face,pcc,pcf))
378
379 axeCyl = geom.MakeAxisStruct( 0.5*longueurPlq,
380                               0.,
381                               epaisseurPlq + posAxeTrou,
382                               0.,
383                               largeurPlq,
384                               0.)
385 cylFond2 = geom.MakeRotation(geom.MakeCopy(cylFond),axeCyl,math.pi)
386 idcylfond2 = geompy.addToStudy(cylFond2,"cylFond2")
387
388 fondec =[]
389 for id in (0,1,2,3):
390     fondec.append(geom.MakeBoolean(decf[id],cylFond2,2))
391 fondec.append(geom.MakeBoolean(decf[4],cylFond,2))
392 for id in (5,6):
393     fondec.append(decf[id])
394
395 iff=0
396 for ff in fondec:
397     idfo = geompy.addToStudy(ff, "ff%d"%(iff))
398     iff = iff +1
399
400 # ----- autres blocs de decoupe
401
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)
406
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")
416
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)
423
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,
437                               rayonConge,0.,0.)
438 flanc2 = geom.MakeTranslation(flanc2,
439                               longueurPlq-rayonConge-epaisseurFlanc,0.,0.)
440
441 # ---- constitution et decoupe des blocs
442 boxfond2 = geom.MakeBox(x0, y1, z0, x3, y2, z4p)
443 idboxfond2 = geompy.addToStudy(boxfond2,"boxfond2")
444
445 blocs = []
446 for dec in fondec:
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))
454 blocs.append(bcong2)
455 blocs.append(bcong4)
456 blocs.append(bcong1)
457 blocs.append(bcong3)
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))
464 blocs.append(flanc1)
465 blocs.append(flanc2)
466  
467 compbloc = MakeCompound(blocs)
468 idcomp = geompy.addToStudy(compbloc,"compbloc")
469
470 # ---- eliminer les faces en double, solid-->shell
471
472 compshell = geom.MakeGlueFaces(compbloc,tol3d)
473 idcomp = geompy.addToStudy(compshell,"compshell")
474