1 # -*- coding: latin-1 -*-
2 # Copyright (C) 2009-2015 CEA/DEN, EDF R&D
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, or (at your option) any later version.
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.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 # Francis KLOSS : 2011-2013 : CEA-Saclay, DEN, DM2S, SFME, LGLS, F-91191 Gif-sur-Yvette, France
22 # =============================================================================================
28 geompy = hexablock.geompy
31 # Construire le modele de bloc
32 # ============================
34 doc = hexablock.addDocument("bielle")
36 # Construire les 2 grilles cylindriques : petite = 1, grande = 2
42 center1 = doc.addVertex(-0.107, 0, -hauteur/2)
43 center2 = doc.addVertex( 0.119, 0, -hauteur/2)
49 vx1 = doc.addVector(math.cos(angle1), math.sin(angle1), 0)
50 vx2 = doc.addVector(1, 0, 0)
51 vz = doc.addVector(0, 0, 1)
53 grille_p = doc.makeCylinderUni (center1, vx1, vz, rint1, rext1, letour, hauteur, 1, 3, 1)
55 grille_g = doc.makeCylinderUni (center2, vx2, vz, rint2, rext2, letour, hauteur, 1, 3, 1)
58 # Relier les 2 grilles
59 # --------------------
61 quad_p = grille_p.getQuadJK(1, 2, 0)
62 quad_g = grille_g.getQuadJK(1, 1, 0)
64 point_p1 = grille_p.getVertexIJK(1, 0, 0)
65 point_p2 = grille_p.getVertexIJK(1, 2, 0)
67 point_g1 = grille_g.getVertexIJK(1, 1, 0)
68 point_g2 = grille_g.getVertexIJK(1, 2, 0)
70 prisme = doc.joinQuadUni (quad_p, quad_g, point_p1, point_g1, point_p2, point_g2, 3)
72 # Charger la geometrie
73 # ====================
75 bielle = geompy.ImportSTEP("bielle.stp")
77 # Selectionner des sous-parties de la geometrie
78 # ---------------------------------------------
80 sommets = geompy.SubShapeAllSortedCentres (bielle, geompy.ShapeType["VERTEX"])
81 nodes_id = geompy.SubShapeAllSortedCentresIDs (bielle, geompy.ShapeType["VERTEX"])
82 ## 0 1 2 3 4 5 6 7 8 9
83 ## 23, 70, 15, 52, 17, 57, 13, 47, 19, 62,
84 ## 11, 42, 6, 30, 9, 37, 7, 32, 26, 75]
86 sommets_petit = [ 6, 8, 7, 9 ]
87 sommets_grand = [ 10, 12, 11, 13 ]
88 node_little_subid = [ 13, 19, 47, 62 ]
89 node_big_subid = [ 11, 6, 42, 30 ]
91 aretes = geompy.SubShapeAllSortedCentres (bielle, geompy.ShapeType["EDGE"])
92 edge_id = geompy.SubShapeAllSortedCentresIDs (bielle, geompy.ShapeType["EDGE"])
93 ## 0 1 2 3 4 5 6 7 8 9
94 ## 16, 56, 22, 71, 69, 53, 58, 14, 51, 18,
95 ## 61, 48, 63, 12, 46, 20, 66, 43, 29, 10,
96 ## 41, 5, 31, 38, 33, 25, 76, 8, 36, 74
99 aretes_petit = [ 7, 9, 8, 10 ]
100 aretes_grand = [ 19, 21, 20, 22 ]
101 arc_little_subid = [ 14, 18, 51, 61 ]
102 arc_big_subid = [ 10, 5, 41, 31 ]
128 # Associer le modele de bloc avec la geometrie
129 # ============================================
131 geometry = hexablock.addShape (doc, bielle, "bielle")
134 # Nettoyer les associations implicites du document
135 # ------------------------------------------------
137 doc.clearAssociation()
139 # Associer les cercles exterieurs
140 # -------------------------------
142 def cercle(grille, k, subid, p):
143 ms = grille.getVertexIJK(0, 0, k)
145 ma1 = grille.getEdgeJ (0, 2, k)
146 ma2 = grille.getEdgeJ (0, 1, k)
147 ma3 = grille.getEdgeJ (0, 0, k)
148 tedges = [ma1, ma2, ma3 ]
151 doc.associateClosedLine (ms, tedges, tgeom, [subid], p, False)
153 cercle (grille_p, 0, subid_pbe, 5.0/6)
154 cercle (grille_p, 1, subid_phe, 5.0/6)
156 cercle (grille_g, 0, subid_gbe, 0)
157 cercle (grille_g, 1, subid_ghe, 0)
159 # Associer les arcs exterieurs (excentres)
160 # ----------------------------------------
162 def arc(grille, i1, i2, k, subid):
163 ma1 = grille.getEdgeJ(1, i1, k)
164 ma2 = grille.getEdgeJ(1, i2, k)
165 doc.associateOpenedLine ([ma1, ma2 ], [geometry], [subid], 0, 1)
167 arc(grille_p, 1, 0, 0, subid_pbcd)
168 arc(grille_p, 1, 0, 1, subid_phcd)
170 arc(grille_g, 0, 2, 0, subid_gbcd)
171 arc(grille_g, 0, 2, 1, subid_ghcd)
173 # Associer les sommets des arcs de cercle de raccord
174 # --------------------------------------------------
176 hm = prisme.getHexa(1)
177 for i in xrange(0, 4):
179 subid = node_little_subid [i]
180 vm.setAssociation (geometry, subid)
182 hm = prisme.getHexa(2)
183 for i in xrange(0, 4):
185 subid = node_big_subid [i]
186 vm.setAssociation (geometry, subid)
188 # Associer les arcs de cercle de raccord
189 # --------------------------------------
191 hm = prisme.getHexa(0)
192 for i in xrange(0, 4):
194 subid = arc_little_subid [i]
195 em.addAssociation (geometry, subid, 0, 1)
197 hm = prisme.getHexa(2)
198 for i in xrange(0, 4):
200 subid = arc_big_subid [i]
201 em.addAssociation (geometry, subid, 0, 1)
203 # Arrondir des associations implicites cylindriques
204 # -------------------------------------------------
207 for h, i, ech in [ [0, 0, 0.95], [0, 1, 0.95], [2, 2, 0.85], [2, 3, 0.85] ]:
208 hm = prisme.getHexa(h)
214 vax = v1.getAssoX ();
215 vay = v1.getAssoY ();
216 vaz = v1.getAssoZ ();
218 vbx = v2.getAssoX ();
219 vby = v2.getAssoY ();
220 vbz = v2.getAssoZ ();
222 vmx = ( vax + vbx ) / 2.0 * ech
223 vmy = ( vay + vby ) / 2.0
224 vmz = ( vaz + vbz ) / 2.0
226 va = geompy.MakeVertex(vax, vay, vaz)
227 vb = geompy.MakeVertex(vbx, vby, vbz)
228 vm = geompy.MakeVertex(vmx, vmy, vmz)
229 eg = geompy.MakeArc(va, vm, vb)
232 arc = geompy.MakeCompound(larc)
233 shape = hexablock.addShape (doc, arc, "arc")
235 # Mailler le modele de bloc
236 for h, i in [ [0, 0], [0, 1], [2, 2], [2, 3] ]:
237 hm = prisme.getHexa(h)
240 em.clearAssociation()
242 em.addAssociation (shape, shape_subid, 0.0, 1.0)
244 # Mailler le modele de bloc
245 # =========================
247 # Definir 5 groupes de faces
248 # --------------------------
250 groupe_petit = doc.addQuadGroup("Petit")
251 groupe_grand = doc.addQuadGroup("Grand")
252 groupe_bas = doc.addQuadGroup("Bas")
253 groupe_haut = doc.addQuadGroup("Haut")
254 groupe_contour = doc.addQuadGroup("Contour")
256 # Constituer les groupes petit et grand
257 # -------------------------------------
260 groupe_petit.addElement( grille_p.getQuadJK(0, i, 0) )
261 groupe_grand.addElement( grille_g.getQuadJK(0, i, 0) )
263 # Constituer les groupes bas et haut
264 # ----------------------------------
267 groupe_bas.addElement( grille_p.getQuadIJ(0, i, 0) )
268 groupe_bas.addElement( grille_g.getQuadIJ(0, i, 0) )
270 groupe_haut.addElement( grille_p.getQuadIJ(0, i, 1) )
271 groupe_haut.addElement( grille_g.getQuadIJ(0, i, 1) )
274 h = prisme.getHexa(i)
276 groupe_bas.addElement( h.getQuad(2) )
277 groupe_haut.addElement( h.getQuad(3) )
279 # Constituer le groupe contour
280 # ----------------------------
283 groupe_contour.addElement( grille_p.getQuadJK(1, i, 0) )
286 groupe_contour.addElement( grille_g.getQuadJK(1, i, 0) )
289 h = prisme.getHexa(i)
291 groupe_contour.addElement( h.getQuad(4) )
292 groupe_contour.addElement( h.getQuad(5) )
294 # Definir 3 groupes de volumes
295 # ----------------------------
297 groupe_petit = doc.addHexaGroup("Petit")
298 groupe_grand = doc.addHexaGroup("Grand")
299 groupe_prisme = doc.addHexaGroup("Prisme")
302 groupe_petit.addElement( grille_p.getHexa(i) )
303 groupe_grand.addElement( grille_g.getHexa(i) )
306 groupe_prisme.addElement( prisme.getHexa(i) )
308 # Mailler le modele de bloc avec association
309 # ------------------------------------------
311 doc.addLaws (0.003, True)
313 law = doc.addLaw("Uniform", 4)
315 for j in range(doc.countPropagation()):
316 propa = doc.getPropagation(j)
319 doc.save("bielle_v5")
320 doc.setName("bielle_v5")
321 hexablock.addToStudy(doc)
323 blocs = hexablock.mesh(doc)
325 muv, mue, muq, muh = hexablock.dump(doc, blocs)