Salome HOME
correct previous integration (Porting to Python 2.6)
[modules/smesh.git] / src / SMESH_SWIG / SMESH_fixation.py
1 #  -*- coding: iso-8859-1 -*-
2 #  Copyright (C) 2007-2008  CEA/DEN, EDF R&D, OPEN CASCADE
3 #
4 #  Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
5 #  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
6 #
7 #  This library is free software; you can redistribute it and/or
8 #  modify it under the terms of the GNU Lesser General Public
9 #  License as published by the Free Software Foundation; either
10 #  version 2.1 of the License.
11 #
12 #  This library is distributed in the hope that it will be useful,
13 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 #  Lesser General Public License for more details.
16 #
17 #  You should have received a copy of the GNU Lesser General Public
18 #  License along with this library; if not, write to the Free Software
19 #  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
20 #
21 #  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
22 #
23 #  File   : SMESH_fix_volute.py
24 #  Author : Paul RASCLE, EDF
25 #  Module : SMESH
26 #  $Header$
27 #
28 import salome
29 import geompy
30 import math
31
32 # -----------------------------------------------------------------------------
33
34 def MakeFace(lstEdges) :
35     """
36     Creates a planar face from 4 edges
37     """
38     wire = geompy.MakeWire(lstEdges)
39     face = geompy.MakeFace(wire, 1)
40     return face
41
42 # -----------------------------------------------------------------------------
43
44 # ---- dimensions
45
46 ##longueurPlq  = 0.686
47 ##largeurPlq   = 0.573
48 ##epaisseurPlq = 0.150
49
50 ##hauteurFlanc   = 0.380
51 ##epaisseurFlanc = 0.112
52 ##rayonConge   = 0.150 - epaisseurFlanc
53
54 ##epaisseurFond = 0.162
55 ##rayonTrou = 0.075
56 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
57 ##marge = 0.01
58 ##tol3d = 1.e-5
59
60 longueurPlq  = 686
61 largeurPlq   = 573
62 epaisseurPlq = 150
63
64 hauteurFlanc   = 380
65 epaisseurFlanc = 112
66 rayonConge   = 150 - epaisseurFlanc
67
68 epaisseurFond = 162
69 rayonTrou = 75
70 posAxeTrou = hauteurFlanc - (180 + rayonTrou)
71 marge = 10
72 tol3d = 1.e-3
73
74 # ---- points, directions de base
75
76 p0 = geompy.MakeVertex(0., 0., 0.)
77
78 vx = geompy.MakeVectorDXDYDZ(100., 0., 0.)
79 vy = geompy.MakeVectorDXDYDZ(0., 100., 0.)
80 vz = geompy.MakeVectorDXDYDZ(0., 0., 100.)
81
82 # ---- ellipse du flanc
83
84 he = hauteurFlanc - 2*rayonConge
85 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
86 sine = re/he
87 cose = math.sqrt(1. - sine*sine)
88
89 ve = geompy.MakeVectorDXDYDZ(sine, 0., cose)
90 cyl0 = geompy.MakeCylinder(p0, ve, re, 2*he)
91 cyl1 = geompy.MakeRotation(cyl0, ve, 0.5)
92 cyle = geompy.MakeTranslation(cyl1, -marge*sine, 0., -marge*cose)
93
94 pbe = geompy.MakeVertex(3*he, -2*re, 3*he)
95 boxe = geompy.MakeBoxTwoPnt(p0, pbe)
96
97 cylcoup = geompy.MakeBoolean(cyle, boxe, 2)
98
99 aretes = []
100 aretes = geompy.SubShapeAllSorted(cylcoup, geompy.ShapeType["EDGE"])
101
102 shape = geompy.MakeCopy(aretes[0])
103 aShape = geompy.MakeTranslation(shape, 0., rayonConge + re, epaisseurPlq + 2*rayonConge)
104
105
106 # -----------------------------------------------------------------------------
107 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
108 # -----------------------------------------------------------------------------
109
110 # ---- cotes x
111
112 x0  = 0.
113 x0h = rayonConge
114 x1  = rayonConge + epaisseurFlanc
115 xc  = longueurPlq/2
116 x2  = longueurPlq - rayonConge - epaisseurFlanc
117 x3h = longueurPlq - rayonConge
118 x3  = longueurPlq
119
120 # ---- cotes y
121
122 y0  = 0.
123 y0h = rayonConge
124 y1  = largeurPlq - epaisseurFond
125 y1m = y1 - marge
126 y2  = largeurPlq
127 y2p = largeurPlq + marge
128
129 # ---- cotes z
130
131 z0  = 0.
132 z1m = epaisseurPlq - marge
133 z1  = epaisseurPlq
134 z2  = epaisseurPlq + rayonConge
135 z3  = epaisseurPlq + 2*rayonConge
136 z4  = epaisseurPlq + hauteurFlanc
137 z4p = epaisseurPlq + hauteurFlanc + marge
138
139 zc  = epaisseurPlq + posAxeTrou
140 zc2 = epaisseurPlq + (posAxeTrou - rayonTrou)/3
141 zc3 = epaisseurPlq + 2*(posAxeTrou - rayonTrou)/3
142
143 # ---- decoupe du fond
144
145 p11 = geompy.MakeVertex(x1, y1m, z1)
146 p12 = geompy.MakeVertex(x1, y1m, z2)
147 p13 = geompy.MakeVertex(x1, y1m, z3)
148 p14 = geompy.MakeVertex(x1, y1m, z4)
149 pc1 = geompy.MakeVertex(xc, y1m, z1)
150 pc2 = geompy.MakeVertex(xc, y1m, zc2)
151 pc3 = geompy.MakeVertex(xc, y1m, zc3)
152 pcc = geompy.MakeVertex(xc, y1m, zc)
153 pc4 = geompy.MakeVertex(xc, y1m, z4)
154 p21 = geompy.MakeVertex(x2, y1m, z1)
155 p22 = geompy.MakeVertex(x2, y1m, z2)
156 p23 = geompy.MakeVertex(x2, y1m, z3)
157 p24 = geompy.MakeVertex(x2, y1m, z4)
158 pcf = geompy.MakeVertex(xc, y2p, zc)
159
160 arc2 = geompy.MakeArc(p12,pc2,p22)
161 arc3 = geompy.MakeArc(p13,pc3,p23)
162
163 segz1  = geompy.MakeVector(p11,p21)
164 segz41 = geompy.MakeVector(p14,pc4)
165 segz42 = geompy.MakeVector(pc4,p24)
166 segx11 = geompy.MakeVector(p11,p12)
167 segx12 = geompy.MakeVector(p12,p13)
168 segx13 = geompy.MakeVector(p13,p14)
169 segxc2 = geompy.MakeVector(pc1,pc2)
170 segxc3 = geompy.MakeVector(pc2,pc3)
171 segxc4 = geompy.MakeVector(pcc,pc4)
172 segx21 = geompy.MakeVector(p21,p22)
173 segx22 = geompy.MakeVector(p22,p23)
174 segx23 = geompy.MakeVector(p23,p24)
175 segx1c1 = geompy.MakeVector(p13,pcc)
176 segx1c2 = geompy.MakeVector(p14,pcc)
177 segx2c1 = geompy.MakeVector(p23,pcc)
178 segx2c2 = geompy.MakeVector(p24,pcc)
179
180 facef = []
181 facef.append(MakeFace([segx13,segx1c2,segx1c1]))
182 facef.append(MakeFace([segx23,segx2c2,segx2c1]))
183 facef.append(MakeFace([segx2c2,segxc4,segz42]))
184 facef.append(MakeFace([segx1c2,segz41,segxc4]))
185 facef.append(MakeFace([segx1c1,arc3,segx2c1]))
186 facef.append(MakeFace([segx12,arc2,segx22,arc3]))
187 facef.append(MakeFace([segx11,segz1,segx21,arc2]))
188
189 vcccf = geompy.MakeVector(pcc, pcf)
190 hcccf = y2p - y1m
191 decf = []
192 for face in facef:
193     decf.append(geompy.MakePrismVecH(face,vcccf,hcccf))
194
195 pc  = geompy.MakeVertex(xc, 0., zc)
196 py2 = geompy.MakeVertex(xc, y2, zc)
197 axeCyl = geompy.MakeVector(pc, py2)
198
199 cylFond = geompy.MakeCylinder(pc, vy, rayonTrou, 1.1*largeurPlq)
200 cylFond2 = geompy.MakeRotation(cylFond, axeCyl, math.pi)
201
202 fondec = []
203 for id in (0,1,2,3):
204     fondec.append(geompy.MakeBoolean(decf[id], cylFond2, 2))
205 fondec.append(geompy.MakeBoolean(decf[4], cylFond, 2))
206 for id in (5,6):
207     fondec.append(decf[id])
208
209 p_xcy2pz4p = geompy.MakeVertex(xc,y2p,z4p)
210 p_x3y2pz4p = geompy.MakeVertex(x3,y2p,z4p)
211 pxc = geompy.MakeVertex(xc,y0,z0)
212 bcut1 = geompy.MakeBoxTwoPnt(p0, p_xcy2pz4p)
213 bcut2 = geompy.MakeBoxTwoPnt(pxc, p_x3y2pz4p)
214
215 fondec2 = []
216 for id in (0,1,2,3):
217     fondec2.append(fondec[id])
218 for id in (4,5,6):
219     fondec2.append(geompy.MakeBoolean(fondec[id], bcut1, 1))
220     fondec2.append(geompy.MakeBoolean(fondec[id], bcut2, 1))
221
222 # ----- autres blocs de decoupe
223
224 bcong1 = geompy.MakeBox(x0,y0,z1, x1,y1,z2)
225 bcong2 = geompy.MakeBox(x0,y1,z1, x1,y2,z2)
226 bcong3 = geompy.MakeBox(x2,y0,z1, x3,y1,z2)
227 bcong4 = geompy.MakeBox(x2,y1,z1, x3,y2,z2)
228
229 pcylx0 = geompy.MakeVertex(0., -marge, z2)
230 pcylx3 = geompy.MakeVertex(longueurPlq, -marge, z2)
231 pcyly0 = geompy.MakeVertex(-marge, 0., z2)
232
233 cylcongx0 = geompy.MakeCylinder(pcylx0, vy, rayonConge, largeurPlq + 2*marge)
234 cylcongx3 = geompy.MakeCylinder(pcylx3, vy, rayonConge, largeurPlq + 2*marge)
235 cylcongy0 = geompy.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq + 2*marge)
236
237 bcong1 = geompy.MakeBoolean(bcong1,cylcongx0,2)
238 bcong2 = geompy.MakeBoolean(bcong2,cylcongx0,2)
239 bcong1 = geompy.MakeBoolean(bcong1,cylcongy0,2)
240 #NRI : inverse order of BOP
241 bcong3 = geompy.MakeBoolean(bcong3,cylcongy0,2)
242 bcong3 = geompy.MakeBoolean(bcong3,cylcongx3,2)
243 bcong4 = geompy.MakeBoolean(bcong4,cylcongx3,2)
244
245 pf1 = geompy.MakeVertex(0., y0h, z3)
246 pf2 = geompy.MakeVertex(0., y1, z3)
247 pf3 = geompy.MakeVertex(0., y1, z4)
248 pf4 = geompy.MakeVertex(0., 0.5*(largeurPlq - epaisseurFond) , z4)
249
250 vf1 = geompy.MakeEdge(pf1, pf2)
251 vf2 = geompy.MakeEdge(pf2, pf3)
252 vf3 = geompy.MakeEdge(pf3, pf4)
253
254 faceFlanc = MakeFace([vf1,vf2,vf3,aShape])
255
256 flanc1 = geompy.MakePrismVecH(faceFlanc, vx, epaisseurFlanc)
257 flanc2 = geompy.MakeCopy(flanc1)
258 flanc1 = geompy.MakeTranslation(flanc1, rayonConge, 0., 0.)
259 flanc2 = geompy.MakeTranslation(flanc2, longueurPlq - rayonConge - epaisseurFlanc, 0., 0.)
260
261 # ---- constitution et decoupe des blocs
262 boxfond2 = geompy.MakeBox(x0, y1, z0, x3, y2, z4p)
263
264 blocs = []
265 for dec in fondec2:
266     blocs.append(geompy.MakeBoolean(boxfond2, dec, 1))
267
268 blocs.append(geompy.MakeBox(x0,y1,z0, x1,y2,z1))
269 blocs.append(geompy.MakeBox(x1,y1,z0, xc,y2,z1))
270 blocs.append(geompy.MakeBox(xc,y1,z0, x2,y2,z1))
271 blocs.append(geompy.MakeBox(x2,y1,z0, x3,y2,z1))
272 blocs.append(geompy.MakeBox(x0,y0,z0, x1,y1,z1))
273 blocs.append(geompy.MakeBox(x1,y0,z0, xc,y1,z1))
274 blocs.append(geompy.MakeBox(xc,y0,z0, x2,y1,z1))
275 blocs.append(geompy.MakeBox(x2,y0,z0, x3,y1,z1))
276 blocs.append(bcong2)
277 blocs.append(bcong4)
278 blocs.append(bcong1)
279 blocs.append(bcong3)
280 blocs.append(geompy.MakeBox(x0h,y1, z2, x1, y2, z3))
281 blocs.append(geompy.MakeBox(x2, y1, z2, x3h,y2, z3))
282 blocs.append(geompy.MakeBox(x0h,y0h,z2, x1, y1, z3))
283 blocs.append(geompy.MakeBox(x2, y0h,z2, x3h,y1, z3))
284 blocs.append(geompy.MakeBox(x0h,y1, z3, x1, y2, z4))
285 blocs.append(geompy.MakeBox(x2, y1, z3, x3h,y2, z4))
286 blocs.append(flanc1)
287 blocs.append(flanc2)
288
289 compbloc = geompy.MakeCompound(blocs)
290 idcomp = geompy.addToStudy(compbloc, "compbloc")
291
292 # ---- eliminer les faces en double, solid-->shell
293
294 compshell = geompy.MakeGlueFaces(compbloc,tol3d)
295 idcomp = geompy.addToStudy(compshell, "compshell")