aoüt 2014
modifié .. .. ....

Le Diametroid de John Bisby Le Diametroid
de John Bisby

Animation sous FreeCAD

Fichier de modélisation "Diametroid.FCStd"
Fichier du script Python "Diametroid.py"

--ooOoo--

Le logiciel FreeCAD permet de programmer l'animation de pièces mobiles d'un dispositif mécanique. Le Diametroid est donc un bon support expérimental pour mieux manipuler le logiciel et surtout, c'était le but, d'essayer de comprendre comment une telle transmission peut fonctionner.

I - Principe de fonctionnement de l'animation sous FreeCAD

Sous FreeCAD, on modélise une pièce formée de plusieurs composants. Si certains composants sont mobiles, il est intéressant de trouver une méthode de modification de la position ces composants voire même les composants eux-mêmes et la manière de contrôler ces modifications.

On conçoit facilement que FreeCAD n'est pas en mesure de deviner ce que veut faire l'utilisateur. Ce dernier doit donc modifier son projet, non pas interactivement comme il l'a fait pour la virtualisation mais dynamiquement en respectant une logique de séquence donc dépendant du temps.

FreeCAD met donc à la disposition de l'utilisateur le moyen de programmer des changement du modèle grâce à un interpréteur de commandes régit par le langage "Python". Ce sont les "macros" et les "scripts" :

          •    Les macros sont des commandes enregistrées durant des manipulations et qui peuvent être ré-exécutées autant de foi que l'on veut. Elle génère un déroulement séquentiel de ses commandes.
•  les scripts sont des séquences algorithmiques de commandes régies par le langage de programmation "Python".

Dès que l'on exécute une macro ou un script, le projet FreeCAD est modifié. Il convient donc de travailler, pendant les périodes de tests, sur des copies des projets ou prendre bien soin de le pas les sauvegarder pendant ces tests.

Durant la lecture de la documentation "scripts et macros", mon attention a été attirée par un aspect étonnant des choix fait par les développeurs.


          Remarque 1 :  1°.  FreeCAD reconnaît un certain nombre de dossiers dans lesquels sont stockés les modules, les scripts et les macros Python. Ces dossiers se situent dans l'environnement d'installation du logiciel ce qui est indispensable pour lui. Mais pour l'utilisateur, stocker les scripts et les macros voire les modules de ses projets dans l'environnement du logiciel est un inconvénient fort handicapant. Très rapidement, ces dossiers deviennent vite ingérables en  se transformant vite en "poubelles" où, en environnement multiutilisateurs, tout le monde y met tout et n'importe quoi !...
 
     Je ne vois aucune difficulté de programmation à prendre en compte des dossiers comme ceux définis dans une variable d'environnement système, par exemple "FreeCADpath=", plus subtile, utilisée sous Unix et Windows qui contiendrait la liste de tous les répertoires de recherche prioritaires et ceux, standards, du logiciel  encore que !.. cela peut poser des problèmes si plusieurs logiciels adoptent la même technique !... Pourquoi faudrait-il privilégier un logiciel plutôt qu'un autre dans le cas où deux d'entre eux au moins possèderaient un module, un script ou une macro portant le même nom ?
 
     Pourquoi n'est-il donc pas possible de les stocker dans des répertoires créés dans ceux des projets eux-mêmes puisque, sitôt un projet enregistré, le logiciel connait parfaitement la localisation de son dossier   ?

Cette solution me paraît la plus intéressante car entièrement indépendante ainsi on pourrait avoir les dossiers suivants :
 

     - "dossier_du_projet",
     - "dossier_du_projet\bin",
      - "dossier_du_projet\Mod",
     - etc...
 
Cette méthode me paraît être une solution générale.
 
