Wrapping a Cplusplus class in Python/pl

Kontekst
FreeCAD używa niestandardowego systemu opartego na XML do tworzenia opakowania Pythona dla klasy C++. Aby opakować klasę C++ do użytku w środowisku Python, należy ręcznie utworzyć dwa pliki, a dwa pliki są automatycznie generowane przez system kompilacji CMake (oprócz plików nagłówkowych i implementacyjnych C++ dla klasy).

Musisz utworzyć:

Edytuj odpowiedni plik, aby dodać odniesienia do tych dwóch plików. Z pliku XML system kompilacji utworzy następnie:



Opis klasy Plik XML
Plik XML zawiera informacje o funkcjach i atrybutach, które implementuje klasa Python, a także dokumentację użytkownika dla tych elementów, która wyświetla się w konsoli FreeCAD.

W tym przykładzie przyjrzymy się wrapperowi dla klasy Axis C++. Plik opisu XML zaczyna się od:

Po tej preambule podana jest lista metod i atrybutów. Format metody jest następujący:

Format atrybutu jest następujący:

W przypadku atrybutu, jeśli "ReadOnly" ma wartość false, należy podać zarówno funkcję pobierającą, jak i ustawiającą. Jeśli natomiast ma wartość true, dozwolona jest tylko funkcja getter. W tym przypadku będziemy musieli dostarczyć dwie funkcje w pliku implementacji C++:

oraz:



Implementacja pliku Cplusplus
Plik implementacji C++ zapewnia "klej", który łączy ze sobą struktury C++ i Python, skutecznie tłumacząc z jednego języka na drugi. System FreeCAD C++-to-Python zapewnia szereg klas C++, które mapują się na odpowiadające im typy Pythona. Najbardziej podstawową z nich jest klasa - rzadko tworzona bezpośrednio, klasa ta stanowi podstawę drzewa dziedziczenia i jest używana jako typ zwracany dla każdej funkcji zwracającej dane z języka Python.



Dołączanie plików
Twój plik implementacyjny C++ będzie zawierać następujące pliki:

Oczywiście można dołączyć wszelkie inne nagłówki C++, których kod wymaga do działania.

Konstruktor
Twoja implementacja C++ musi zawierać definicję funkcji PyInit: na przykład dla wrappera klasy Axis jest to:

W ramach tej funkcji najprawdopodobniej będziesz musiał przeanalizować argumenty przychodzące do konstruktora: najważniejszą funkcją do tego celu jest dostarczona przez środowisko Python. Przyjmuje ona przekazaną listę argumentów, deskryptor oczekiwanych argumentów, które powinna przeanalizować, oraz informacje o typie i lokalizacje przechowywania przeanalizowanych wyników. Na przykład:

For a complete list of format specifiers see Python C API documentation. Note that several related functions are also defined which allow the use of keywords, etc. The complete set is:

Odnośniki internetowe

 * Exposing Cplusplus to Python
 * Commit 20b86e5, exposing OCC's precision methods to Python