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
31 geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
33 ShapeTypeCompSolid = 1
41 # -----------------------------------------------------------------------------
43 def MakeFace(lstEdges) :
45 Creates a face from 4 edges
48 for edge in lstEdges :
49 lstWire.append(edge._get_Name())
50 wire = geom.MakeWire(lstWire)
51 face = geom.MakeFace(wire, 1)
54 def MakeShell(lstFaces) :
56 Creates a shell from 6 faces
59 for face in lstFaces :
60 lstShell.append(face._get_Name())
61 shell = geom.MakeSewing(lstShell, 0.00001)
64 def MakeCompound(lstShells) :
66 Creates a compound from several shells
69 for shell in lstShells :
70 lstCompound.append(shell._get_Name())
71 compound = geom.MakeCompound(lstCompound)
74 # -----------------------------------------------------------------------------
80 ##epaisseurPlq = 0.150
82 ##hauteurFlanc = 0.380
83 ##epaisseurFlanc = 0.112
84 ##rayonConge = 0.150 - epaisseurFlanc
86 ##epaisseurFond = 0.162
88 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
98 rayonConge = 150 - epaisseurFlanc
102 posAxeTrou = hauteurFlanc -(180 + rayonTrou)
106 # ---- points, directions de base
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)
116 # ---- ellipse du flanc
118 he = hauteurFlanc -2*rayonConge
119 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
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")
135 aretes = geom.SubShapeAllSorted(cylcoup, ShapeTypeEdge)
138 ##for edge in aretes:
139 ## edname="arete%d"%eid
140 ## idedge=geompy.addToStudy(edge,edname)
143 shape = geom.MakeCopy(aretes[0])
144 #idarete = geompy.addToStudy(shape, "arete")
145 aShape = geom.MakeTranslation(shape,
146 0., rayonConge +re, epaisseurPlq +2*rayonConge)
149 # -----------------------------------------------------------------------------
150 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
151 # -----------------------------------------------------------------------------
157 x1 = rayonConge + epaisseurFlanc
159 x2 = longueurPlq - rayonConge - epaisseurFlanc
160 x3h = longueurPlq - rayonConge
167 y1 = largeurPlq - epaisseurFond
170 y2p = largeurPlq + marge
175 z1m = epaisseurPlq -marge
177 z2 = epaisseurPlq + rayonConge
178 z3 = epaisseurPlq + 2*rayonConge
179 z4 = epaisseurPlq + hauteurFlanc
180 z4p = epaisseurPlq + hauteurFlanc + marge
182 zc = epaisseurPlq + posAxeTrou
183 zc2 = epaisseurPlq + (posAxeTrou -rayonTrou)/3
184 zc3 = epaisseurPlq + 2*(posAxeTrou -rayonTrou)/3
186 # ---- decoupe du fond
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)
203 arc2 = geom.MakeArc(p12,pc2,p22)
204 arc3 = geom.MakeArc(p13,pc3,p23)
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)
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]))
235 decf.append(geom.MakePrism(face,pcc,pcf))
237 axeCyl = geom.MakeAxisStruct( 0.5*longueurPlq,
239 epaisseurPlq + posAxeTrou,
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")
250 fondec.append(geom.MakeBoolean(decf[id],cylFond2,2))
251 fondec.append(geom.MakeBoolean(decf[4],cylFond,2))
253 fondec.append(decf[id])
255 bcut1=geom.MakeBox(x0,y0,z0, xc,y2p,z4p)
256 bcut2=geom.MakeBox(xc,y0,z0, x3,y2p,z4p)
259 fondec2.append(fondec[id])
261 fondec2.append(geom.MakeBoolean(fondec[id],bcut1,1))
262 fondec2.append(geom.MakeBoolean(fondec[id],bcut2,1))
266 ## idfo = geompy.addToStudy(ff, "ff%d"%(iff))
269 # ----- autres blocs de decoupe
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)
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")
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)
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,
308 flanc2 = geom.MakeTranslation(flanc2,
309 longueurPlq-rayonConge-epaisseurFlanc,0.,0.)
311 # ---- constitution et decoupe des blocs
312 boxfond2 = geom.MakeBox(x0, y1, z0, x3, y2, z4p)
313 #idboxfond2 = geompy.addToStudy(boxfond2,"boxfond2")
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))
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))
339 compbloc = MakeCompound(blocs)
340 idcomp = geompy.addToStudy(compbloc,"compbloc")
342 # ---- eliminer les faces en double, solid-->shell
344 compshell = geom.MakeGlueFaces(compbloc,tol3d)
345 idcomp = geompy.addToStudy(compshell,"compshell")