:tocdepth: 3

.. _intropython:

===========================================
Example: Python script for a connecting rod
===========================================

.. image:: _static/cad_bielle.png
   :align: center

.. centered::
   Connecting rod 

.. _menu:

Steps
=====
    - :ref:`modelcreation`
    - :ref:`recover`
    - :ref:`assoc`
    - :ref:`groupdef`
    - :ref:`lawdisc`
    - :ref:`meshgener`

.. _modelcreation:

Model creation
==============

::

     import math

     import geompy
     import hexablock


     doc = hexablock.addDocument("bielle")

     # ------------------------------------- Build 2 cylindrical grids

     centre_pb = doc.addVertex(0, 0, 0)
     centre_gb = doc.addVertex(7, 0, 0)

     angle_px   = math.pi / 3
     vecteur_px = doc.addVector(math.cos(angle_px), math.sin(angle_px), 0)
     vecteur_gx = doc.addVector(1, 0, 0)

     vecteur_z = doc.addVector(0, 0, 1)

     grille_p = doc.makeCylindrical(centre_pb, vecteur_px, vecteur_z,  1, 360, 1,  1, 3, 1,  False)
     grille_g = doc.makeCylindrical(centre_gb, vecteur_gx, vecteur_z,  1, 360, 1,  1, 3, 1,  False)

     # ------------------------------------- Join the grids

     quad_p = grille_p.getQuadJK(1, 2, 0)
     quad_g = grille_g.getQuadJK(1, 1, 0)
     
     point_p1 = grille_p.getVertexIJK(1, 0, 0)
     point_p2 = grille_p.getVertexIJK(1, 2, 0)

     point_g1 = grille_g.getVertexIJK(1, 1, 0)
     point_g2 = grille_g.getVertexIJK(1, 2, 0)

     prisme = doc.joinQuad(quad_p, quad_g,  point_p1, point_g1,  
                                       point_p2, point_g2,  3)


Go back to :ref:`menu`

.. _recover:

Recovering edges and faces from geometry before the association
===============================================================

::

     bielle = geompy.ImportSTEP("bielle.stp")


     sommets = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["VERTEX"])

     sommets_petit = [  6,  8,  7,  9 ]
     sommets_grand = [ 10, 12, 11, 13 ]

     aretes = geompy.SubShapeAllSortedCentres(bielle, geompy.ShapeType["EDGE"])

     aretes_petit = [  7,  9,  8, 10 ]
     aretes_grand = [ 19, 21, 20, 22 ]

     ga_pbcd = aretes[ 0]
     ga_pbe  = aretes[ 2]

     ga_phcd = aretes[ 1]
     ga_phe  = aretes[ 3]
     
     ga_gbcd = aretes[27]
     ga_gbe  = aretes[25]

     ga_ghcd = aretes[28]
     ga_ghe  = aretes[26]


Go back to :ref:`menu`

.. _assoc:

Association of the model to the geometry
========================================

