Manual:Creating interface tools/de

In den letzten beiden Kapiteln haben wir gesehen, wie man Teilgeometrie erstellt und parametrische Objekte erstellt. Ein letztes Teil fehlt noch, um die volle Kontrolle über FreeCAD zu erhalten: Erstellen von Werkzeugen, die mit dem Benutzer interagieren.

In vielen Situationen ist es nicht sehr benutzerfreundlich, ein Objekt mit Nullwerten zu konstruieren, wie wir es im vorigen Kapitel mit dem Rechteck getan haben, und den Benutzer dann aufzufordern, die Werte für Höhe und Breite im Eigenschaftenpaneel einzugeben. Dies funktioniert bei einer sehr kleinen Anzahl von Objekten, wird aber sehr mühsam, wenn du viele Rechtecke zu erstellen hast. Ein besserer Weg wäre es, die Werte für Höhe und Breite bereits beim Erstellen des Rechtecks angeben zu können.

Python bietet ein grundlegendes Werkzeug, mit dem der Benutzer Text auf dem Bildschirm eingeben kann:

text = raw_input("Höhe des Rechtecks?") print("Die eingegebene Höhe ist",text)

Dies erfordert jedoch eine laufende Python Konsole, und wenn wir unseren Code von einem Makro aus ausführen, sind wir nicht immer sicher, dass die Python Konsole auf dem Rechner des Benutzers eingeschaltet ist.

Die Graphische Benutzeroberfläche, oder GUI, d.h. alle Teile von FreeCAD, die auf deinem Bildschirm angezeigt werden (das Menü, die Werkzeugleisten, die 3D Ansicht, usw.), sind alle zu diesem Zweck da: zur Interaktion mit dem Benutzer. Die Schnittstelle von FreeCAD ist mit Qt aufgebaut, einem sehr verbreiteten Open Source GUI Werkzeugsatz, der eine breite Palette von Werkzeugen wie Dialogfelder, Schaltflächen, Beschriftungen, Texteingabefelder oder Auswahlmenüs bietet. Diese werden alle allgemein als "Widgets" bezeichnet.

Die Qt Werkzeuge sind von Python aus dank eines Python Moduls namens Pyside sehr einfach zu benutzen (es gibt auch mehrere andere Python Module, um von Python aus mit Qt zu kommunizieren). Dieses Modul erlaubt es dir, Widgets zu erstellen und mit ihnen zu interagieren, zu lesen, was der Benutzer mit ihnen gemacht hat (was in Textfeldern ausgefüllt wurde) oder Dinge zu tun, wenn z.B. eine Schaltfläche gedrückt wurde.

Qt bietet auch ein weiteres interessantes Werkzeug namens Qt Designer, das heute in eine größere Anwendung namens Qt Ersteller eingebettet ist. Es ermöglicht die grafische Gestaltung von Dialogfeldern und Schnittstellen Paneels, anstatt sie manuell zu programmieren. In diesem Kapitel werden wir den Qt Ersteller verwenden, um ein Paneel Widget zu entwerfen, das wir im Aufgaben Paneel von FreeCAD verwenden werden. Daher musst du den Qt Ersteller von seiner offiziellen Seite herunterladen und installieren, wenn du unter Windows oder Mac arbeitest (unter Linux wird er normalerweise in Ihrer Software Verwaltungsanwendung verfügbar sein).

In der folgenden Übung werden wir zuerst ein Paneel mit Qt Ersteller erstellen, das nach Längen-, Breiten- und Höhenwerten fragt, dann erstellen wir eine Python Klasse darum herum, die die vom Benutzer eingegebenen Werte aus dem Paneel liest, und erstellen einen Kasten mit den gegebenen Abmessungen. Diese Python Klasse wird dann von FreeCAD verwendet, um das Aufgabenpaneel anzuzeigen und zu steuern:



