Python Development Environment/de

Eine vereinfachte Entwicklungsumgebung für Python in FreeCAD
Python ist eine Programmierumgebung, die in das FreeCAD System integriert wurde. Mit Python stehen viele von FreeCAD angebotene Abläufe für den programmierten Zugriff zur Verfügung. Python Programme für FreeCAD werden in der Regel so entwickelt, dass sie entweder auf der Python Konsole oder über die Makrofunktion von FreeCAD ausgeführt werden können (siehe Wie man Makros installiert).

Für die Programmentwicklung in Python stehen zahlreiche Werkzeuge zur Verfügung. Die komplizierenden Faktoren für die Entwicklung von Python zur Verwendung mit FreeCAD sind zweifach: Zum einen haben die Werkzeuge keine Unterstützung für die zahlreichen Datenstrukturen und Zugriffspunkte von FreeCAD; zum anderen funktionieren sie nicht "innerhalb von FreeCAD". Das bedeutet, dass Du mit ihnen Code außerhalb von FreeCAD entwickeln kannst und nicht in der Zielumgebung testen kannst; oder Du kannst Python in der Zielumgebung (d.h. der FreeCAD Umgebung) entwickeln, hast aber keine Unterstützung durch die Entwicklungswerkzeuge. Keines von beiden ist eine akzeptable Lösung.

Hintergrund
Die moderne Softwareentwicklung auf dem kommerziellen Standard erfolgt in der Regel mit einem Satz von Werkzeugen, der üblicherweise als 'IDE' bezeichnet wird. Typischerweise umfassen diese Werkzeuge die folgenden 3:


 * Quellcode Editor
 * Automatisierungstools bauen
 * Fehlersuchprogramme

die Standard sind, während die folgenden in einigen IDEs vorhanden sind, in anderen aber nicht:


 * intelligente Code Vervollständigung
 * integrierter Compiler, Interpreter oder beides
 * Versionskontrollsystem
 * Konstruktion der grafischen Benutzeroberfläche (GUI)
 * Klasse Browser
 * Objekt Browser
 * Klassenhierarchie Diagramm

Eine Zusammenfassung des Status dieser Werkzeuge innerhalb von FreeCAD ist ('N/V' bedeutet 'Nicht Verfügbar'.):

Es gibt viele Werkzeuge zur Unterstützung der oben genannten Funktion für die Python Programmierung, aber leider lassen sie sich nicht in die FreeCAD Entwicklungsumgebung integrieren.

Eine Liste von IDEs für Python findest du unter Integrierte Entwicklungsumgebungen für Python.

Editoren
Es gibt einen Editor für Python als Teil von FreeCAD, er wird durch Klicken auf die Schaltfläche Bearbeiten im Menü Makro->Makros... gestartet. Wenn du einen Editor eines Drittanbieters verwenden möchtest, der die Vorteile deiner Plattform ausnutzt, dann gibt es verschiedene Python Editoren, für zahlreiche Plattformen und mit unterschiedlichem Funktionsumfang. Ein Vorteil der Verwendung eines externen Editors ist, dass der Anzeigebereich von FreeCAD für die Ausgabe (sowohl grafisch als auch in Textform auf der Konsole) genutzt werden kann, während der Quellcode in einer anderen Anwendung angezeigt wird. Eine Liste von Editoren für Python für eine Vielzahl von Plattformen ist verfügbar unter Python Editoren.

Hinweis : Für den Macintosh funktioniert der Texteditor TextWrangler gut. Er verfügt über Code Hervorhebung und ausgezeichnete Suchmöglichkeiten. Es gibt Optionen zur Ausführung von Aufträgen in Python, aber diese funktionieren natürlich nicht mit der FreeCAD Umgebung.

