Pivy/ru: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
Line 14: Line 14:
</div>
</div>


<div class="mw-translate-fuzzy">
[[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.
[[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.
</div>


<div class="mw-translate-fuzzy">
Библиотека Coin разделена на несколько частей, собственно Coin, для управления графами сцен и привязки к различным GUI системам, таким как Windows или Qt. Эти модули также доступны Pivy, если они представлены в системе. Модуль Coin всегда присутствует, и это то что мы будем использовать в любом случае, поэтому мы не должны заботится о привязках нашего трёхмерного отображения к различным интерфейсам, это уже сделано в самом FreeCAD. Все что вам нужно, так это сделать это:
Библиотека Coin разделена на несколько частей, собственно Coin, для управления графами сцен и привязки к различным GUI системам, таким как Windows или Qt. Эти модули также доступны Pivy, если они представлены в системе. Модуль Coin всегда присутствует, и это то что мы будем использовать в любом случае, поэтому мы не должны заботится о привязках нашего трёхмерного отображения к различным интерфейсам, это уже сделано в самом FreeCAD. Все что вам нужно, так это сделать это:
</div>


{{Code|code=
{{Code|code=
Line 22: Line 26:
}}
}}


<div class="mw-translate-fuzzy">
==Получение доступа и изменение древа сцен==
==Получение доступа и изменение древа сцен==
</div>


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


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


<div class="mw-translate-fuzzy">
Некоторые из этих узлов, такие как SoSeparators или SoGroups, также могут обладать потомками. Полный список доступных Сoin объектов можно найти в официальной документации Сoin.
Некоторые из этих узлов, такие как SoSeparators или SoGroups, также могут обладать потомками. Полный список доступных Сoin объектов можно найти в официальной документации Сoin.
</div>


Давайте, сейчас, попробуем добавить что-нибудь в наше древо сцены. Мы добавим милейший красный куб:
Давайте, сейчас, попробуем добавить что-нибудь в наше древо сцены. Мы добавим милейший красный куб:
Line 52: Line 62:
{{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 60: Line 70:
}}
}}


<div class="mw-translate-fuzzy">
и здесь наш(милый) красный куб. Теперь попробуем следующее:
и здесь наш(милый) красный куб. Теперь попробуем следующее:
</div>


{{Code|code=
{{Code|code=
Line 66: Line 78:
}}
}}


<div class="mw-translate-fuzzy">
Видите? все по прежнему доступно и изменяемо на лету. Не нужно что-нибудь пересчитывать или перересовывать, coin позаботится обо всем. Вы можете что-то в ваше древо сцен, изменить свойства, скрыть этот объект, показать временный объект, что угодно. Конечно это касается только отображения трехмерного вида. Это отображение получается при считывании FreeCAD-ом файла при открытии, и когда объект нужно перечитать. Так что, если вы изменили какой-нибудь аспект в существующем FreeCAD объекте,эти изменения будут потеряны, если объект перечитают, или же повторно откроют.
Видите? все по прежнему доступно и изменяемо на лету. Не нужно что-нибудь пересчитывать или перересовывать, coin позаботится обо всем. Вы можете что-то в ваше древо сцен, изменить свойства, скрыть этот объект, показать временный объект, что угодно. Конечно это касается только отображения трехмерного вида. Это отображение получается при считывании FreeCAD-ом файла при открытии, и когда объект нужно перечитать. Так что, если вы изменили какой-нибудь аспект в существующем FreeCAD объекте,эти изменения будут потеряны, если объект перечитают, или же повторно откроют.
</div>


<div class="mw-translate-fuzzy">
Ключ к работе с древом сцен в ваших сценариях, чтобы обладать доступом к определенным свойствам узлов вы добавляете то что вам нужно. Например, если нам нужно переместить наш куб, мы добавили бы узел SoTranslation в нашему обычному узлу, м выглядело бы это так:
Ключ к работе с древом сцен в ваших сценариях, чтобы обладать доступом к определенным свойствам узлов вы добавляете то что вам нужно. Например, если нам нужно переместить наш куб, мы добавили бы узел SoTranslation в нашему обычному узлу, м выглядело бы это так:
</div>


{{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 83: Line 99:
}}
}}


