Embedding FreeCAD/de: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
No edit summary
(25 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
{{docnav|Scripted objects|Code snippets}}


{{TOCright}}
FreeCAD hat die erstaunliche Fähigkeit, wie ein Python-Modul in anderen Programmen importiert zu laufen oder in einer eigenständigen Python-Konsole importiert, zusammen mit all seinen Modulen und Komponenten.
Es ist sogar möglich, die FreeCAD GUI als Python-Modul zu importieren - mit [[Embedding_FreeCAD/de#Caveats|einigen Einschränkungen]] allerdings.


== Einführung ==
=== FreeCAD benutzen ohne GUI ===


FreeCAD kann als ein [[Python/de|Python]]-Modul in anderen Programmen oder einer eigenständigen Python-Konsole importiert werden, zusammen mit all seinen Modulen und Komponenten. Es ist sogar möglich, die FreeCAD-GUI als ein Python-Modul zu importieren, allerdings mit [[Embedding_FreeCAD/de#Caveats|einigen Einschränkungen]].
Eine erste, direkte, einfache und nützliche Anwendung die für Sie daraus entsteht, ist, FreeCAD-Dokumente in Ihre Programme zu importieren.
Im folgenden Beispiel werden wir die Part-Geometrie eines FreeCAD-Dokuments in [http://www.blender.org Blender] importieren. Hier ist das komplette Skript.
Ich hoffe, Sie werden durch seine Einfachheit beeindruckt sein:<syntaxhighlight>


== FreeCAD benutzen ohne GUI ==

Die erste, direkte, einfache und nützliche Anwendung die für Sie daraus entsteht, ist, FreeCAD-Dokumente in Ihre Programme zu importieren.
Im folgenden Beispiel werden wir die Part-Geometrie eines FreeCAD-Dokuments in [http://www.blender.org Blender] importieren. Hier ist das komplette Skript. Ich hoffe, Sie werden durch seine Einfachheit beeindruckt sein:
{{Code|lang=python|code=
<nowiki>
FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
import Blender, sys
import Blender, sys
Line 45: Line 47:
if __name__=='__main__':
if __name__=='__main__':
main()
main()
</nowiki>
</syntaxhighlight>Der erste und wichtigste Teil ist sicherzustellen, das Python unsere FreeCAD-Bibliothek finden wird.
}}
Nachdem Python sie findet, werden alle FreeCAD-Module wie Part, dass wir auch nutzen werden, automatisch zur Verfügung stehen.
Also nehmen wir einfach die sys.path-Variable, wo Python nach Modulen suchen wird, und wir ergänzen Sie um den FreeCAD lib - Pfad.
Diese Änderungen sind nur temporär und gehen verloren, wenn wir unseren Python-Interpreter schließen.
Ein anderer Weg wäre, einen Link zu Ihrer FreeCAD-Bibliothek in einem der Python-Suchpfade anzulegen.
Ich setze den Pfad in einer konstanten (FREECADPATH), so dass es für einen anderen Benutzer des Skripts dann einfacher ist, dieses für sein eigenes System zu konfigurieren.


Der erste und wichtigste Teil ist sicherzustellen, das Python unsere FreeCAD-Bibliothek finden wird.
Sobald wir sicher sind, dass die Bibliothek geladen wird (siehe try/except Sequenz), können wir jetzt auf die gleiche Weise mit FreeCAD arbeiten,
Nachdem Python sie findet, werden alle FreeCAD-Module wie Part (das wir auch nutzen werden) automatisch zur Verfügung stehen.
wie wir es Innerhalb des FreeCAD eigenen Python-Interpreters tun würden.
Also nehmen wir einfach die {{Incode|sys.path}}-Variable, wo Python nach Modulen suchen wird, und wir ergänzen sie um den FreeCAD-library-Pfad. Diese Änderung ist nur temporär und geht verloren, wenn wir unseren Python-Interpreter schließen. Ein alternativer Weg wäre, einen Link zu Ihrer FreeCAD-Bibliothek in einem der Python-Suchpfade anzulegen. Ich speicherte den Pfad in einer Konstanten {{Incode|FREECADPATH}}, so dass es für einen anderen Benutzer des Skripts dann einfacher ist, dieses für sein eigenes System zu konfigurieren.
Wir öffnen das FreeCAD-Dokument, das uns von der main()-Funktion übergeben wird, und wir erstellen eine Liste der Objekte.

Da wir uns nur um die Part-Geometrie kümmern wollten, überprüfen wir, ob jedes Objekt die Type-Eigenschaft "Part" enthält, dann werden wir es tessellieren. ([https://de.wikipedia.org/wiki/Triangulation_(Fl%C3%A4che) Triangulation])
{{Code|lang=python|code=
FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
import Blender, sys
sys.path.append(FREECADPATH)
}}

Sobald wir sicher sind, dass die Bibliothek geladen wird (siehe {{incode|try}}/{{incode|except}} Sequenz), können wir jetzt auf die gleiche Weise mit FreeCAD arbeiten, wie wir es Innerhalb des FreeCAD eigenen Python-Interpreters tun würden. Wir öffnen das FreeCAD-Dokument, das uns von der {{incode|main()}}-Funktion übergeben wird, und wir erstellen eine Liste der Objekte. Da wir uns nur um die Part-Geometrie kümmern wollten, überprüfen wir, ob jedes Objekt die Type-Eigenschaft "{{incode|Part}}" enthält, dann werden wir es tessellieren.

{{Code|lang=python|code=
import Part
doc = FreeCAD.open(filename)
objects = doc.Objects
for ob in objects:
if ob.Type[:4] == 'Part':
}}


Die Tesselation erzeugt eine Liste der Knoten und eine Liste der Flächen, die durch Ecken Indizes definiert wird.
Die Tesselation erzeugt eine Liste der Knoten und eine Liste der Flächen, die durch Ecken Indizes definiert wird.
Line 62: Line 75:
Wenn alles fertig ist, lassen wir den Bildschirm neu zeichnen(aufbauen), und das ist alles!
Wenn alles fertig ist, lassen wir den Bildschirm neu zeichnen(aufbauen), und das ist alles!


{{Code|lang=python|code=
Natürlich ist es ein sehr einfaches Skript(tatsächlich habe ich eine erweiterte Version [http://yorik.orgfree.com/scripts/import_freecad.py hier]), dass Sie vielleicht erweitern möchten, z. B. auch zum importieren von Mesh-Objekten, oder importieren von Part-Geometrie ohne Flächen, oder Import anderer Dateiformate, die FreeCAD lesen kann. Vielleicht wollen Sie auch Geometrien ein FreeCAD-Dokument exportieren, was auf die gleiche Weise durchgeführt werden kann. Vielleicht wollen Sie auch einen Dialog aufbauen, womit der Benutzer wählen kann, was zu importieren ist, etc...
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()
}}

Natürlich ist es ein sehr einfaches Skript(tatsächlich habe ich eine erweiterte Version [https://yorik.orgfree.com/scripts/import_freecad.py FreeCAD nach Blender-Import]), die Sie vielleicht erweitern möchten, z. B. auch zum importieren von Mesh-Objekten, oder importieren von Part-Geometrie ohne Flächen, oder Import anderer Dateiformate, die FreeCAD lesen kann. Vielleicht wollen Sie auch Geometrien ein FreeCAD-Dokument exportieren, was auf die gleiche Weise durchgeführt werden kann. Vielleicht wollen Sie auch einen Dialog aufbauen, womit der Benutzer wählen kann, was zu importieren ist, etc...
Die Schönheit in alle dem liegt in der Tatsache, dass Sie FreeCAD die gesaamte Grundarbeit überlassen, während der Präsentation des Ergebnisses in dem Programm Ihrer Wahl geschiet.
Die Schönheit in alle dem liegt in der Tatsache, dass Sie FreeCAD die gesaamte Grundarbeit überlassen, während der Präsentation des Ergebnisses in dem Programm Ihrer Wahl geschiet.


{{Emphasis|Hinweis:}} Probiere [[Headless_FreeCAD/de|Headless FreeCAD]], um FreeCAD ohne GUI zu betreiben.
=== FreeCAD nutzen mit GUI ===

== FreeCAD nutzen mit GUI ==


Ab der Version 4.2 hat Qt die faszinierende Fähigkeit, Qt-GUI-abhängige-plugins in nicht-Qt-Host-Anwendungen einzubetten und sich an der Ereignis-Schleife des Gastgebers zu beteiligen.
Ab der Version 4.2 hat Qt die faszinierende Fähigkeit, Qt-GUI-abhängige-plugins in nicht-Qt-Host-Anwendungen einzubetten und sich an der Ereignis-Schleife des Gastgebers zu beteiligen.
Line 73: Line 102:
Der ganze Python-Code dies zu erreichen, besteht nur aus zwei Zeilen
Der ganze Python-Code dies zu erreichen, besteht nur aus zwei Zeilen


{{Code|code=
<syntaxhighlight>
import FreeCADGui
import FreeCADGui
FreeCADGui.showMainWindow()
FreeCADGui.showMainWindow()
}}
</syntaxhighlight>


Wenn die Host-Anwendung auf Qt basiert, dann sollte diese Lösung auf allen Plattformen, die Qt unterstützt arbeiten. Allerdings sollte der Host die gleiche Qt-Version wie FreeCAD nutzen, weil man sonst unerwartete Laufzeitfehler erhalten könnte.
Wenn die Host-Anwendung auf Qt basiert, dann sollte diese Lösung auf allen Plattformen, die Qt unterstützt arbeiten. Allerdings sollte der Host die gleiche Qt-Version wie FreeCAD nutzen, weil man sonst unerwartete Laufzeitfehler erhalten könnte.
Line 85: Line 114:
Beachten Sie, für Konsole-Anwendungen wird diese Lösung natürlich nicht funktionieren, weil keine Ereignis-Schleife läuft.
Beachten Sie, für Konsole-Anwendungen wird diese Lösung natürlich nicht funktionieren, weil keine Ereignis-Schleife läuft.


===Vorbehalte===
==Vorbehalte==


Obwohl es möglich ist, FreeCAD in einen externen Python-Interpreter zu importieren, ist dies kein übliches Benutzungsszenario und erfordert etwas Sorgfalt. Generell ist es besser, das in FreeCAD enthaltene Python zu verwenden, FreeCAD auf der Kommandozeile auszuführen oder als ein Sub-Prozess. Zu den letzten beiden Optionen gibt es [[Start up and Configuration/de|hier]] nähere Einzelheiten.
Obwohl es möglich ist, FreeCAD in einen externen Python-Interpreter zu importieren, ist dies kein übliches Benutzungsszenario und erfordert etwas Sorgfalt. Generell ist es besser, das in FreeCAD enthaltene Python zu verwenden, FreeCAD auf der Kommandozeile auszuführen oder als ein Sub-Prozess. Zu den letzten beiden Optionen gibt es [[Start up and Configuration/de|hier]] nähere Einzelheiten.


Weil das FreeCAD-Python-Modul aus C++ kompiliert wurde (anstatt ein reines Python-Modul zu sein), kann es nur von einem kompatiblen Python-Interpreter importiert werden. Generell bedeutet das, dass der Python-Interpreter mit dem gleichen C-Compiler wie bei der Erstellung von FreeCAD kompiliert werden muss. Informationen über den bei der Erstellung des (in FreeCAD enthaltenen) Python-Interpreters benutzten Compilers köönen wie folgt ermittelt werden:
Weil das FreeCAD-Python-Modul aus C++ kompiliert wurde (anstatt ein reines Python-Modul zu sein), kann es nur von einem kompatiblen Python-Interpreter importiert werden. Generell bedeutet das, dass der Python-Interpreter mit dem gleichen C-Compiler wie bei der Erstellung von FreeCAD kompiliert werden muss. Informationen über den bei der Erstellung des (in FreeCAD enthaltenen) Python-Interpreters benutzten Compilers köönen wie folgt ermittelt werden:
{{Code|code=

<syntaxhighlight>
>>> import sys
>>> import sys
>>> sys.version
>>> 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)]'
'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)]'
}}
</syntaxhighlight>

==Verwandtes==


* [[Headless_FreeCAD|Headless FreeCAD]]


{{docnav/de|Scripted objects/de|Code snippets/de}}


{{Powerdocnavi{{#translation:}}}}
[[Category:Poweruser Documentation/de]] [[Category:Python Code/de]]
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]
{{clear}}

Revision as of 22:12, 21 August 2021

Einführung

FreeCAD kann als ein Python-Modul in anderen Programmen oder einer eigenständigen Python-Konsole importiert werden, zusammen mit all seinen Modulen und Komponenten. Es ist sogar möglich, die FreeCAD-GUI als ein Python-Modul zu importieren, allerdings mit einigen Einschränkungen.

FreeCAD benutzen ohne GUI

Die erste, direkte, einfache und nützliche Anwendung die für Sie daraus entsteht, ist, FreeCAD-Dokumente in Ihre Programme zu importieren. Im folgenden Beispiel werden wir die Part-Geometrie eines FreeCAD-Dokuments in Blender importieren. Hier ist das komplette Skript. Ich hoffe, Sie werden durch seine Einfachheit beeindruckt sein:

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

Der erste und wichtigste Teil ist sicherzustellen, das Python unsere FreeCAD-Bibliothek finden wird. Nachdem Python sie findet, werden alle FreeCAD-Module wie Part (das wir auch nutzen werden) automatisch zur Verfügung stehen. Also nehmen wir einfach die sys.path-Variable, wo Python nach Modulen suchen wird, und wir ergänzen sie um den FreeCAD-library-Pfad. Diese Änderung ist nur temporär und geht verloren, wenn wir unseren Python-Interpreter schließen. Ein alternativer Weg wäre, einen Link zu Ihrer FreeCAD-Bibliothek in einem der Python-Suchpfade anzulegen. Ich speicherte den Pfad in einer Konstanten FREECADPATH, so dass es für einen anderen Benutzer des Skripts dann einfacher ist, dieses für sein eigenes System zu konfigurieren.

FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
import Blender, sys
sys.path.append(FREECADPATH)

Sobald wir sicher sind, dass die Bibliothek geladen wird (siehe try/except Sequenz), können wir jetzt auf die gleiche Weise mit FreeCAD arbeiten, wie wir es Innerhalb des FreeCAD eigenen Python-Interpreters tun würden. Wir öffnen das FreeCAD-Dokument, das uns von der main()-Funktion übergeben wird, und wir erstellen eine Liste der Objekte. Da wir uns nur um die Part-Geometrie kümmern wollten, überprüfen wir, ob jedes Objekt die Type-Eigenschaft "Part" enthält, dann werden wir es tessellieren.

import Part
       doc = FreeCAD.open(filename)
       objects = doc.Objects
       for ob in objects:
           if ob.Type[:4] == 'Part':

Die Tesselation erzeugt eine Liste der Knoten und eine Liste der Flächen, die durch Ecken Indizes definiert wird. Dies ist Ideal, da es genau auf die gleiche Weise wie Blender Netze definiert. Somit wird unsere Aufgabe lächerlich einfach, wir übergeben einfach beide Listeninhalte an die Punkte und Flächen von einem Blender-Netz. Wenn alles fertig ist, lassen wir den Bildschirm neu zeichnen(aufbauen), und das ist alles!

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

Natürlich ist es ein sehr einfaches Skript(tatsächlich habe ich eine erweiterte Version FreeCAD nach Blender-Import), die Sie vielleicht erweitern möchten, z. B. auch zum importieren von Mesh-Objekten, oder importieren von Part-Geometrie ohne Flächen, oder Import anderer Dateiformate, die FreeCAD lesen kann. Vielleicht wollen Sie auch Geometrien ein FreeCAD-Dokument exportieren, was auf die gleiche Weise durchgeführt werden kann. Vielleicht wollen Sie auch einen Dialog aufbauen, womit der Benutzer wählen kann, was zu importieren ist, etc... Die Schönheit in alle dem liegt in der Tatsache, dass Sie FreeCAD die gesaamte Grundarbeit überlassen, während der Präsentation des Ergebnisses in dem Programm Ihrer Wahl geschiet.

Hinweis: Probiere Headless FreeCAD, um FreeCAD ohne GUI zu betreiben.

FreeCAD nutzen mit GUI

Ab der Version 4.2 hat Qt die faszinierende Fähigkeit, Qt-GUI-abhängige-plugins in nicht-Qt-Host-Anwendungen einzubetten und sich an der Ereignis-Schleife des Gastgebers zu beteiligen.

Insbesondere für FreeCAD bedeutet dies, dass es aus einer anderen Anwendung mit seiner ganzen Oberfläche importiert werden kann, wobei die Host-Anwendung die volle Kontrolle über FreeCAD behält.

Der ganze Python-Code dies zu erreichen, besteht nur aus zwei Zeilen

import FreeCADGui 
FreeCADGui.showMainWindow()

Wenn die Host-Anwendung auf Qt basiert, dann sollte diese Lösung auf allen Plattformen, die Qt unterstützt arbeiten. Allerdings sollte der Host die gleiche Qt-Version wie FreeCAD nutzen, weil man sonst unerwartete Laufzeitfehler erhalten könnte.

Für Nicht-Qt-Anwendungen aber, gibt es ein paar Einschränkungen, die Sie beachten müssen. Diese Lösung wird wahrscheinlich nicht mit allen anderen Toolkits funktionieren. Für Windows funktioniert es, solange die Host-Anwendung direkt aufbaut auf Win32 oder andere Toolkits, die intern die Win32-API verwenden, wie z.B. wxWidgets, MFC oder WinForms. Damit es unter X11 arbeitet, muss die Host-Anwendung mit der "glib"-Bibliothek verknüpft sein.

Beachten Sie, für Konsole-Anwendungen wird diese Lösung natürlich nicht funktionieren, weil keine Ereignis-Schleife läuft.

Vorbehalte

Obwohl es möglich ist, FreeCAD in einen externen Python-Interpreter zu importieren, ist dies kein übliches Benutzungsszenario und erfordert etwas Sorgfalt. Generell ist es besser, das in FreeCAD enthaltene Python zu verwenden, FreeCAD auf der Kommandozeile auszuführen oder als ein Sub-Prozess. Zu den letzten beiden Optionen gibt es hier nähere Einzelheiten.

Weil das FreeCAD-Python-Modul aus C++ kompiliert wurde (anstatt ein reines Python-Modul zu sein), kann es nur von einem kompatiblen Python-Interpreter importiert werden. Generell bedeutet das, dass der Python-Interpreter mit dem gleichen C-Compiler wie bei der Erstellung von FreeCAD kompiliert werden muss. Informationen über den bei der Erstellung des (in FreeCAD enthaltenen) Python-Interpreters benutzten Compilers köönen wie folgt ermittelt werden:

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

Verwandtes