Wrapping a Cplusplus class in Python/fr

Contexte
FreeCAD utilise un système personnalisé basé sur XML pour créer le wrapper Python d'une classe C++. Pour encapsuler une classe C++ afin de l'utiliser dans Python, deux fichiers doivent être créés manuellement, et deux fichiers sont automatiquement générés par le système de construction CMake (en plus des fichiers d'en-tête et d'implémentation C++ de la classe).

Vous devez créer :

Editez le fichier approprié pour ajouter des références à ces deux fichiers. A partir du fichier XML, le système de construction créera alors :

Fichier XML de description des classes
Le fichier XML fournit des informations sur les fonctions et attributs que la classe Python implémente ainsi que la documentation utilisateur pour ces éléments qui s'affiche dans la Console Python de FreeCAD.

Pour cet exemple, nous allons examiner le wrapper de la classe Axis C++. Le fichier de description XML commence par:

Et définit une direction et une position (base) dans l'espace 3D.

And defines a direction and a position (base) in 3D space.

Les constructeurs suivants sont pris en charge :
 * Axis -- constructeur vide
 * Axis(Axis) -- copie le constructeur
 * Axis(Base, Direction) -- définit la position et la direction

Après ce préambule, une liste de méthodes et d'attributs est donnée. Le format d'une méthode est le suivant :

Le format d'un attribut est :

Pour un attribut, si "ReadOnly" est faux, vous devez fournir une fonction getter et une fonction setter. Si elle est vraie, seule une fonction getter est autorisée. Dans ce cas, nous devrons fournir deux fonctions dans le fichier C++ d'implémentation :

et

and:

Mise en œuvre du fichier Cplusplus
Le fichier d'implémentation C++ fournit la "colle" qui relie les structures C++ et Python ensemble, effectuant la traduction efficacement d'un langage à l'autre. Le système FreeCAD C++ vers Python fournit un certain nombre de classes C++ qui correspondent à leur type Python. La plus fondamentale de ces classes est la classe -- rarement créée directement, cette classe fournit la base de l'arbre d'héritage et est utilisée comme type de retour pour toute fonction qui retourne des données Python.

Fichiers inclus
Votre fichier d'implémentation C++ comprendra les fichiers suivants : {{Code|lang=cpp|code=
 * 1) include "PreCompiled.h"

{{Code|lang=cpp|code=
 * 1) include "PreCompiled.h"


 * 1) include "[YourClass].h"

// Inclusion of the generated files (generated out of [YourClass]Py.xml) }}
 * 1) include "[YourClass]Py.h"
 * 2) include "[YourClass]Py.cpp"

Bien entendu, vous pouvez inclure tous les autres en-têtes C++ dont votre code a besoin pour fonctionner.

Constructeur
Votre implémentation C++ doit contenir la définition de la fonction PyInit : par exemple, pour le wrapper de la classe Axis, c'est

Dans cette fonction, vous aurez probablement besoin d'analyser les arguments entrants du constructeur : la fonction la plus importante à cet effet est la fonction fournie par Python. Elle prend en compte la liste des arguments passés, un descripteur pour les arguments attendus qu'elle doit analyser, ainsi que les informations de type et les emplacements de stockage pour les résultats analysés. Par exemple :

Pour une liste complète des spécificateurs de format, voir documentation de l'API Python C. Notez que plusieurs fonctions connexes sont également définies pour permettre l'utilisation de mots-clés etc... L'ensemble complet est le suivant :