Embedding FreeCAD/ro: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
(39 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<languages/>
FreeCAD has the amazing ability to be importable as a python module in other programs or in a standalone python console, together with all its modules and components. It's even possible to import the FreeCAD GUI as python module -- with some restrictions, however.

{{TOCright}}

== Introduction ==


<div class="mw-translate-fuzzy">
=== Using FreeCAD without GUI ===
FreeCAD are capacitatea uimitoare de a fi importabil ca modul python în alte programe sau într-o consolă python autonomă, împreună cu toate modulele și componentele sale. Este posibil chiar să importați interfața grafică GUI-ul FreeCAD ca modul python - cu [[Embedding_FreeCAD # Caveats|some restrictions]], dar cu anumite restricții.
</div>


<div class="mw-translate-fuzzy">
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>
=== Utilizarea FreeCAD fără interfață grafică/GUI ===
</div>


<div class="mw-translate-fuzzy">
O primă aplicație directă, ușoară și utilă pe care o puteți face este importul documentelor FreeCAD în programul dvs. În următorul exemplu, vom importa geometria pieselor unui document FreeCAD în [http://www.blender.org blender]. Iată scenariul complet. Sper că veți fi impresionat de simplitatea sa:
</div>
{{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 39: Line 52:
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.
}}


<div class="mw-translate-fuzzy">
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.
Prima parte importantă este să vă asigurați că Python va găsi biblioteca noastră FreeCAD. Odată ce o găsește, toate modulele FreeCAD, cum ar fi Part, pe care o vom folosi, vor fi disponibile automat. Așa că luăm pur și simplu variabila sys.path, care este unde Python caută module și adăugăm calea FreCAD.Lib. Această modificare este doar temporară și se va pierde atunci când închidem interpretorul nostru python. Un alt mod ar putea fi să faceți o legătură cu biblioteca dvs. FreeCAD într-una din căile de căutare python. Am păstrat calea într-o constantă (FREECADPATH) astfel încât un alt utilizator al scriptului îi va fi mai ușor să configureze propriul sistem
</div>


{{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 = '/opt/FreeCAD/lib' # path to your FreeCAD.so or FreeCAD.dll file
import Blender, sys
sys.path.append(FREECADPATH)
}}


<div class="mw-translate-fuzzy">
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.
Odată ce suntem siguri că biblioteca este încărcată (secvența try/except), acum putem lucra cu FreeCAD, la fel ca și cum am fi în interiorul interpretului Python al FreeCAD. Deschidem documentul FreeCAD care ne este transmis prin funcția principală main() și facem o listă a obiectelor sale. Apoi, pe măsură ce alegem doar să ne pese de geometria piesei, verificăm dacă proprietatea Type a fiecărui obiect conține "Part", apoi o mozaicăm (tessellation).
</div>


{{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':
}}

Mozaicarea (Tessellation) produce o listă de vârfuri(vertex) și o listă de fasțete definite de indici de vârfuri. Acest lucru este perfect, deoarece este exact același mod în care programul Blender definește ochiurile de plasă. Deci, sarcina noastră este ridicol de simplă, adăugăm ambele conținuturi ale listelor la vârfurile și fețetele unei rețele de tip Blender. Când totul este realizat, noi redesenăm ecranul și gata ”c'est fini” !

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

<div class="mw-translate-fuzzy">
Bineînțeles, ați văzut că acest script este foarte simplu (de fapt am făcut unul mai avansat aici [http://yorik.orgfree.com/scripts/import_freecad.py here]),ați putea dori să-l extindeți, de exemplu importarea obiectelor de tip plasă, sau importarea ”Part Geometry” care nu are fațete sau importul altor formate de fișiere pe care FreeCAD le poate citi. De asemenea, ați putea dori să exportați forme geometrice într-un document FreeCAD, care se poate face în același mod. S-ar putea să doriți, de asemenea, să construiți un dialog, astfel încât utilizatorul să poată alege ce să importe, etc.... Frumusețea tuturor acestor lucruri constă de fapt că l-ai lăsat pe FreeCAD să efectueze în totalitate, prezentându-și în același timp rezultatele în programul pe care l-ai ales .
</div>

{{Emphasis|Note:}} checkout [[Headless_FreeCAD|Headless FreeCAD]] for running FreeCAD without the GUI.

<div class="mw-translate-fuzzy">
=== Utilizarea FreeCAD cu interfață grafică(GUI) ===
</div>

De la versiunea 4.2 cu Qt are capacitatea de a încorpora plugin-urile dependente de Qt-GUI în aplicații gazdă non-Qt și de a partaja bucla evenimentului gazdei.


Mai presus de toate, pentru FreeCAD, aceasta înseamnă că poate fi importat dintr-o altă aplicație cu interfața sa completă de utilizator (GUI) și în consecință aplicația gazdă controlează pe deplin FreeCAD.
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.


Tot codul python pentru a obține aceasta are numai 2 linii
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.


{{Code|code=
The whole python code to achieve that has only two lines<syntaxhighlight>
import FreeCADGui
import FreeCADGui
FreeCADGui.showMainWindow()
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.


Dacă aplicația se bazează pe Qt, atunci aceasta soluție ar trebui să funcționeze pe toate platformele suportate de către Qt . Cu toate acestea, gazda ar trebui să conecteze aceeași versiune QT ca și FreeCAD, deoarece altfel ați putea obține erori de execuție neașteptate.
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.


Cu toate acestea, pentru aplicațiile non-Qt există câteva limitări pe care trebuie să le cunoașteți. Această soluție probabil nu funcționează împreună cu toate celelalte seturi de instrumente(toolkit).
Note, for any console application this solution of course doesn't work because there is no event loop running.
Pentru Windows funcționează atât timp cât aplicația gazdă este compatibilă și se bazează direct pe Win32 sau pe orice alt set de instrumente care utilizează intern API-ul Win32, cum ar fi wxWidgets, MFC sau WinForms. Pentru ca aceasta să funcționeze sub X11(Linux), aplicația gazdă trebuie să conecteze biblioteca "glib".


Notă, pentru orice aplicație consolă această soluție, această soluție, nu va funcționa deoarece nu este o funcționare în buclă de evenimente (event loop running) în acest sistem.
{{docnav|Scripted objects|Code snippets}}


<div class="mw-translate-fuzzy">
[[Category:Poweruser Documentation]]
=== Avertismente ===
[[Category:Python Code]]
</div>


Deși este posibil să importați FreeCAD la un interpretor extern Python, acesta este un scenariu de utilizare obișnuit și necesită o atenție deosebită. În general, este mai bine să folosiți Python inclus în FreeCAD, via o linia de comandă sau ca pe un subproces. Vedeți [[Start up and Configuration]] pentru mai multe informații asupra ultimelor două opțiuni.

Deoarece modulul FreeCAD Python este compilat din C ++ (mai degrabă decât de a fi un modul Python pur), acesta poate fi importat numai de la un interpretorul Python compatibil. În general, acest lucru înseamnă că interpretorul Python trebuie să fie compilat cu același compilator C, cum a fost cel folosit pentru a construi FreeCAD. Informații despre compilatorul folosit pentru a construi un interpretor Python (inclusiv cel construit cu FreeCAD), pot fi găsite la:
{{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)]'
}}

== Related ==

* [[Headless_FreeCAD|Headless FreeCAD]]


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

Revision as of 11:29, 13 March 2021

Introduction

FreeCAD are capacitatea uimitoare de a fi importabil ca modul python în alte programe sau într-o consolă python autonomă, împreună cu toate modulele și componentele sale. Este posibil chiar să importați interfața grafică GUI-ul FreeCAD ca modul python - cu some restrictions, dar cu anumite restricții.

Utilizarea FreeCAD fără interfață grafică/GUI

O primă aplicație directă, ușoară și utilă pe care o puteți face este importul documentelor FreeCAD în programul dvs. În următorul exemplu, vom importa geometria pieselor unui document FreeCAD în blender. Iată scenariul complet. Sper că veți fi impresionat de simplitatea sa:

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

Prima parte importantă este să vă asigurați că Python va găsi biblioteca noastră FreeCAD. Odată ce o găsește, toate modulele FreeCAD, cum ar fi Part, pe care o vom folosi, vor fi disponibile automat. Așa că luăm pur și simplu variabila sys.path, care este unde Python caută module și adăugăm calea FreCAD.Lib. Această modificare este doar temporară și se va pierde atunci când închidem interpretorul nostru python. Un alt mod ar putea fi să faceți o legătură cu biblioteca dvs. FreeCAD într-una din căile de căutare python. Am păstrat calea într-o constantă (FREECADPATH) astfel încât un alt utilizator al scriptului îi va fi mai ușor să configureze propriul sistem

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

Odată ce suntem siguri că biblioteca este încărcată (secvența try/except), acum putem lucra cu FreeCAD, la fel ca și cum am fi în interiorul interpretului Python al FreeCAD. Deschidem documentul FreeCAD care ne este transmis prin funcția principală main() și facem o listă a obiectelor sale. Apoi, pe măsură ce alegem doar să ne pese de geometria piesei, verificăm dacă proprietatea Type a fiecărui obiect conține "Part", apoi o mozaicăm (tessellation).

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

Mozaicarea (Tessellation) produce o listă de vârfuri(vertex) și o listă de fasțete definite de indici de vârfuri. Acest lucru este perfect, deoarece este exact același mod în care programul Blender definește ochiurile de plasă. Deci, sarcina noastră este ridicol de simplă, adăugăm ambele conținuturi ale listelor la vârfurile și fețetele unei rețele de tip Blender. Când totul este realizat, noi redesenăm ecranul și gata ”c'est fini” !

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

Bineînțeles, ați văzut că acest script este foarte simplu (de fapt am făcut unul mai avansat aici here),ați putea dori să-l extindeți, de exemplu importarea obiectelor de tip plasă, sau importarea ”Part Geometry” care nu are fațete sau importul altor formate de fișiere pe care FreeCAD le poate citi. De asemenea, ați putea dori să exportați forme geometrice într-un document FreeCAD, care se poate face în același mod. S-ar putea să doriți, de asemenea, să construiți un dialog, astfel încât utilizatorul să poată alege ce să importe, etc.... Frumusețea tuturor acestor lucruri constă de fapt că l-ai lăsat pe FreeCAD să efectueze în totalitate, prezentându-și în același timp rezultatele în programul pe care l-ai ales .

Note: checkout Headless FreeCAD for running FreeCAD without the GUI.

Utilizarea FreeCAD cu interfață grafică(GUI)

De la versiunea 4.2 cu Qt are capacitatea de a încorpora plugin-urile dependente de Qt-GUI în aplicații gazdă non-Qt și de a partaja bucla evenimentului gazdei.

Mai presus de toate, pentru FreeCAD, aceasta înseamnă că poate fi importat dintr-o altă aplicație cu interfața sa completă de utilizator (GUI) și în consecință aplicația gazdă controlează pe deplin FreeCAD.

Tot codul python pentru a obține aceasta are numai 2 linii

import FreeCADGui 
FreeCADGui.showMainWindow()

Dacă aplicația se bazează pe Qt, atunci aceasta soluție ar trebui să funcționeze pe toate platformele suportate de către Qt . Cu toate acestea, gazda ar trebui să conecteze aceeași versiune QT ca și FreeCAD, deoarece altfel ați putea obține erori de execuție neașteptate.

Cu toate acestea, pentru aplicațiile non-Qt există câteva limitări pe care trebuie să le cunoașteți. Această soluție probabil nu funcționează împreună cu toate celelalte seturi de instrumente(toolkit). Pentru Windows funcționează atât timp cât aplicația gazdă este compatibilă și se bazează direct pe Win32 sau pe orice alt set de instrumente care utilizează intern API-ul Win32, cum ar fi wxWidgets, MFC sau WinForms. Pentru ca aceasta să funcționeze sub X11(Linux), aplicația gazdă trebuie să conecteze biblioteca "glib".

Notă, pentru orice aplicație consolă această soluție, această soluție, nu va funcționa deoarece nu este o funcționare în buclă de evenimente (event loop running) în acest sistem.

Avertismente

Deși este posibil să importați FreeCAD la un interpretor extern Python, acesta este un scenariu de utilizare obișnuit și necesită o atenție deosebită. În general, este mai bine să folosiți Python inclus în FreeCAD, via o linia de comandă sau ca pe un subproces. Vedeți Start up and Configuration pentru mai multe informații asupra ultimelor două opțiuni.

Deoarece modulul FreeCAD Python este compilat din C ++ (mai degrabă decât de a fi un modul Python pur), acesta poate fi importat numai de la un interpretorul Python compatibil. În general, acest lucru înseamnă că interpretorul Python trebuie să fie compilat cu același compilator C, cum a fost cel folosit pentru a construi FreeCAD. Informații despre compilatorul folosit pentru a construi un interpretor Python (inclusiv cel construit cu FreeCAD), pot fi găsite la:

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

Related