Salome HOME
updated copyright message
[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 math
34
35      import geompy
36      import hexablock
37
38
39      doc = hexablock.addDocument("bielle")
40
41      # ------------------------------------- Build 2 cylindrical grids
42
43      centre_pb = doc.addVertex(0, 0, 0)
44      centre_gb = doc.addVertex(7, 0, 0)
45
46      angle_px   = math.pi / 3
47      vecteur_px = doc.addVector(math.cos(angle_px), math.sin(angle_px), 0)
48      vecteur_gx = doc.addVector(1, 0, 0)
49
50      vecteur_z = doc.addVector(0, 0, 1)
51
52      grille_p = doc.makeCylindrical(centre_pb, vecteur_px, vecteur_z,  1, 360, 1,  1, 3, 1,  False)
53      grille_g = doc.makeCylindrical(centre_gb, vecteur_gx, vecteur_z,  1, 360, 1,  1, 3, 1,  False)
54
55      # ------------------------------------- Join the grids
56
57      quad_p = grille_p.getQuadJK(1, 2, 0)
58      quad_g = grille_g.getQuadJK(1, 1, 0)
59      
60      point_p1 = grille_p.getVertexIJK(1, 0, 0)
61      point_p2 = grille_p.getVertexIJK(1, 2, 0)
62
63      point_g1 = grille_g.getVertexIJK(1, 1, 0)
64      point_g2 = grille_g.getVertexIJK(1, 2, 0)
65
66      prisme = doc.joinQuad(quad_p, quad_g,  point_p1, point_g1,  
67                                        point_p2, point_g2,  3)
68
69
70 Go back to :ref:`menu`
71
72 .. _recover:
73
74 Recovering edges and faces from geometry before the association
75 ===============================================================
76
77 ::
78
79      bielle = geompy.ImportSTEP("bielle.stp")
80
81
82      sommets = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["VERTEX"])
83
84      sommets_petit = [  6,  8,  7,  9 ]
85      sommets_grand = [ 10, 12, 11, 13 ]
86
87      aretes = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["EDGE"])
88
89      aretes_petit = [  7,  9,  8, 10 ]
90      aretes_grand = [ 19, 21, 20, 22 ]
91
92      ga_pbcd = aretes[ 0]
93      ga_pbe  = aretes[ 2]
94
95      ga_phcd = aretes[ 1]
96      ga_phe  = aretes[ 3]
97      
98      ga_gbcd = aretes[27]
99      ga_gbe  = aretes[25]
100
101      ga_ghcd = aretes[28]
102      ga_ghe  = aretes[26]
103
104
105 Go back to :ref:`menu`
106
107 .. _assoc:
108
109 Association of the model to the geometry
110 ========================================
111
112 ::
113
114      doc.setShape(bielle)
115
116      # ---------------------------- Clean implicit associations of the model 
117
118      doc.clearAssociation()
119
120      # -------------------------- Procedure who associates external circles 
121      def cercle(grille, k, ge, p):
122          ms  = grille.getVertexIJK(0, 0, k)
123
124          ma1 = grille.getEdgeJ(0, 2, k)
125          ma2 = grille.getEdgeJ(0, 1, k)
126          ma3 = grille.getEdgeJ(0, 0, k)
127
128          doc.associateClosedLine(ms, ma1, [ ma2, ma3 ], ge, p, False, [])
129
130      cercle(grille_p, 0, ga_pbe, 5.0/6)
131      cercle(grille_p, 1, ga_phe, 5.0/6)
132      
133      cercle(grille_g, 0, ga_gbe, 0)
134      cercle(grille_g, 1, ga_ghe, 0)
135
136      # ------------------- Procedure who associates external decentered lines 
137      def arc(grille, i1, i2, k, ge):
138          ma1 = grille.getEdgeJ(1, i1, k)
139          ma2 = grille.getEdgeJ(1, i2, k)
140      
141          doc.associateOpenedLine(ma1, [ ma2 ], ge, 0, [], 1)
142
143      arc(grille_p, 1, 0, 0, ga_pbcd)
144      arc(grille_p, 1, 0, 1, ga_phcd)
145
146      arc(grille_g, 0, 2, 0, ga_gbcd)
147      arc(grille_g, 0, 2, 1, ga_ghcd)
148
149
150      # ---------------------- Associate archs vertices with connection circles
151
152      hm = prisme.getHexa(1)
153      for i in xrange(0, 4):
154        vm = hm.getVertex(i)
155        ga = sommets[ sommets_petit[i] ]
156        vm.setAssociation(ga)
157
158      hm = prisme.getHexa(2)
159      for i in xrange(0, 4):
160        vm = hm.getVertex(i)
161        ga = sommets[ sommets_grand[i] ]
162        vm.setAssociation(ga)
163
164      # ---------------------- Associate connection circles
165
166      hm = prisme.getHexa(0)
167      for i in xrange(0, 4):
168        em = hm.getEdge(i+8)
169        ga = aretes[ aretes_petit[i] ]
170        em.addAssociation(ga, 0, 1)
171
172      hm = prisme.getHexa(2)
173      for i in xrange(0, 4):
174        em = hm.getEdge(i+8)
175        ga = aretes[ aretes_grand[i] ]
176        em.addAssociation(ga, 0, 1)
177
178      # --------------------- Round implicit cylindrical associations
179
180      for h, i, ech in [ [0, 0, 0.95], [0, 1, 0.95],  [2, 2, 0.85], [2, 3, 0.85] ]:
181        hm = prisme.getHexa(h)
182        em = hm.getEdge(i)
183        va = em.getVertex(0).getAssociation()
184        vb = em.getVertex(1).getAssociation()
185        vax, vay, vaz = geompy.PointCoordinates(va)
186        vbx, vby, vbz = geompy.PointCoordinates(vb)
187        vmx = ( vax + vbx ) / 2.0 * ech
188        vmy = ( vay + vby ) / 2.0
189        vmz = ( vaz + vbz ) / 2.0
190        vm = geompy.MakeVertex(vmx, vmy, vmz)
191        eg = geompy.MakeArc(va, vm, vb)
192        em.clearAssociation()
193        em.addAssociation(eg, 0, 1)
194
195 Go back to :ref:`menu`
196  
197 .. _groupdef:
198
199 Definition of elements groups for the mesh
200 ==========================================
201
202 ::
203
204      # -------------------------- # Define 5 faces groups
205
206      groupe_petit   = doc.addQuadGroup("Petit")
207      groupe_grand   = doc.addQuadGroup("Grand")
208      groupe_bas     = doc.addQuadGroup("Bas")
209      groupe_haut    = doc.addQuadGroup("Haut")
210      groupe_contour = doc.addQuadGroup("Contour")
211
212      # -------------------------- Define little and big cylinder groups
213
214      for i in xrange(3):
215        groupe_petit.addElement( grille_p.getQuadJK(0, i, 0) )
216        groupe_grand.addElement( grille_g.getQuadJK(0, i, 0) )
217
218      # -------------------------- Define bottum and up groups
219
220      for i in xrange(3):
221        groupe_bas.addElement(  grille_p.getQuadIJ(0, i, 0) )
222        groupe_bas.addElement(  grille_g.getQuadIJ(0, i, 0) )
223
224        groupe_haut.addElement( grille_p.getQuadIJ(0, i, 1) )
225        groupe_haut.addElement( grille_g.getQuadIJ(0, i, 1) )
226
227      for i in xrange(3):
228        h = prisme.getHexa(i)
229
230        groupe_bas.addElement(  h.getQuad(2) )
231        groupe_haut.addElement( h.getQuad(3) )
232
233      # -------------------------- Define border group
234
235      for i in xrange(2):
236        groupe_contour.addElement( grille_p.getQuadJK(1, i, 0) )
237
238      for i in [0, 2]:
239        groupe_contour.addElement( grille_g.getQuadJK(1, i, 0) )
240
241      for i in xrange(3):
242        h = prisme.getHexa(i)
243
244        groupe_contour.addElement( h.getQuad(4) )
245        groupe_contour.addElement( h.getQuad(5) )
246
247      # -------------------------- Define 3 groups of volumes
248
249      groupe_petit  = doc.addHexaGroup("Petit")
250      groupe_grand  = doc.addHexaGroup("Grand")
251      groupe_prisme = doc.addHexaGroup("Prisme")
252
253      for i in xrange(3):
254        groupe_petit.addElement( grille_p.getHexa(i) )
255        groupe_grand.addElement( grille_g.getHexa(i) )
256
257      for i in xrange(3):
258        groupe_prisme.addElement( prisme.getHexa(i) )
259
260
261 Go back to :ref:`menu`
262
263 .. _lawdisc:
264
265 Definition of a law discretization laws :
266 ========================================
267
268 ::
269
270      hexablock.addLaws(doc, 0.003, True)
271
272
273 Go back to :ref:`menu`
274
275
276 .. _meshgener:
277
278 Mesh generation
279 ===============
280
281 ::
282
283      blocs = hexablock.mesh(doc)
284                                         ##  .. and show statistics
285      muv, mue, muq, muh = hexablock.dump(doc, blocs)