Manual:Creating interface tools/ro

În ultimele două capitole, am văzut cum să create Part geometry și create parametric objects. O ultimă piesă lipsește pentru a obține un control deplin peste FreeCAD: Creați instrumente care vor interacționa cu utilizatorul.

În multe situații, nu este foarte ușor să construim un obiect cu valori zero, așa cum am făcut-o cu dreptunghiul din capitolul precedent, și apoi să cerem utilizatorului să completeze valorile Înălțime și Lățime din panoul Proprietăți. Aceasta funcționează pentru un număr foarte mic de obiecte, dar va deveni foarte obositoare dacă aveți multe dreptunghiuri. O modalitate mai bună ar fi să puteți da deja înălțimea și lățimea la crearea dreptunghiului.

Python oferă un instrument de bază pentru ca utilizatorul să introducă text pe ecran:

text = raw_input("Height of the rectangle?") print("The entered height is ",text)

Cu toate acestea, aceasta necesită o consolă Python care rulează, iar atunci când executăm codul dintr-o macrocomandă, nu suntem întotdeauna siguri că avem Consola Python va fi activată pe mașina utilizatorului.

Interfața utilizatorului grafic Graphical User Interface, sau GUI, adică întreaga parte a programului FreeCAD care este afișat pe ecran (meniul, barele de instrumente, vizualizarea 3D etc.), este acolo în acest scop: interacționați cu utilizatorul. Interfața FreeCAD este construită cu Qt, o trusă de instrumente GUI foarte variate, care oferă o gamă largă de instrumente, cum ar fi casete, butoane, etichete, casete de introducere a textului sau meniuri derulante. Acestea sunt numite generic "widget-uri".

Instrumentele Qt sunt foarte ușor de utilizat din Python, datorită unui modul Python numit Pyside Pyside (Există și alte module Python care comunică cu Qt de la Python). Acest modul vă permite să creați și să interacționați cu widget-uri, să citiți ce a făcut utilizatorul cu ele sau să faceți lucruri atunci când, de exemplu, a fost apăsat un buton.

Qt furnizează de asemenea un alt instrument numit Qt Designer, care astăzi este încorporată într-o aplicație mai mare numită Qt Creator Qt Creator.Permite crearea grafică a casetelor de dialog și a panourilor de interfață, în loc să le codeze manual. In acest capitol,vom folosi Qt Creator pentru a proiecta un widget pe care îl vom folosi în panoul de Sarcini Task al FreeCAD. Prin urmare, va trebui să descărcați și să instalați Qt Creator de pe official page dacă sunteți pe Windows sau Mac (sub Linux, va fi de obicei disponibilă din aplicația dvs. de manager de software).

În exercițiul următor, vom crea mai întâi un panou cu Qt Creator care solicită valorile de lungime, lățime și înălțime, apoi vom crea în jurul lui o clasă Python care va citi valorile introduse de utilizator din panou și va crea o casetă cu dimensiunile date. Acest Python va fi folosit de FreeCAD pentru afișarea și controlul panoului de sarcini:



Să începem prin crearea unui widget. Start Qt Creator, apoi meniul File -> New File or Project -> Files and Classes -> Qt -> Qt Designer Form -> Dialog without buttons. Click Next, dați-i un nume de fișier pentru a-l salva, click Next, lăsați toate câmpurile de proiect la valoarea lor implicită (" "), și Create. Sistemul de sarcini FreeCAD va adăuga automat butoanele OK / Anulare, așa că am ales aici o casetă de dialog fără butoane.




 * Găsiți Label din lista din panoul din stânga și glisați-o pe panza widget-ului nostru. Faceți dublu clic pe eticheta locației recente și modificați textul sau la Lungime.
 * Faceți clic dreapta pe pânza widget și alegeți Lay out-> Lay out in a Grid. Acest lucru va pune widgetul nostru într-o rețea cu o singură celulă, ocupată de prima noastră etichetă. Acum putem adăuga următoarele elemente la stânga, la dreapta, în partea de sus sau în partea de jos a primei noastre etichete, iar grilă se va extinde automat.
 * Adăugați încă două etichete la prima și schimbați textul la Lățime și înălțime:




 * Acum plasați 3 Double Spin Box widgets lângă etichetele Lungime, Lățime și Înălțime. Pentru fiecare dintre ele, în panoul din dreapta jos, care arată toate setările disponibile pentru widgetul selectat, localizați Suffix și definiți sufixul în 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:

import FreeCAD,FreeCADGui,Part 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)
 * 1) CHANGE THE LINE BELOW

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:

FreeCADGui.Control.closeDialog

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:

panel = BoxTaskPanel FreeCADGui.Control.showDialog(panel)

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):

from PySide import QtGui w = FreeCADGui.PySideUic.loadUi("C:\Users\yorik\Documents\dialog.ui") w.show

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:

w.BoxHeight.value

This is very useful for testing.

În cele din urmă, nu uitați că există mult mai multe despre widgeturile QT pe FreeCAD Wiki, în secțiunea Python Scripting, care conține dialog creation tutorial, o parte terță specială  PySide tutorial care acoperă în mode extins subiectul.

De citit în plus


 * Qt Creator
 * Installing Qt Creator
 * Python scripting documentation
 * Dialog creation tutorial
 * PySide tutorials
 * PySide documentation