1 # Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
2 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
18 # See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
22 # File : SMESH_fix_volute.py
23 # Author : Paul RASCLE, EDF
34 geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
35 myBuilder = salome.myStudy.NewBuilder()
37 ShapeTypeCompSolid = 1
45 # -----------------------------------------------------------------------------
47 def MakeFace(lstEdges) :
49 Creates a face from 4 edges
52 for edge in lstEdges :
53 lstWire.append(edge._get_Name())
54 wire = geom.MakeWire(lstWire)
55 face = geom.MakeFace(wire, 1)
58 def MakeShell(lstFaces) :
60 Creates a shell from 6 faces
63 for face in lstFaces :
64 lstShell.append(face._get_Name())
65 shell = geom.MakeSewing(lstShell, 0.00001)
68 def MakeCompound(lstShells) :
70 Creates a compound from several shells
73 for shell in lstShells :
74 lstCompound.append(shell._get_Name())
75 compound = geom.MakeCompound(lstCompound)
78 # -----------------------------------------------------------------------------
84 ##epaisseurPlq = 0.150
86 ##hauteurFlanc = 0.380
87 ##epaisseurFlanc = 0.112
88 ##rayonConge = 0.150 - epaisseurFlanc
90 ##epaisseurFond = 0.162
92 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
102 rayonConge = 150 - epaisseurFlanc
106 posAxeTrou = hauteurFlanc -(180 + rayonTrou)
110 # ---- points, directions de base
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)
120 # ---- ellipse du flanc
122 he = hauteurFlanc -2*rayonConge
123 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
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")
139 aretes = geom.SubShapeAllSorted(cylcoup, ShapeTypeEdge)
142 ##for edge in aretes:
143 ## edname="arete%d"%eid
144 ## idedge=geompy.addToStudy(edge,edname)
147 shape = geom.MakeCopy(aretes[0])
148 #idarete = geompy.addToStudy(shape, "arete")
149 aShape = geom.MakeTranslation(shape,
150 0., rayonConge +re, epaisseurPlq +2*rayonConge)
153 # -----------------------------------------------------------------------------
154 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
155 # -----------------------------------------------------------------------------
161 x1 = rayonConge + epaisseurFlanc
163 x2 = longueurPlq - rayonConge - epaisseurFlanc
164 x3h = longueurPlq - rayonConge
171 y1 = largeurPlq - epaisseurFond
174 y2p = largeurPlq + marge
179 z1m = epaisseurPlq -marge
181 z2 = epaisseurPlq + rayonConge
182 z3 = epaisseurPlq + 2*rayonConge
183 z4 = epaisseurPlq + hauteurFlanc
184 z4p = epaisseurPlq + hauteurFlanc + marge
186 zc = epaisseurPlq + posAxeTrou
187 zc2 = epaisseurPlq + (posAxeTrou -rayonTrou)/3
188 zc3 = epaisseurPlq + 2*(posAxeTrou -rayonTrou)/3
190 # ---- decoupe du fond
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)
207 arc2 = geom.MakeArc(p12,pc2,p22)
208 arc3 = geom.MakeArc(p13,pc3,p23)
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)
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]))
239 decf.append(geom.MakePrism(face,pcc,pcf))
241 axeCyl = geom.MakeAxisStruct( 0.5*longueurPlq,
243 epaisseurPlq + posAxeTrou,
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")
254 fondec.append(geom.MakeBoolean(decf[id],cylFond2,2))
255 fondec.append(geom.MakeBoolean(decf[4],cylFond,2))
257 fondec.append(decf[id])
259 bcut1=geom.MakeBox(x0,y0,z0, xc,y2p,z4p)
260 bcut2=geom.MakeBox(xc,y0,z0, x3,y2p,z4p)
263 fondec2.append(fondec[id])
265 fondec2.append(geom.MakeBoolean(fondec[id],bcut1,1))
266 fondec2.append(geom.MakeBoolean(fondec[id],bcut2,1))
270 ## idfo = geompy.addToStudy(ff, "ff%d"%(iff))
273 # ----- autres blocs de decoupe
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)
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")
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)
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,
311 flanc2 = geom.MakeTranslation(flanc2,
312 longueurPlq-rayonConge-epaisseurFlanc,0.,0.)
314 # ---- constitution et decoupe des blocs
315 boxfond2 = geom.MakeBox(x0, y1, z0, x3, y2, z4p)
316 #idboxfond2 = geompy.addToStudy(boxfond2,"boxfond2")
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))
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))
342 compbloc = MakeCompound(blocs)
343 idcomp = geompy.addToStudy(compbloc,"compbloc")
345 # ---- eliminer les faces en double, solid-->shell
347 compshell = geom.MakeGlueFaces(compbloc,tol3d)
348 idcomp = geompy.addToStudy(compshell,"compshell")