Salome HOME
NRI : Add path fro GEOM and MED idls.
[modules/smesh.git] / src / SMESH_SWIG / SMESH_fixation.py
1 #==============================================================================
2 #  File      : SMESH_fix_volute.py
3 #  Created   : mer sep  4 09:58:49 CEST 2002
4 #  Author    : Paul RASCLE, EDF
5 #  Project   : SALOME
6 #  Copyright : EDF 2002
7 #  $Header$
8 #==============================================================================
9
10 #
11 # les numeros d'edge dans les explode sont parfois decales de 1 entre
12 # le script et le gui
13 # piece1 --> piece : memes numeros
14 # ellipse : il faut decrementer de 1 dans le script 
15 #
16
17 import salome
18 from salome import sg
19
20 import geompy
21
22 ##import SMESH
23 ##import smeshpy
24 ##import SMESH_BasicHypothesis_idl
25
26 import math
27
28 # -----------------------------------------------------------------------------
29
30 def MakeFace(lstEdges) :
31     """
32     Creates a face from 4 edges
33     """
34     lstWire = []
35     for edge in lstEdges :
36         lstWire.append(edge._get_Name())
37     wire = geompy.MakeWire(lstWire)
38     face = geompy.MakeFace(wire, 1)
39     return face
40
41 def MakeShell(lstFaces) :
42     """
43     Creates a shell from 6 faces
44     """
45     lstShell = []
46     for face in lstFaces :
47         lstShell.append(face._get_Name())
48     shell = geompy.MakeSewing(lstShell, 0.00001)
49     return shell
50
51 def MakeCompound(lstShells) :
52     """
53     Creates a compound from several shells
54     """
55     lstCompound = []
56     for shell in lstShells :
57         lstCompound.append(shell._get_Name())
58     compound = geompy.MakeCompound(lstCompound)
59     return compound
60
61 # -----------------------------------------------------------------------------
62
63 geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
64 myBuilder = salome.myStudy.NewBuilder()
65
66 ShapeTypeCompSolid = 1
67 ShapeTypeSolid     = 2
68 ShapeTypeShell     = 3
69 ShapeTypeFace      = 4
70 ShapeTypeWire      = 5
71 ShapeTypeEdge      = 6
72 ShapeTypeVertex    = 7
73
74 # ---- dimensions
75
76 ##longueurPlq  = 0.686
77 ##largeurPlq   = 0.573
78 ##epaisseurPlq = 0.150
79
80 ##hauteurFlanc   = 0.380
81 ##epaisseurFlanc = 0.112
82 ##rayonConge   = 0.150 - epaisseurFlanc
83
84 ##epaisseurFond = 0.162
85 ##rayonTrou = 0.075
86 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
87 ##marge = 0.01
88 ##tol3d = 1.e-5
89
90 longueurPlq  = 686
91 largeurPlq   = 573
92 epaisseurPlq = 150
93
94 hauteurFlanc   = 380
95 epaisseurFlanc = 112
96 rayonConge   = 150 - epaisseurFlanc
97
98 epaisseurFond = 162
99 rayonTrou = 75
100 posAxeTrou = hauteurFlanc -(180 + rayonTrou)
101 marge = 10
102 tol3d = 1.e-3
103
104 # ---- points, directions de base
105
106 p0 = geom.MakePointStruct(0., 0., 0.)
107 px = geom.MakePointStruct(100., 0., 0.)
108 vx = geom.MakeDirection(px)
109 py = geom.MakePointStruct(0., 100., 0.)
110 vy = geom.MakeDirection(py)
111 pz = geom.MakePointStruct(0., 0., 100.)
112 vz = geom.MakeDirection(pz)
113
114 # ---- volumes de controle
115
116 volglob = geom.MakeBox( 0., 0., 0.,
117                         longueurPlq,
118                         largeurPlq,
119                         hauteurFlanc + epaisseurPlq +marge)
120 idvolglob = geompy.addToStudy(volglob, "volglob")
121 volhaut = geom.MakeBox(-marge,
122                        0.5*(largeurPlq - epaisseurFond), 
123                        hauteurFlanc + epaisseurPlq,
124                        longueurPlq+marge,
125                        largeurPlq+marge,
126                        hauteurFlanc + epaisseurPlq +2*marge)
127 idvolhaut = geompy.addToStudy(volhaut, "volhaut")
128
129 # ---- base
130
131 #plaque = geom.MakeBox( 0., 0., 0., longueurPlq, largeurPlq, epaisseurPlq )
132 plaque = geom.MakeBox( -marge, -marge/2, 0.,
133                        longueurPlq +2*marge, largeurPlq, epaisseurPlq )
134 # ---- fond
135
136 fond = geom.MakeBox( rayonConge,
137                      largeurPlq - epaisseurFond,
138                      epaisseurPlq,
139                      longueurPlq - rayonConge,
140                      largeurPlq,
141                      epaisseurPlq + hauteurFlanc +marge/2)
142
143 # ---- trou du fond
144
145 pAxe1 = geom.MakePointStruct( 0.5*longueurPlq,
146                               0.,
147                               epaisseurPlq + posAxeTrou)
148 cylFond = geom.MakeCylinder(pAxe1, vy, rayonTrou, 1.1*largeurPlq)
149 fondTroue = geom.MakeBoolean(fond, cylFond, 2)
150
151 piece = geom.MakeBoolean(plaque, fondTroue, 3)
152 idPiece = geompy.addToStudy(piece, "piece")
153
154 # ---- cotes
155
156 cote1 = geom.MakeBox(rayonConge,
157                      -marge/2,
158                      epaisseurPlq,
159                      epaisseurFlanc + rayonConge,
160                      largeurPlq - epaisseurFond,
161                      hauteurFlanc + epaisseurPlq +marge/2)
162 piece = geom.MakeBoolean(piece, cote1, 3)
163                      
164 cote2 = geom.MakeBox(longueurPlq -epaisseurFlanc -rayonConge,
165                      -marge/2,
166                      epaisseurPlq,
167                      longueurPlq -rayonConge,
168                      largeurPlq - epaisseurFond,
169                      hauteurFlanc + epaisseurPlq +marge/2)
170 piece = geom.MakeBoolean(piece, cote2, 3)
171 idPiece = geompy.addToStudy(piece, "piece1")
172
173 # ---- ellipse du flanc
174
175 he = hauteurFlanc -2*rayonConge
176 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
177 sine = re/he
178 cose = math.sqrt(1.-sine*sine)
179 pe = geom.MakePointStruct(sine, 0., cose)
180 ve = geom.MakeDirection(pe)
181 cyl0 = geom.MakeCylinder(p0, ve, re, 2*he)
182 axecy = geom.MakeAxisStruct(0., 0., 0.,sine, 0., cose)
183 cyl1 = geom.MakeRotation(cyl0, axecy, 0.5)
184 cyle = geom.MakeTranslation(cyl1,
185                             -marge*sine, 0., -marge*cose)
186 boxe = geom.MakeBox(0., 0., 0., 3*he, -2*re, 3*he)
187 #idcyle = geompy.addToStudy(cyle, "cyle")
188 #idboxe = geompy.addToStudy(boxe, "boxe")
189 cylcoup = geom.MakeBoolean(cyle, boxe, 2)
190 idcylcoup = geompy.addToStudy(cylcoup, "cylcoup")
191 aretes = []
192 aretes = geompy.SubShapeAll(cylcoup, ShapeTypeEdge)
193 # OCC3.1 : aretes[3], OCC4.0 aretes[5]
194 shape = geom.MakeCopy(aretes[5])
195 aShape = geom.MakeTranslation(shape,
196                               0., rayonConge +re, epaisseurPlq +2*rayonConge)
197
198 # ---- segments face objet decoupe des flancs
199
200 pf1 = geom.MakePointStruct(0.,
201                            -marge,
202                            hauteurFlanc + epaisseurPlq +marge)
203 pf2 = geom.MakePointStruct(0.,
204                            0.5*(largeurPlq - epaisseurFond),
205                            hauteurFlanc + epaisseurPlq +marge)
206 pf3 = geom.MakePointStruct(0.,
207                            0.5*(largeurPlq - epaisseurFond),
208                            hauteurFlanc + epaisseurPlq)
209 pf4 = geom.MakePointStruct(0.,
210                            rayonConge,
211                            epaisseurPlq +2*rayonConge)
212 pf5 = geom.MakePointStruct(0.,
213                            rayonConge,
214                            epaisseurPlq)
215 pf6 = geom.MakePointStruct(0.,
216                            -marge,
217                            epaisseurPlq)
218
219 vf1 = geom.MakeEdge(pf1,pf2)
220 vf2 = geom.MakeEdge(pf2,pf3)
221 vf4 = geom.MakeEdge(pf4,pf5)
222 vf5 = geom.MakeEdge(pf5,pf6)
223 vf6 = geom.MakeEdge(pf6,pf1)
224
225 id1 = geompy.addToStudy(vf1,"vf1")
226 id2 = geompy.addToStudy(vf2,"vf2")
227 ids = geompy.addToStudy(aShape,"aShape")
228 id4 = geompy.addToStudy(vf4,"vf4")
229 id5 = geompy.addToStudy(vf5,"vf5")
230 id6 = geompy.addToStudy(vf6,"vf6")
231
232 faceDec = MakeFace([vf1,vf2,aShape,vf4,vf5,vf6])
233 idf = geompy.addToStudy(faceDec,"faceDec")
234
235 # forme de decoupe par extrusion
236
237 pfe = geom.MakePointStruct(longueurPlq+4*marge, 0., 0.)
238 decoupe = geom.MakePrism(faceDec, p0, pfe)
239 decoupe = geom.MakeTranslation(decoupe, -2*marge, 0., 0.)
240 idec = geompy.addToStudy(decoupe, "decoupe")
241
242 # decoupe piece1 par decoupe
243
244 piece2 = geom.MakeBoolean(piece, decoupe, 2)
245 idpiece = geompy.addToStudy(piece2, "piece2")
246
247 # conges 
248 conges = []
249 conges = geompy.SubShapeAllSorted(piece2, ShapeTypeEdge)
250
251
252 # boucle pour trouver les bons indices
253 #ind = 0
254 #for ff in conges:
255 #       print ind, ff._get_Index()
256 #       name = "edge%d"%(ind)
257 #       geompy.addToStudy(ff, name)
258 #       ind = ind + 1
259
260
261 index1 = conges[7]._get_Index()
262 index2 = conges[11]._get_Index()
263 index3 = conges[36]._get_Index()
264 index4 = conges[43]._get_Index()
265
266 #piece3 = geompy.MakeFillet (piece2, rayonConge, ShapeTypeEdge, [3,4,8,9])
267 piece3 = geompy.MakeFillet (piece2, rayonConge, ShapeTypeEdge, [index1[0],index2[0],index3[0],index4[0]])
268
269 idPiece = geompy.addToStudy(piece3, "piece3")
270
271 # partie incluse dans le volume de controle (devient non valide)
272
273 piece4 = geom.MakeBoolean(piece3, volglob, 1)
274 idPiece = geompy.addToStudy(piece4, "piece4")
275
276 # enlever volume haut
277
278 piece = geom.MakeBoolean(piece4, volhaut, 2)
279 idpiece = geompy.addToStudy(piece, "piece")
280
281 # -----------------------------------------------------------------------------
282 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
283 # -----------------------------------------------------------------------------
284
285 # ---- cotes x
286
287 x0 = 0.
288 x0h = rayonConge
289 x1 = rayonConge + epaisseurFlanc
290 xc = longueurPlq/2
291 x2 = longueurPlq - rayonConge - epaisseurFlanc
292 x3h = longueurPlq - rayonConge
293 x3 = longueurPlq
294
295 # ---- cotes y
296
297 y0 = 0.
298 y0h = rayonConge
299 y1 = largeurPlq - epaisseurFond
300 y1m = y1 -marge
301 y2 = largeurPlq
302 y2p = largeurPlq + marge
303
304 # ---- cotes z
305
306 z0 = 0.
307 z1m = epaisseurPlq -marge
308 z1 = epaisseurPlq
309 z2 = epaisseurPlq + rayonConge
310 z3 = epaisseurPlq + 2*rayonConge
311 z4 = epaisseurPlq + hauteurFlanc
312 z4p = epaisseurPlq + hauteurFlanc + marge
313
314 zc = epaisseurPlq + posAxeTrou
315 zc2 = epaisseurPlq + (posAxeTrou -rayonTrou)/3
316 zc3 = epaisseurPlq + 2*(posAxeTrou -rayonTrou)/3
317
318 # ---- decoupe du fond
319
320 p11 = geom.MakePointStruct(x1, y1m, z1)
321 p12 = geom.MakePointStruct(x1, y1m, z2)
322 p13 = geom.MakePointStruct(x1, y1m, z3)
323 p14 = geom.MakePointStruct(x1, y1m, z4)
324 pc1 = geom.MakePointStruct(xc, y1m, z1)
325 pc2 = geom.MakePointStruct(xc, y1m, zc2)
326 pc3 = geom.MakePointStruct(xc, y1m, zc3)
327 pcc = geom.MakePointStruct(xc, y1m, zc)
328 pc4 = geom.MakePointStruct(xc, y1m, z4)
329 p21 = geom.MakePointStruct(x2, y1m, z1)
330 p22 = geom.MakePointStruct(x2, y1m, z2)
331 p23 = geom.MakePointStruct(x2, y1m, z3)
332 p24 = geom.MakePointStruct(x2, y1m, z4)
333 pcf = geom.MakePointStruct(xc, y2p, zc)
334
335 arc2 = geom.MakeArc(p12,pc2,p22)
336 arc3 = geom.MakeArc(p13,pc3,p23)
337
338 segz1 = geom.MakeVector(p11,p21)
339 #segz4 = geom.MakeVector(p14,p24)
340 segz41 = geom.MakeVector(p14,pc4)
341 segz42 = geom.MakeVector(pc4,p24)
342 segx11 = geom.MakeVector(p11,p12)
343 segx12 = geom.MakeVector(p12,p13)
344 segx13 = geom.MakeVector(p13,p14)
345 segxc2 = geom.MakeVector(pc1,pc2)
346 segxc3 = geom.MakeVector(pc2,pc3)
347 segxc4 = geom.MakeVector(pcc,pc4)
348 segx21 = geom.MakeVector(p21,p22)
349 segx22 = geom.MakeVector(p22,p23)
350 segx23 = geom.MakeVector(p23,p24)
351 segx1c1 = geom.MakeVector(p13,pcc)
352 segx1c2 = geom.MakeVector(p14,pcc)
353 segx2c1 = geom.MakeVector(p23,pcc)
354 segx2c2 = geom.MakeVector(p24,pcc)
355
356 facef = []
357 facef.append(MakeFace([segx13,segx1c2,segx1c1]))
358 facef.append(MakeFace([segx23,segx2c2,segx2c1]))
359 facef.append(MakeFace([segx2c2,segxc4,segz42]))
360 facef.append(MakeFace([segx1c2,segz41,segxc4]))
361 facef.append(MakeFace([segx1c1,arc3,segx2c1]))
362 facef.append(MakeFace([segx12,arc2,segx22,arc3]))
363 facef.append(MakeFace([segx11,segz1,segx21,arc2]))
364
365 decf =[]
366 for face in facef:
367     decf.append(geom.MakePrism(face,pcc,pcf))
368
369 axeCyl = geom.MakeAxisStruct( 0.5*longueurPlq,
370                               0.,
371                               epaisseurPlq + posAxeTrou,
372                               0.,
373                               largeurPlq,
374                               0.)
375 cylFond2 = geom.MakeRotation(geom.MakeCopy(cylFond),axeCyl,math.pi)
376 idcylfond2 = geompy.addToStudy(cylFond2,"cylFond2")
377
378 fondec =[]
379 for id in (0,1,2,3):
380     fondec.append(geom.MakeBoolean(decf[id],cylFond2,2))
381 fondec.append(geom.MakeBoolean(decf[4],cylFond,2))
382 for id in (5,6):
383     fondec.append(decf[id])
384
385 iff=0
386 for ff in fondec:
387     idfo = geompy.addToStudy(ff, "ff%d"%(iff))
388     iff = iff +1
389
390 # ----- autres blocs de decoupe
391
392 bcong1=geom.MakeBox(x0,y0,z1, x1,y1,z2)
393 bcong2=geom.MakeBox(x0,y1,z1, x1,y2,z2)
394 bcong3=geom.MakeBox(x2,y0,z1, x3,y1,z2)
395 bcong4=geom.MakeBox(x2,y1,z1, x3,y2,z2)
396
397 pcylx0 = geom.MakePointStruct(0., -marge, z2)
398 cylcongx0 = geom.MakeCylinder(pcylx0, vy, rayonConge, largeurPlq +2*marge)
399 idcylcongx0 = geompy.addToStudy(cylcongx0,"cylcongx0")
400 pcylx3 = geom.MakePointStruct(longueurPlq, -marge, z2)
401 cylcongx3 = geom.MakeCylinder(pcylx3, vy, rayonConge, largeurPlq +2*marge)
402 idcylcongx3 = geompy.addToStudy(cylcongx3,"cylcongx3")
403 pcyly0 = geom.MakePointStruct(-marge, 0., z2)
404 cylcongy0 = geom.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq +2*marge)
405 idcylcongy0 = geompy.addToStudy(cylcongy0,"cylcongy0")
406
407 bcong1=geom.MakeBoolean(bcong1,cylcongx0,2)
408 bcong2=geom.MakeBoolean(bcong2,cylcongx0,2)
409 bcong1=geom.MakeBoolean(bcong1,cylcongy0,2)
410 bcong3=geom.MakeBoolean(bcong3,cylcongx3,2)
411 bcong4=geom.MakeBoolean(bcong4,cylcongx3,2)
412 bcong3=geom.MakeBoolean(bcong3,cylcongy0,2)
413
414 pf1 = geom.MakePointStruct(0., y0h, z3)
415 pf2 = geom.MakePointStruct(0., y1, z3)
416 pf3 = geom.MakePointStruct(0., y1, z4)
417 pf4 = geom.MakePointStruct(0.,0.5*(largeurPlq - epaisseurFond) , z4)
418 vf1 = geom.MakeEdge(pf1,pf2)
419 vf2 = geom.MakeEdge(pf2,pf3)
420 vf3 = geom.MakeEdge(pf3,pf4)
421 faceFlanc = MakeFace([vf1,vf2,vf3,aShape])
422 idfaceFlanc = geompy.addToStudy(faceFlanc,"faceFlanc")
423 pfe = geom.MakePointStruct(epaisseurFlanc, 0., 0.)
424 flanc1 = geom.MakePrism(faceFlanc, p0, pfe)
425 flanc2 = geom.MakeCopy(flanc1)
426 flanc1 = geom.MakeTranslation(flanc1,
427                               rayonConge,0.,0.)
428 flanc2 = geom.MakeTranslation(flanc2,
429                               longueurPlq-rayonConge-epaisseurFlanc,0.,0.)
430
431 # ---- constitution et decoupe des blocs
432 boxfond2 = geom.MakeBox(x0, y1, z0, x3, y2, z4p)
433 idboxfond2 = geompy.addToStudy(boxfond2,"boxfond2")
434
435 blocs = []
436 for dec in fondec:
437     blocs.append(geom.MakeBoolean(boxfond2, dec, 1))
438 blocs.append(geom.MakeBox(x0,y1,z0, x1,y2,z1))
439 blocs.append(geom.MakeBox(x1,y1,z0, x2,y2,z1))
440 blocs.append(geom.MakeBox(x2,y1,z0, x3,y2,z1))
441 blocs.append(geom.MakeBox(x0,y0,z0, x1,y1,z1))
442 blocs.append(geom.MakeBox(x1,y0,z0, x2,y1,z1))
443 blocs.append(geom.MakeBox(x2,y0,z0, x3,y1,z1))
444 blocs.append(bcong2)
445 blocs.append(bcong4)
446 blocs.append(bcong1)
447 blocs.append(bcong3)
448 blocs.append(geom.MakeBox(x0h,y1, z2, x1, y2, z3))
449 blocs.append(geom.MakeBox(x2, y1, z2, x3h,y2, z3))
450 blocs.append(geom.MakeBox(x0h,y0h,z2, x1, y1, z3))
451 blocs.append(geom.MakeBox(x2, y0h,z2, x3h,y1, z3))
452 blocs.append(geom.MakeBox(x0h,y1, z3, x1, y2, z4))
453 blocs.append(geom.MakeBox(x2, y1, z3, x3h,y2, z4))
454 blocs.append(flanc1)
455 blocs.append(flanc2)
456  
457 compbloc = MakeCompound(blocs)
458 idcomp = geompy.addToStudy(compbloc,"compbloc")
459
460 # ---- eliminer les faces en double, solid-->shell
461
462 compshell = geom.MakeGlueFaces(compbloc,tol3d)
463 idcomp = geompy.addToStudy(compshell,"compshell")
464