Embedding FreeCAD/fr: Difference between revisions

From FreeCAD Documentation
(Created page with "FreeCAD a la capacité incroyable de pouvoir être importé '''en tant que module Python''' dans d'autres programmes ou, dans une console Python autonome, avec tous ses module...")
(Created page with "Category:Python Code/fr")
(38 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
FreeCAD a la capacité incroyable de pouvoir être importé '''en tant que module Python''' dans d'autres programmes ou, dans une console Python autonome, avec tous ses modules et ses composants. Il est même possible d'importer l'interface graphique (GUI) de FreeCAD en tant que module python avec toutefois, '''quelques restrictions'''.
{{docnav/fr|[[Scripted objects/fr|Script d'objets]]|[[Code snippets/fr|Bouts de code]]}}

FreeCAD a la capacité incroyable de pouvoir être importé '''en tant que module Python''' dans d'autres programmes ou, dans une console Python autonome, avec tous ses modules et ses composants. Il est même possible d'importer l'interface graphique (GUI) de FreeCAD en tant que module python avec toutefois, '''quelques restrictions'''. Mais avec [[Embedding_FreeCAD#Avertissement|quelques restrictions]].

=== Utilisation de FreeCAD sans interface graphique (GUI) ===


Une première application, directe, facile et utile que vous pouvez faire est d'importer des documents FreeCAD dans votre programme.
=== Using FreeCAD without GUI ===
Dans l'exemple suivant, nous allons importer '''Part geometry''' d'un document FreeCAD dans [http://www.blender.org blender].
Voici le script complet.
J'espère que vous serez impressionné par sa simplicité:
{{Code|code=


FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
One first, direct, easy and useful application you can make of this is to import FreeCAD documents into your program. In the following example, we'll import the Part geometry of a FreeCAD document into [http://www.blender.org blender]. Here is the complete script. I hope you'll be impressed by its simplicity:<syntaxhighlight>
import Blender, sys
FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
sys.path.append(FREECADPATH)
import Blender, sys
sys.path.append(FREECADPATH)
def import_fcstd(filename):
def import_fcstd(filename):
try:
try:
import FreeCAD
import FreeCAD
except ValueError:
except ValueError:
Blender.Draw.PupMenu('Error%t|FreeCAD library not found. Please check the FREECADPATH variable in the import script is correct')
Blender.Draw.PupMenu('Error%t|FreeCAD library not found. Please check the FREECADPATH variable in the import script is correct')
else:
else:
scene = Blender.Scene.GetCurrent()
scene = Blender.Scene.GetCurrent()
import Part
import Part
doc = FreeCAD.open(filename)
doc = FreeCAD.open(filename)
objects = doc.Objects
objects = doc.Objects
for ob in objects:
for ob in objects:
if ob.Type[:4] == 'Part':
if ob.Type[:4] == 'Part':
shape = ob.Shape
shape = ob.Shape
if shape.Faces:
if shape.Faces:
mesh = Blender.Mesh.New()
mesh = Blender.Mesh.New()
rawdata = shape.tessellate(1)
rawdata = shape.tessellate(1)
for v in rawdata[0]:
for v in rawdata[0]:
mesh.verts.append((v.x,v.y,v.z))
mesh.verts.append((v.x,v.y,v.z))
for f in rawdata[1]:
for f in rawdata[1]:
mesh.faces.append.append(f)
mesh.faces.append.append(f)
scene.objects.new(mesh,ob.Name)
scene.objects.new(mesh,ob.Name)
Blender.Redraw()
Blender.Redraw()

def main():
def main():
Blender.Window.FileSelector(import_fcstd, 'IMPORT FCSTD',
Blender.Window.FileSelector(import_fcstd, 'IMPORT FCSTD',
Blender.sys.makename(ext='.fcstd'))
Blender.sys.makename(ext='.fcstd'))
# This lets you import the script without running it
# This lets you import the script without running it
if __name__=='__main__':
if __name__=='__main__':
main()
main()
}}
</syntaxhighlight>The first, important part is to make sure python will find our FreeCAD library. Once it finds it, all FreeCAD modules such as Part, that we'll use too, will be available automatically. So we simply take the sys.path variable, which is where python searches for modules, and we append the FreeCAD lib path. This modification is only temporary, and will be lost when we'll close our python interpreter. Another way could be making a link to your FreeCAD library in one of the python search paths. I kept the path in a constant (FREECADPATH) so it'll be easier for another user of the script to configure it to his own system.


Première chose, s'assurer que Python va trouver notre bibliothèque FreeCAD. Une fois qu'il l'a trouvée, tous les modules FreeCAD comme '''Part''', que nous allons aussi utiliser, seront disponibles automatiquement.
Once we are sure the library is loaded (the try/except sequence), we can now work with FreeCAD, the same way as we would inside FreeCAD's own python interpreter. We open the FreeCAD document that is passed to us by the main() function, and we make a list of its objects. Then, as we choosed only to care about Part geometry, we check if the Type property of each object contains "Part", then we tesselate it.
Donc, nous utilisons tout simplement la variable '''sys.path''', qui va donner à Python le chemin des modules à rechercher, et nous ajoutons le chemin '''FreeCAD lib'''.
Cette modification n'est que temporaire, et sera perdue quand nous aurons terminé avec notre interpréteur Python.
Une autre façon, est de créer un lien vers votre bibliothèque FreeCAD dans l'un des chemins (Path) de recherche Python.
Nous placerons le chemin dans une constante ('''FREECADPATH'''), un autre utilisateur du script aura ainsi plus de facilité pour configurer son propre système.


Une fois certain que la bibliothèque a été chargée (the try/except sequence), nous pourrons travailler avec FreeCAD, de la même manière que si nous le ferions à l'intérieur de l’interpréteur Python de FreeCAD.
The tesselation produce a list of vertices and a list of faces defined by vertices indexes. This is perfect, since it is exactly the same way as blender defines meshes. So, our task is ridiculously simple, we just add both lists contents to the verts and faces of a blender mesh. When everything is done, we just redraw the screen, and that's it!
Nous ouvrons le document FreeCAD que nous avons chargé avec la fonction '''main()''', et nous listons ses objets. Puis, comme nous avons choisi de nous occuper que de la forme géométrique, nous vérifions si la propriété '''Type''' de chaque objet contient '''Part''', puis nous faison une [http://fr.wikipedia.org/wiki/Tesselation tesselation].


La tesselation produit une liste de '''sommets''' (Vertex) et une liste de '''faces''' définis par les indices de sommets.
Of course this script is very simple (in fact I made a more advanced [http://yorik.orgfree.com/scripts/import_freecad.py here]), you might want to extend it, for example importing mesh objects too, or importing Part geometry that has no faces, or import other file formats that FreeCAD can read. You might also want to export geometry to a FreeCAD document, which can be done the same way. You might also want to build a dialog, so the user can choose what to import, etc... The beauty of all this actually lies in the fact that you let FreeCAD do the ground work while presenting its results in the program of your choice.
C'est parfait, puisque c'est exactement de cette manière que Blender définit les mailles.
Donc, notre tâche est ridiculement simple, nous ajoutons juste les deux listes des '''sommets''' et '''faces''' comme un maillage de Blender.
Une fois fait, nous allons juste redessiner l'écran et, c'est fini !


Vous avez vu, ce script est très simple (en fait, j'en ai écris un [http://yorik.orgfree.com/scripts/import_freecad.py plus évolué ici]), vous voudrez peut-être l'étendre, par exemple importer des objets "mesh", ou importer "Part geometry" qui n'a pas de face, ou importer d'autres formats que FreeCAD peut lire.
=== Using FreeCAD with GUI ===
Vous pouvez également exporter les formes géométriques dans un document FreeCAD, la procédure est la même.
Vous pouvez également créer un dialogue, afin que l'utilisateur puisse choisir ce qu'il veut importer, etc . . .
En réalité, la beauté dans tout cela, réside du fait que vous laissez faire la totalité du travail à FreeCAD, tout en présentant ses résultats dans le programme de votre choix.


=== Utilisation de FreeCAD avec interface graphique (GUI) ===
From version 4.2 on Qt has the intriguing ability to embed Qt-GUI-dependent plugins into non-Qt host applications and share the host's event loop.


Depuis la version 4.2 de Qt, Qt a la capacité d'intégrer des plugins '''Qt-GUI''' dépendants d'applications hôtes non-Qt, et, de partager la boucle évènementielle de l'hôte.
Especially, for FreeCAD this means that it can be imported from within another application with its whole user interface where the host application has full control over FreeCAD, then.


Principalement pour FreeCAD, cela signifie qu'il peut être importé à partir d'une autre application avec son interface utilisateur entière (GUI) par conséquences, l'application hôte prend le contrôle total de FreeCAD.
The whole python code to achieve that has only two lines<syntaxhighlight>
import FreeCADGui
FreeCADGui.showMainWindow()
</syntaxhighlight>
If the host application is based on Qt then this solution should work on all platforms which Qt supports. However, the host should link the same Qt version as FreeCAD because otherwise you could run into unexpected runtime errors.


L'ensemble du code Python nécessaire pour atteindre ce but, n'a que deux lignes:
For non-Qt applications, however, there are a few limitations you must be aware of. This solution probably doesn't work together with all other toolkits.
For Windows it works as long as the host application is directly based on Win32 or any other toolkit that internally uses the Win32 API such as wxWidgets, MFC or WinForms. In order to get it working under X11 the host application must link the "glib" library.


{{Code|code=
Note, for any console application this solution of course doesn't work because there is no event loop running.
import FreeCADGui
FreeCADGui.showMainWindow()
}}


Si, l'application hôte est basée sur Qt, alors cette solution devrait fonctionner sur toutes les plates-formes supportées par Qt. '''Toutefois''', l'hôte doit être de la même version Qt que la version utilisée pour FreeCAD, sinon, vous pouvez obtenir des erreurs d'exécution inattendues.
{{docnav|Scripted objects|Code snippets}}


Cependant, pour les applications non-Qt, il ya quelques restrictions, que vous devez connaitre:
[[Category:Poweruser Documentation]]
* Cette solution ne fonctionnera probablement pas avec tous les autres outils (toolkit):
[[Category:Python Code]]
** Pour Windows, il fonctionnera aussi longtemps que l'application hôte utilisée est compatible avec '''Win32''' ou, tout autres outils (toolkit) qui utilisent l''''API Win32''', comme '''wxWidgets''', '''MFC''' ou '''WinForms'''.
** Pour le faire fonctionner sous '''[http://fr.wikipedia.org/wiki/X_Window_System X11]''' (Linux), l'application hôte doit utiliser la bibliothèque '''"[http://developer.gnome.org/glib/ glib]"'''.


'''PS:'''pour toute application console, cette solution, bien sûr ne fonctionnera pas car, il n'y a pas de fonctionnement "boucle évènementielle" dans ce système.
{{clear}}

<languages/>
=== Avertissement ===

Bien qu'il soit possible d'importer FreeCAD vers un interpréteur Python externe, il ne s'agit pas d'un scénario d'utilisation courant et cela nécessite quelques précautions. En règle générale, il est préférable d'utiliser le Python fourni avec FreeCAD, d'exécuter FreeCAD via une ligne de commande, ou en tant que sous-processus. Voir [[Start up and Configuration/fr|Démarrage et configuration]] pour plus d'informations sur les deux dernières options.

Puisque le module Python de FreeCAD est compilé à partir de C ++ (plutôt que d'être un pur module Python), il ne peut être importé qu'à partir d'un interpréteur Python compatible. Cela signifie généralement que l'interpréteur Python doit être compilé avec le même compilateur C que celui utilisé pour construire FreeCAD. Les informations sur le compilateur utilisé pour construire un interpréteur Python (y compris celui construit avec FreeCAD) peuvent être trouvés comme suit:

{{Code|code=
>>> import sys
>>> sys.version
'2.7.13 (default, Dec 17 2016, 23:03:43) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]'
}}


{{docnav/fr|[[Scripted objects/fr|Script d'objects]]|[[Code snippets/fr|Bouts de code]]}}

{{Userdocnavi/fr}}

[[Category:Poweruser Documentation/fr]]

[[Category:Python Code/fr]]

Revision as of 10:04, 5 March 2019

FreeCAD a la capacité incroyable de pouvoir être importé en tant que module Python dans d'autres programmes ou, dans une console Python autonome, avec tous ses modules et ses composants. Il est même possible d'importer l'interface graphique (GUI) de FreeCAD en tant que module python avec toutefois, quelques restrictions. Mais avec quelques restrictions.

Utilisation de FreeCAD sans interface graphique (GUI)

Une première application, directe, facile et utile que vous pouvez faire est d'importer des documents FreeCAD dans votre programme. Dans l'exemple suivant, nous allons importer Part geometry d'un document FreeCAD dans blender. Voici le script complet. J'espère que vous serez impressionné par sa simplicité:

FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
import Blender, sys
sys.path.append(FREECADPATH)
 
def import_fcstd(filename):
   try:
       import FreeCAD
   except ValueError:
       Blender.Draw.PupMenu('Error%t

Première chose, s'assurer que Python va trouver notre bibliothèque FreeCAD. Une fois qu'il l'a trouvée, tous les modules FreeCAD comme Part, que nous allons aussi utiliser, seront disponibles automatiquement. Donc, nous utilisons tout simplement la variable sys.path, qui va donner à Python le chemin des modules à rechercher, et nous ajoutons le chemin FreeCAD lib. Cette modification n'est que temporaire, et sera perdue quand nous aurons terminé avec notre interpréteur Python. Une autre façon, est de créer un lien vers votre bibliothèque FreeCAD dans l'un des chemins (Path) de recherche Python. Nous placerons le chemin dans une constante (FREECADPATH), un autre utilisateur du script aura ainsi plus de facilité pour configurer son propre système.

Une fois certain que la bibliothèque a été chargée (the try/except sequence), nous pourrons travailler avec FreeCAD, de la même manière que si nous le ferions à l'intérieur de l’interpréteur Python de FreeCAD. Nous ouvrons le document FreeCAD que nous avons chargé avec la fonction main(), et nous listons ses objets. Puis, comme nous avons choisi de nous occuper que de la forme géométrique, nous vérifions si la propriété Type de chaque objet contient Part, puis nous faison une tesselation.

La tesselation produit une liste de sommets (Vertex) et une liste de faces définis par les indices de sommets. C'est parfait, puisque c'est exactement de cette manière que Blender définit les mailles. Donc, notre tâche est ridiculement simple, nous ajoutons juste les deux listes des sommets et faces comme un maillage de Blender. Une fois fait, nous allons juste redessiner l'écran et, c'est fini !

Vous avez vu, ce script est très simple (en fait, j'en ai écris un plus évolué ici), vous voudrez peut-être l'étendre, par exemple importer des objets "mesh", ou importer "Part geometry" qui n'a pas de face, ou importer d'autres formats que FreeCAD peut lire. Vous pouvez également exporter les formes géométriques dans un document FreeCAD, la procédure est la même. Vous pouvez également créer un dialogue, afin que l'utilisateur puisse choisir ce qu'il veut importer, etc . . . En réalité, la beauté dans tout cela, réside du fait que vous laissez faire la totalité du travail à FreeCAD, tout en présentant ses résultats dans le programme de votre choix.

Utilisation de FreeCAD avec interface graphique (GUI)

Depuis la version 4.2 de Qt, Qt a la capacité d'intégrer des plugins Qt-GUI dépendants d'applications hôtes non-Qt, et, de partager la boucle évènementielle de l'hôte.

Principalement pour FreeCAD, cela signifie qu'il peut être importé à partir d'une autre application avec son interface utilisateur entière (GUI) par conséquences, l'application hôte prend le contrôle total de FreeCAD.

L'ensemble du code Python nécessaire pour atteindre ce but, n'a que deux lignes:

import FreeCADGui 
FreeCADGui.showMainWindow()

Si, l'application hôte est basée sur Qt, alors cette solution devrait fonctionner sur toutes les plates-formes supportées par Qt. Toutefois, l'hôte doit être de la même version Qt que la version utilisée pour FreeCAD, sinon, vous pouvez obtenir des erreurs d'exécution inattendues.

Cependant, pour les applications non-Qt, il ya quelques restrictions, que vous devez connaitre:

  • Cette solution ne fonctionnera probablement pas avec tous les autres outils (toolkit):
    • Pour Windows, il fonctionnera aussi longtemps que l'application hôte utilisée est compatible avec Win32 ou, tout autres outils (toolkit) qui utilisent l'API Win32, comme wxWidgets, MFC ou WinForms.
    • Pour le faire fonctionner sous X11 (Linux), l'application hôte doit utiliser la bibliothèque "glib".

PS:pour toute application console, cette solution, bien sûr ne fonctionnera pas car, il n'y a pas de fonctionnement "boucle évènementielle" dans ce système.

Avertissement

Bien qu'il soit possible d'importer FreeCAD vers un interpréteur Python externe, il ne s'agit pas d'un scénario d'utilisation courant et cela nécessite quelques précautions. En règle générale, il est préférable d'utiliser le Python fourni avec FreeCAD, d'exécuter FreeCAD via une ligne de commande, ou en tant que sous-processus. Voir Démarrage et configuration pour plus d'informations sur les deux dernières options.

Puisque le module Python de FreeCAD est compilé à partir de C ++ (plutôt que d'être un pur module Python), il ne peut être importé qu'à partir d'un interpréteur Python compatible. Cela signifie généralement que l'interpréteur Python doit être compilé avec le même compilateur C que celui utilisé pour construire FreeCAD. Les informations sur le compilateur utilisé pour construire un interpréteur Python (y compris celui construit avec FreeCAD) peuvent être trouvés comme suit:

>>> import sys
>>> sys.version
'2.7.13 (default, Dec 17 2016, 23:03:43) \n[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]'