Embedding FreeCAD/fr: Difference between revisions

From FreeCAD Documentation
(Created page with "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'appli...")
(Updating to match new version of source page)
(46 intermediate revisions by 5 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'''.

{{TOCright}}

== Introduction ==

FreeCAD peut être importé en tant que module [[Python/fr|Python]] dans d'autres programmes ou dans une console Python autonome, avec tous ses modules et composants. Il est même possible d'importer l'interface utilisateur de FreeCAD en tant que module python mais avec certaines restrictions indiquées dans [[#Avertissements|Avertissements]].


=== Utilisation de FreeCAD sans interface graphique (GUI) ===
== 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.
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 [http://www.blender.org blender].
Dans l'exemple suivant, nous allons importer '''Part geometry''' d'un document FreeCAD dans [http://www.blender.org blender].
Voici le script complet.
Voici le script complet.
J'espère que vous serez impressionné par sa simplicité:<syntaxhighlight>
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
<nowiki>
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()
</nowiki>
</syntaxhighlight>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.
}}

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'''.
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.
Cette modification n'est que temporaire, et sera perdue quand nous aurons terminé avec notre interpréteur Python.
Line 60: Line 71:
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.
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) ===
== 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.
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.
Line 66: Line 77:
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.
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:
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.


{{Code|code=
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.
import FreeCADGui
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.
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.
Note, for any console application this solution of course doesn't work because there is no event loop running.


Cependant, pour les applications non-Qt, il ya quelques restrictions, que vous devez connaitre:
{{docnav|Scripted objects|Code snippets}}
* 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 '''[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.
[[Category:Poweruser Documentation]]
[[Category:Python Code]]


==Avertissements==

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)]'
}}


{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
{{clear}}
{{clear}}
<languages/>

Revision as of 20:48, 23 August 2020

Introduction

FreeCAD peut être importé en tant que module Python dans d'autres programmes ou dans une console Python autonome, avec tous ses modules et composants. Il est même possible d'importer l'interface utilisateur de FreeCAD en tant que module python mais avec certaines restrictions indiquées dans Avertissements.

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|FreeCAD library not found. Please check the FREECADPATH variable in the import script is correct')
   else:
       scene = Blender.Scene.GetCurrent()
       import Part
       doc = FreeCAD.open(filename)
       objects = doc.Objects
       for ob in objects:
           if ob.Type[:4] == 'Part':
               shape = ob.Shape
               if shape.Faces:
                   mesh = Blender.Mesh.New()
                   rawdata = shape.tessellate(1)
                   for v in rawdata[0]:
                       mesh.verts.append((v.x,v.y,v.z))
                   for f in rawdata[1]:
                       mesh.faces.append.append(f)
                   scene.objects.new(mesh,ob.Name)
       Blender.Redraw()

def main():
   Blender.Window.FileSelector(import_fcstd, 'IMPORT FCSTD', 
                        Blender.sys.makename(ext='.fcstd'))    
 
# This lets you import the script without running it
if __name__=='__main__':
   main()

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.

Avertissements

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)]'