1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE
4 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
5 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
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.
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.
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
21 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
23 # File : SMESH_fix_volute.py
24 # Author : Paul RASCLE, EDF
32 # -----------------------------------------------------------------------------
34 def MakeFace(lstEdges) :
36 Creates a planar face from 4 edges
38 wire = geompy.MakeWire(lstEdges)
39 face = geompy.MakeFace(wire, 1)
42 # -----------------------------------------------------------------------------
48 ##epaisseurPlq = 0.150
50 ##hauteurFlanc = 0.380
51 ##epaisseurFlanc = 0.112
52 ##rayonConge = 0.150 - epaisseurFlanc
54 ##epaisseurFond = 0.162
56 ##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
66 rayonConge = 150 - epaisseurFlanc
70 posAxeTrou = hauteurFlanc - (180 + rayonTrou)
74 # ---- points, directions de base
76 p0 = geompy.MakeVertex(0., 0., 0.)
78 vx = geompy.MakeVectorDXDYDZ(100., 0., 0.)
79 vy = geompy.MakeVectorDXDYDZ(0., 100., 0.)
80 vz = geompy.MakeVectorDXDYDZ(0., 0., 100.)
82 # ---- ellipse du flanc
84 he = hauteurFlanc - 2*rayonConge
85 re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
87 cose = math.sqrt(1. - sine*sine)
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)
94 pbe = geompy.MakeVertex(3*he, -2*re, 3*he)
95 boxe = geompy.MakeBoxTwoPnt(p0, pbe)
97 cylcoup = geompy.MakeBoolean(cyle, boxe, 2)
100 aretes = geompy.SubShapeAllSorted(cylcoup, geompy.ShapeType["EDGE"])
102 shape = geompy.MakeCopy(aretes[0])
103 aShape = geompy.MakeTranslation(shape, 0., rayonConge + re, epaisseurPlq + 2*rayonConge)
106 # -----------------------------------------------------------------------------
107 # ---- decoupage de la piece en volumes a 6 faces de 4 cotes
108 # -----------------------------------------------------------------------------
114 x1 = rayonConge + epaisseurFlanc
116 x2 = longueurPlq - rayonConge - epaisseurFlanc
117 x3h = longueurPlq - rayonConge
124 y1 = largeurPlq - epaisseurFond
127 y2p = largeurPlq + marge
132 z1m = epaisseurPlq - marge
134 z2 = epaisseurPlq + rayonConge
135 z3 = epaisseurPlq + 2*rayonConge
136 z4 = epaisseurPlq + hauteurFlanc
137 z4p = epaisseurPlq + hauteurFlanc + marge
139 zc = epaisseurPlq + posAxeTrou
140 zc2 = epaisseurPlq + (posAxeTrou - rayonTrou)/3
141 zc3 = epaisseurPlq + 2*(posAxeTrou - rayonTrou)/3
143 # ---- decoupe du fond
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)
160 arc2 = geompy.MakeArc(p12,pc2,p22)
161 arc3 = geompy.MakeArc(p13,pc3,p23)
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)
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]))
189 vcccf = geompy.MakeVector(pcc, pcf)
193 decf.append(geompy.MakePrismVecH(face,vcccf,hcccf))
195 pc = geompy.MakeVertex(xc, 0., zc)
196 py2 = geompy.MakeVertex(xc, y2, zc)
197 axeCyl = geompy.MakeVector(pc, py2)
199 cylFond = geompy.MakeCylinder(pc, vy, rayonTrou, 1.1*largeurPlq)
200 cylFond2 = geompy.MakeRotation(cylFond, axeCyl, math.pi)
204 fondec.append(geompy.MakeBoolean(decf[id], cylFond2, 2))
205 fondec.append(geompy.MakeBoolean(decf[4], cylFond, 2))
207 fondec.append(decf[id])
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)
217 fondec2.append(fondec[id])
219 fondec2.append(geompy.MakeBoolean(fondec[id], bcut1, 1))
220 fondec2.append(geompy.MakeBoolean(fondec[id], bcut2, 1))
222 # ----- autres blocs de decoupe
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)
229 pcylx0 = geompy.MakeVertex(0., -marge, z2)
230 pcylx3 = geompy.MakeVertex(longueurPlq, -marge, z2)
231 pcyly0 = geompy.MakeVertex(-marge, 0., z2)
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)
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)
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)
250 vf1 = geompy.MakeEdge(pf1, pf2)
251 vf2 = geompy.MakeEdge(pf2, pf3)
252 vf3 = geompy.MakeEdge(pf3, pf4)
254 faceFlanc = MakeFace([vf1,vf2,vf3,aShape])
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.)
261 # ---- constitution et decoupe des blocs
262 boxfond2 = geompy.MakeBox(x0, y1, z0, x3, y2, z4p)
266 blocs.append(geompy.MakeBoolean(boxfond2, dec, 1))
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))
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))
289 compbloc = geompy.MakeCompound(blocs)
290 idcomp = geompy.addToStudy(compbloc, "compbloc")
292 # ---- eliminer les faces en double, solid-->shell
294 compshell = geompy.MakeGlueFaces(compbloc,tol3d)
295 idcomp = geompy.addToStudy(compshell, "compshell")