Makro Quellcode Verzeichnisse
Es gibt zwei Verzeichnisse, die von FreeCAD verwendet werden. Standardmäßig handelt es sich um dasselbe Verzeichnis, aber sie werden von verschiedenen Aufrufpunkten in FreeCAD angesprochen:
 * FreeCAD.ConfigGet ("UserAppData")
 * FreeCAD.ParamGet('User parameter:BaseApp/Preferences/Macro').GetString('MacroPath')

Das erste "UserAppData" zeigt auf ein Verzeichnis, in dem Dinge wie Konfigurationsdateien oder andere Dateien, die für den Benutzer bestimmt sind, aber nicht vom Benutzer bearbeitet werden sollen, gespeichert werden können.

Das zweite "MacroPath" verweist auf ein Verzeichnis, in dem die Python Dateien, bei denen es sich um Makro Dateien für FreeCAD handelt, gespeichert sind. Um eine Python Datei als Makro Datei für FreeCAD zu markieren, wird die Dateierweiterung von ".py" in ".FCMacro" geändert.

Standardmäßig befinden sich diese beiden Verzeichnisse am selben Ort, aber dies ist nicht notwendig. Es kann sinnvoll sein, den Speicherort für die Makro Dateien (*.FCMacro) auf einen anderen Speicherort zu ändern.

Das Bearbeiten von Dateien, die sich im "MacroPath" befinden, ist unkompliziert, der Texteditor wird dies berücksichtigen. Um die Benutzung von FreeCAD Makro Dateien zu erleichtern, ist es ratsam, alle Makro Dateien in dem Verzeichnis zu belassen, auf das "MacroPath" verweist.

Um das Verzeichnis "MacroPath" zu ändern, verwende Werkzeuge->Parameter bearbeiten und wähle dann Einstellungen/Makro/MakroPfad, wo der Text doppelgeklickt und bearbeitet werden kann. Alternativ kann "MacroPath" durch den Code geändert werden:

Fehlersuchprogramm
Debugger bieten typischerweise zwei Hauptfunktionen (unter anderem):
 * Haltepunkte im Quellcode
 * Variablenprüfung

Haltepunkte sind 'Fallen', die in den Code gesetzt werden. Wenn der Ausführungspfad durch den Code auf einen dieser Haltepunkte trifft, wird die Ausführung angehalten oder unterbrochen. Beachte, dass die Ausführung nicht angehalten wird, da beim Anhalten eines Programms alle speicherresistenten Informationen wie z.B. Variablen verloren gehen. Während das Programm angehalten wird, kann der Inhalt der Variablen überprüft und manchmal geändert werden (was von der Fähigkeit des Fehlersuchprogramms abhängt). Im Allgemeinen kann der Quellcode nicht geändert werden, obwohl einige Umgebungen dies unterstützen. Wenn der Quellcode fertig ist, kann die Ausführung des Quellcodes wieder aufgenommen werden. Es können zahlreiche Haltepunkte im Code gesetzt werden und es kann zu zahlreichen Unterbrechungen durch die Haltepunkte kommen. Der Zweck des Fehlersuchprogramms besteht darin, sicherzustellen, dass die Ausführung mit den Haltepunkten und Unterbrechungen funktionell identisch mit der Ausführung ohne Haltepunkte ist.

Variablenprüfungen sind während der durch einen Haltepunkt verursachten Aussetzung der Ausführung verfügbar. Im Allgemeinen kann der Inhalt von Variablen eingesehen werden, viele Fehlersuchprogramme unterstützen auch die Bearbeitung des Inhalts, bevor die Ausführung wieder aufgenommen wird.

Obwohl ein voll funktionsfähiger Fehlersuchprogramm für FreeCAD geplant ist, ist es noch nicht verfügbar. In diesem Abschnitt werden einige Arbeitsumgehungen für die Zwischenzeit bis zur Freigabe des Fehlersuchprogramms beschrieben.

