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