<div class="mw-translate-fuzzy">
Помните, что в дереве сцен openInventor, важен порядок. Узел влияет на то что будет дальше, вы можете сказать нечто вроде: цет красны, куб, цвет желтый, сфера, и вы получите красный куб и желтую сферу. Если мы добавим перемещение сейчас в нашу существующий узел, он будет стоять после куба и не будет влиять на него. Если мы вставили его до его создания, как показано выше, мы могли бы сейчас сделать:
Помните, что в дереве сцен openInventor, важен порядок. Узел влияет на то что будет дальше, вы можете сказать нечто вроде: цет красны, куб, цвет желтый, сфера, и вы получите красный куб и желтую сферу. Если мы добавим перемещение сейчас в нашу существующий узел, он будет стоять после куба и не будет влиять на него. Если мы вставили его до его создания, как показано выше, мы могли бы сейчас сделать:
</div>


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


<div class="mw-translate-fuzzy">
И наш куб прыгает на 2 единицы вправо. Наконец, удалим что-нибудь, введя:
И наш куб прыгает на 2 единицы вправо. Наконец, удалим что-нибудь, введя:
</div>


{{Code|code=
{{Code|code=
Line 95: Line 115:
}}
}}


[[#top|top]]

<div class="mw-translate-fuzzy">
==Использование обратных вызовов==
==Использование обратных вызовов==
</div>


<div class="mw-translate-fuzzy">
[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 может наблюдать за множеством различных вещей, таких как положение курсора, нажатия клавиши мыши, нажатые клавиши клавиатуры, и множество других вещей.
[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 может наблюдать за множеством различных вещей, таких как положение курсора, нажатия клавиши мыши, нажатые клавиши клавиатуры, и множество других вещей.
</div>


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|top]]


<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
Line 122: Line 154:
</div>
</div>


<div class="mw-translate-fuzzy">
К сожалению сам Pivy ещё не обладает собственной документацией. Однако, так как это оболочка библиотекиCoin, вы можете читать справку по C++. В этом случает Вам нужно лишь переводить стиль наименования классов C++ в стиль Python.
К сожалению сам Pivy ещё не обладает собственной документацией. Однако, так как это оболочка библиотекиCoin, вы можете читать справку по C++. В этом случает Вам нужно лишь переводить стиль наименования классов C++ в стиль Python.
</div>


В C++:
В C++:
Line 138: Line 172:
}}
}}


* [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://grey.colorado.edu/coin3d/index.html Coin3D Documentation], at University of Colorado.
* [https://coin3d.bitbucket.io/Coin/index.html Coin Documentation], at BitBucket
* [https://coin3d.bitbucket.io/Coin/index.html Coin3D Documentation], at BitBucket.

[[#top|top]]


<div class="mw-translate-fuzzy">
<div class="mw-translate-fuzzy">
Line 151: Line 187:


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

Revision as of 22:06, 5 June 2020

Введение

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

Некоторые из этих узлов, такие как SoSeparators или SoGroups, также могут обладать потомками. Полный список доступных С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 объекте,эти изменения будут потеряны, если объект перечитают, или же повторно откроют.

Ключ к работе с древом сцен в ваших сценариях, чтобы обладать доступом к определенным свойствам узлов вы добавляете то что вам нужно. Например, если нам нужно переместить наш куб, мы добавили бы узел 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)

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

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

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

sg.removeChild(myCustomNode)

top

Использование обратных вызовов

Функция обратного вызова это система, позволяет библиотекам которые вы используете, такой как наша библиотека 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.

top

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

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

В C++:

SoFile::getClassTypeId()

В Pivy

SoFile.getClassId()

top