Negli ultimi due capitoli, abbiamo visto come creare della geometria Parte e creare oggetti parametrici. Manca un ultimo pezzo per avere il pieno controllo su FreeCAD: creare strumenti che interagiscono con l'utente.
In molte situazioni, non è molto amichevole costruire un oggetto con valori zero, come abbiamo fatto con il rettangolo nel capitolo precedente, e poi chiedere all'utente di compilare i valori di altezza e larghezza nel pannello delle Proprietà. Questo va bene per un numero molto limitato di oggetti, ma diventa veramente noioso se si devono fare parecchi rettangoli. Sarebbe meglio poter assegnare l'altezza e la larghezza già durante la creazione del rettangolo.
Python offre uno strumento base che consente all'utente di inserire il testo dallo schermo:
text = raw_input("Height of the rectangle?") print("The entered height is ",text)
Però, questo richiede una console Python in esecuzione, e quando si esegue il codice da una macro, non siamo sempre sicuri che la console Python sia attiva sulla macchina dell'utente.
La Graphical User Interface, o GUI, cioè, tutta la parte di FreeCAD che viene visualizzata sullo schermo (menu, barre degli strumenti, vista 3D, ecc), è tutta lì per questo scopo: interagire con l'utente. L'interfaccia di FreeCAD è costruita con Qt, un kit di strumenti GUI open-source molto comune che offre una vasta gamma di strumenti quali finestre di dialogo, pulsanti, etichette, caselle di testo o menu a discesa. Tutti questi strumenti sono genericamente chiamati "widget".
Gli strumenti Qt sono molto facili da usare da Python, grazie ad un modulo Python chiamato Pyside (ci sono anche molti altri moduli Python per comunicare con Qt da Python). Questo modulo permette di creare e interagire con i widget, leggere ciò che l'utente ha fatto con essi (leggere quello che è stato inserito nelle caselle di testo) o fare qualcosa quando, ad esempio, viene premuto un pulsante.
One of the key advantages of Qt is its cross-platform compatibility, enabling FreeCAD to run seamlessly on different operating systems like Windows, macOS, and Linux. Additionally, Qt’s flexibility makes it easy for developers to extend or customize FreeCAD’s interface, either by creating new toolbars and menus or by building entirely new modules that integrate into the software. This adaptability ensures that FreeCAD remains both user-friendly and highly extensible.
For users interested in scripting or developing new tools, FreeCAD's Python API also provides access to many Qt features. This means you can not only automate tasks but also create custom widgets or dialogs that integrate directly into the FreeCAD environment.
The Qt tools are very easy to use from Python, thanks to a Python module called PySide. PySide is the official Python binding for the Qt library, providing a seamless way to create and interact with widgets programmatically. It allows developers to design interfaces, manage user inputs (such as reading text from input boxes), and define actions based on user interactions, such as responding to a button press. Using PySide, you can build custom dialog boxes, menus, and toolbars directly within FreeCAD, extending its functionality in a way that integrates smoothly with its existing interface.
PySide makes it easy to connect user actions to specific functions in your code. For example, you can set up a button so that when it’s pressed, it triggers a script to execute a command or modify an object in the 3D view. This interactive capability opens up endless possibilities for customizing workflows and automating repetitive tasks.
Qt fornisce anche un altro strumento interessante chiamato Qt Designer, che attualmente è incorporato all'interno di un'applicazione più grande chiamata Qt Creator. Esso consente di progettare finestre di dialogo e pannelli dell'interfaccia grafica, invece di doverli codificare manualmente. In questo capitolo, useremo Qt Creator per la progettazione di un pannello widget che useremo nel pannello Azioni di FreeCAD. Quindi è necessario scaricare e installare Qt Creator dalla sua official page se siete su Windows o Mac (su Linux di solito è disponibile tramite il gestore del software).
Nel prossimo esercizio, inizieremo usando Qt Creator per creare un pannello che richieda i valori di lunghezza, larghezza e altezza, poi creeremo su di esso una classe Python che legga nel pannello i valori inseriti dall'utente, e crei un box con le dimensioni indicate. Questa classe Python sarà poi utilizzata da FreeCAD per visualizzare e controllare il pannello delle azioni:
Cominciamo creando il widget. Avviare Qt Creator, quindi nel menu File → New File or Project → Files and Classes → Qt → Qt Designer Form scegliere Dialog without buttons. Cliccare Next, dare un nome per salvare il file, fare clic su Next, lasciare tutti i campi del progetto al loro valore di default ("<none>"), e poi clic su Create. Il sistema Azioni di FreeCAD aggiungerà automaticamente i pulsanti OK e Annulla, è per questo che abbiamo scelto un dialogo senza pulsanti.
import FreeCAD,FreeCADGui,Part
# CHANGE THE LINE BELOW
path_to_ui = "C:\Users\yorik\Documents\dialog.ui"
class BoxTaskPanel:
def __init__(self):
# this will create a Qt widget from our ui file
self.form = FreeCADGui.PySideUic.loadUi(path_to_ui)
def accept(self):
length = self.form.BoxLength.value()
width = self.form.BoxWidth.value()
height = self.form.BoxHeight.value()
if (length == 0) or (width == 0) or (height == 0):
print("Error! None of the values can be 0!")
# we bail out without doing anything
return
box = Part.makeBox(length,width,height)
Part.show(box)
FreeCADGui.Control.closeDialog()
panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)
Nel codice precedente, abbiamo utilizzato una funzione di convenienza (PySideUic.loadUi) del modulo FreeCADGui. Questa funzione carica un .ui file, crea da esso un Qt Widget, e mappa i nomi, e in questo modo consente di accedere facilmente al SubWidget tramite i loro nomi (ex: self.form.BoxLength).
Anche la funzione "accept" è una convenienza offerta da Qt. Quando in un dialogo vi è un pulsante "OK" (che è il caso di default quando si utilizza il pannello Azioni di FreeCAD), qualsiasi funzione di nome "accept" viene automaticamente eseguita quando si preme il pulsante "OK". Analogamente, è possibile anche aggiungere una funzione "reject" che viene eseguita quando si preme il pulsante "Annulla". Nel nostro caso, abbiamo omesso tale funzione, quindi premendo "Annulla" si esegue il comportamento di default (non fare nulla e chiudere la finestra di dialogo).
Se implementiamo una delle funzioni accept o reject, il loro comportamento di default (non fare nulla e chiudere) non si verifica più. Quindi dobbiamo chiudere noi il pannello Azioni. Ciò viene fatto con:
FreeCADGui.Control.closeDialog()
Una volta che abbiamo il nostro BoxTaskPanel che ha 1- un widget chiamato "self.form" e 2- se necessario, accetta e rifiuta le funzioni, con esso possiamo aprire il pannello delle attività, tramite queste due ultime righe:
panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)
Notare che il widget creato da PySideUic.loadUi non è specifico per FreeCAD, ma è un widget standard di Qt che può essere utilizzato con gli altri strumenti di Qt. Ad esempio, con esso possiamo mostrare una finestra di dialogo separata. Proviamo questo nella console Python di FreeCAD (ovviamente utilizzando il percorso corretto per il file .ui):
from PySide import QtGui
w = FreeCADGui.PySideUic.loadUi("C:\Users\yorik\Documents\dialog.ui")
w.show()
Naturalmente al nostro dialogo non abbiamo aggiunto un pulsante "OK" o "Cancel", dato che è stato fatto per essere usato dal pannello Azioni di FreeCAD che fornisce già tali pulsanti. Quindi non c'è nessun modo per chiudere la finestra di dialogo (oltre che premere il suo pulsante Chiudi finestra). Ma la funzione show() crea una finestra di dialogo non modale, il che significa che non blocca il resto dell'interfaccia. Così si possono leggere i valori dei campi mentre il dialogo è ancora aperto,:
w.BoxHeight.value()
Ciò è molto utile per i test.
Infine, non dimenticate che c'è molta altra documentazione sull'utilizzo dei wiget di Qt, nella sezione Script Python, che contiene un tutorial per creare dialoghi, e uno speciale tutorial per PySide in tre parti che copre ampiamente l'argomento.