Salome HOME
Merge branch merge_1_2_d
[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 math
33
34 geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
35 myBuilder = salome.myStudy.NewBuilder()
36
37 ShapeTypeCompSolid = 1
38 ShapeTypeSolid     = 2
39 ShapeTypeShell     = 3
40 ShapeTypeFace      = 4
41 ShapeTypeWire      = 5
42 ShapeTypeEdge      = 6
43 ShapeTypeVertex    = 7
44
45 # -----------------------------------------------------------------------------
46
47 def MakeFace(lstEdges) :
48     """
49     Creates a face from 4 edges
50     """
51     lstWire = []
52     for edge in lstEdges :
53         lstWire.append(edge._get_Name())
54     wire = geom.MakeWire(lstWire)
55     face = geom.MakeFace(wire, 1)
56     return face
57
58 def MakeShell(lstFaces) :
59     """
60     Creates a shell from 6 faces
61     """
62     lstShell = []
63     for face in lstFaces :
64         lstShell.append(face._get_Name())
65     shell = geom.MakeSewing(lstShell, 0.00001)
66     return shell
67
68 def MakeCompound(lstShells) :
69     """
70     Creates a compound from several shells
71     """
72     lstCompound = []
73     for shell in lstShells :
74         lstCompound.append(shell._get_Name())
75     compound = geom.MakeCompound(lstCompound)
76     return compound
77
78 # -----------------------------------------------------------------------------
79
80 # ---- dimensions
81
82 ##longueurPlq  = 0.686
83 ##largeurPlq   = 0.573
84 ##epaisseurPlq = 0.150
85
86 ##hauteurFlanc   = 0.380
87 ##epaisseurFlanc = 0.112
88 ##rayonConge   = 0.150 - epaisseurFlanc
89
90 ##epaisseurFond = 0.162
91 ##rayonTrou = 0.075
92 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
93 ##marge = 0.01
94 ##tol3d = 1.e-5
95
96 longueurPlq  = 686
97 largeurPlq   = 573
98 epaisseurPlq = 150
99
100 hauteurFlanc   = 380
101 epaisseurFlanc = 112
102 rayonConge   = 150 - epaisseurFlanc
103
104 epaisseurFond = 162
105 rayonTrou = 75
106 posAxeTrou = hauteurFlanc -(180 + rayonTrou)
107 marge = 10
108 tol3d = 1.e-3
109
110 # ---- points, directions de base
111
112 p0 = geom.MakePointStruct(0., 0., 0.)
113 px = geom.MakePointStruct(100., 0., 0.)
114 vx = geom.MakeDirection(px)
115 py = geom.MakePointStruct(0., 100., 0.)
116 vy = geom.MakeDirection(py)
117 pz = geom.MakePointStruct(0., 0., 100.)
118 vz = geom.MakeDirection(pz)
119
120 # ---- ellipse du flanc
121
122 he = hauteurFlanc -2*rayonConge
123 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
124 sine = re/he
125 cose = math.sqrt(1.-sine*sine)
126 pe = geom.MakePointStruct(sine, 0., cose)
127 ve = geom.MakeDirection(pe)
128 cyl0 = geom.MakeCylinder(p0, ve, re, 2*he)
129 axecy = geom.MakeAxisStruct(0., 0., 0.,sine, 0., cose)
130 cyl1 = geom.MakeRotation(cyl0, axecy, 0.5)
131 cyle = geom.MakeTranslation(cyl1,
132                             -marge*sine, 0., -marge*cose)
133 boxe = geom.MakeBox(0., 0., 0., 3*he, -2*re, 3*he)
134 #idcyle = geompy.addToStudy(cyle, "cyle")
135 #idboxe = geompy.addToStudy(boxe, "boxe")
136 cylcoup = geom.MakeBoolean(cyle, boxe, 2)
137 #idcylcoup = geompy.addToStudy(cylcoup, "cylcoup")
138 aretes = []
139 aretes = geom.SubShapeAllSorted(cylcoup, ShapeTypeEdge)
140
141 ##eid=0
142 ##for edge in aretes:
143 ##    edname="arete%d"%eid
144 ##    idedge=geompy.addToStudy(edge,edname)
145 ##    eid=eid+1
146     
147 shape = geom.MakeCopy(aretes[0])
148 #idarete = geompy.addToStudy(shape, "arete")
149 aShape = geom.MakeTranslation(shape,
150                               0., rayonConge +re, epaisseurPlq +2*rayonConge)
151
152
153 # -----------------------------------------------------------------------------
154 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
155 # -----------------------------------------------------------------------------
156
157 # ---- cotes x
158
159 x0 = 0.
160 x0h = rayonConge
161 x1 = rayonConge + epaisseurFlanc
162 xc = longueurPlq/2
163 x2 = longueurPlq - rayonConge - epaisseurFlanc
164 x3h = longueurPlq - rayonConge
165 x3 = longueurPlq
166
167 # ---- cotes y
168
169 y0 = 0.
170 y0h = rayonConge
171 y1 = largeurPlq - epaisseurFond
172 y1m = y1 -marge
173 y2 = largeurPlq
174 y2p = largeurPlq + marge
175
176 # ---- cotes z
177
178 z0 = 0.
179 z1m = epaisseurPlq -marge
180 z1 = epaisseurPlq
181 z2 = epaisseurPlq + rayonConge
182 z3 = epaisseurPlq + 2*rayonConge
183 z4 = epaisseurPlq + hauteurFlanc
184 z4p = epaisseurPlq + hauteurFlanc + marge
185
186 zc = epaisseurPlq + posAxeTrou
187 zc2 = epaisseurPlq + (posAxeTrou -rayonTrou)/3
188 zc3 = epaisseurPlq + 2*(posAxeTrou -rayonTrou)/3
189
190 # ---- decoupe du fond
191
192 p11 = geom.MakePointStruct(x1, y1m, z1)
193 p12 = geom.MakePointStruct(x1, y1m, z2)
194 p13 = geom.MakePointStruct(x1, y1m, z3)
195 p14 = geom.MakePointStruct(x1, y1m, z4)
196 pc1 = geom.MakePointStruct(xc, y1m, z1)
197 pc2 = geom.MakePointStruct(xc, y1m, zc2)
198 pc3 = geom.MakePointStruct(xc, y1m, zc3)
199 pcc = geom.MakePointStruct(xc, y1m, zc)
200 pc4 = geom.MakePointStruct(xc, y1m, z4)
201 p21 = geom.MakePointStruct(x2, y1m, z1)
202 p22 = geom.MakePointStruct(x2, y1m, z2)
203 p23 = geom.MakePointStruct(x2, y1m, z3)
204 p24 = geom.MakePointStruct(x2, y1m, z4)
205 pcf = geom.MakePointStruct(xc, y2p, zc)
206
207 arc2 = geom.MakeArc(p12,pc2,p22)
208 arc3 = geom.MakeArc(p13,pc3,p23)
209
210 segz1 = geom.MakeVector(p11,p21)
211 #segz4 = geom.MakeVector(p14,p24)
212 segz41 = geom.MakeVector(p14,pc4)
213 segz42 = geom.MakeVector(pc4,p24)
214 segx11 = geom.MakeVector(p11,p12)
215 segx12 = geom.MakeVector(p12,p13)
216 segx13 = geom.MakeVector(p13,p14)
217 segxc2 = geom.MakeVector(pc1,pc2)
218 segxc3 = geom.MakeVector(pc2,pc3)
219 segxc4 = geom.MakeVector(pcc,pc4)
220 segx21 = geom.MakeVector(p21,p22)
221 segx22 = geom.MakeVector(p22,p23)
222 segx23 = geom.MakeVector(p23,p24)
223 segx1c1 = geom.MakeVector(p13,pcc)
224 segx1c2 = geom.MakeVector(p14,pcc)
225 segx2c1 = geom.MakeVector(p23,pcc)
226 segx2c2 = geom.MakeVector(p24,pcc)
227
228 facef = []
229 facef.append(MakeFace([segx13,segx1c2,segx1c1]))
230 facef.append(MakeFace([segx23,segx2c2,segx2c1]))
231 facef.append(MakeFace([segx2c2,segxc4,segz42]))
232 facef.append(MakeFace([segx1c2,segz41,segxc4]))
233 facef.append(MakeFace([segx1c1,arc3,segx2c1]))
234 facef.append(MakeFace([segx12,arc2,segx22,arc3]))
235 facef.append(MakeFace([segx11,segz1,segx21,arc2]))
236
237 decf =[]
238 for face in facef:
239     decf.append(geom.MakePrism(face,pcc,pcf))
240
241 axeCyl = geom.MakeAxisStruct( 0.5*longueurPlq,
242                               0.,
243                               epaisseurPlq + posAxeTrou,
244                               0.,
245                               largeurPlq,
246                               0.)
247 pAxe1 = geom.MakePointStruct(xc, 0., zc)
248 cylFond = geom.MakeCylinder(pAxe1, vy, rayonTrou, 1.1*largeurPlq)
249 cylFond2 = geom.MakeRotation(geom.MakeCopy(cylFond),axeCyl,math.pi)
250 #idcylfond2 = geompy.addToStudy(cylFond2,"cylFond2")
251
252 fondec =[]
253 for id in (0,1,2,3):
254     fondec.append(geom.MakeBoolean(decf[id],cylFond2,2))
255 fondec.append(geom.MakeBoolean(decf[4],cylFond,2))
256 for id in (5,6):
257     fondec.append(decf[id])
258
259 bcut1=geom.MakeBox(x0,y0,z0, xc,y2p,z4p)
260 bcut2=geom.MakeBox(xc,y0,z0, x3,y2p,z4p)
261 fondec2 = []
262 for id in (0,1,2,3):
263     fondec2.append(fondec[id])
264 for id in (4,5,6):
265     fondec2.append(geom.MakeBoolean(fondec[id],bcut1,1))
266     fondec2.append(geom.MakeBoolean(fondec[id],bcut2,1))
267
268 ##iff=0
269 ##for ff in fondec2:
270 ##   idfo = geompy.addToStudy(ff, "ff%d"%(iff))
271 ##   iff = iff +1
272
273 # ----- autres blocs de decoupe
274
275 bcong1=geom.MakeBox(x0,y0,z1, x1,y1,z2)
276 bcong2=geom.MakeBox(x0,y1,z1, x1,y2,z2)
277 bcong3=geom.MakeBox(x2,y0,z1, x3,y1,z2)
278 bcong4=geom.MakeBox(x2,y1,z1, x3,y2,z2)
279
280 pcylx0 = geom.MakePointStruct(0., -marge, z2)
281 cylcongx0 = geom.MakeCylinder(pcylx0, vy, rayonConge, largeurPlq +2*marge)
282 #idcylcongx0 = geompy.addToStudy(cylcongx0,"cylcongx0")
283 pcylx3 = geom.MakePointStruct(longueurPlq, -marge, z2)
284 cylcongx3 = geom.MakeCylinder(pcylx3, vy, rayonConge, largeurPlq +2*marge)
285 #idcylcongx3 = geompy.addToStudy(cylcongx3,"cylcongx3")
286 pcyly0 = geom.MakePointStruct(-marge, 0., z2)
287 cylcongy0 = geom.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq +2*marge)
288 #idcylcongy0 = geompy.addToStudy(cylcongy0,"cylcongy0")
289
290 bcong1=geom.MakeBoolean(bcong1,cylcongx0,2)
291 bcong2=geom.MakeBoolean(bcong2,cylcongx0,2)
292 bcong1=geom.MakeBoolean(bcong1,cylcongy0,2)
293 bcong3=geom.MakeBoolean(bcong3,cylcongx3,2)
294 bcong4=geom.MakeBoolean(bcong4,cylcongx3,2)
295 bcong3=geom.MakeBoolean(bcong3,cylcongy0,2)
296
297 pf1 = geom.MakePointStruct(0., y0h, z3)
298 pf2 = geom.MakePointStruct(0., y1, z3)
299 pf3 = geom.MakePointStruct(0., y1, z4)
300 pf4 = geom.MakePointStruct(0.,0.5*(largeurPlq - epaisseurFond) , z4)
301 vf1 = geom.MakeEdge(pf1,pf2)
302 vf2 = geom.MakeEdge(pf2,pf3)
303 vf3 = geom.MakeEdge(pf3,pf4)
304 faceFlanc = MakeFace([vf1,vf2,vf3,aShape])
305 #idfaceFlanc = geompy.addToStudy(faceFlanc,"faceFlanc")
306 pfe = geom.MakePointStruct(epaisseurFlanc, 0., 0.)
307 flanc1 = geom.MakePrism(faceFlanc, p0, pfe)
308 flanc2 = geom.MakeCopy(flanc1)
309 flanc1 = geom.MakeTranslation(flanc1,
310                               rayonConge,0.,0.)
311 flanc2 = geom.MakeTranslation(flanc2,
312                               longueurPlq-rayonConge-epaisseurFlanc,0.,0.)
313
314 # ---- constitution et decoupe des blocs
315 boxfond2 = geom.MakeBox(x0, y1, z0, x3, y2, z4p)
316 #idboxfond2 = geompy.addToStudy(boxfond2,"boxfond2")
317
318 blocs = []
319 for dec in fondec2:
320     blocs.append(geom.MakeBoolean(boxfond2, dec, 1))
321 blocs.append(geom.MakeBox(x0,y1,z0, x1,y2,z1))
322 blocs.append(geom.MakeBox(x1,y1,z0, xc,y2,z1))
323 blocs.append(geom.MakeBox(xc,y1,z0, x2,y2,z1))
324 blocs.append(geom.MakeBox(x2,y1,z0, x3,y2,z1))
325 blocs.append(geom.MakeBox(x0,y0,z0, x1,y1,z1))
326 blocs.append(geom.MakeBox(x1,y0,z0, xc,y1,z1))
327 blocs.append(geom.MakeBox(xc,y0,z0, x2,y1,z1))
328 blocs.append(geom.MakeBox(x2,y0,z0, x3,y1,z1))
329 blocs.append(bcong2)
330 blocs.append(bcong4)
331 blocs.append(bcong1)
332 blocs.append(bcong3)
333 blocs.append(geom.MakeBox(x0h,y1, z2, x1, y2, z3))
334 blocs.append(geom.MakeBox(x2, y1, z2, x3h,y2, z3))
335 blocs.append(geom.MakeBox(x0h,y0h,z2, x1, y1, z3))
336 blocs.append(geom.MakeBox(x2, y0h,z2, x3h,y1, z3))
337 blocs.append(geom.MakeBox(x0h,y1, z3, x1, y2, z4))
338 blocs.append(geom.MakeBox(x2, y1, z3, x3h,y2, z4))
339 blocs.append(flanc1)
340 blocs.append(flanc2)
341  
342 compbloc = MakeCompound(blocs)
343 idcomp = geompy.addToStudy(compbloc,"compbloc")
344
345 # ---- eliminer les faces en double, solid-->shell
346
347 compshell = geom.MakeGlueFaces(compbloc,tol3d)
348 idcomp = geompy.addToStudy(compshell,"compshell")
349