2°.  J'ai cherché à utiliser l'éditeur de scripts et de macros de FreeCAD. Si la création et la modification du fichier ne pausent aucun problème, à part celui de choisir le code ANSI puisque je suis sous Windows, je n'ai pas réussi à arrêter avec le bouton Stop(inactif) le script sous éditeur lancé avec le bouton Execute. De plus, le lancement au clavier de l'instruction "timer.stop()" est inopérante car le script est lancé dans un processus différent de celui de la console alors qu'elle l'est si on copie le script directement dans la console Python où tous les points d'entrée "def" sont accessibles. Pour arrêter un script qui boucle, il faut fermer FreeCAD !...
3°.  Comme il n'est pas possible, pour le moment de stocker des scripts Python dans des dossiers du projet, et que des problèmes surgissent sous l'éditeur, j'ai finalement opté pour la solution du script stocké dans le répertoire du projet, édité avec l'éditeur "notepad++" que j'utilise habituellement, script que je copie directement dans la console Python avec l'extension ".py" et non ".FCMacro" pour l'auto_completion. L'avantage de cette solution est de travailler dans le processus de la console et donc d'avoir accès à toutes les commandes du script (def) et aussi à toutes ses variables.
     Il y a bien entendu le revers de la médaille !.. celui d'être obligé de faire un script monolytique.
     Il y a bien dans "Edition=>Préférences=>Macro=>Chemin de la macro" la possibilité de définir le chemin d'accès à un dossier mais ce dernier ne sera valable que pour le projet ouvert courant.
4°.  Dans la syntaxe des scripts Python, je n'apprécie pas particulièrement le principe de définition des blocs d'instructions par un changement d'indentation.
 
     Mais bon, nouveau langage, nouvelle forme. Pourquoi pas après tout !...
 
     Personnellement, je reste fidèle à la syntaxe et les instructions du C, langage avec lequel on peut absolument tout faire, même la programmation orientée objet dont les fondements existent tout naturellement depuis le Big-Bang, il y a 14 milliards d'années !...  

Je ne trouve pas tout cela très élégant mais ça marche !... 


II - Écriture du script Python d'animation

Le script Python d'animation s'élabore de proche en proche. Ici, le premier stade de l'animation commence par la rotation du planétaire du train épicycloïdal d'entrée. Il commande l'animation puisqu'il est connecté au moteur qui lui applique un couple de puissance.

- Animation du planétaire du train épicycloïdal d'entrée : Source ICI

La structure du script est simple :

•   le maillon principal, lignes 83-117 : 

°   Il définit un timer nommé "timer" (lignes 110-112) qui va permettre d'exécuter la fonction "Diametroid()" d'animation périodiquement tous les intervalles de temps définis par "intervalle".
°   Il définit le pas "pas" de l'angle de rotation de l'arbre et de l'engrenage du planétaire d'entrée.
°   Il positionne l'axe de référence du diametroid (ref_x, ref_y, rf_z)
°   Il positionne l'angle de départ du planétaire "plan_ent_ang".

On peut donc jouer sur les deux paramètres 'intervalle et pas pour régler la vitesse de l'animation.

•   la fonction "Diametroid()", lignes 46-65 :

°   Elle incrémente l'angle de rotation "plan_ent_ang" d'un pas "pas".

Elle donne le contrôle à chaque fonction de traitement de la position des différents composants du Diametroid :

°   Elle calcule la position du pivot du composant qui dépend parfois des paramètres d'un autre composant traité précédemment,
°   Elle calcule l'angle de rotation du composant qui dépend souvent de l'angle de rotation d'un autre composant traité précédemment,
°   Elle donne le contrôle à la fonction de traitement de l'animation du composant courant,
  
- Animation du planétaire du train épicycloïdal d'entrée :  

•   la fonction "planetaire_entree(x_pivot, y_pivot, z_pivot, angle)", lignes 26-44 :

Elle provoque la modification de la position de l'engrenage planétaire du train épicycloïdal d'entrée.

°   Elle déclenche la rotation de l'engrenage du planétaire d'un angle défini par "angle",
°   Elle déclenche la rotation de l'engrenage du planétaire du même angle.

On a choisi ici de faire tourner le planétaire dans le sens des aiguille d'une montre.

- Animation des engrenages satellite du train épicycloïdal d'entrée : Nouveau source ICI

À ce niveau, le script a été repris pour les modification suivantes :

