Pivy/ru: Difference between revisions

From FreeCAD Documentation
No edit summary
(Updating to match new version of source page)
 
(34 intermediate revisions by 4 users not shown)
Line 1: Line 1:
<languages/>
<languages/>

<div class="mw-translate-fuzzy">
{{docnav/ru
{{Docnav/ru
|[[Scenegraph/ru|Scenegraph]]
|[[Scenegraph/ru|Граф сцены]]
|[[PySide/ru|PySide]]
|[[PySide/ru|PySide]]
}}
}}

{{TOCright}}

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

<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>
</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. Все что вам нужно, так это сделать это:
[[Pivy/ru|Pivy]] - это библиотека привязок [[Python/ru|Python]] для [https://github.com/coin3d Coin], библиотеки 3D-рендеринга, используемой в FreeCAD для отображения вещей в [[3D_view/ru|трёхмерный вид]]. При импорте в работающий интерпретатор Python Pivy позволяет напрямую взаимодействовать с любым работающим [[Scenegraph/ru|графом сцен]] Coin, таким, как [[3D_view/ru|трёхмерный вид]] FreeCAD, или даже создавать новые. Pivy не требуется для компиляции FreeCAD, но требуется во время выполнения при запуске основанных на Python верстаков, которые создают фигуры на экране, такие как [[Draft_Module/ru|Draft]] и [[Arch_Module/ru|Arch]]. Из-за этого Pivy обычно устанавливается при установке дистрибутива FreeCAD.


Библиотека Coin разделена на несколько частей, собственно Coin, для управления графами сцен и привязки к различным GUI системам, таким как Windows или Qt. Эти модули также доступны Pivy, если они представлены в системе. Модуль Coin всегда присутствует, и это то что мы будем использовать в любом случае, поэтому мы не должны заботится о привязках нашего трёхмерного отображения к различным интерфейсам, это уже сделано в самом FreeCAD. Все что вам нужно, так это сделать это:
{{Code|code=
{{Code|code=
from pivy import coin
from pivy import coin
}}
}}


==Древо сцены==
==Получение доступа и изменение древа сцен==


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


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

{{Code|code=
{{Code|code=
sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
Line 27: Line 34:


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

{{Code|code=
{{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> >
Line 32: Line 40:


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

{{Code|code=
{{Code|code=
for node in sg.getChildren():
for node in sg.getChildren():
Line 37: Line 46:
}}
}}


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


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

{{Code|code=
{{Code|code=
col = coin.SoBaseColor()
col = coin.SoBaseColor()
col.rgb = (1,0,0)
col.rgb = (1, 0, 0)
cub = coin.SoCube()
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode = coin.SoSeparator()
Line 50: Line 60:
}}
}}


и здесь наш(милый) красный куб. Теперь попробуем следующее:
Теперь попробуем следующее:

{{Code|code=
{{Code|code=
col.rgb = (1, 1, 0)
col.rgb = (1, 1, 0)
}}
}}


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

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


Ключ к работе с древом сцен в ваших сценариях, чтобы обладать доступом к определенным свойствам узлов вы добавляете то что вам нужно. Например, если нам нужно переместить наш куб, мы добавили бы узел SoTranslation в нашему обычному узлу, м выглядело бы это так:
{{Code|code=
{{Code|code=
col = coin.SoBaseColor()
col = coin.SoBaseColor()
col.rgb=(1,0,0)
col.rgb = (1, 0, 0)
trans = coin.SoTranslation()
trans = coin.SoTranslation()
trans.translation.setValue([0,0,0])
trans.translation.setValue([0, 0, 0])
cub = coin.SoCube()
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode = coin.SoSeparator()
Line 71: Line 83:
}}
}}


Чтобы переместить наш куб, мы можем теперь сделать:
Помните, что в дереве сцен openInventor, важен порядок. Узел влияет на то что будет дальше, вы можете сказать нечто вроде: цет красны, куб, цвет желтый, сфера, и вы получите красный куб и желтую сферу. Если мы добавим перемещение сейчас в нашу существующий узел, он будет стоять после куба и не будет влиять на него. Если мы вставили его до его создания, как показано выше, мы могли бы сейчас сделать:

{{Code|code=
{{Code|code=
trans.translation.setValue([2,0,0])
trans.translation.setValue([2, 0, 0])
}}
}}


И наш куб прыгает на 2 единицы вправо. Наконец, удалим что-нибудь, введя:
Наконец удалим что-нибудь, введя:

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


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

[http://ru.wikipedia.org/wiki/Callback_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%29 Функция обратного вызова] это система, позволяет библиотекам которые вы используете, такой как наша библиотека coin , возвращать вызов, это означает, возможность вызова определенных функций с вашего запущенного python объекта. Это очень полезно, потому что это способ которыйм coin может сообщить вам , о конкретных событиях происходящих на сцене. Coin может наблюдать за множеством различных вещей, таких как положение курсора, нажатия клавиши мыши, нажатые клавиши клавиатуры, и множество других вещей.


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

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

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


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

ButtonTest()
ButtonTest()
}}
}}


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


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

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


В C++:
В C++:

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

В Pivy
В Pivy:

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


* [https://github.com/coin3d Coin3d] homepage
* [https://github.com/coin3d Coin3D] homepage.
* [https://github.com/coin3d/pivy Pivy] homepage
* [https://github.com/coin3d/pivy Pivy] homepage.
* [https://grey.colorado.edu/coin3d/index.html Coin Documentation], at University of Colorado
* [https://github.com/coin3d/coin/wiki Coin3D wiki], at GitHub.
* [https://coin3d.bitbucket.io/Coin/index.html Coin Documentation], at BitBucket
* [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
{{Docnav/ru
|[[Scenegraph/ru|Scenegraph]]
|[[Scenegraph/ru|Граф сцены]]
|[[PySide/ru|PySide]]
|[[PySide/ru|PySide]]
}}
}}


{{Powerdocnavi{{#translation:}}}}
{{Powerdocnavi{{#translation:}}}}
[[Category:Developer Documentation{{#translation:}}]]
{{clear}}
[[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.

наверх