Embedding FreeCAD/ru: Difference between revisions

From FreeCAD Documentation
(Created page with "Сперва, вожно убедится что python найдет ваши FreeCAD библиотеки. как только он их найдет, все модули Fre...")
No edit summary
(33 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<languages/>
FreeCAD обладает удивительной способность , импортироваться как python модуль в другие программы или в автономную python консоль, вместе со всеми модулями и компонентами. Можно даже импортировать FreeCAD GUI как python модуль --однако, с некоторыми ограничениями.

{{Docnav
|[[Scripted_objects|Scripted objects]]
|[[Code_snippets|Code snippets]]
}}

{{TOCright}}

== Introduction ==

FreeCAD может импортироваться как модуль [[Python/ru|Python]] в другие программы или в автономную консоль python, вместе со всеми модулями и компонентами. Можно даже импортировать пользовательский интерфейс FreeCAD как модуль python, но с [[Embedding_FreeCAD/ru#Caveats|некоторыми ограничениями]].


=== Использование FreeCAD без GUI ===
== Использование FreeCAD без GUI ==


Одно из первых, простых, прямой и полезных приложений , вы можете создать чтобы импортировать FreeCAD документы в ващу программу. В следующем примере, мы импортируем Part геометрию FreeCAD документа в [http://www.blender.org blender]. Это готовый сценарий. Я надеюсь вы будете поражены его простотой:<syntaxhighlight>
Одно из первых, простых, прямой и полезных приложений , вы можете создать чтобы импортировать FreeCAD документы в ващу программу. В следующем примере, мы импортируем Part геометрию FreeCAD документа в [http://www.blender.org blender]. Это готовый сценарий. Я надеюсь вы будете поражены его простотой:
{{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>Сперва, вожно убедится что python найдет ваши FreeCAD библиотеки. как только он их найдет, все модули FreeCAD такие как Part, которые мы также будем использовать, будут доступны автоматически. Так что мы просто берес значение переменной sys.path, где описано где python ищет модули, и мы добавляем буть к библиотекам FreeCAD. Это изменение носит временный характер, и будет потеряно когдв мы закроем наш python интепритатор. Другой способ которым вы можете создать ссылку на вашу FreeCAD библиотеку в одном посковых путей python. Я держал путь в константе (FREECADPATH) так что бы было легче другому пользователю сценария настроить его под свою систему.
}}


Сперва, вожно убедится что python найдет ваши FreeCAD библиотеки. как только он их найдет, все модули FreeCAD такие как Part, которые мы также будем использовать, будут доступны автоматически. Так что мы просто берес значение переменной sys.path, где описано где python ищет модули, и мы добавляем буть к библиотекам FreeCAD. Это изменение носит временный характер, и будет потеряно когдв мы закроем наш python интепритатор. Другой способ которым вы можете создать ссылку на вашу FreeCAD библиотеку в одном посковых путей python. Я держал путь в константе (FREECADPATH) так что бы было легче другому пользователю сценария настроить его под свою систему.
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.


После того как мы проверили что библиотеки загружены (повторите/исключите последовательность), теперь мы можем работать с FreeCAD, так же как если бы мы были внутри FreeCADовского python интерпритатора. Мы открываем FreeCAD документ который передается нам с помощью функции main() , и мы создаем список список своих объектов. Затем, так как мы решаем заботиться только о геометрии детали «Part», мы проверяем, содержит ли свойство Type каждого объекта «Part», и затем тесселяем ее.
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!


Трансляция(tesselation- преобразование в сетку) произвела список вершин и список граней, заданных индексами вершин.Это идеальный вариант, так как он точно аналогично блендеру задает сетки. Таким образом, наша задача до смешного проста, мы просто добавим оба списка содержащих вершины и грани в блендере сетку. Когда все будет сделано, мы просто перерисуем экран, и вот оно!
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.


Конечно этот сценарий очень прост (в действительности я создал более продвинутый [http://yorik.orgfree.com/scripts/import_freecad.py здесь]), вы можете продолжить его, например импортирвав также полигиональные объекты, или импортировав Part геометрию которая не обладает гранями, или импортировав другие файловые форматы которые может читать FreeCAD. Вы также можете экспортировать геометрию в FreeCAD документ, что можно сделать схожим образом. Вы также можете создать диолог, где пользователь может выбрать что импортировать и.т.д... Красота всего этого заключается в том, что вы позволяете FreeCAD делать фоновую работу вто время как его результаты представляются в программе по вашему выбору.
=== Using FreeCAD with GUI ===


== Использование FreeCAD с 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.


Начиная с версии 4.2, Qt обладает интегрирующей способностью встраивать Qt-GUI-зависящие плагины в не-Qt главные приложения и распространять как привязки к главному приложению.
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.


В особенности, для FreeCAD это означает что он может быть импортирован из другого приложения со всем его интерфейсом где головное приложение имеет полный контроль над 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.


Весь python код , для достижения этого, укладывается всего в две строчки
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()
}}


Если головное приложение основывается на Qt, то это решение должно работать на всех платформах поддерживаемых Qt. Однако, головное приложение должно ссылаться на туже версию Qt что и FreeCAD потому что иначе мы може столкнуться с неожиданными ошибками во время выполнения.
{{docnav|Scripted objects|Code snippets}}


Однако,Для не-Qt преложений, имеется несколько ограничений , вы должны знать об этом. Это решение , вероятно не сработает вместе с остальными инструментальными средствами.
[[Category:Poweruser Documentation]]
Для Windows это работает до тех пор пока головное приложение напрямую основано на Win32 или любом другом инструментальном средстве который внутренне использует Win32 API такие как wxWidgets, MFC или WinForms. Для того чтобы заставить его работать под X11, головное предложение необходимо связать с библиотекой "glib".
[[Category:Python Code]]


Обратите внимание, для любого консольного приложения это решение, конечно, не работает, потому что не существует запущенного цикла обработки событий.

== Caveats ==

Although it is possible to import FreeCAD to an external Python interpreter, this is not a common usage scenario and requires some care. Generally, it is better to use the Python included with FreeCAD, run FreeCAD via command line, or as a subprocess. See [[Start up and Configuration]] for more on the last two options.

Since the FreeCAD Python module is compiled from C++ (rather than being a pure Python module), it can only be imported from a compatible Python interpreter. Generally this means that the Python interpreter must be compiled with the same C compiler as was used to build FreeCAD. Information about the compiler used to build a Python interpreter (including the one built with FreeCAD) can be found as follows:
{{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/ru
|[[Scripted_objects/ru|Скриптовые объекты]]
|[[Code_snippets/ru|Фрагменты кода]]
}}

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

Revision as of 18:34, 14 June 2020

Introduction

FreeCAD может импортироваться как модуль Python в другие программы или в автономную консоль python, вместе со всеми модулями и компонентами. Можно даже импортировать пользовательский интерфейс FreeCAD как модуль python, но с некоторыми ограничениями.

Использование FreeCAD без GUI

Одно из первых, простых, прямой и полезных приложений , вы можете создать чтобы импортировать FreeCAD документы в ващу программу. В следующем примере, мы импортируем Part геометрию FreeCAD документа в blender. Это готовый сценарий. Я надеюсь вы будете поражены его простотой:

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

Сперва, вожно убедится что python найдет ваши FreeCAD библиотеки. как только он их найдет, все модули FreeCAD такие как Part, которые мы также будем использовать, будут доступны автоматически. Так что мы просто берес значение переменной sys.path, где описано где python ищет модули, и мы добавляем буть к библиотекам FreeCAD. Это изменение носит временный характер, и будет потеряно когдв мы закроем наш python интепритатор. Другой способ которым вы можете создать ссылку на вашу FreeCAD библиотеку в одном посковых путей python. Я держал путь в константе (FREECADPATH) так что бы было легче другому пользователю сценария настроить его под свою систему.

После того как мы проверили что библиотеки загружены (повторите/исключите последовательность), теперь мы можем работать с FreeCAD, так же как если бы мы были внутри FreeCADовского python интерпритатора. Мы открываем FreeCAD документ который передается нам с помощью функции main() , и мы создаем список список своих объектов. Затем, так как мы решаем заботиться только о геометрии детали «Part», мы проверяем, содержит ли свойство Type каждого объекта «Part», и затем тесселяем ее.

Трансляция(tesselation- преобразование в сетку) произвела список вершин и список граней, заданных индексами вершин.Это идеальный вариант, так как он точно аналогично блендеру задает сетки. Таким образом, наша задача до смешного проста, мы просто добавим оба списка содержащих вершины и грани в блендере сетку. Когда все будет сделано, мы просто перерисуем экран, и вот оно!

Конечно этот сценарий очень прост (в действительности я создал более продвинутый здесь), вы можете продолжить его, например импортирвав также полигиональные объекты, или импортировав Part геометрию которая не обладает гранями, или импортировав другие файловые форматы которые может читать FreeCAD. Вы также можете экспортировать геометрию в FreeCAD документ, что можно сделать схожим образом. Вы также можете создать диолог, где пользователь может выбрать что импортировать и.т.д... Красота всего этого заключается в том, что вы позволяете FreeCAD делать фоновую работу вто время как его результаты представляются в программе по вашему выбору.

Использование FreeCAD с GUI

Начиная с версии 4.2, Qt обладает интегрирующей способностью встраивать Qt-GUI-зависящие плагины в не-Qt главные приложения и распространять как привязки к главному приложению.

В особенности, для FreeCAD это означает что он может быть импортирован из другого приложения со всем его интерфейсом где головное приложение имеет полный контроль над FreeCAD, тогда.

Весь python код , для достижения этого, укладывается всего в две строчки

import FreeCADGui 
FreeCADGui.showMainWindow()

Если головное приложение основывается на Qt, то это решение должно работать на всех платформах поддерживаемых Qt. Однако, головное приложение должно ссылаться на туже версию Qt что и FreeCAD потому что иначе мы може столкнуться с неожиданными ошибками во время выполнения.

Однако,Для не-Qt преложений, имеется несколько ограничений , вы должны знать об этом. Это решение , вероятно не сработает вместе с остальными инструментальными средствами. Для Windows это работает до тех пор пока головное приложение напрямую основано на Win32 или любом другом инструментальном средстве который внутренне использует Win32 API такие как wxWidgets, MFC или WinForms. Для того чтобы заставить его работать под X11, головное предложение необходимо связать с библиотекой "glib".

Обратите внимание, для любого консольного приложения это решение, конечно, не работает, потому что не существует запущенного цикла обработки событий.

Caveats

Although it is possible to import FreeCAD to an external Python interpreter, this is not a common usage scenario and requires some care. Generally, it is better to use the Python included with FreeCAD, run FreeCAD via command line, or as a subprocess. See Start up and Configuration for more on the last two options.

Since the FreeCAD Python module is compiled from C++ (rather than being a pure Python module), it can only be imported from a compatible Python interpreter. Generally this means that the Python interpreter must be compiled with the same C compiler as was used to build FreeCAD. Information about the compiler used to build a Python interpreter (including the one built with FreeCAD) can be found as follows:

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