°   dans le maillon principal, l'intervalle de temps entre les tops d'horloge est calculé à partir de la définition de la vitesse de rotation du planétaire en nombre de tours par minute définie par le paramètre "nb_tours_mn_entree".
°   dans la fonction "Diametroid()", on définit les paramètres de positionnement des différents composants qui, pour certains, seront calculés en fonction de la position de certains autres,

•   la fonction "satellite_entree(numero_satellite, x_pivot, y_pivot, z_pivot, angle)",
lignes 47-66 :

°   cette fonction est appelée deux fois avec un positionnement symétrique en ordonnées des axes de rotation  par rapport à l'ordonnée de l'axe de référence,
°   le sens de rotation des satellites est inverse de celui du planétaire. Les deux satellites tournent donc en phase,
°  les engrenages satellites étant identique, leur vitesse de rotation  est fonction du rapport des nombres de dents de l'engrenage planétaire (31) et des leurs (33). Cette vitesse dépend de l'angle de rotation des engrenages donc :

angle satellite = angle planétaire * nb dents planétaire / nb dents satellite



Animation 1

<object style="width:320px;height:240px"> <param name="movie" value="player_flv_maxi.swf?file=Diametroid_anim_010.flv" > <param name="quality" value="high" > </object>
- Animation des excentriques et des broches du train épicycloïdal d'entrée : Source ICI

En vue d'une simplification de la future mise au point, le script a été pratiquement refondu pour permettre le repositionnement du Diametroid dans son état initial. En effet, l'animation modifie certains paramètres relatifs aux composants et donc, quand on arrête l'animation, on ne sait pas dans quel état se trouve la modélisation.

Certes, la solution simple, radicale et des plus fiables consiste à fermer le projet sans le sauvegarder et à restaurer le projet initial par les commande que propose FreeCAD dans sa console :

#*** Fermeture du projet sans sauvegarde :
   App.closeDocument("Diametroid")
   App.setActiveDocument("")
   App.ActiveDocument=None
   Gui.ActiveDocument=None

#*** Ouverture du projet initial :
   FreeCAD.open(".... / ..... / .... /Technique/Diametroid/Diametroid.FCStd")
   App.setActiveDocument("Diametroid")
   App.ActiveDocument=App.getDocument("Diametroid")
   Gui.ActiveDocument=Gui.getDocument("Diametroid")

La solution aurait été parfaite si j'avais pu trouver la méthode qui me permette de récupérer le chemin d'accès complet au projet ouvert par FreeCAD pour la coder dans l'instruction "FreeCAD.open(...). Le projet peut se trouver dans des répertoires différents correspondant à des différentes phases d'élaboration. Je réserve cela pour plus tard.

Par conséquent, il est impératif de remettre la configuration dans son état de départ :

°   au lancement de l'animation car le modèle pourrait ne pas être dans son état initial à cause de manipulations préalables d'origine quelconque,
°   à l'arrêt de l'animation pour laisser la place aussi propre en sortant qu'on l'a trouvée en entrant.

Le script se réduit maintenant à l'appel des méthodes suivantes :

°   la méthode "diametroid()" (lignes 26-136) : elle positionne les composants à chaque top d'horloge,
°   la méthode "position_initiale()" (lignes 138-255) : elle remet le modèle dans sont état initial,
°   la méthode "position_composant(nom_composant,  x_pivot,  y_pivot,  z_pivot,  angle)" (lignes 257-267) : elle est appelée pour chaque composant avec un pivot et un angle. Elle permet aussi de simplifier l'écriture dans la méthode d'appel donc de rendre la programmation plus lisible,

Les méthodes suivantes (lignes 269-302) permettent de contrôler l'exécution de l'animation en les saisissant directement au clavier de la console :

°   la méthode "a()" (lignes 281-288) : elle arrête l'animation par arrêt de l'horloge et appelle la méthode "position_initial()" pour tout remettre en ordre.
°   la méthode "s()" (lignes 290-294) : elle suspend l'animation par arrêt de l'horloge afin de pouvoir consulter des messages généralement de mise au point affichés en temps réel dans la "Vue Rapport" car il n'est pas prévu dans FreeCAD semble-til d'en suspendre le déroulement.
°   la méthode "r()" (lignes 296-302) : elle relance l'animation suspendue.

