5 ===========================================
6 Example: Python script for a connecting rod
7 ===========================================
9 .. image:: _static/cad_bielle.PNG
19 - :ref:`modelcreation`
38 STEP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/crank.stp")
40 #=============================
42 #=============================
44 doc = hexablock.addDocument()
46 #=============================
48 #=============================
50 # For the connecting rod, two cylindrical grids have to be build and
51 # the quadrangles have to be prismed between these wo grids
53 #=============================
55 #=============================
57 R = 0.095168291790720005
63 xgrand = 1.35739 + 0.1595
64 longueur = (xgrand - xpetit)/2.0
65 hauteur = 0.019999999553*2
75 #=============================
77 #=============================
79 dx = doc.addVector(longueur, 0, 0)
80 dy = doc.addVector(0, longueur, 0)
81 dz = doc.addVector(0, 0, longueur)
83 #=================================================
84 # Creation of cylindrical grid centers
85 #=================================================
87 c_pte = doc.addVertex(xpetit, 0, 0)
88 c_grd = doc.addVertex(2*longueur, 0, 0)
89 dx_prime = doc.addVectorVertices(c_pte, c_grd)
91 #=================================================
92 # small cylindrical grid creation
93 #=================================================
95 grille_cyl_pte = doc.makeCylindrical(c_pte, dx, dz, dr_pte, da_pte, dl_pte, nr_pte, na_pte, nl_pte, False)
97 #=================================
98 # Small cylindrical grid creation
99 #=================================
101 grille_cyl_grd = doc.makeTranslation(grille_cyl_pte, dx_prime)
103 #==================================
104 # Joining the two cylindrical grids
105 #==================================
107 mod_x1 = grille_cyl_pte.getVertexIJK(1, 0, 1)
108 mod_x2 = grille_cyl_pte.getVertexIJK(1, 1, 0)
109 mod_x3 = grille_cyl_pte.getVertexIJK(1, 5, 0)
110 mod_x4 = grille_cyl_pte.getVertexIJK(1, 0, 0)
111 quad_11 = doc.findQuad(mod_x1, mod_x2)
112 quad_12 = doc.findQuad(mod_x1, mod_x3)
114 mod_y1 = grille_cyl_grd.getVertexIJK(1, 3, 1)
115 mod_y2 = grille_cyl_grd.getVertexIJK(1, 2, 0)
116 mod_y3 = grille_cyl_grd.getVertexIJK(1, 4, 0)
117 mod_y4 = grille_cyl_grd.getVertexIJK(1, 3, 0)
119 quad_21 = doc.findQuad(mod_y1, mod_y2)
120 quad_22 = doc.findQuad(mod_y1, mod_y3)
122 model_biell_fin = doc.joinQuads([quad_11, quad_12], quad_21, mod_x1, mod_y1, mod_x4, mod_y4, 1)
125 Go back to :ref:`menu`
129 Recovering edges and faces before the association
130 =================================================
134 bielle_geom = geompy.ImportFile(STEP_PATH, "STEP")
135 doc.setShape(bielle_geom)
136 geompy.addToStudy(bielle_geom, "bielle_geom")
137 all_edges_bielle = geompy.SubShapeAllSorted(bielle_geom, geompy.ShapeType["EDGE"])
141 # dictionnaire des edges de la géométrie :
142 # key = nom, value = indice dans all_edges_bielle
143 dic_edge_names = {"edge_ray_pte_b": 0, "edge_ray_pte_h": 1,
144 "edge_trou_pte_b": 2, "edge_trou_pte_h" :3,
145 "edge_arr_pte_g_b": 7, "edge_arr_pte_g_h": 8,
146 "edge_arr_pte_d_b": 9, "edge_arr_pte_d_h": 10,
147 "edge_arr_grd_g_b": 19, "edge_arr_grd_g_h": 20,
148 "edge_arr_grd_d_b": 21, "edge_arr_grd_d_h": 22,
149 "edge_trou_grd_b": 25, "edge_trou_grd_h": 26,
150 "edge_ray_grd_b": 27, "edge_ray_grd_h": 28,
151 "edge_long_g_b": 13, "edge_long_g_h": 14,
152 "edge_long_d_b": 15, "edge_long_d_h": 16
156 all_faces_bielle = geompy.SubShapeAllSorted(bielle_geom, geompy.ShapeType["FACE"])
157 # dictionnaire des faces de la geometrie :
158 # key = nom, value = indice dans all_faces_bielle
159 dic_face_names = {"face_ray_pte": 0, "face_trou_pte": 1, "face_pte_g": 2,
160 "face_pte_d": 3, "face_long_g": 4, "face_long_d": 5,
161 "face_bas": 6, "face_haut": 7, "face_grd_g": 8,
162 "face_grd_d": 9, "face_trou_grd": 10,
169 Go back to :ref:`menu`
173 Association of the model to the geometry
174 ========================================
178 dico_haut_bas = {"h": 1, "b": 0}
180 # 1. lignes internes (trou) haut/bas du petit cylindre
181 # ====================================================
182 for z in dico_haut_bas.iteritems():
184 mod_line = [grille_cyl_pte.getEdgeJ(0, j, z[1]) for j in range(5)]
185 mod_start = grille_cyl_pte.getEdgeJ(0, 5, z[1])
186 mod_first = mod_start.getVertex(1)
188 # geometrie : 1 seule ligne
189 edge_hole_in = all_edges_bielle[dic_edge_names["edge_trou_pte_"+z[0]]]
190 geo_start = edge_hole_in
195 ier = doc.associateClosedLine(mod_first, mod_start, mod_line,
196 geo_start, par_start, geo_line)
199 # 2. lignes internes (trou) haut/bas du grand cylindre
200 # =====================================================
201 for z in dico_haut_bas.iteritems():
203 mod_start = grille_cyl_grd.getEdgeJ(0, 5, z[1])
204 mod_first = mod_start.getVertex(1)
205 mod_line = [grille_cyl_grd.getEdgeJ(0, j, z[1]) for j in range (5)]
207 # geometrie : 1 seule ligne
208 edge_hole_in = all_edges_bielle[dic_edge_names["edge_trou_grd_"+z[0]]]
209 geo_start = edge_hole_in
214 ier = doc.associateClosedLine(mod_first, mod_start, mod_line,
215 geo_start, par_start, geo_line)
218 # 3. lignes externes haut/bas du petit cylindre
219 # =============================================
220 for z in dico_haut_bas.iteritems():
223 mod_start = grille_cyl_pte.getEdgeJ(1, 1, z[1])
225 mod_line = [grille_cyl_pte.getEdgeJ(1, j, z[1]) for j in [2, 3, 4]]
228 # les edges de la geometrie correspondant sont, dans l'ordre (par
229 # exemple pour le haut) :
230 # edge_arr_pte_d_h, edge_ray_pte_h, edge_arr_pte_g_h
231 geo_start = all_edges_bielle[dic_edge_names["edge_arr_pte_d_"+z[0]]]
234 geo_line.append(all_edges_bielle[dic_edge_names["edge_ray_pte_"+z[0]]])
235 geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_pte_g_"+z[0]]])
238 # la première est la dernière ligne sont orientées "dans le
239 # mauvais sens" => on fournit cette info :
242 ier = doc.associateOpenedLine(mod_start, mod_line,
243 geo_start, par_start, geo_line, par_end)
246 ## # 4. lignes externes haut/bas du grand cylindre
247 ## # =============================================
248 for z in dico_haut_bas.iteritems():
251 mod_start = grille_cyl_grd.getEdgeJ(1, 4, z[1])
253 mod_line = [grille_cyl_grd.getEdgeJ(1, j, z[1]) for j in [5, 0, 1]]
256 # les edges de la geometrie correspondant sont, dans l'ordre (par
257 # exemple pour le haut) :
258 # edge_arr_grd_g_h, edge_ray_grd_h, edge_arr_grd_d_h
259 geo_start = all_edges_bielle[dic_edge_names["edge_arr_grd_g_"+z[0]]]
262 geo_line.append(all_edges_bielle[dic_edge_names["edge_ray_grd_"+z[0]]])
263 geo_line.append(all_edges_bielle[dic_edge_names["edge_arr_grd_d_"+z[0]]])
266 # la première est la dernière ligne sont orientées "dans le
267 # mauvais sens" => on fournit cette info :
270 ier = doc.associateOpenedLine(mod_start, mod_line,
271 geo_start, par_start, geo_line, par_end)
273 # 6. association des 4 points restants (x1, x4, y1, y4) :
274 # =======================================================
283 face_haut = all_faces_bielle[dic_face_names["face_haut"]]
285 edge_haut_droite = geompy.GetEdgesByLength(face_haut, 0.136, 0.137)
286 edge_haut_gauche = geompy.GetEdgesByLength(face_haut, 0.131, 0.132)
288 # 1. grand cylindre :
289 y_h_g = geompy.MakeVertexOnSurface(face_haut, 1, 0.5)
290 u_h_g = geompy.MakeVertexOnCurve(edge_haut_droite, 1)
291 w_h_g = geompy.MakeVertexOnCurve(edge_haut_gauche, 0)
292 edge_v_grd = geompy.MakeLineTwoPnt(u_h_g, w_h_g)
294 geo_y1 = geompy.MakeVertexOnCurve(edge_v_grd, 0.5)
295 geo_y4 = geompy.MakeVertexWithRef(geo_y1, 0.0, 0.0, -hauteur)
297 # vertex cote grande grille cylindrique :
298 mod_y1.setAssociation(geo_y1)
299 mod_y4.setAssociation(geo_y4)
301 # 2. petit cylindre :
302 # REM : le modele grand cylindre a ete cree par translation / au petit
304 v_h_p = geompy.MakeVertexOnSurface(face_haut, 0, 0.5)
305 x_h_p = geompy.MakeVertexOnCurve(edge_haut_droite, 0)
306 z_h_p = geompy.MakeVertexOnCurve(edge_haut_gauche, 1)
307 edge_v_pte = geompy.MakeLineTwoPnt(x_h_p, z_h_p)
309 geo_x1 = geompy.MakeVertexOnCurve(edge_v_pte, 0.5)
310 geo_x4 = geompy.MakeVertexWithRef(geo_x1, 0.0, 0.0, -hauteur)
312 # vertex cote petite grille cylindrique :
313 mod_x1.setAssociation(geo_x1)
314 mod_x4.setAssociation(geo_x4)
316 # 7. association des faces :
317 quad1 = grille_cyl_pte.getQuadJK(1, 1, 0)
318 quad1.addAssociation(all_faces_bielle[dic_face_names["face_pte_d"]])
319 quad2 = grille_cyl_pte.getQuadJK(1, 4, 0)
320 quad2.addAssociation(all_faces_bielle[dic_face_names["face_pte_g"]])
321 quad3 = grille_cyl_grd.getQuadJK(1, 1, 0)
322 quad3.addAssociation(all_faces_bielle[dic_face_names["face_grd_d"]])
323 quad4 = grille_cyl_grd.getQuadJK(1, 4, 0)
324 quad4.addAssociation(all_faces_bielle[dic_face_names["face_grd_g"]])
327 Go back to :ref:`menu`
331 Definition of elements groups for the mesh
332 ==========================================
338 # groupe d edges (arretes)
339 edge_grp = doc.addEdgeGroup("Edge_grp")
340 for i in range(doc.countEdge()):
341 edge_grp.addElement(doc.getEdge(i))
343 # groupe de quads (faces)
344 quad_grp = doc.addQuadGroup("Quad_grp")
345 for i in range(doc.countQuad()):
346 quad_grp.addElement(doc.getQuad(i))
348 # groupe d hexas (solids)
349 hexa_grp = doc.addHexaGroup("Hexa_grp")
350 for i in range(doc.countHexa()):
351 hexa_grp.addElement(doc.getHexa(i))
353 # groupe de noeuds de vertex pour tout le modele
354 vertex_nod_grp = doc.addVertexNodeGroup("Vertex_Nod_Grp")
355 for i in range(doc.countVertex()):
356 vertex_nod_grp.addElement(doc.getVertex(i))
358 Go back to :ref:`menu`
362 Definition of a law discretization
363 ==================================
367 law = doc.addLaw("Uniform", 4)
369 for j in range(doc.countPropagation()):
370 propa = doc.getPropagation(j)
371 propa.setLaw(law) # apply discretization law on the model and generate the mesh
373 Go back to :ref:`menu`
383 print " --- HEXAHEDRICAL MESH --- "
384 mesh_hexas = hexablock.mesh("Bielle:hexas", doc)
386 print "Number of hexahedra:", mesh_hexas.NbHexas()
387 print "Number of quadrangles:", mesh_hexas.NbQuadrangles()
388 print "Number of segments:", mesh_hexas.NbEdges()
389 print "Number of nodes:", mesh_hexas.NbNodes()