::

     doc.setShape(bielle)

     # ---------------------------- Clean implicit associations of the model 

     doc.clearAssociation()

     # -------------------------- Procedure who associates external circles 
     def cercle(grille, k, ge, p):
         ms  = grille.getVertexIJK(0, 0, k)

         ma1 = grille.getEdgeJ(0, 2, k)
         ma2 = grille.getEdgeJ(0, 1, k)
         ma3 = grille.getEdgeJ(0, 0, k)

         doc.associateClosedLine(ms, ma1, [ ma2, ma3 ], ge, p, False, [])

     cercle(grille_p, 0, ga_pbe, 5.0/6)
     cercle(grille_p, 1, ga_phe, 5.0/6)
     
     cercle(grille_g, 0, ga_gbe, 0)
     cercle(grille_g, 1, ga_ghe, 0)

     # ------------------- Procedure who associates external decentered lines 
     def arc(grille, i1, i2, k, ge):
         ma1 = grille.getEdgeJ(1, i1, k)
         ma2 = grille.getEdgeJ(1, i2, k)
     
         doc.associateOpenedLine(ma1, [ ma2 ], ge, 0, [], 1)

     arc(grille_p, 1, 0, 0, ga_pbcd)
     arc(grille_p, 1, 0, 1, ga_phcd)

     arc(grille_g, 0, 2, 0, ga_gbcd)
     arc(grille_g, 0, 2, 1, ga_ghcd)


     # ---------------------- Associate archs vertices with connection circles

     hm = prisme.getHexa(1)
     for i in xrange(0, 4):
       vm = hm.getVertex(i)
       ga = sommets[ sommets_petit[i] ]
       vm.setAssociation(ga)

     hm = prisme.getHexa(2)
     for i in xrange(0, 4):
       vm = hm.getVertex(i)
       ga = sommets[ sommets_grand[i] ]
       vm.setAssociation(ga)

     # ---------------------- Associate connection circles

     hm = prisme.getHexa(0)
     for i in xrange(0, 4):
       em = hm.getEdge(i+8)
       ga = aretes[ aretes_petit[i] ]
       em.addAssociation(ga, 0, 1)

     hm = prisme.getHexa(2)
     for i in xrange(0, 4):
       em = hm.getEdge(i+8)
       ga = aretes[ aretes_grand[i] ]
       em.addAssociation(ga, 0, 1)

     # --------------------- Round implicit cylindrical associations

     for h, i, ech in [ [0, 0, 0.95], [0, 1, 0.95],  [2, 2, 0.85], [2, 3, 0.85] ]:
       hm = prisme.getHexa(h)
       em = hm.getEdge(i)
       va = em.getVertex(0).getAssociation()
       vb = em.getVertex(1).getAssociation()
       vax, vay, vaz = geompy.PointCoordinates(va)
       vbx, vby, vbz = geompy.PointCoordinates(vb)
       vmx = ( vax + vbx ) / 2.0 * ech
       vmy = ( vay + vby ) / 2.0
       vmz = ( vaz + vbz ) / 2.0
       vm = geompy.MakeVertex(vmx, vmy, vmz)
       eg = geompy.MakeArc(va, vm, vb)
       em.clearAssociation()
       em.addAssociation(eg, 0, 1)

Go back to :ref:`menu`
 
.. _groupdef:

Definition of elements groups for the mesh
==========================================

::

     # -------------------------- # Define 5 faces groups

     groupe_petit   = doc.addQuadGroup("Petit")
     groupe_grand   = doc.addQuadGroup("Grand")
     groupe_bas     = doc.addQuadGroup("Bas")
     groupe_haut    = doc.addQuadGroup("Haut")
     groupe_contour = doc.addQuadGroup("Contour")

     # -------------------------- Define little and big cylinder groups

     for i in xrange(3):
       groupe_petit.addElement( grille_p.getQuadJK(0, i, 0) )
       groupe_grand.addElement( grille_g.getQuadJK(0, i, 0) )

     # -------------------------- Define bottum and up groups

     for i in xrange(3):
       groupe_bas.addElement(  grille_p.getQuadIJ(0, i, 0) )
       groupe_bas.addElement(  grille_g.getQuadIJ(0, i, 0) )

       groupe_haut.addElement( grille_p.getQuadIJ(0, i, 1) )
       groupe_haut.addElement( grille_g.getQuadIJ(0, i, 1) )

     for i in xrange(3):
       h = prisme.getHexa(i)

       groupe_bas.addElement(  h.getQuad(2) )
       groupe_haut.addElement( h.getQuad(3) )

     # -------------------------- Define border group

     for i in xrange(2):
       groupe_contour.addElement( grille_p.getQuadJK(1, i, 0) )

     for i in [0, 2]:
       groupe_contour.addElement( grille_g.getQuadJK(1, i, 0) )

     for i in xrange(3):
       h = prisme.getHexa(i)

       groupe_contour.addElement( h.getQuad(4) )
       groupe_contour.addElement( h.getQuad(5) )

     # -------------------------- Define 3 groups of volumes

     groupe_petit  = doc.addHexaGroup("Petit")
     groupe_grand  = doc.addHexaGroup("Grand")
     groupe_prisme = doc.addHexaGroup("Prisme")

     for i in xrange(3):
       groupe_petit.addElement( grille_p.getHexa(i) )
       groupe_grand.addElement( grille_g.getHexa(i) )

     for i in xrange(3):
       groupe_prisme.addElement( prisme.getHexa(i) )


Go back to :ref:`menu`

.. _lawdisc:

Definition of a law discretization laws :
========================================

::

     hexablock.addLaws(doc, 0.003, True)


Go back to :ref:`menu`


.. _meshgener:

Mesh generation
===============

::

     blocs = hexablock.mesh(doc)
                                        ##  .. and show statistics
     muv, mue, muq, muh = hexablock.dump(doc, blocs)