Pour permettre l'arrêt, la suspension et la reprise de l'exécution du script, comme je l'ai expliqué dans le 2° de la remarque 1, le script doit être copié et collé dans la console pour travailler dans son espace-adresse. Ces possibilités n'ont pas l'air d'être disponibles en standard. De plus, si on édite le script du présent projet qui boucle sur un timer sans jamais s'arrêter de lui-même, il n'y a apparemment aucune d'autre solution que celle de fermer FreeCAD !...

Les deux méthodes "position_initiale()"  et "diametroid()" ont la même structure et leur programmation a l'avantage d'être assez "mécanique".  La seule différence réside dans le fait que les paramètres initiaux sont figés dans la première et que les mêmes paramètres sont calculés dans la deuxième.

- Animation des broches de excentriques :  

C'est bien parce que la broche de chacun des satellites est déportée de 22 mm de l'axe de ces derniers qu'on les appelle "excentriques". Ils sont solidaires des satellites et tournent en phase.

Dans un premier essai, j'avais associé le cylindre et la broche de l'excentrique. J'avais eu quelques difficultés à manipuler les broches par la suite.

Dans la version actuelle, les broches sont traitées séparément. Le calcul des coordonnées du pivot dans le plan Z étant simplement assuré par les instructions suivantes :

- sat_ent_n_bro_x = sat_ent_n_exc_x + ray_tra_cen_bro*math.cos(alpha)
- sat_ent_n_bro_y = sat_ent_n_exc_y + ray_tra_cen_bro*math.sin(alpha)

où :

°   (sat_ent_1_bro_x, sat_ent_1_bro_y) sont les coordonnées du pivot de la broche "n".
°   (sat_ent_n_exc_x, sat_ent_n_exc_y) sont les coordonnées du pivot de l'excentrique.
°   ray_tra_cen_bro est le rayon du cercle de la trajectoire du pivot de la broche.
°   alpha est l'angle courant de rotation de l'excentrique.
  
- Animation globale du train épicycloïdal d'entrée :  


Animation 2

- Animation du train épicycloïdal de sortie :  

Comme cela a été sommairement décrit dans la page "Virtualisation", on pressent le fonctionnement de cette transmission continue variable.

Concrètement, le conducteur adapte un régime moteur pour pouvoir rouler à la vitesse qu'il souhaite. La transmission sélecte en permanence, sans aide extérieure, le rapport de vitesse approprié pour des efforts minimaux et aussi des contraintes minimales. C'est ce que fait normalement le conducteur manuellement si la boîte est mécanique et ce que fait l'asservissement et l'électronique si c'est une boîte automatique.

La vitesse de translation du véhicule est directement liée à la vitesse de rotation des roues donc à la vitesse de rotation de l'arbre du planétaire de sortie. Pour une vitesse de rotation donnée sur l'arbre du planétaire d'entrée et une vitesse de rotation donnée sur l'arbre du planétaire de sortie, il s'agit de déterminer la vitesse de rotation du bloc qui contient l'ensemble des composants qui assurent l'auto-adaptation.

Il est logique de traiter maintenant l'animation du train épicycloïdal de sortie. Dans le maillon principal du script, comme pour la vitesse de rotation de l'arbre du train épicycloïdal d'entrée avec le paramètre "nb_tours_mn_entree", on définit une vitesse de rotation de l'arbre du train épicycloïdal de sortie par le paramètre "nb_tours_mn_entree". Mais cette fois-ci, on calcule le pas d'angle parcouru à chaque top d'horloge par l'arbre du train de sortie.

IL n'est pas proposé de description car le principe de fonctionnement de l'étage de sortie est identique à celui de l'étage d'entrée, jusqu'aux couronnes des trains épicycloïdaux.