Breakpoints
Implementing breakpoints involves a supervisory level of code which administers the execution of the code under development. Such a level of code for Python development within FreeCAD is not presently available. As a weak substitute, the following code is an option. Instead of suspending the execution the code will halt execution completely by dividing a number by zero. This really is a very weak option compared to a proper debugger breakpoint, also this option is only of use when used alongside the routine shown in the next section 'Variable Inspection'.

Breakpoint Code

Console Traceback

When a program fails during execution, Python generates what is known as a traceback which lists the order of program execution (i.e. which program called which program in which order).

For the code sample

we get the following traceback:

Reading the traceback we can determine that:
 * a message of 'Breakpoint: amalgamation routine' was sent by the breakpoint which has the string 'amalgamation routine'
 * the execution error occurred at line 28 of module 'myNewMacro'
 * routine 'myNewMacro' was called from line 40 in the module 'testStub'

Assuming the string passed to the breakpoint call is meaningful then the location of the breakpoint can easily be determined. Note that is a complex system the traceback may have tens or even hundreds of entries in it.

To become productive with these breakpoints, continue on to the next section.

Variable Inspection
The second main feature of a debugger is to examine and possibly alter the contents of variables. Once again, until the FreeCAD debugger for Python is ready we have to depend on work-arounds.

A feature of the FreeCAD system is the provision of global variables. These variables that are created by the Python code and exist in FreeCAD's memory until the user Quits from FreeCAD. The form of these variables is:

The statement creates a Python variable in the FreeCAD memory which is fully accessible to Python code, in fact it behaves identically to a normal Python variable. Yet after the Python code finishes running, no matter if it is running as a macro or through the console, there will be a variable 'FreeCAD.myVariable' remaining in memory with the value of 123. Entering:

will produce the contents of the variable on the console. This value will remain in FreeCAD until either it is changed or the user Quits from FreeCAD. This means the value is present and available for a subsequent Python program to read from. At any time it can be checked from the console by typing it's name. So a program called 'Program A':

can run and load values into the global variable. Later a second program called 'Program B' can run and retrieve the value:

Presumably 'Program B' then goes on to make calculations involving the values left in FreeCAD.myVariable. At any time the user can type on the console to inspect the variable contents:

An important fact to be aware of with FreeCAD global variables is that they exist in memory and are lost when the program is Quit from. They are not saved with documents but only exist in memory.

Anwendung
Damit sind wir an einem Punkt angelangt, an dem wir die beiden Schritte zusammenfügen und sie dazu nutzen können, Fehler im Code aufzuspüren. Dies ist etwas umständlich in der Anwendung, aber es ist nur eine Option, bis das FreeCAD Fehlersuchprogramm fertig ist.

It's probably easiest to present through an example, say the following program is being debugged:

Execution of the program on the console yields:

which is not what we expected! Assuming we are unable to see the errors we can use our unsophisticated breakpoint and variable examiner as follows. We can insert a line to copy the value of the variable we are wondering about to a global variable, then we can place a breakpoint to halt execution there:

Now when we run the program we get:

Probably things don't look so good, but what we can now do is inspect the value of the Python variable 'temporaryVariable1' as we assigned it's value to the global variable 'FreeCAD.saveMyVariable':

Remembering that the variable 'FreeCAD.saveMyVariable' holds the value of the Python variable 'temporaryVariable1' we can now determine the error in the value and start tracing back to determine where the error came from. When we are looking at 'FreeCAD.saveMyVariable' it is important to realise that the variable 'temporaryVariable1' is no longer available - it has been garbage collected away by the Python system.

Once the error has been located in the statement

and corrected to:

Then we can run the program again, and get the value of '11' which is still not right. We can make more assignments to FreeCAD global variables, have multiple breakpoints (although the first one encountered will stop execution)

We now have two breakpoints (although one is commented out) and two FreeCAD global variables in use. There is no practical limit to the global variables available from FreeCAD so there is no need to economise unnecessarily. We can now produce the following on the console:

