Difference between revisions of "Manual:Creating interface tools/fr"

From FreeCAD Documentation
Jump to: navigation, search
(Created page with "Commençons par créer le widget. Démarrez Qt Creator, puis menu '''Fichier -> Nouveau fichier ou projet ->Fichiers et classes -> Qt -> Formulaire Qt Designer -> Boîte de di...")
 
(32 intermediate revisions by 5 users not shown)
Line 1: Line 1:
 +
<languages/>
 +
{{Docnav/fr|[[Manual:Creating parametric objects/fr|Création d'objets paramétriques]]|[[Manual:The Community/fr|La communauté]]|[[Manual:Introduction/fr|Début du manuel]]|IconC=Crystal Clear manual.png}}
 +
 
{{Manual:TOC/fr}}
 
{{Manual:TOC/fr}}
  
Dans les deux derniers chapitres, nous avons vu comment créer la géométrie Part ([[Manual:Creating and manipulating geometry|create Part geometry]]) et créer des objets paramétriques ([[Manual:Creating parametric objects|create parametric objects]]). Une dernière pièce manque pour avoir un contrôle total sur FreeCAD : Créer des outils qui interagiront avec l'utilisateur.
+
Dans les deux derniers chapitres, nous avons vu comment créer la géométrie Part ([[Manual:Creating and manipulating geometry/fr|Création et manipulation de la géométrie]]) et créer des objets paramétriques ([[Manual:Creating parametric objects/fr|Création d'objets paramétriques]]). Une dernière pièce manque pour avoir un contrôle total sur FreeCAD: créer des outils qui interagiront avec l'utilisateur.
  
 
Dans de nombreuses situations, il n'est pas très convivial de construire un objet avec des valeurs nulles, comme nous avons fait avec le rectangle dans le chapitre précédent, puis de demander à l'utilisateur de remplir la hauteur et la largeur dans le panneau Propriétés. Cela fonctionne pour un très petit nombre d'objets, mais devient très fastidieux si vous avez beaucoup de rectangles à réaliser. Une meilleure façon serait d'être capable de donner déjà la hauteur et la largeur lors de la création du rectangle.
 
Dans de nombreuses situations, il n'est pas très convivial de construire un objet avec des valeurs nulles, comme nous avons fait avec le rectangle dans le chapitre précédent, puis de demander à l'utilisateur de remplir la hauteur et la largeur dans le panneau Propriétés. Cela fonctionne pour un très petit nombre d'objets, mais devient très fastidieux si vous avez beaucoup de rectangles à réaliser. Une meilleure façon serait d'être capable de donner déjà la hauteur et la largeur lors de la création du rectangle.
Line 12: Line 15:
 
Cependant, cela nécessite une console Python en cours d'exécution et, lors de l'exécution de notre code à partir d'une macro, nous ne sommes pas toujours sûrs que la console Python sera activée sur la machine de l'utilisateur.
 
Cependant, cela nécessite une console Python en cours d'exécution et, lors de l'exécution de notre code à partir d'une macro, nous ne sommes pas toujours sûrs que la console Python sera activée sur la machine de l'utilisateur.
  
L'interface utilisateur graphique ([https://en.wikipedia.org/wiki/Graphical_user_interface Graphical User Interface]), ou GUI, c'est-à-dire toute la partie de FreeCAD qui s'affiche sur votre écran (le menu, les barres d'outils, la vue 3D, etc.) est tout à cette fin : interagir avec l’utilisateur. L'interface de FreeCAD est construite avec [https://en.wikipedia.org/wiki/Qt_(software) Qt], une trousse d'outils GUI open source très commune qui qffre une large gamme d'outils tels que les boîtes de dialogue, les boutons, les étiquettes, les boîtes de saisie de texte ou les menus déroulants (tout cela est généralement appelé "widgets").
+
L'[https://fr.wikipedia.org/wiki/Interface_graphiquel interface utilisateur graphique], ou GUI en anglais, c'est-à-dire toute la partie de FreeCAD qui s'affiche sur votre écran (le menu, les barres d'outils, la vue 3D, etc.) a pour seul objet: interagir avec l’utilisateur. L'interface de FreeCAD est construite avec [https://fr.wikipedia.org/wiki/Qt Qt], une trousse d'outils GUI open source très commune qui offre une large gamme d'outils tels que des boîtes de dialogue, des boutons, des étiquettes, des boîtes de saisie de texte ou des menus déroulants (tout cela est généralement appelé "widgets").
  
Les outils Qt sont très faciles à utiliser depuis Python, grâce à un module Python appelé [https://en.wikipedia.org/wiki/PySide Pyside] (Il existe aussi plusieurs autres modules Python pour communiquer avec Qt depuis Python). Ce module vous permet de créer et d'interagir avec des widgets, lire ce que l'utilisateur a fait avec eux (ce qui a été rempli dans des zones de texte) ou faire des choses quand, par exemple, un bouton a été pressé.
+
Les outils Qt sont très faciles à utiliser depuis Python, grâce à un module Python appelé [https://fr.wikipedia.org/wiki/PySide Pyside] (Il existe aussi plusieurs autres modules Python pour communiquer avec Qt depuis Python). Ce module vous permet de créer et d'interagir avec des widgets, lire ce que l'utilisateur a fait avec eux (ce qui a été rempli dans des zones de texte) ou faire des choses quand, par exemple, un bouton a été pressé.
  
Qt fournit également un autre outil intéressant appelé [http://doc.qt.io/qt-4.8/designer-manual.html Qt Designer], aujourd'hui incorporé à l'intérieur d’une plus grande application appelée [https://en.wikipedia.org/wiki/Qt_Creator Qt Creator]. Il permet de concevoir des boîtes de dialogue et des panneaux d'interface graphiquement, au lieu d'avoir à les coder manuellement. Dans ce chapitre, nous utiliserons Qt Creator pour dessiner un widget de panneau que nous utiliserons dans le '''panneau des tâches''' de FreeCAD. Donc, vous devrez télécharger et installer Qt Creator à partir de sa page officielle ([https://www.qt.io/ide/ official page]) si vous êtes sur Windows ou Mac (sur Linux, il sera généralement disponible auprès de votre application de gestionnaire de logiciels).
+
Qt fournit également un autre outil intéressant appelé [http://doc.qt.io/qt-4.8/designer-manual.html Qt Designer], aujourd'hui incorporé à l'intérieur d’une plus grande application appelée [https://fr.wikipedia.org/wiki/Qt_Creator Qt Creator]. Il permet de concevoir des boîtes de dialogue et des panneaux d'interface graphiquement au lieu d'avoir à les coder manuellement. Dans ce chapitre, nous utiliserons Qt Creator pour dessiner un widget de panneau que nous utiliserons dans le '''panneau des tâches''' de FreeCAD. Vous devrez télécharger et installer Qt Creator à partir de sa page officielle ([https://www.qt.io/ide/ official page]) si vous êtes sur Windows ou Mac. Sur Linux, il est généralement disponible auprès de votre application de gestionnaire de logiciels.
  
 
Dans l'exercice suivant, nous allons d'abord créer un panneau avec Qt Creator qui demande les valeurs de longueur, de largeur et de hauteur, alors nous allons créer une classe Python autour de lui, qui lira les valeurs entrées par l'utilisateur à partir du panneau, et créer une boîte avec les dimensions données. Cette classe Python sera ensuite utilisée par FreeCAD pour afficher et contrôler le panneau des tâches :
 
Dans l'exercice suivant, nous allons d'abord créer un panneau avec Qt Creator qui demande les valeurs de longueur, de largeur et de hauteur, alors nous allons créer une classe Python autour de lui, qui lira les valeurs entrées par l'utilisateur à partir du panneau, et créer une boîte avec les dimensions données. Cette classe Python sera ensuite utilisée par FreeCAD pour afficher et contrôler le panneau des tâches :
Line 26: Line 29:
 
[[Image:Exercise_python_06.jpg]]
 
[[Image:Exercise_python_06.jpg]]
  
* Find the '''Label''' in the list in the left panel, and drag it onto the canvas of our widget. Double-click the recent placed Label, and change its text to '''Length'''.
+
* Trouvez le '''Label''' (étiquette) dans la liste du panneau de gauche et faites-le glisser sur le canevas de notre widget. Double-cliquez sur l'étiquette récemment placée, et modifiez son texte en '''Longueur'''.
* Right-click the widget canvas, and choose '''Lay out-> Lay out in a Grid'''. This will turn our widget into a grid with currently only one cell, occupied by ourfirst label. We can now add the next items at the left, right, top or bottom of our first label, and the grid will expand automatically.
+
* Cliquez avec le bouton droit de la souris sur la toile du widget, puis choisissez '''Lay out-> Lay out in a Grid'''. Cela mettra notre widget dans une grille avec actuellement une seule cellule, occupée par notre première étiquette. Nous pouvons maintenant ajouter les éléments suivants à gauche, à droite, en haut ou en bas de notre première étiquette, et la grille s’étendra automatiquement.
* Add two more labels below the first one, and change their text to Width and Height:
+
* Ajoutez deux autres étiquettes en dessous de la première et modifiez leur texte en '''Largeur''' et '''Hauteur''' :
  
 
[[Image:Exercise_python_08.jpg]]
 
[[Image:Exercise_python_08.jpg]]
  
* Now place 3 '''Double Spin Box''' widgets next to our Length, Width and Height labels. For each of them, in the lower left 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 [[CompileOnUnix#Qt_designer_plugin|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:
+
* Maintenant, placez 3 widgets '''Double Spin Box''' à côté de nos étiquettes Longueur, Largeur et Hauteur. Pour chacun d'entre eux, dans le panneau inférieur gauche, qui affiche tous les paramètres disponibles pour le Widget sélectionné, localisez '''Suffix''' et définissez leur suffixe en '''mm'''. FreeCAD a un Widget plus avancé, qui peut gérer différentes unités, mais cela n'est pas disponible dans Qt Creator par défaut (mais peut être compilé ([[CompileOnUnix#Qt_designer_plugin|compiled]])), alors, pour l'instant, nous utiliserons une Double Spin Box standard, et nous ajouterons le suffixe "mm" pour nous assurer que l'utilisateur sait dans quelle unité ils fonctionnent :
  
 
[[Image:Exercise_python_09.jpg]]
 
[[Image:Exercise_python_09.jpg]]
  
* 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:
+
* Maintenant, notre widget est terminé, il suffit de nous assurer d'une dernière chose. Étant donné que FreeCAD devra accéder à ce widget et lire les valeurs Longueur, Largeur et Hauteur, nous devons donner les noms appropriés à ces widgets, afin que nous puissions les récupérer facilement dans FreeCAD. Cliquez sur chacune des boîtes Double Spin, et dans la fenêtre supérieure droite, double-cliquez sur leur nom d'objet, et modifiez-les par quelque chose de facile à retenir, par exemple : BoxLength, BoxWidth et BoxHeight :
  
 
[[Image:Exercise_python_10.jpg]]
 
[[Image:Exercise_python_10.jpg]]
  
* Save the file, you can now close Qt Creator, the rest will be done in Python.
+
* Enregistrez le fichier, vous pouvez maintenant fermer Qt Creator, le reste se fera dans Python.
* Open FreeCAD and create a new macro from menu '''Macro -> Macros -> Create'''
+
* Ouvrez FreeCAD et créez une nouvelle macro dans le menu '''Macro -> Macros -> Créer'''
* Paste the following code. Make sure you change the file path to match where you saved the .ui file created in QtCreator:
+
* Collez le code suivant. Assurez-vous de modifier le chemin du fichier pour correspondre à l'endroit où vous avez enregistré le fichier .ui créé dans QtCreator :
  
 
  import FreeCAD,FreeCADGui,Part
 
  import FreeCAD,FreeCADGui,Part
Line 69: Line 72:
 
  FreeCADGui.Control.showDialog(panel)
 
  FreeCADGui.Control.showDialog(panel)
  
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).
+
Dans le code ci-dessus, nous avons utilisé une fonction commode (PySideUic.loadUi) à partir du module FreeCADGui. Cette fonction charge un fichier .ui, crée un widget Qt à partir de celui-ci et écrit les noms, afin que nous puissions accéder facilement au sous-espace par leurs noms (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).
+
La fonction "accepter" est également une commodité offerte par Qt. Lorsqu'il existe un bouton "OK" dans une boîte de dialogue (ce qui est le cas par défaut lors de l'utilisation du panneau des Tâches FreeCAD), toute fonction appelée "accepter" sera automatiquement exécutée lorsque vous appuyez sur le bouton "OK". De même, vous pouvez également ajouter une fonction de "rejet" qui s'exécute lorsque vous appuyez sur le bouton "Annuler". Dans notre cas, nous avons supprimé cette fonction, alors appuyer sur "Annuler" provoquera le comportement par défaut (ne rien faire et fermer la boîte de dialogue).
  
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:
+
Si nous implémentons une des fonctions d'acceptation ou de rejet, leur comportement par défaut (ne rien faire et fermer) ne se produira plus. Nous devons donc fermer le panneau de tâches nous-mêmes. Cela se fait avec :
  
 
  FreeCADGui.Control.closeDialog()  
 
  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:
+
Une fois que nous avons notre BoxTaskPanel qui a 1- un widget appelé "self.form" et 2- si nécessaire, les fonctions Accepter et Rejeter, nous pouvons ouvrir le panneau de tâches avec lui, ce qui est fait avec ces deux dernières lignes :
  
 
  panel = BoxTaskPanel()
 
  panel = BoxTaskPanel()
 
  FreeCADGui.Control.showDialog(panel)
 
  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):
+
Notez que le widget créé par PySideUic.loadUi n'est pas spécifique à FreeCAD, c'est un widget Qt standard qui peut être utilisé avec d'autres outils Qt. Par exemple, nous aurions pu afficher une boîte de dialogue distincte. Essayez ceci dans la console Python de FreeCAD (en utilisant le chemin correct pour votre fichier .ui bien sûr) :
  
 
  from PySide import QtGui
 
  from PySide import QtGui
Line 88: Line 91:
 
  w.show()
 
  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:
+
Bien sûr, nous n'avons ajouté aucun bouton "OK" ou "Annuler" à notre boîte de dialogue, car il a été fait pour être utilisé à partir du panneau de tâches FreeCAD, qui fournit déjà de tels boutons. Il n'y a donc aucun moyen de fermer la boîte de dialogue (autrement que de presser son bouton Fermer la fenêtre). Mais la fonction show () crée une boîte de dialogue non modale, ce qui signifie qu'elle ne bloque pas le reste de l'interface. Ainsi, alors que notre dialogue est toujours ouvert, nous pouvons lire les valeurs des champs :
  
 
  w.BoxHeight.value()  
 
  w.BoxHeight.value()  
  
This is very useful for testing.
+
Ceci est très utile pour les tests.
  
Finally, don't forget there is much more documentation about using Qt widgets on the FreeCAD Wiki, in the [[Power_users_hub|Python Scripting]] section, which contains a [[Dialog_creation|dialog creation tutorial]], a special 3-part [[PySide|PySide tutorial]] that covers the subject extensively.
+
Enfin, n'oubliez pas qu'il existe beaucoup plus de documentation sur l'utilisation des widgets Qt dans le Wiki FreeCAD, dans la section [[Power_users_hub|Python Scripting]], qui contient un didacticiel de création de dialogue ([[Dialog_creation|dialog creation tutorial]]), un tutoriel spécial en 3 parties de PySide ([[PySide|PySide tutorial]]) qui couvre le sujet en profondeur.
  
'''Read more'''
+
== Liens pertinents ==
 +
* [https://fr.wikipedia.org/wiki/Qt_Creator Qt Creator Documentation]
 +
* [https://www.qt.io/qt-features-libraries-apis-tools-and-ide/ Installing Qt Creator]
 +
* [[Power_users_hub/fr|Documentation pour utilisateurs avancés]]
 +
* [[Dialog_creation/fr|Création de dialogue]]
 +
* [[PySide/fr|PySide]]
 +
* [http://srinikom.github.io/pyside-docs/index.html Documentation PySide]
  
* [https://en.wikipedia.org/wiki/Qt_Creator Qt Creator]
+
{{Docnav/fr|[[Manual:Creating parametric objects/fr|Création d'objets paramétriques]]|[[Manual:The Community/fr|La communauté]]|[[Manual:Introduction/fr|Début du manuel]]|IconC=Crystal Clear manual.png}}
* [https://www.qt.io/ide/ Installing Qt Creator]
 
* [[Power_users_hub|Python scripting documentation]]
 
* [[Dialog_creation|Dialog creation tutorial]]
 
* [[PySide|PySide tutorials]]
 
* [http://srinikom.github.io/pyside-docs/index.html PySide documentation]
 
  
<languages/>
+
[[Category:Developer/fr]]
 +
 
 +
[[Category:Developer Documentation/fr]]
 +
 
 +
[[Category:Python Code/fr]]

Latest revision as of 16:03, 5 August 2019

Other languages:
English • ‎français • ‎italiano • ‎română • ‎русский

Dans les deux derniers chapitres, nous avons vu comment créer la géométrie Part (Création et manipulation de la géométrie) et créer des objets paramétriques (Création d'objets paramétriques). Une dernière pièce manque pour avoir un contrôle total sur FreeCAD: créer des outils qui interagiront avec l'utilisateur.

Dans de nombreuses situations, il n'est pas très convivial de construire un objet avec des valeurs nulles, comme nous avons fait avec le rectangle dans le chapitre précédent, puis de demander à l'utilisateur de remplir la hauteur et la largeur dans le panneau Propriétés. Cela fonctionne pour un très petit nombre d'objets, mais devient très fastidieux si vous avez beaucoup de rectangles à réaliser. Une meilleure façon serait d'être capable de donner déjà la hauteur et la largeur lors de la création du rectangle.

Python offre un outil de base permettant à l'utilisateur de saisir du texte à l'écran :

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

Cependant, cela nécessite une console Python en cours d'exécution et, lors de l'exécution de notre code à partir d'une macro, nous ne sommes pas toujours sûrs que la console Python sera activée sur la machine de l'utilisateur.

L'interface utilisateur graphique, ou GUI en anglais, c'est-à-dire toute la partie de FreeCAD qui s'affiche sur votre écran (le menu, les barres d'outils, la vue 3D, etc.) a pour seul objet: interagir avec l’utilisateur. L'interface de FreeCAD est construite avec Qt, une trousse d'outils GUI open source très commune qui offre une large gamme d'outils tels que des boîtes de dialogue, des boutons, des étiquettes, des boîtes de saisie de texte ou des menus déroulants (tout cela est généralement appelé "widgets").

Les outils Qt sont très faciles à utiliser depuis Python, grâce à un module Python appelé Pyside (Il existe aussi plusieurs autres modules Python pour communiquer avec Qt depuis Python). Ce module vous permet de créer et d'interagir avec des widgets, lire ce que l'utilisateur a fait avec eux (ce qui a été rempli dans des zones de texte) ou faire des choses quand, par exemple, un bouton a été pressé.

Qt fournit également un autre outil intéressant appelé Qt Designer, aujourd'hui incorporé à l'intérieur d’une plus grande application appelée Qt Creator. Il permet de concevoir des boîtes de dialogue et des panneaux d'interface graphiquement au lieu d'avoir à les coder manuellement. Dans ce chapitre, nous utiliserons Qt Creator pour dessiner un widget de panneau que nous utiliserons dans le panneau des tâches de FreeCAD. Vous devrez télécharger et installer Qt Creator à partir de sa page officielle (official page) si vous êtes sur Windows ou Mac. Sur Linux, il est généralement disponible auprès de votre application de gestionnaire de logiciels.

Dans l'exercice suivant, nous allons d'abord créer un panneau avec Qt Creator qui demande les valeurs de longueur, de largeur et de hauteur, alors nous allons créer une classe Python autour de lui, qui lira les valeurs entrées par l'utilisateur à partir du panneau, et créer une boîte avec les dimensions données. Cette classe Python sera ensuite utilisée par FreeCAD pour afficher et contrôler le panneau des tâches :

Exercise python 07.jpg

Commençons par créer le widget. Démarrez Qt Creator, puis menu Fichier -> Nouveau fichier ou projet ->Fichiers et classes -> Qt -> Formulaire Qt Designer -> Boîte de dialogue sans boutons. Cliquez sur Suivant, donnez lui un nom de fichier pour l’enregistrer, cliquez sur Suivant, laissez tous les champs de projet à leur valeur par défaut ("<none>") et Créer. Le système de tâches de FreeCAD ajoutera automatiquement les boutons OK / Annuler, c'est pourquoi nous avons choisi ici une boîte de dialogue sans boutons.

Exercise python 06.jpg

  • Trouvez le Label (étiquette) dans la liste du panneau de gauche et faites-le glisser sur le canevas de notre widget. Double-cliquez sur l'étiquette récemment placée, et modifiez son texte en Longueur.
  • Cliquez avec le bouton droit de la souris sur la toile du widget, puis choisissez Lay out-> Lay out in a Grid. Cela mettra notre widget dans une grille avec actuellement une seule cellule, occupée par notre première étiquette. Nous pouvons maintenant ajouter les éléments suivants à gauche, à droite, en haut ou en bas de notre première étiquette, et la grille s’étendra automatiquement.
  • Ajoutez deux autres étiquettes en dessous de la première et modifiez leur texte en Largeur et Hauteur :

Exercise python 08.jpg

  • Maintenant, placez 3 widgets Double Spin Box à côté de nos étiquettes Longueur, Largeur et Hauteur. Pour chacun d'entre eux, dans le panneau inférieur gauche, qui affiche tous les paramètres disponibles pour le Widget sélectionné, localisez Suffix et définissez leur suffixe en mm. FreeCAD a un Widget plus avancé, qui peut gérer différentes unités, mais cela n'est pas disponible dans Qt Creator par défaut (mais peut être compilé (compiled)), alors, pour l'instant, nous utiliserons une Double Spin Box standard, et nous ajouterons le suffixe "mm" pour nous assurer que l'utilisateur sait dans quelle unité ils fonctionnent :

Exercise python 09.jpg

  • Maintenant, notre widget est terminé, il suffit de nous assurer d'une dernière chose. Étant donné que FreeCAD devra accéder à ce widget et lire les valeurs Longueur, Largeur et Hauteur, nous devons donner les noms appropriés à ces widgets, afin que nous puissions les récupérer facilement dans FreeCAD. Cliquez sur chacune des boîtes Double Spin, et dans la fenêtre supérieure droite, double-cliquez sur leur nom d'objet, et modifiez-les par quelque chose de facile à retenir, par exemple : BoxLength, BoxWidth et BoxHeight :

Exercise python 10.jpg

  • Enregistrez le fichier, vous pouvez maintenant fermer Qt Creator, le reste se fera dans Python.
  • Ouvrez FreeCAD et créez une nouvelle macro dans le menu Macro -> Macros -> Créer
  • Collez le code suivant. Assurez-vous de modifier le chemin du fichier pour correspondre à l'endroit où vous avez enregistré le fichier .ui créé dans QtCreator :
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)

Dans le code ci-dessus, nous avons utilisé une fonction commode (PySideUic.loadUi) à partir du module FreeCADGui. Cette fonction charge un fichier .ui, crée un widget Qt à partir de celui-ci et écrit les noms, afin que nous puissions accéder facilement au sous-espace par leurs noms (ex: self.form.BoxLength).

La fonction "accepter" est également une commodité offerte par Qt. Lorsqu'il existe un bouton "OK" dans une boîte de dialogue (ce qui est le cas par défaut lors de l'utilisation du panneau des Tâches FreeCAD), toute fonction appelée "accepter" sera automatiquement exécutée lorsque vous appuyez sur le bouton "OK". De même, vous pouvez également ajouter une fonction de "rejet" qui s'exécute lorsque vous appuyez sur le bouton "Annuler". Dans notre cas, nous avons supprimé cette fonction, alors appuyer sur "Annuler" provoquera le comportement par défaut (ne rien faire et fermer la boîte de dialogue).

Si nous implémentons une des fonctions d'acceptation ou de rejet, leur comportement par défaut (ne rien faire et fermer) ne se produira plus. Nous devons donc fermer le panneau de tâches nous-mêmes. Cela se fait avec :

FreeCADGui.Control.closeDialog() 

Une fois que nous avons notre BoxTaskPanel qui a 1- un widget appelé "self.form" et 2- si nécessaire, les fonctions Accepter et Rejeter, nous pouvons ouvrir le panneau de tâches avec lui, ce qui est fait avec ces deux dernières lignes :

panel = BoxTaskPanel()
FreeCADGui.Control.showDialog(panel)

Notez que le widget créé par PySideUic.loadUi n'est pas spécifique à FreeCAD, c'est un widget Qt standard qui peut être utilisé avec d'autres outils Qt. Par exemple, nous aurions pu afficher une boîte de dialogue distincte. Essayez ceci dans la console Python de FreeCAD (en utilisant le chemin correct pour votre fichier .ui bien sûr) :

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

Bien sûr, nous n'avons ajouté aucun bouton "OK" ou "Annuler" à notre boîte de dialogue, car il a été fait pour être utilisé à partir du panneau de tâches FreeCAD, qui fournit déjà de tels boutons. Il n'y a donc aucun moyen de fermer la boîte de dialogue (autrement que de presser son bouton Fermer la fenêtre). Mais la fonction show () crée une boîte de dialogue non modale, ce qui signifie qu'elle ne bloque pas le reste de l'interface. Ainsi, alors que notre dialogue est toujours ouvert, nous pouvons lire les valeurs des champs :

w.BoxHeight.value() 

Ceci est très utile pour les tests.

Enfin, n'oubliez pas qu'il existe beaucoup plus de documentation sur l'utilisation des widgets Qt dans le Wiki FreeCAD, dans la section Python Scripting, qui contient un didacticiel de création de dialogue (dialog creation tutorial), un tutoriel spécial en 3 parties de PySide (PySide tutorial) qui couvre le sujet en profondeur.

Liens pertinents