- Animation de la couronne du train épicycloïdal d'entrée et du pignon de phase : Source ICI

J'ai essayé de commenter le plus possible le code du script. Comme on retrouve souvent des séquences analogues voire identiques aux valeurs près des paramètres, on retrouvera les mêmes commentaires que je n'ai pas pris la peine de supprimer !...

Le script d'animation correspond à l'image de la figure 1 ci-dessous du Diametroid. On ne s'intéressera pour le moment qu'à l'étage d'entrée jusqu'au pignon de phase, partie de la transmission  dont l'image ne fait pas apparaître l'anomalie de fonctionnement que je pressens :


Figure 1

L'axe de la tringle gris-blanc coïncide avec l'axe de référence du Diametroid et indique ici la solidarité entre le support des excentriques des satellites et le pignon de phase (tous deux en vert foncé), comme on peut le repérer sur le modèle de John Bisby dans l'éclaté de la figure 2 que j'ai pu réaliser sous Rhinoceros à partir de son fichier "Diametroid EP.3ds"  :

Train_epicycloidal_entree_Rhinoceros_010 
figure 2

On peut parfaitement voir les évidements des boulons de fixation sur le support des excentriques et le pignon de phase. Mais on peut aussi remarquer avec surprise sur la figure 3 que le nombre de dents de la couronne comporte 24 dents et celui du pignon de phase 16 ce qui ne permet pas à l'entretoise d'évoluer dans l'évidement de la couronne :

Train_epicycloidal_entree_Rhinoceros_020 
figure 3

 Dans son document, John Bisby précise pourtant que ces deux nombres doivent être dans le rapport, 24/12, 32/16 si l'on souhaite que l'entretoise soit la plus grande possible pour des raisons de résistance mécanique. La figure 4 ci-dessous illustre le problème et l'on voit que les engrenages de gauche 24/12 permettent à l'entretoise de passer au plus près des évidements des excentriques tout en gardant au maximum sa surface de contact avec leur support :

test_engrenages
figure
4

Les engrenages de droite pourraient bien sûr fonctionner correctement mais ce serait au prix d'une réduction du rayon du cercle périphérique de l'entretoise si les contraintes de résistance sont satisfaites.

Contrairement

Figure 5
 à John Bisby, j'ai donc adopté la configuration 24/12 et je reprends donc le fil de l'animation dans laquelle je n'ai pas réussi à faire fonctionner correctement cet ensemble mécanique. N'étant pas un spécialiste du traitement des engrenages, peut-être, n'ai-je pas traité correctement l'animation dans mon script ?

Pourtant, si l'on observe la figure 5, la couronne, couleur ocre-jaune, commandée par les deux broches des deux excentrique, en rouge, se déplace parallèlement au plan passant par les axes de ces deux excentriques. Ce plan tourne à la vitesse la rotation du support des satellites, en vert. La couronne tourne donc à la même vitesse que celle du support.

Or, le pignon de phase, en vert au centre, devrait s'engréner dans la couronne pour tourner deux fois plus vite que cette dernière quand on regarde le nombre de dents des engrenages. Mais le pignon de phase est solidaire du support. Il tourne donc à la même vitesse que celle du support donc à la même vitesse que celle de la couronne ce qui mécaniquement impossible.

C'est cette particularité qui m'a intrigué. On le voit bien sur la figure 5, la couronne et le pignon de phase n'arrivent pas à s'engrener correctement.

C'est peut-être ce phénomène qui a entraîné l'abandon du projet par John Bisby.

Je présente néanmoins le script pour une étude du projet par d'éventuels intéressés qui, peut-être, pourraient me communiquer remarques, critiques et conseils voire suggestions qui seront les bienvenus avec mes remerciements.

Le fichier de modélisation : 
le fichier du script : 
"Diametroid.FCStd"
"Diametroid.py"

Le script Python a été programmé en vue de le copier dans la console pour qu'il travaille dans l'espace adresse de cette dernière dans le but de pouvoir exécuter en temps réel certaines méthodes et modifier certains paramètres.