Some points about the use of the FreeCAD global variables:
 * Python treats these variables identically to any other Python variable
 * these variables may hold any Python data type - anything a regular Python variable would hold
 * these variables may be used to 'bring out' the contents of a Python variable so we can see them
 * also these variables may be used to 'supply' values to a Python variable by setting their value from the console prior to running a routine, or setting it in a previous Python program
 * these variables may be used to pass data between two programs that run at different points in time
 * (to repeat) these variables are only for the duration of the FreeCAD session, once the user Quits from FreeCAD then the variables are lost

Variablen Beobachter
Es gibt ein Dienstprogramm Global Variable Watcher, um die globalen Variablen von FreeCAD zu überwachen. Es kann den Inhalt einer globalen Variable entweder auf Anfrage oder auf Zeitbasis anzeigen.

Namensraum Konflikt
Eine Sache, die man beachten muss, ist, dass FreeCAD keine Verwaltung von globalen Variablennamen hat, so dass die Möglichkeit besteht, eine Variable vom System oder ein anderes Stück Code zu ändern. Folglich ist es eine gute Idee, Ihren Variablen etwas Eindeutiges voranzustellen, wie z.B. den Routinenamen. Um beispielsweise eine Variable aus einer Routine namens 'alpha1' zu verwenden, könnte der globale Name 'FreeCAD.alpha1MyVariable' lauten.

Codierungsgerüst
Bei der Entwicklung von kleinen Teilen des Python Codes in FreeCAD kann es ausreichen, die Python Konsole zu verwenden. Mit zunehmender Anzahl von Codezeilen macht es jedoch mehr Sinn, diese in einer Datei zu speichern. Python kann in jeder Datei mit der Endung ".py" stehen, FreeCAD bietet jedoch auch einen Mechanismus namens Macro zum Speichern solcher Programme und zur Interaktion mit ihnen (z.B. Bearbeiten, Ausführen). Python in regulären '.py'-Dateien kann nur von der Python Konsole aus ausgeführt werden, während Python in der Makro Datei '.FCMacro' von der FreeCAD Schnittstelle zur Ausführung von Makros ausgeführt werden kann. Ein Nachteil der FreeCAD Menüoberfläche ist, dass sie menügeführt ist und ein Kontrollfenster enthält, was zu einem gewissen Durcheinander auf der Bildschirmoberfläche führen kann.

Ein einfacherer Ansatz ist es, den Python Code zu nehmen und ihn nicht aus dem FreeCAD Makro Menü zu starten, sondern aus einer Werkzeugleiste heraus. Eine Python Routine, die mit einer Schaltfläche in einer Symbolleiste verknüpft ist, kann mit einem Klick ausgeführt werden. Da es sich bei den Symbolleisten um schwebende Fenster handelt, wird die Bildschirmanzeige nicht überladen. Wenn das FreeCAD Fenster kleiner als die physische Größe des Bildschirms ist, kann die Symbolleiste außerhalb des FreeCAD Fensters schweben. Dies ist vorteilhaft, wenn Bildschirmschnappschüsse der FreeCAD Anzeige benötigt werden. Außerdem kann die Werkzeugleiste viel kleiner sein als das Makro-Steuerungsfenster, das im Makro Menü von FreeCAD angezeigt wird.

Das Verbinden eines Makros mit einer Schaltfläche auf einer Symbolleiste wird in So installieren Sie Makros und So passen Sie eine Symbolleiste an behandelt. Es kann einige Minuten dauern, ein Makro mit einer Schaltfläche in der Symbolleiste zu verbinden, ein Symbol auszuwählen usw. Dies ist nicht immer erforderlich, da man manchmal einfach nur schnell ein Stück Code ausarbeiten möchte, das dann in einen anderen Code integriert wird. Für diese Situation kann ein Test Stub vorteilhaft sein. Es gibt keine wirkliche Definition dafür, was ein Test-Stub beinhalten würde, es hängt wirklich von der Person und dem Anwendungsbereich ab. Ein Beispiel ist unten dargestellt:

