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