Pivy/ru: Difference between revisions

From FreeCAD Documentation
(Created page with "Давайте, сейчас, попробуем добавить что-нибудь в наше древо сцены. Мы добавим милейший красный к...")
(Updating to match new version of source page)
 
(75 intermediate revisions by 6 users not shown)
Line 1: Line 1:
<languages/>
[http://pivy.coin3d.org/ Pivy] это python библаотека привязанная к [http://www.coin3d.org Coin3d], библиотеке 3D-рендеринга используемой FreeCAD-ом. Когда он импортирован, в запущенный python интерпритатор, он позволяет вести диалог напрямую с любым запущеным [[Scenegraph/ru|деревом сцен]] Coin3d, также как окна трехмерного отображения FreeCAD, или даже создавать новые. Pivy входит в стандвртную установку FreeCAD.


{{Docnav/ru
Библиотека coin разделена на несколько частей, собственно coin, для управления древами сцен и привязки к различным GUI системам, таким как windows или, в нашем случае, qt. Эти модули также доступны pivy, если они представлены в системе. Модуль coin всегда присутствует, и это то что мы будем использовать в любом случае, поэтому мы не должны хаботится о наших привзках нашего 3D отображения, к различным интерфейсам, это уже сделано в самом FreeCAD. Все что вам нужно, так это сделать ЭТО:
|[[Scenegraph/ru|Граф сцены]]
<syntaxhighlight>
|[[PySide/ru|PySide]]
from pivy import coin
}}
</syntaxhighlight>
==Получение доступа и изменение древа сцен==


{{TOCright}}
Мы говорили на странице [[Scenegraph/ru|Scenegraph]] как организована типичная Coin сцена. Все что добавляется в окно трехмерного отображения FreeCAD , coin scenegraph, организует схожим образом. у нас есть один корневой узел, и все объекты на экране его потомки.

==Введение==

<div class="mw-translate-fuzzy">
[[Pivy/ru|Pivy]] - это библиотека привязок [[Python/ru|Python]] для [https://github.com/coin3d Coin3D], библиотеки 3D-рендеринга, используемой в FreeCAD для отображения вещей в [[3D_view/ru|трёхмерный вид]]. При импорте в работающий интерпретатор Python Pivy позволяет напрямую взаимодействовать с любым работающим [[Scenegraph/ru|графом сцен]] Coin, таким, как [[3D_view/ru|трёхмерный вид]] FreeCAD, или даже создавать новые. Pivy не требуется для компиляции FreeCAD, но требуется во время выполнения при запуске основанных на Python верстаков, которые создают фигуры на экране, такие как [[Draft_Workbench/ru|Draft]] и [[Arch_Workbench/ru|Arch]]. Из-за этого Pivy обычно устанавливается при установке дистрибутива FreeCAD.
</div>

When imported in a running Python interpreter, Pivy allows us to communicate directly with any running Coin [[Scenegraph|scenegraph]], such as the [[3D_view|3D view]], or even to create new ones. Pivy is not required to compile FreeCAD, but it is required at runtime when running Python-based workbenches that create shapes on screen, like [[Draft_Workbench|Draft]] and [[Arch_Workbench|Arch]]. Because of this, Pivy is normally installed when installing a distribution of FreeCAD.

Библиотека Coin разделена на несколько частей, собственно Coin, для управления графами сцен и привязки к различным GUI системам, таким как Windows или Qt. Если эти модули присутствуют в системе, они также доступны для Pivy. Модуль Coin всегда присутствует, и это то что мы будем использовать в любом случае, поэтому мы не должны заботится о привязках нашего трёхмерного отображения к различным интерфейсам, что уже сделано в FreeCAD. Все что вам нужно, так это сделать это:

{{Code|code=
from pivy import coin
}}

==Древо сцены==

Мы видели на странице [[Scenegraph/ru|Scenegraph]], как организована типичная сцена Coin. Все что появляется в [[3D_view|трехмерный вид]] - это граф сцен Coin, организованный так же. У нас есть один корневой узел, и все объекты на экране его потомки.


FreeCAD обладает простым способом получит доступ к корневому узлу(вершине) древа сцена 3D вида:
FreeCAD обладает простым способом получит доступ к корневому узлу(вершине) древа сцена 3D вида:

<syntaxhighlight>
{{Code|code=
sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
print sg
print(sg)
</syntaxhighlight>
}}

Это вернет корневой узел:
Это вернет корневой узел:

<syntaxhighlight>
{{Code|code=
<pivy.coin.SoSelection; proxy of <Swig Object of type 'SoSelection *' at 0x360cb60> >
<pivy.coin.SoSelection; proxy of <Swig Object of type 'SoSelection *' at 0x360cb60> >
</syntaxhighlight>
}}

Мы сразу же можем просмотреть потомков, нашей сцены:
Мы сразу же можем просмотреть потомков, нашей сцены:

<syntaxhighlight>
{{Code|code=
for node in sg.getChildren():
for node in sg.getChildren():
print node
print(node)
</syntaxhighlight>
}}
Некоторые из этих узлов, такие как SoSeparators или SoGroups, также могут обладать потомками. Полный список доступных coin объектов можно найти в [http://doc.coin3d.org/Coin/classes.html оффициальной документаци coin].

Некоторые из этих узлов, такие как ноды {{incode|SoSeparator}} или {{incode|SoGroup}}, также могут обладать потомками. Полный список доступных объектов Сoin можно найти в официальной документации Сoin.


Давайте, сейчас, попробуем добавить что-нибудь в наше древо сцены. Мы добавим милейший красный куб:
Давайте, сейчас, попробуем добавить что-нибудь в наше древо сцены. Мы добавим милейший красный куб:
<syntaxhighlight>
col = coin.SoBaseColor()
col.rgb=(1,0,0)
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)
</syntaxhighlight>
and here is our (nice) red cube. Now, let's try this:
<syntaxhighlight>
col.rgb=(1,1,0)
</syntaxhighlight>
See? everything is still accessible and modifiable on-the-fly. No need to recompute or redraw anything, coin takes care of everything. You can add stuff to your scenegraph, change properties, hide stuff, show temporary objects, anything. Of course, this only concerns the display in the 3D view. That display gets recomputed by FreeCAD on file open, and when an object needs recomputing. So, if you change the aspect of an existing FreeCAD object, those changes will be lost if the object gets recomputed or when you reopen the file.


{{Code|code=
A key to work with scenegraphs in your scripts is to be able to access certain properties of the nodes you added when needed. For example, if we wanted to move our cube, we would have added a SoTranslation node to our custom node, and it would have looked like this:
col = coin.SoBaseColor()
<syntaxhighlight>
col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
cub = coin.SoCube()
col.rgb=(1,0,0)
trans = coin.SoTranslation()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
trans.translation.setValue([0,0,0])
myCustomNode.addChild(cub)
cub = coin.SoCube()
sg.addChild(myCustomNode)
myCustomNode = coin.SoSeparator()
}}
myCustomNode.addChild(col)
mtCustomNode.addChild(trans)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)
</syntaxhighlight>
Remember that in an openInventor scenegraph, the order is important. A node affects what comes next, so you can say something like: color red, cube, color yellow, sphere, and you will get a red cube and a yellow sphere. If we added the translation now to our existing custom node, it would come after the cube, and not affect it. If we had inserted it when creating it, like here above, we could now do:
<syntaxhighlight>
trans.translation.setValue([2,0,0])
</syntaxhighlight>
And our cube would jump 2 units to the right.
Finally, removing something is done with:
<syntaxhighlight>
sg.removeChild(myCustomNode)
</syntaxhighlight>
==Using callback mechanisms==


Теперь попробуем следующее:
A [http://en.wikipedia.org/wiki/Callback_%28computer_science%29 callback mechanism] is a system that permits a library that you are using, such as our coin library, to call you back, that is, to call a certain function from your currently running python object. This is extremely useful, because that way coin can notify you if some specific event occurs in the scene. Coin can watch very different things, such as mouse position, clicks of a mouse button, keyboard keys being pressed, and many other things.


{{Code|code=
FreeCAD features an easy way to use such callbacks:
col.rgb = (1, 1, 0)
<syntaxhighlight>
}}
class ButtonTest:
def __init__(self):
self.view = FreeCADGui.ActiveDocument.ActiveView
self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getMouseClick)
def getMouseClick(self,event_cb):
event = event_cb.getEvent()
if event.getState() == SoMouseButtonEvent.DOWN:
print "Alert!!! A mouse button has been improperly clicked!!!"
self.view.removeEventCallbackSWIG(SoMouseButtonEvent.getClassTypeId(),self.callback)
ButtonTest()
</syntaxhighlight>
The callback has to be initiated from an object, because that object must still be running when the callback will occur.
See also a [[Code_snippets#Observing_mouse_events_in_the_3D_viewer_via_Python|complete list]] of possible events and their parameters, or the [http://doc.coin3d.org/Coin/classes.html official coin documentation].


Как видите, все по прежнему доступно и изменяемо на лету. Не нужно что-нибудь пересчитывать или перересовывать, Coin позаботится обо всем. Вы можете что-то в ваше древо сцен, изменить свойства, скрыть этот объект, показать временный объект, что угодно. Конечно это касается только отображения трехмерного вида. Это отображение получается при считывании FreeCAD-ом файла при открытии, и когда объект нужно перечитать. Так что, если вы изменили какой-нибудь аспект в существующем FreeCAD объекте,эти изменения будут потеряны, если объект перечитают, или же повторно откроют.
== Documentation ==


Как уже упоминалось, в графе сцен openInventor важен порядок. Каждый узел влияет на то, что будет дальше. Например, если мы хотим иметь возможность переместить наш куб, нам нужно добавить узел {{incode|SoTranslation}} {{Emphasis|перед}} кубом:
Unfortunately pivy itself still doesn't have a proper documentation, but since it is an accurate translation of coin, you can safely use the coin documentation as reference, and use python style instead of c++ style (for example SoFile::getClassTypeId() would in pivy be SoFile.getClassId())


{{Code|code=
{{docnav|Scenegraph|PyQt}}
col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
trans = coin.SoTranslation()
trans.translation.setValue([0, 0, 0])
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(trans)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)
}}


Чтобы переместить наш куб, мы можем теперь сделать:
[[Category:Poweruser Documentation]]


{{Code|code=
{{clear}}
trans.translation.setValue([2, 0, 0])
<languages/>
}}

Наконец удалим что-нибудь, введя:

{{Code|code=
sg.removeChild(myCustomNode)
}}
{{Top}}
==Обратные вызовы==

[http://ru.wikipedia.org/wiki/Callback_(программирование) Функция обратного вызова] это система, позволяет библиотекам вроде нашей библиотеки Coin , возвращать вызов, то есть возможность вызова определенных функций с вашего запущенного объекта Python. Таким образом Coin может сообщить вам, что на сцене произошло конкретное событие. Coin может наблюдать за множеством различных вещей, таких как положение курсора, нажатия клавиши мыши, нажатые клавиши клавиатуры, и многое другое.

FreeCAD способен легко использовать такие функции обратного вызова:

{{Code|code=
from pivy import coin

class ButtonTest:
def __init__(self):
self.view = FreeCADGui.ActiveDocument.ActiveView
self.callback = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.getMouseClick)

def getMouseClick(self, event_cb):
event = event_cb.getEvent()
if event.getState() == coin.SoMouseButtonEvent.DOWN:
print("Alert!!! A mouse button has been improperly clicked!!!")
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callback)

ButtonTest()
}}

<div class="mw-translate-fuzzy">
Функция обратного вызова, должна быть инициализирована объектом, потому что объект должен по прежнему работать, когда случатся обратные вызовы. Смотри также [[Code_snippets#Observing_mouse_events_in_the_3D_viewer_via_Python|полный список]] возможных событий и их параметров, или официальную документацию Coin.
</div>
{{Top}}
==Документация==

К сожалению, Pivy не обладает собственной документацией. Однако, так как это оболочка библиотекиCoin, вы можете читать справку по C++. В этом случает Вам нужно лишь переводить стиль наименования классов C++ в стиль Python.

В C++:

{{Code|code=
SoFile::getClassTypeId()
}}

В Pivy:

{{Code|code=
SoFile.getClassId()
}}

* [https://github.com/coin3d Coin3D] homepage.
* [https://github.com/coin3d/pivy Pivy] homepage.
* [https://github.com/coin3d/coin/wiki Coin3D wiki], at GitHub.
* [https://github.com/coin3d/coin/wiki/Documentation Coin3D wiki documentation], at GitHub.
* [https://coin3d.github.io/Coin/html/ Coin3D Documentation], latest automatically generated Doxygen documentation.
* [https://webdocs.cs.ualberta.ca/~graphics/books/mentor.pdf (Open)Inventor Mentor] - recommended.

=== Older ===

These links provide reference documentation for Coin v3.x. The differences with v4.x are minimal, so they may still be useful.

* [https://coin3d.bitbucket.io/Coin/index.html Coin3D Documentation], at BitBucket.
* [https://grey.colorado.edu/coin3d/index.html Coin3D Documentation], at University of Colorado.
* [https://mevislabdownloads.mevis.de/docs/current/MeVis/ThirdParty/Documentation/Publish/OpenInventorReference/index.html Open Inventor Reference Documentation], by MeVisLab.
{{Top}}

{{Docnav/ru
|[[Scenegraph/ru|Граф сцены]]
|[[PySide/ru|PySide]]
}}

{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]
[[Category:Python Code{{#translation:}}]]

Latest revision as of 09:10, 30 December 2022

Введение

Pivy - это библиотека привязок Python для Coin3D, библиотеки 3D-рендеринга, используемой в FreeCAD для отображения вещей в трёхмерный вид. При импорте в работающий интерпретатор Python Pivy позволяет напрямую взаимодействовать с любым работающим графом сцен Coin, таким, как трёхмерный вид FreeCAD, или даже создавать новые. Pivy не требуется для компиляции FreeCAD, но требуется во время выполнения при запуске основанных на Python верстаков, которые создают фигуры на экране, такие как Draft и Arch. Из-за этого Pivy обычно устанавливается при установке дистрибутива FreeCAD.

When imported in a running Python interpreter, Pivy allows us to communicate directly with any running Coin scenegraph, such as the 3D view, or even to create new ones. Pivy is not required to compile FreeCAD, but it is required at runtime when running Python-based workbenches that create shapes on screen, like Draft and Arch. Because of this, Pivy is normally installed when installing a distribution of FreeCAD.

Библиотека Coin разделена на несколько частей, собственно Coin, для управления графами сцен и привязки к различным GUI системам, таким как Windows или Qt. Если эти модули присутствуют в системе, они также доступны для Pivy. Модуль Coin всегда присутствует, и это то что мы будем использовать в любом случае, поэтому мы не должны заботится о привязках нашего трёхмерного отображения к различным интерфейсам, что уже сделано в FreeCAD. Все что вам нужно, так это сделать это:

from pivy import coin

Древо сцены

Мы видели на странице Scenegraph, как организована типичная сцена Coin. Все что появляется в трехмерный вид - это граф сцен Coin, организованный так же. У нас есть один корневой узел, и все объекты на экране его потомки.

FreeCAD обладает простым способом получит доступ к корневому узлу(вершине) древа сцена 3D вида:

sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
print(sg)

Это вернет корневой узел:

<pivy.coin.SoSelection; proxy of <Swig Object of type 'SoSelection *' at 0x360cb60> >

Мы сразу же можем просмотреть потомков, нашей сцены:

for node in sg.getChildren():
    print(node)

Некоторые из этих узлов, такие как ноды SoSeparator или SoGroup, также могут обладать потомками. Полный список доступных объектов Сoin можно найти в официальной документации Сoin.

Давайте, сейчас, попробуем добавить что-нибудь в наше древо сцены. Мы добавим милейший красный куб:

col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)

Теперь попробуем следующее:

col.rgb = (1, 1, 0)

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

Как уже упоминалось, в графе сцен openInventor важен порядок. Каждый узел влияет на то, что будет дальше. Например, если мы хотим иметь возможность переместить наш куб, нам нужно добавить узел SoTranslation перед кубом:

col = coin.SoBaseColor()
col.rgb = (1, 0, 0)
trans = coin.SoTranslation()
trans.translation.setValue([0, 0, 0])
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(trans)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)

Чтобы переместить наш куб, мы можем теперь сделать:

trans.translation.setValue([2, 0, 0])

Наконец удалим что-нибудь, введя:

sg.removeChild(myCustomNode)

наверх

Обратные вызовы

Функция обратного вызова это система, позволяет библиотекам вроде нашей библиотеки Coin , возвращать вызов, то есть возможность вызова определенных функций с вашего запущенного объекта Python. Таким образом Coin может сообщить вам, что на сцене произошло конкретное событие. Coin может наблюдать за множеством различных вещей, таких как положение курсора, нажатия клавиши мыши, нажатые клавиши клавиатуры, и многое другое.

FreeCAD способен легко использовать такие функции обратного вызова:

from pivy import coin

class ButtonTest:
    def __init__(self):
        self.view = FreeCADGui.ActiveDocument.ActiveView
        self.callback = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.getMouseClick) 

    def getMouseClick(self, event_cb):
        event = event_cb.getEvent()
        if event.getState() == coin.SoMouseButtonEvent.DOWN:
            print("Alert!!! A mouse button has been improperly clicked!!!")
            self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callback)

ButtonTest()

Функция обратного вызова, должна быть инициализирована объектом, потому что объект должен по прежнему работать, когда случатся обратные вызовы. Смотри также полный список возможных событий и их параметров, или официальную документацию Coin.

наверх

Документация

К сожалению, Pivy не обладает собственной документацией. Однако, так как это оболочка библиотекиCoin, вы можете читать справку по C++. В этом случает Вам нужно лишь переводить стиль наименования классов C++ в стиль Python.

В C++:

SoFile::getClassTypeId()

В Pivy:

SoFile.getClassId()

Older

These links provide reference documentation for Coin v3.x. The differences with v4.x are minimal, so they may still be useful.

наверх