Le script a été à nouveau restructuré comme suit :

              °   lignes 395-434 :  la "maillon principal" du script  est le point d'entrée de l'animation qui initialise les conditions de son départ :
  
  - lignes 405-406 :   définition du nombre de tours par minutes de l'étage d'entrée "nb_tours_mn_entree" et de l'étage de sortie "nb_tours_mn_sortie".
     On rappelle que le but du projet est de vérifier comment la vitesse de rotation de l'étage d'auto-adaptation peut être déterminée en fonction de la vitesse de rotation  du planétaire d'entrée sur lequel est connecté le moteur pour obtenir la vitesse de rotation désirée du planétaire de l'étage de sortie sur lequel sont connectées les roues.
  - lignes 408-409 :   position de repos de l'angle φ de l'axe   des excentriques d'entrée "phi_ent" et de sortie "phi_sor" avec la verticale.
  - lignes 413 :   définition du pas "pas" d'incrémentation de l'angle "plan_ent_ang_d" du planétaire d'entrée exprimé en degrés.
   Ce paramètre peut être modifié pendant l'animation pour changer la vitesse d'affichage.
  - lignes 415-419 :   définition de l'intervalle "intervalle" en millisecondes de temps entre deux tops d'horloge. Cette intervalle détermine la vitesse de l'animation.
  - lignes 427 :   appel à la méthode "position_initiale()" pour positionner le modèle dans son état d'origine. Cette opération est nécessaire car le modèle pourrait très bien être modifié avant le démarrage de l'animation.
  - lignes 429-432 :   initialisation d'un timer qui lancera la méthode "diametroid()" toutes les "intervalle" millisecondes.
       
              °   lignes 26-56 :  la méthode "position_initiale()" positionne le Diametroid dans son état initial. Elle définit les paramètres de départ et appelle la méthode "diametroid()".
  

  - lignes 37-38 :   définition des coordonnées et de l'angle de référence (ref_x, ref_y, ref_z). Ces paramètres ne sont pas très utiles car, au départ, je pensais pouvoir localiser plusieurs modélisations pour comparaison.
  - lignes 40-41 :   définition de l'angle φ de l'étage d'entrée "phi_ent" et de l'étage de sortie "phi_sor". Explications plus loin.
  - lignes 43-50 :   définition de la position des différents composants du Diametroid le long de l'axe des Z. Pendant l'animation, il est possible de changer la valeur de ces paramètres directement dans la console pour voir le composant se déplacer (visualisation d'un éclaté ou d'un condensé avec les combinaisons intermédiaires).
     Vu l'anomalie rencontrée, l'étage de sortie n'est pas traité.
  - lignes 52-54 :   initialisation de l'angle en degrés du planétaire de l'étage d'entrée et appel à la méthode "diametroid()" pour le positionnement de départ.
       
          °   lignes 58-346 :  la méthode "diametroid()" positionne le Diametroid pour l'angle courant "plan_ent_ang_d" du planétaire d'entrée. La méthode est exécutée à chaque top d'horloge :
  

  - lignes 75 :   incrémentation d'un pas de l'angle "plan_ent_ang_d"  en degrés du planétaire de l'étage d'entrée.
  - lignes 77-81 :   calcul de l'angle "phi_ent"  en degrés du plan s'appuyant sur les axes des satellites S1 et S2 de l'étage d'entrée donné par le pignon de phase centré sur l'axe de référence P. Ce plan est représenté par la droite pointillée (S1,S2). Il dépend non seulement du rapport du nombre de dents de l'engrenage du planétaire centré sur P et de celui des satellites S1 et S2 mais aussi du rapport du nombre de dents de l'engrenage du pignon de phase aussi centré sur P et de celui de la couronne centré en C à mi distance de l'axe des broches B1 et B2 des excentriques E1 et E2 :
 
       L'angle θ (B1,S1,S) que prend le centre de la broche B1 avec l'axe (S1,S) est proportionnel à l'angle de rotation du planétaire dans le rapport
                       plan_ent_eng_dents / sat_ent_eng_dents

