]> SALOME platform Git repositories - modules/hexablock.git/blob - src/TEST_PY/recettes/bielle.py
Salome HOME
ParaView 4.1 / VTK 6.1 porting
[modules/hexablock.git] / src / TEST_PY / recettes / bielle.py
1 # -*- coding: latin-1 -*-
2 # Copyright (C) 2009-2013  CEA/DEN, EDF R&D
3 #
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.
8 #
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.
13 #
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
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 # Francis KLOSS : 2011-2013 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France
22 # =============================================================================================
23
24 import math
25
26 import geompy
27 import hexablock
28
29 # Construire le modele de bloc
30 # ============================
31
32 doc = hexablock.addDocument("bielle")
33
34 # Construire les 2 grilles cylindriques : petite = 1, grande = 2
35
36 letour  = 360
37 hauteur = 0.04
38 angle1  = math.pi / 3
39
40 center1 = doc.addVertex(-0.107, 0, -hauteur/2)
41 center2 = doc.addVertex( 0.119, 0, -hauteur/2)
42 rint1   = 0.012
43 rint2   = 0.025
44 rext1   = 2*rint1
45 rext2   = 2*rint2
46
47 vx1 = doc.addVector(math.cos(angle1), math.sin(angle1), 0)
48 vx2 = doc.addVector(1, 0, 0)
49 vz  = doc.addVector(0, 0, 1)
50
51 grille_p = doc.makeCylinderUni (center1, vx1, vz,  rint1, rext1, letour, hauteur, 1, 3, 1)
52 hexablock.what ()
53 grille_g = doc.makeCylinderUni (center2, vx2, vz,  rint2, rext2, letour, hauteur, 1, 3, 1)
54 hexablock.what ()
55
56 # Relier les 2 grilles
57 # --------------------
58
59 quad_p = grille_p.getQuadJK(1, 2, 0)
60 quad_g = grille_g.getQuadJK(1, 1, 0)
61
62 point_p1 = grille_p.getVertexIJK(1, 0, 0)
63 point_p2 = grille_p.getVertexIJK(1, 2, 0)
64
65 point_g1 = grille_g.getVertexIJK(1, 1, 0)
66 point_g2 = grille_g.getVertexIJK(1, 2, 0)
67
68 prisme = doc.joinQuadUni (quad_p, quad_g,  point_p1, point_g1,  point_p2, point_g2,  3)
69
70 # Charger la geometrie
71 # ====================
72
73 bielle = geompy.ImportSTEP("bielle.stp")
74
75 # Selectionner des sous-parties de la geometrie
76 # ---------------------------------------------
77
78 sommets  = geompy.SubShapeAllSortedCentres    (bielle, geompy.ShapeType["VERTEX"])
79 nodes_id = geompy.SubShapeAllSortedCentresIDs (bielle, geompy.ShapeType["VERTEX"])
80      ##   0   1   2   3   4   5   6   7   8   9
81      ##  23, 70, 15, 52, 17, 57, 13, 47, 19, 62,
82      ##  11, 42,  6, 30,  9, 37,  7, 32, 26, 75]
83
84 sommets_petit     = [  6,  8,  7,  9 ]
85 sommets_grand     = [ 10, 12, 11, 13 ]
86 node_little_subid = [ 13, 19, 47, 62 ]
87 node_big_subid    = [ 11,  6, 42, 30 ]
88
89 aretes  = geompy.SubShapeAllSortedCentres    (bielle, geompy.ShapeType["EDGE"])
90 edge_id = geompy.SubShapeAllSortedCentresIDs (bielle, geompy.ShapeType["EDGE"])
91      ##   0   1   2   3   4   5   6   7   8   9
92      ##  16, 56, 22, 71, 69, 53, 58, 14, 51, 18,
93      ##  61, 48, 63, 12, 46, 20, 66, 43, 29, 10,
94      ##  41,  5, 31, 38, 33, 25, 76,  8, 36, 74
95
96
97 aretes_petit     = [  7,  9,  8, 10 ]
98 aretes_grand     = [ 19, 21, 20, 22 ]
99 arc_little_subid = [ 14, 18, 51, 61 ]
100 arc_big_subid    = [ 10,  5, 41, 31 ]
101
102 subid_pbcd = 16
103 subid_pbe  = 22
104
105 subid_phcd = 56
106 subid_phe  = 71
107
108 subid_gbcd = 8
109 subid_gbe  = 25
110
111 subid_ghcd = 36
112 subid_ghe  = 76
113
114 ga_pbcd = aretes[ 0]
115 ga_pbe  = aretes[ 2]
116
117 ga_phcd = aretes[ 1]
118 ga_phe  = aretes[ 3]
119
120 ga_gbcd = aretes[27]
121 ga_gbe  = aretes[25]
122
123 ga_ghcd = aretes[28]
124 ga_ghe  = aretes[26]
125
126 # Associer le modele de bloc avec la geometrie
127 # ============================================
128
129 geometry = hexablock.addShape (doc, bielle, "bielle")
130 doc.setLevel (748)
131
132 # Nettoyer les associations implicites du document
133 # ------------------------------------------------
134
135 doc.clearAssociation()
136
137 # Associer les cercles exterieurs
138 # -------------------------------
139
140 def cercle(grille, k, subid, p):
141     ms  = grille.getVertexIJK(0, 0, k)
142
143     ma1 = grille.getEdgeJ (0, 2, k)
144     ma2 = grille.getEdgeJ (0, 1, k)
145     ma3 = grille.getEdgeJ (0, 0, k)
146     tedges = [ma1, ma2, ma3 ]
147     tgeom  = [geometry]
148
149     doc.associateClosedLine (ms, tedges, tgeom, [subid], p, False)
150
151 cercle (grille_p, 0, subid_pbe, 5.0/6)
152 cercle (grille_p, 1, subid_phe, 5.0/6)
153
154 cercle (grille_g, 0, subid_gbe, 0)
155 cercle (grille_g, 1, subid_ghe, 0)
156
157 # Associer les arcs exterieurs (excentres)
158 # ----------------------------------------
159
160 def arc(grille, i1, i2, k, subid):
161     ma1 = grille.getEdgeJ(1, i1, k)
162     ma2 = grille.getEdgeJ(1, i2, k)
163     doc.associateOpenedLine ([ma1, ma2 ], [geometry], [subid], 0, 1)
164
165 arc(grille_p, 1, 0, 0, subid_pbcd)
166 arc(grille_p, 1, 0, 1, subid_phcd)
167
168 arc(grille_g, 0, 2, 0, subid_gbcd)
169 arc(grille_g, 0, 2, 1, subid_ghcd)
170
171 # Associer les sommets des arcs de cercle de raccord
172 # --------------------------------------------------
173
174 hm = prisme.getHexa(1)
175 for i in xrange(0, 4):
176   vm = hm.getVertex(i)
177   subid = node_little_subid [i]
178   vm.setAssociation (geometry, subid)
179
180 hm = prisme.getHexa(2)
181 for i in xrange(0, 4):
182   vm = hm.getVertex(i)
183   subid = node_big_subid [i]
184   vm.setAssociation (geometry, subid)
185
186 # Associer les arcs de cercle de raccord
187 # --------------------------------------
188
189 hm = prisme.getHexa(0)
190 for i in xrange(0, 4):
191   em = hm.getEdge(i+8)
192   subid = arc_little_subid [i]
193   em.addAssociation (geometry, subid, 0, 1)
194
195 hm = prisme.getHexa(2)
196 for i in xrange(0, 4):
197   em = hm.getEdge(i+8)
198   subid = arc_big_subid [i]
199   em.addAssociation (geometry, subid, 0, 1)
200
201 # Arrondir des associations implicites cylindriques
202 # -------------------------------------------------
203
204 larc = []
205 for h, i, ech in [ [0, 0, 0.95], [0, 1, 0.95],  [2, 2, 0.85], [2, 3, 0.85] ]:
206   hm = prisme.getHexa(h)
207   em = hm.getEdge(i)
208
209   v1 = em.getVertex(0)
210   v2 = em.getVertex(1)
211
212   vax = v1.getAssoX ();
213   vay = v1.getAssoY ();
214   vaz = v1.getAssoZ ();
215
216   vbx = v2.getAssoX ();
217   vby = v2.getAssoY ();
218   vbz = v2.getAssoZ ();
219
220   vmx = ( vax + vbx ) / 2.0 * ech
221   vmy = ( vay + vby ) / 2.0
222   vmz = ( vaz + vbz ) / 2.0
223
224   va = geompy.MakeVertex(vax, vay, vaz)
225   vb = geompy.MakeVertex(vbx, vby, vbz)
226   vm = geompy.MakeVertex(vmx, vmy, vmz)
227   eg = geompy.MakeArc(va, vm, vb)
228   larc.append(eg)
229
230 arc   = geompy.MakeCompound(larc)
231 shape = hexablock.addShape (doc, arc, "arc")
232
233 # Mailler le modele de bloc
234 for h, i in [ [0, 0], [0, 1],  [2, 2], [2, 3] ]:
235   hm = prisme.getHexa(h)
236   em = hm.getEdge(i)
237
238   em.clearAssociation()
239   shape_subid = 2+3*i
240   em.addAssociation (shape, shape_subid, 0.0, 1.0)
241
242 # Mailler le modele de bloc
243 # =========================
244
245 # Definir 5 groupes de faces
246 # --------------------------
247
248 groupe_petit   = doc.addQuadGroup("Petit")
249 groupe_grand   = doc.addQuadGroup("Grand")
250 groupe_bas     = doc.addQuadGroup("Bas")
251 groupe_haut    = doc.addQuadGroup("Haut")
252 groupe_contour = doc.addQuadGroup("Contour")
253
254 # Constituer les groupes petit et grand
255 # -------------------------------------
256
257 for i in xrange(3):
258   groupe_petit.addElement( grille_p.getQuadJK(0, i, 0) )
259   groupe_grand.addElement( grille_g.getQuadJK(0, i, 0) )
260
261 # Constituer les groupes bas et haut
262 # ----------------------------------
263
264 for i in xrange(3):
265   groupe_bas.addElement(  grille_p.getQuadIJ(0, i, 0) )
266   groupe_bas.addElement(  grille_g.getQuadIJ(0, i, 0) )
267
268   groupe_haut.addElement( grille_p.getQuadIJ(0, i, 1) )
269   groupe_haut.addElement( grille_g.getQuadIJ(0, i, 1) )
270
271 for i in xrange(3):
272   h = prisme.getHexa(i)
273
274   groupe_bas.addElement(  h.getQuad(2) )
275   groupe_haut.addElement( h.getQuad(3) )
276
277 # Constituer le groupe contour
278 # ----------------------------
279
280 for i in xrange(2):
281   groupe_contour.addElement( grille_p.getQuadJK(1, i, 0) )
282
283 for i in [0, 2]:
284   groupe_contour.addElement( grille_g.getQuadJK(1, i, 0) )
285
286 for i in xrange(3):
287   h = prisme.getHexa(i)
288
289   groupe_contour.addElement( h.getQuad(4) )
290   groupe_contour.addElement( h.getQuad(5) )
291
292 # Definir 3 groupes de volumes
293 # ----------------------------
294
295 groupe_petit  = doc.addHexaGroup("Petit")
296 groupe_grand  = doc.addHexaGroup("Grand")
297 groupe_prisme = doc.addHexaGroup("Prisme")
298
299 for i in xrange(3):
300   groupe_petit.addElement( grille_p.getHexa(i) )
301   groupe_grand.addElement( grille_g.getHexa(i) )
302
303 for i in xrange(3):
304   groupe_prisme.addElement( prisme.getHexa(i) )
305
306 # Mailler le modele de bloc avec association
307 # ------------------------------------------
308
309 doc.addLaws (0.003, True)
310
311 law = doc.addLaw("Uniform", 4)
312
313 for j in range(doc.countPropagation()):
314     propa = doc.getPropagation(j)
315     propa.setLaw(law)
316
317 doc.save("bielle_v5")
318 doc.setName("bielle_v5")
319 hexablock.addToStudy(doc)
320
321 blocs = hexablock.mesh(doc)
322
323 muv, mue, muq, muh = hexablock.dump(doc, blocs)