Embedding FreeCAD/it: Difference between revisions

From FreeCAD Documentation
(Created page with "FreeCAD ha la sorprendente capacità di essere importabile come modulo Python in altri programmi o in una console autonoma di Python, insieme con tutti i suoi moduli e compone...")
No edit summary
 
(65 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<languages/>
FreeCAD ha la sorprendente capacità di essere importabile come modulo Python in altri programmi o in una console autonoma di Python, insieme con tutti i suoi moduli e componenti. E' anche possibile importare la GUI di FreeCAD come modulo Python (anche se con alcune restrizioni).

{{TOCright}}

<span id="Introduction"></span>
==Introduzione==

FreeCAD può essere importato come modulo [[Python/it|Python]] in altri programmi o in una console autonoma di Python, insieme con tutti i suoi moduli e componenti. E' anche possibile importare l'interfaccia utente di FreeCAD come modulo Python, ma con alcune restrizioni indicate nelle [[Embedding_FreeCAD/it#Avvertenze|avvertenze]].


<span id="Using_FreeCAD_without_GUI"></span>
=== Using FreeCAD without GUI ===
== Utilizzare FreeCAD senza GUI ==


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>
La prima, diretta, facile e utile applicazione che si può fare grazie a questo è quella di importare i documenti di FreeCAD in un vostro programma. Nell'esempio che segue, si importa la geometria Parte di un documento di FreeCAD in [http://www.blender.org Blender]. Segue lo script completo. È impressionante la sua semplicità:
{{Code|lang=python|code=
FREECADPATH = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
<nowiki>
import Blender, sys
FREECADPATH = '/usr/lib/freecad-python3/lib/' # path to your FreeCAD.so or FreeCAD.pyd file,
sys.path.append(FREECADPATH)
# for Windows you must either use \\ or / in the path, using a single \ is problematic
# FREECADPATH = 'C:\\FreeCAD\\bin'
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>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.
}}


La prima e più importante cosa da fare è che Python trovi la libreria di FreeCAD. Se la trova, tutti i moduli di FreeCAD, come il modulo Parte (che si è utilizzato) saranno automaticamente disponibili. Così si prenda semplicemente la variabile {{incode|sys.path}}, che è il posto dove Python cerca i moduli, e vi si aggiunga il percorso della libreria FreeCAD. Questa modifica è solo temporanea, e sarà persa quando chiuderemo l'interprete Python. Un modo alternativo potrebbe essere: creare un collegamento alla propria libreria di FreeCAD in uno dei percorsi di ricerca di Python. Si pone il percorso nella costante ({{incode|FREECADPATH}}) in modo che per un altro utente dello script sia più facile configurarlo per il proprio sistema. Per gli utenti Windows è importante che il percorso venga specificato utilizzando {{incode|\\}} o {{incode|/}} come separatore anziché solo {{incode|\}} poiché questo è un carattere di escape.
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.


{{Code|lang=python|code=
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!
FREECADPATH = 'C:\\FreeCAD\\bin' # path to your FreeCAD.so or FreeCAD.pyd file
import sys
sys.path.append(FREECADPATH)
}}


Quando si è sicuri che la libreria è stata caricata (la sequenza {{incode|try}}/{{incode|except}}), si può lavorare con FreeCAD, allo stesso modo che si farebbe all'interno dell'interprete Python di FreeCAD. Si apre il documento FreeCAD che viene passato dalla funzione {{incode|main()}}, e si fa una lista dei suoi oggetti. Poi, siccome si è deciso di preoccuparsi solo della geometria del pezzo, controlliamo se la proprietà Type di ogni oggetto contiene "{{incode|Part}}", e dopo la tasselliamo.
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.


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


Il tassellamento produce una lista di vertici e un elenco di facce definite dai vertici indicizzati. Questo è perfetto, poiché è esattamente lo stesso modo in cui Blender definisce i Mesh. Quindi, il nostro compito è ridicolmente semplice, basta aggiungere il contenuto di entrambi gli elenchi ai vertici e alle facce di una mesh di Blender. Quando tutto è fatto, basta ridisegnare lo schermo, e questo è tutto!
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.


{{Code|lang=python|code=
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.
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()
}}


Ovviamente questo script è molto semplice (in realtà ne ho fatto uno più avanzato [https://yorik.orgfree.com/scripts/import_freecad.py FreeCAD to Blender importer]), è probabile che si voglia estenderlo, per esempio per importare anche oggetti mesh, o importare la geometria di una parte che non ha facce, o importare altri formati di file che FreeCAD è in grado di leggere. Si potrebbe anche voler esportare la geometria in un documento di FreeCAD, cosa che può essere fatto allo stesso modo. Si potrebbe anche voler costruire un dialogo per permettere all'utente di scegliere cosa importare, ecc.. La bellezza di tutto questo risiede proprio nel fatto che lasciate lavorare FreeCAD in ombra, mentre i suoi risultati sono presentati nel programma di vostra scelta.
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.


{{Emphasis|Nota:}} controllare [[Headless_FreeCAD/it|Headless FreeCAD]] per eseguire FreeCAD senza la GUI.
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.


<span id="Using_FreeCAD_with_GUI"></span>
Note, for any console application this solution of course doesn't work because there is no event loop running.
== Utilizzare FreeCAD con GUI ==


Dalla versione 4.2, Qt ha la capacità affascinante di incorporare i plug-in della GUI dipendenti da Qt in applicazioni ospite (host) non-Qt e condividere il ciclo di eventi dell'ospite.
{{docnav|Scripted objects|Code snippets}}


In particolare, per FreeCAD questo significa che esso può essere importato (incorporato) all'interno di un'altra applicazione con tutta la sua interfaccia utente dentro un'altra applicazione ospite la quale ha, a questo punto, il pieno controllo di FreeCAD.
[[Category:Poweruser Documentation]]
[[Category:Python Code]]


L'intero codice python per ottenere questo ha solo due linee:

{{Code|code=
import FreeCADGui
FreeCADGui.showMainWindow()
}}

Se l'applicazione ospite è basata su Qt, allora questa soluzione dovrebbe funzionare su tutte le piattaforme che supportano Qt. Tuttavia, l'ospite deve basarsi sulla stessa versione Qt di FreeCAD perché altrimenti si potrebbe incorrere in errori di esecuzione inaspettati.

Per le applicazioni non-Qt, tuttavia, ci sono alcune limitazioni di cui è necessario essere a conoscenza. Questa soluzione probabilmente non funziona con tutti gli altri toolkit.
Per Windows funziona fintanto che l'applicazione ospite è basata direttamente su Win32 o su qualsiasi altro toolkit che utilizza internamente l'API Win32, come wxWidgets, MFC o WinForms. Al fine di farla funzionare sotto X11 l'applicazione ospite deve linkare la libreria "glib".

Notare che, questa soluzione, naturalmente, non funziona per nessuna applicazione da console perché non c'è nessun ciclo di eventi in esecuzione.

<span id="Caveats"></span>
== Avvertenze ==

Anche se è possibile importare FreeCAD con un interprete Python esterno, questo non è uno scenario di utilizzo comune e richiede una certa cura. In generale, è meglio usare il Python incluso con FreeCAD, eseguire FreeCAD da linea di comando, o come un sottoprocesso. Vedere [[Start up and Configuration/it|Avvio e configurazione]] per maggiori informazioni sulle ultime due opzioni.

Dato che il modulo Python di FreeCAD viene compilato da C ++ (invece di essere un puro modulo Python), esso può essere importato solo da un interprete Python compatibile. Generalmente questo significa che l'interprete Python deve essere compilato con lo stesso compilatore C che è stato utilizzato per costruire FreeCAD. Le informazioni sul compilatore utilizzato per costruire un interprete Python (compreso quello costruito con FreeCAD) si possono trovare nel seguente modo:
{{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)]'
}}

<span id="Related"></span>
== Riferimenti ==

* [[Headless_FreeCAD/it|Headless FreeCAD]]


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

Latest revision as of 16:13, 26 August 2023

Introduzione

FreeCAD può essere importato come modulo Python in altri programmi o in una console autonoma di Python, insieme con tutti i suoi moduli e componenti. E' anche possibile importare l'interfaccia utente di FreeCAD come modulo Python, ma con alcune restrizioni indicate nelle avvertenze.

Utilizzare FreeCAD senza GUI

La prima, diretta, facile e utile applicazione che si può fare grazie a questo è quella di importare i documenti di FreeCAD in un vostro programma. Nell'esempio che segue, si importa la geometria Parte di un documento di FreeCAD in Blender. Segue lo script completo. È impressionante la sua semplicità:

FREECADPATH = '/usr/lib/freecad-python3/lib/' # path to your FreeCAD.so or FreeCAD.pyd file,
# for Windows you must either use \\ or / in the path, using a single \ is problematic
# FREECADPATH = 'C:\\FreeCAD\\bin'
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()

La prima e più importante cosa da fare è che Python trovi la libreria di FreeCAD. Se la trova, tutti i moduli di FreeCAD, come il modulo Parte (che si è utilizzato) saranno automaticamente disponibili. Così si prenda semplicemente la variabile sys.path, che è il posto dove Python cerca i moduli, e vi si aggiunga il percorso della libreria FreeCAD. Questa modifica è solo temporanea, e sarà persa quando chiuderemo l'interprete Python. Un modo alternativo potrebbe essere: creare un collegamento alla propria libreria di FreeCAD in uno dei percorsi di ricerca di Python. Si pone il percorso nella costante (FREECADPATH) in modo che per un altro utente dello script sia più facile configurarlo per il proprio sistema. Per gli utenti Windows è importante che il percorso venga specificato utilizzando \\ o / come separatore anziché solo \ poiché questo è un carattere di escape.

FREECADPATH = 'C:\\FreeCAD\\bin' # path to your FreeCAD.so or FreeCAD.pyd file
import sys
sys.path.append(FREECADPATH)

Quando si è sicuri che la libreria è stata caricata (la sequenza try/except), si può lavorare con FreeCAD, allo stesso modo che si farebbe all'interno dell'interprete Python di FreeCAD. Si apre il documento FreeCAD che viene passato dalla funzione main(), e si fa una lista dei suoi oggetti. Poi, siccome si è deciso di preoccuparsi solo della geometria del pezzo, controlliamo se la proprietà Type di ogni oggetto contiene "Part", e dopo la tasselliamo.

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

Il tassellamento produce una lista di vertici e un elenco di facce definite dai vertici indicizzati. Questo è perfetto, poiché è esattamente lo stesso modo in cui Blender definisce i Mesh. Quindi, il nostro compito è ridicolmente semplice, basta aggiungere il contenuto di entrambi gli elenchi ai vertici e alle facce di una mesh di Blender. Quando tutto è fatto, basta ridisegnare lo schermo, e questo è tutto!

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

Ovviamente questo script è molto semplice (in realtà ne ho fatto uno più avanzato FreeCAD to Blender importer), è probabile che si voglia estenderlo, per esempio per importare anche oggetti mesh, o importare la geometria di una parte che non ha facce, o importare altri formati di file che FreeCAD è in grado di leggere. Si potrebbe anche voler esportare la geometria in un documento di FreeCAD, cosa che può essere fatto allo stesso modo. Si potrebbe anche voler costruire un dialogo per permettere all'utente di scegliere cosa importare, ecc.. La bellezza di tutto questo risiede proprio nel fatto che lasciate lavorare FreeCAD in ombra, mentre i suoi risultati sono presentati nel programma di vostra scelta.

Nota: controllare Headless FreeCAD per eseguire FreeCAD senza la GUI.

Utilizzare FreeCAD con GUI

Dalla versione 4.2, Qt ha la capacità affascinante di incorporare i plug-in della GUI dipendenti da Qt in applicazioni ospite (host) non-Qt e condividere il ciclo di eventi dell'ospite.

In particolare, per FreeCAD questo significa che esso può essere importato (incorporato) all'interno di un'altra applicazione con tutta la sua interfaccia utente dentro un'altra applicazione ospite la quale ha, a questo punto, il pieno controllo di FreeCAD.

L'intero codice python per ottenere questo ha solo due linee:

import FreeCADGui 
FreeCADGui.showMainWindow()

Se l'applicazione ospite è basata su Qt, allora questa soluzione dovrebbe funzionare su tutte le piattaforme che supportano Qt. Tuttavia, l'ospite deve basarsi sulla stessa versione Qt di FreeCAD perché altrimenti si potrebbe incorrere in errori di esecuzione inaspettati.

Per le applicazioni non-Qt, tuttavia, ci sono alcune limitazioni di cui è necessario essere a conoscenza. Questa soluzione probabilmente non funziona con tutti gli altri toolkit. Per Windows funziona fintanto che l'applicazione ospite è basata direttamente su Win32 o su qualsiasi altro toolkit che utilizza internamente l'API Win32, come wxWidgets, MFC o WinForms. Al fine di farla funzionare sotto X11 l'applicazione ospite deve linkare la libreria "glib".

Notare che, questa soluzione, naturalmente, non funziona per nessuna applicazione da console perché non c'è nessun ciclo di eventi in esecuzione.

Avvertenze

Anche se è possibile importare FreeCAD con un interprete Python esterno, questo non è uno scenario di utilizzo comune e richiede una certa cura. In generale, è meglio usare il Python incluso con FreeCAD, eseguire FreeCAD da linea di comando, o come un sottoprocesso. Vedere Avvio e configurazione per maggiori informazioni sulle ultime due opzioni.

Dato che il modulo Python di FreeCAD viene compilato da C ++ (invece di essere un puro modulo Python), esso può essere importato solo da un interprete Python compatibile. Generalmente questo significa che l'interprete Python deve essere compilato con lo stesso compilatore C che è stato utilizzato per costruire FreeCAD. Le informazioni sul compilatore utilizzato per costruire un interprete Python (compreso quello costruito con FreeCAD) si possono trovare nel seguente modo:

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

Riferimenti