plan_ent_eng_dents :   est le nombre de dents de l'engrenage du planétaire et
sat_ent_eng_dents   est le nombre de dents de l'engrenage  de chaque satellite.

     Mais pendant que les broches B1 et B2 parcourent cet angle θ,  l'axe (S2,S1) du support des satellites parcourt l'angle φ dans le rapport
                      pig_pha_eng_dents / cou_ent_eng_dents

pig_pha_eng_dents   est le nombre de dents de l'engrenage  du pignon de phase.
cou_ent_eng_dents :   est le nombre de dents de l'engrenage de la couronne.
  - lignes 83-93 :   positionnement du planétaire d'entrée situé à la cote "plan_ent_eng_z=ref_z+100.0 mm" par défaut (ref_x, ref_y, ref_z). La définition des cotes des différents composants par rapport à origine de référence permet de les rapprocher plus ou moins pour une meilleure observation. 
     Le but du projet est aussi de montrer l'animation d'un éclaté du Diametroid.
  
   Il y a deux positionnement à opérer, celui de l'arbre du planétaire et celui de son engrenage.
  - lignes 95-135 :   calcul des coordonnées du centre du satellite n° 1 de l'étage d'entrée situé à la même cote que celle du planétaire. Ces coordonnées dépendent de l'angle φ et coïncident avec celles de l'arbre et de l'excentrique. Les broches de l'excentrique ont pour centre de rotation le centre de l'excentrique et tourne autour de lui à la même vitesse angulaire que le satellite.
  - lignes 137-174 :   positionnement du satellite n° 2 de l'étage d'entrée situé à la même cote que celle du planétaire.
     Le traitement est identique à celui du satellite N°1.
  - lignes 176-181 :   positionnement du support des satellites d'entrée. Il tourne à la vitesse données par l'angle "phi_ent".
  - lignes 183-191 :   positionnement de la couronne de l'étage d'entrée dont le mouvement est commandé par les broches des excentriques. Elle se déplace parallèlement à elle-même. Sa vitesse de rotation est la même que celle du support des excentriques. La vitesse linéaire des broches prises isolément n'est pas constante puisque leur vitesse de déplacement varient en fonction de leurs positions avançantes ou reculantes sur leurs excentriques respectif mais, sur un tour complet de ces derniers, la vitesse de rotation de la couronne est  "phi_ent" imprimée par le support des satellites. Quand l'une est avançante, l'autre est reculante, leur mouvement conjoint se compense pour donner une vitesse de rotation constante.
  - lignes 493-205 :  positionnement du pignon de phase.  Solidaire du support des excentriques, il a la même vitesse soit  "phi_ent".
  - lignes 207-279 :  positionnement du train épicycloïdale de sortie commencé mais non poursuivi.
  - lignes 281-342 :  phase exécutoire des positionnements définis pour l'ensemble des composants.
  - lignes 344 :  appel de la méthode "s()" pour suspendre l'animation afin de permettre la création des images à inclure dans un gif animé.
  - lignes 348-358 :  la méthode "position_composant()" effectue le positionnement effectif d'un élément animé sur le modèle. Elle contient la seule instruction de modification du modèle.
  - lignes 360-393 :  méthodes déjà décrites qui permettent la suspension, la reprise ou l'arrêt de l'animation en saisissant directement dans la console Python le nom de la méthode (avec ses parenthèses).

À cause de la suspicion que j'avais formulée plus haut sur le blocage mécanique de ce Diametroid que je pense avoir confirmée, je ne poursuis pas davantage l'étude en attendant, peut-être un éventuellement éclaircissement.

Pour conclure, je dois dire que cette petite étude a été un bon exercice de découverte du logiciel FreeCAD :

° côté virtualisation   la définition du modèle est relativement facile,
° côté animation : la programmation est un peu plus délicate tout en n'étant pas difficile outre mesure. Je n'ai pas réussi à utiliser les script sous éditeur car, une fois lancé, je n'ai pas trouvé le moyen de l'arrêter, ni même de le suspendre ou de le continuer.
     

 

 

--ooOoo--