Dieser Test stub dient auch als Vorlage für Code mit definierten Stellen für die verschiedenen Aspekte eines großen Python Programms. Bei der Ausführung des Teststub Programms wird einfach eine Meldung mit dem Namen des Programms erzeugt und beendet. Bei der Verwendung eines Teststubs wird der geschriebene Hauptzeilencode ganz am Ende der Datei platziert, wobei der Code für die Klassendefinition, Funktionen usw. in den vorherigen Abschnitten platziert wird. Das Template kann einfach an die Situation angepasst werden. Bei einem Programm mit 5 Zeilen ist eine solche Menge an Dokumentation natürlich nicht notwendig.

Indem man einen Button permanent auf einer Symbolleiste behält und diesen Button mit dem Test Sub verknüpft, gibt es immer einen Bereich, in dem man Code schreiben und sofort ausführen kann. Die Ausführung erfolgt unabhängig von der Python Konsole. Die Ausführung kann auch unabhängig von der Bildschirm GUI erfolgen. Die Ausgaben des zu entwickelnden Programms erscheinen so, wie sie auf dem Bildschirm erscheinen sollen, ohne weitere Artefakte aus der Programmierumgebung. Die Python Konsole kann bei Bedarf ausgeblendet werden, um die Anzeigefläche zu vergrößern oder für andere Zwecke verwendet werden. Wenn die Ausführung über die Schaltfläche in der Werkzeugleiste erfolgt, wird die Konsole nicht benötigt.

Wenn der Code fertig ist, kann er einfach in eine andere Datei kopiert werden und der Text stub bleibt bis zum nächsten Mal leer.

Mehrere Code Stücke können unter Verwendung desselben Teststub mit etwas extra Code für die Bereitstellung mehrerer Buttons entwickelt werden, der sich unter PySide Beginner Examples - More Than 2 Buttons befindet.

Mehr PySide Unterstützung

Für weitere Unterstützung bei der Verwendung der PySide GUI gibt es die Seite PySide

Mehr Unterstützung für Python Programmierung

Für weitere Unterstützung bei der Python Codierung gibt es ein Makro, das zur Unterstützung bei der Entwicklung von Python Code geschrieben wurde, befindet es sich unter Python Assistenz Fenster

Alles Zusammensetzen
Die Bildschirmverwaltung kann eine Herausforderung sein, wenn es darum geht, Code zu entwickeln, der komplexe und detaillierte grafische Ausgaben hat, wie es FreeCAD tut. Das folgende System funktioniert gut:
 * FreeCAD für Konsole, Bericht, GUI-Anzeige
 * Symbolleiste zum Aufruf von in Entwicklung befindlichem Code
 * externer Editor zum Modifizieren des Codes
 * PAW (Python Assistant Window) zur Unterstützung der Python Code Generierung

Bildschirmmanagement

Wenn der Test stub über eine Symbolleiste bedient wird und ein externer Editor verwendet wird, wird das Fensterlayout auf dem Bildschirm in etwa so aussehen:



"Baum" im Diagramm bezieht sich auf den Combi oder Baum Browser, die Python Konsole und die Report Ansicht sind im unteren Fenster zusammengefasst und über Schaltflächen auswählbar. Durch den gezielten Einsatz der Werkzeuge kann der Entwicklungsstrom optimiert werden, das oben genannte ist nur eine Idee. Der Zuschnitt erfolgt auf einer persönlichen Basis.

Verschiedene Verknüpfungen
Einige andere Verknüpfungen über IDEs für Python, die von Interesse sein könnten, sind:
 * Vergleich von Python-IDEs für die Entwicklung
 * Die beste Python-IDE auswählen
 * Ihre Entwicklungsumgebung
 * PyCharm Community Edition IDE