Beginnen wir mit der Erstellung des Widgets. Starte Qt Ersteller, dann Menü Datei → Neue Datei oder Projekt → Dateien und Klassen → Qt → Qt → Qt Designer Form → Dialog ohne Schaltflächen. Klicke auf Weiter, gib einen Dateinamen zum Speichern an, klicke auf Weiter, belasse alle Projektfelder auf ihrem Standardwert (" "), und Erstellen. Das Aufgabensystem von FreeCAD fügt automatisch OK/Abbrechen-Schaltflächen hinzu, deshalb haben wir hier einen Dialog ohne Schaltflächen gewählt.




 * Suche die Beschriftung in der Liste in der linken Leiste und ziehe sie auf die Leinwand unseres Widgets. Doppelklicke auf die zuletzt platzierte Beschriftung und ändere ihren Text in Länge.
 * Klicke mit der rechten Maustaste auf die Leinwand des Widgets und wähle Darstellung → Darstellung in einem Gitter. Dadurch wird unser Widget zu einem Gitter mit derzeit nur einer Zelle, die von unserem ersten Label belegt wird. Wir können nun die nächsten Elemente links, rechts, oben oder unten zu unserem ersten Label hinzufügen, und das Gitter wird automatisch erweitert.
 * Füge zwei weitere Beschriftungen unterhalb der ersten Beschriftung hinzu und ändere ihren Text in Breite und Höhe:




 * Now place 3 Double Spin Box widgets next to our Length, Width and Height labels. For each of them, in the lower right panel, which shows all the available settings for the selected widget, locate Suffix and set their suffix to mm. FreeCAD has a more advanced widget, that can handle different units, but that is not available in Qt Creator by default (but can be compiled), so for now we will use a standard Double Spin Box, and we add the "mm" suffix to make sure the user knows in which units they work:




 * Now our widget is done, we just need to make sure of one last thing. Since FreeCAD will need to access that widget and read the Length, Width and Height values, we need to give proper names to those widgets, so we can easily retrive them from within FreeCAD. Click each of the Double Spin Boxes, and in the upper right window, double-click their Object Name, and change them to something easy to remember, for example: BoxLength, BoxWidth and BoxHeight:




 * Save the file, you can now close Qt Creator, the rest will be done in Python.
 * Open FreeCAD and create a new macro from menu Macro → Macros → Create
 * Paste the following code. Make sure you change the file path to match where you saved the .ui file created in QtCreator:

In the code above, we used a convenience function (PySideUic.loadUi) from the FreeCADGui module. That function loads a .ui file, creates a Qt Widget from it, and maps names, so we can easily access the subwidget by their names (ex: self.form.BoxLength).

The "accept" function is also a convenience offered by Qt. When there is an "OK" button in a dialog (which is the case by default when using the FreeCAD Tasks panel), any function named "accept" will automatically be executed when the "OK" button is pressed. Similarly, you can also add a "reject" function which gets executed when the "Cancel" button is pressed. In our case, we omitted that function, so pressing "Cancel" will do the default behaviour (do nothing and close the dialog).

If we implement any of the accept or reject functions, their default behaviour (do nothing and close) will not occur anymore. So we need to close the Task panel ourselves. This is done with:

Once we have our BoxTaskPanel that has 1- a widget called "self.form" and 2- if needed, accept and reject functions, we can open the task panel with it, which is done with these two last lines:

Note that the widget created by PySideUic.loadUi is not specific to FreeCAD, it is a standard Qt widget which can be used with other Qt tools. For example, we could have shown a separate dialog box with it. Try this in the Python Console of FreeCAD (using the correct path to your .ui file of course):

Of course we didn't add any "OK" or "Cancel" button to our dialog, since it was made to be used from the FreeCAD Task panel, which already provides such buttons. So there is no way to close the dialog (other than pressing its Window Close button). But the function show creates a non-modal dialog, which means it doesn't block the rest of the interface. So, while our dialog is still open, we can read the values of the fields:

Dies ist für Tests sehr nützlich.

Schliesslich vergiss nicht, dass es im FreeCAD Wiki im Abschnitt Python Skripten viel mehr Dokumentation über die Verwendung von Qt Widgets gibt, die ein Tutorium zur Dialogerstellung, ein spezielles 3-teiliges PySide Tutorium enthält, das das Thema ausführlich behandelt.

Maßgebliche Verweise

 * Qt Ersteller Dokumentation
 * Qt Ersteller installieren
 * FreeCAD Python Dokumentation Skripten
 * FreeCAD Dialog Erstellung Tutorium
 * FreeCAD PySide Tutorien
 * PySide Dokumentation