]> SALOME platform Git repositories - modules/hexablock.git/blob - doc/intro_python.rst
Salome HOME
Merge from V6_main_20120808 08Aug12
[modules/hexablock.git] / doc / intro_python.rst
1 :tocdepth: 3
2
3 .. _intropython:
4
5 ===========================================
6 Example: Python script for a connecting rod
7 ===========================================
8
9 .. image:: _static/cad_bielle.PNG
10    :align: center
11
12 .. centered::
13    Connecting rod 
14
15 .. _menu:
16
17 Steps
18 =====
19     - :ref:`modelcreation`
20     - :ref:`recover`
21     - :ref:`assoc`
22     - :ref:`groupdef`
23     - :ref:`lawdisc`
24     - :ref:`meshgener`
25
26 .. _modelcreation:
27
28 Model creation
29 ==============
30
31 ::
32
33         import os
34         import geompy
35         import hexablock
36         import math
37
38         STEP_PATH = os.path.expandvars("$HEXABLOCK_ROOT_DIR/bin/salome/crank.stp")
39
40         #=============================
41         # CREATION DOCUMENT
42         #=============================
43
44         doc = hexablock.addDocument()
45
46         #=============================
47         # MODEL CREATION
48         #=============================
49
50         # For the connecting rod, two cylindrical grids have to be build and
51         # the quadrangles have to be prismed between these wo grids
52
53         #=============================
54         # PARAMETRES
55         #=============================
56
57         R = 0.095168291790720005
58
59         r_pte = R
60         r_pte_t = R/2.0
61
62         xpetit = 0.0
63         xgrand = 1.35739 + 0.1595
64         longueur = (xgrand - xpetit)/2.0
65         hauteur = 0.019999999553*2
66
67         dr_pte = R
68         da_pte = 360
69         dl_pte = hauteur
70
71         nr_pte = 1
72         na_pte = 6
73         nl_pte = 1
74
75         #=============================
76         # Vectors Creation 
77         #=============================
78
79         dx = doc.addVector(longueur, 0, 0)
80         dy = doc.addVector(0, longueur, 0)
81         dz = doc.addVector(0, 0, longueur)
82
83         #=================================================
84         # Creation of cylindrical grid centers
85         #=================================================
86
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)
90
91         #=================================================
92         # small cylindrical grid creation
93         #=================================================
94
95         grille_cyl_pte = doc.makeCylindrical(c_pte, dx, dz, dr_pte, da_pte, dl_pte, nr_pte, na_pte, nl_pte, False)
96
97         #=================================
98         #  Small cylindrical grid creation
99         #=================================
100
101         grille_cyl_grd = doc.makeTranslation(grille_cyl_pte, dx_prime)
102
103         #==================================
104         # Joining the two cylindrical grids
105         #==================================
106
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)
113
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)
118
119         quad_21 = doc.findQuad(mod_y1, mod_y2)
120         quad_22 = doc.findQuad(mod_y1, mod_y3)
121
122         model_biell_fin = doc.joinQuads([quad_11, quad_12], quad_21, mod_x1, mod_y1, mod_x4, mod_y4, 1)
123
124
125 Go back to :ref:`menu`
126
127 .. _recover:
128
129 Recovering edges and faces before the association
130 =================================================
131
132 ::
133
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"])
138
139
140
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
153                           }
154
155
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,
163                           "face_ray_grd": 11
164                          }
165
166
167
168
169 Go back to :ref:`menu`
170
171 .. _assoc:
172
173 Association of the model to the geometry
174 ========================================
175
176 ::
177
178  dico_haut_bas = {"h": 1, "b": 0}
179
180  # 1. lignes internes (trou) haut/bas du petit cylindre
181  # ====================================================
182  for z in dico_haut_bas.iteritems():
183
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)
187
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
191      par_start = 0.0
192      geo_line  = []
193
194      # association :
195      ier = doc.associateClosedLine(mod_first, mod_start, mod_line,
196                                    geo_start, par_start, geo_line)
197  
198
199  # 2. lignes internes (trou) haut/bas du grand cylindre
200  # =====================================================
201  for z in dico_haut_bas.iteritems():
202
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)]
206
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
210      par_start = 0.0
211      geo_line  = []
212
213      # association :
214      ier = doc.associateClosedLine(mod_first, mod_start, mod_line,
215                                    geo_start, par_start, geo_line)
216
217
218  # 3. lignes externes haut/bas du petit cylindre
219  # =============================================
220  for z in dico_haut_bas.iteritems():
221
222      # modele de blocs :
223      mod_start = grille_cyl_pte.getEdgeJ(1, 1, z[1])
224      # table des edges :
225      mod_line = [grille_cyl_pte.getEdgeJ(1, j, z[1]) for j in [2, 3, 4]]
226
227      # geometrie :
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]]]
232
233      geo_line  = []
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]]])
236
237      # association :
238      # la première est la dernière ligne sont orientées "dans le
239      # mauvais sens" => on fournit cette info :
240      par_start = 0.0
241      par_end = 1.0
242      ier = doc.associateOpenedLine(mod_start, mod_line,
243                                    geo_start, par_start, geo_line, par_end)
244
245
246  ## # 4. lignes externes haut/bas du grand cylindre
247  ## # =============================================
248  for z in dico_haut_bas.iteritems():
249
250      # modele de blocs :
251      mod_start = grille_cyl_grd.getEdgeJ(1, 4, z[1])
252      # table des edges :
253      mod_line = [grille_cyl_grd.getEdgeJ(1, j, z[1]) for j in [5, 0, 1]]
254
255      # geometrie :
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]]]
260
261      geo_line  = []
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]]])
264
265      # association :
266      # la première est la dernière ligne sont orientées "dans le
267      # mauvais sens" => on fournit cette info :
268      par_start = 0.0
269      par_end = 1.0
270      ier = doc.associateOpenedLine(mod_start, mod_line,
271                                    geo_start, par_start, geo_line, par_end)
272
273  # 6. association des 4 points restants (x1, x4, y1, y4) :
274  # =======================================================
275
276  # NB:
277  # h = top (haut)
278  # b = bottom (bas)
279  # g = big (grand)
280  # p = small (petit)
281  # t = hole (trou)
282
283  face_haut = all_faces_bielle[dic_face_names["face_haut"]]
284
285  edge_haut_droite = geompy.GetEdgesByLength(face_haut, 0.136, 0.137)
286  edge_haut_gauche = geompy.GetEdgesByLength(face_haut, 0.131, 0.132)
287
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)
293
294  geo_y1 = geompy.MakeVertexOnCurve(edge_v_grd, 0.5)
295  geo_y4 = geompy.MakeVertexWithRef(geo_y1, 0.0, 0.0, -hauteur)
296
297  # vertex cote grande grille cylindrique :
298  mod_y1.setAssociation(geo_y1)
299  mod_y4.setAssociation(geo_y4)
300
301  # 2. petit cylindre :
302  # REM : le modele grand cylindre a ete cree par translation / au petit
303  # cylindre.
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)
308
309  geo_x1 = geompy.MakeVertexOnCurve(edge_v_pte, 0.5)
310  geo_x4 = geompy.MakeVertexWithRef(geo_x1, 0.0, 0.0, -hauteur)
311
312  # vertex cote petite grille cylindrique :
313  mod_x1.setAssociation(geo_x1)
314  mod_x4.setAssociation(geo_x4)
315
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"]])
325
326
327 Go back to :ref:`menu`
328  
329 .. _groupdef:
330
331 Definition of elements groups for the mesh
332 ==========================================
333
334 ::
335
336  # We define 3 groups 
337
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))
342
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))
347
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))
352
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))
357
358 Go back to :ref:`menu`
359
360 .. _lawdisc:
361
362 Definition of a law discretization
363 ==================================
364
365 ::
366
367  law = doc.addLaw("Uniform", 4)
368
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
372
373 Go back to :ref:`menu`
374
375
376 .. _meshgener:
377
378 Mesh generation
379 ===============
380
381 ::
382
383  print  " --- HEXAHEDRICAL MESH --- "
384  mesh_hexas = hexablock.mesh("Bielle:hexas", doc)
385
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()
390