Pivy/pl: Difference between revisions

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


{{Docnav
{{Docnav/pl
|[[Scenegraph|Scenegraph]]
|[[Scenegraph/pl|Scenogram]]
|[[PySide|PySide]]
|[[PySide/pl|PySide]]
}}
}}


{{TOCright}}
{{TOCright}}


==Introduction==
==Wprowadzenie==


[[Pivy/pl|Pivy]] jest biblioteką wiążącą [[Python/pl|Python]] do [https://github.com/coin3d Coin], biblioteką renderowania 3D używaną w FreeCAD do wyświetlania obiektów w oknie [[3D_view/pl|widoku 3D]]. Coin jest otwartą implementacją specyfikacji "Open Inventor" do obsługi grafiki. Dlatego w środowisku FreeCAD terminy ''Pivy'', ''Coin'' lub ''Open Inventor'' odnoszą się zasadniczo do tego samego.
[[Pivy|Pivy]] is a [[Python|Python]] binding library for [https://github.com/coin3d Coin], the 3D-rendering library used in FreeCAD to display things in the [[3D_view|3D view]]. When imported in a running Python interpreter, Pivy allows us to communicate directly with any running Coin [[Scenegraph|scenegraph]], such as the FreeCAD [[3D_view|3D views]], 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 creates shapes on screen, like [[Draft_Module|Draft]] and [[Arch_Module|Arch]]. Because of this, Pivy is normally installed when installing a distribution of FreeCAD.


Po zaimportowaniu do działającego interpretera Python, Pivy pozwala nam na bezpośrednią komunikację z dowolnym działającym [[Scenegraph/pl|scenegrafem]] Coin, takim jak [[3D_view/pl|widok 3D]], a nawet na tworzenie nowych. Pivy nie jest wymagany do kompilacji FreeCAD, ale jest wymagany podczas uruchamiania opartych na Pythonie środowisk pracy, które tworzą kształty na ekranie, takich jak [[Draft_Workbench/pl|Rysunek Roboczy]] i [[Arch_Workbench/pl|Architektura]]. Z tego powodu, Pivy jest zwykle instalowany podczas instalacji programu FreeCAD.
The Coin library is divided into several pieces, Coin itself for manipulating scenegraphs, and bindings for several GUI systems, such as Windows or Qt. Those modules are available to Pivy too, depending if they are present on the system. The Coin module is always present, and it is what we will use anyway, since we won't need to care about anchoring our 3D display in any interface, it is already done by FreeCAD itself. All we need to do is this:

Biblioteka Coin jest podzielona na kilka części, sam Coin do manipulowania scenegrafami oraz wiązania dla kilku systemów GUI, takich jak Windows i Qt. Jeśli są obecne w systemie, moduły te są również dostępne dla Pivy. Moduł Coin jest zawsze obecny i to właśnie z niego będziemy korzystać, ponieważ nie będziemy musieli dbać o zakotwiczenie naszego wyświetlacza 3D w jakimkolwiek interfejsie, to już robi FreeCAD. Jedyne co musimy zrobić to:


{{Code|code=
{{Code|code=
Line 18: Line 20:
}}
}}


==Scenograf==
==Accessing and modifying the scenegraph==


Na stronie [[Scenegraph/pl|Scenogram]] zobaczyliśmy, jak zorganizowana jest typowa scena Coin. Wszystko, co pojawia się w oknie [[3D_view/pl|widoku 3D]] jest scenegrafem Coin, zorganizowanym w ten sam sposób. Mamy jeden węzeł główny, a wszystkie obiekty na ekranie są jego produktami pochodnymi.
We saw in the [[Scenegraph]] page how a typical Coin scene is organized. Everything that appears in a [[3D_view|3D view]] is a coin scenegraph, organized the same way. We have one root node, and all objects on the screen are its children.


FreeCAD posiada łatwy sposób dostępu do węzła głównego scenegrafu widoku 3D:
FreeCAD has an easy way to access the root node of a 3D view scenegraph:


{{Code|code=
{{Code|code=
Line 29: Line 31:
}}
}}


Spowoduje to zwrócenie węzła głównego:
This will return the root node:


{{Code|code=
{{Code|code=
Line 35: Line 37:
}}
}}


Możemy skontrolować bezpośrednie obiekty pochodne naszej sceny:
We can inspect the immediate children of our scene:


{{Code|code=
{{Code|code=
Line 42: Line 44:
}}
}}


Niektóre z tych węzłów, takie jak {{incode|SoSeparator}} czy {{incode|SoGroup}}, mogą mieć same elementy pochodne. Pełną listę dostępnych obiektów Coin można znaleźć w oficjalnej dokumentacji Coin.
Some of those nodes, such as SoSeparators or SoGroups, can have children themselves. The complete list of the available coin objects can be found in the official coin documentation.


Spróbujmy teraz dodać coś do naszego scenegrafu. Dodamy ładny czerwony sześcian:
Let's try to add something to our scenegraph now. We'll add a nice red cube:


{{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 56: Line 58:
}}
}}


A teraz spróbujmy tego:
and here is our (nice) red cube. Now, let's try this:


{{Code|code=
{{Code|code=
Line 62: Line 64:
}}
}}


Jak widać wszystko jest nadal dostępne i modyfikowalne w locie. Nie trzeba niczego rekompilować ani przerysowywać, Coin zajmuje się wszystkim. Możesz dodawać obiekty do swojego scenegrafu, zmieniać właściwości, ukrywać je, pokazywać obiekty tymczasowe, cokolwiek zechcesz. Oczywiście, dotyczy to tylko wyświetlania w widoku 3D. Ten widok jest ponownie obliczany przez FreeCAD przy otwieraniu pliku, oraz gdy obiekt wymaga ponownego obliczenia. Tak więc, jeśli zmienisz aspekt istniejącego obiektu FreeCAD, zmiany te zostaną utracone, gdy obiekt zostanie ponownie obliczony lub gdy ponownie otworzysz plik.
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.


Jak już wspomniano, w scenegrafie OpenInventor kolejność jest ważna. Węzeł wpływa na to, co będzie następne. Przykładowo, jeśli chcemy mieć możliwość przesuwania naszego sześcianu, będziemy musieli dodać węzeł {{incode|SoTranslation}} {{Emphasis|przed}} sześcianem:
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:


{{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 79: Line 81:
}}
}}


Aby przesunąć nasz sześcian możemy teraz zrobić:
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:


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


Wreszcie usunięcie czegoś jest załatwione:
And our cube would jump 2 units to the right. Finally, removing something is done with:


{{Code|code=
{{Code|code=
sg.removeChild(myCustomNode)
sg.removeChild(myCustomNode)
}}
}}
{{Top}}
==Informacje zwrotne==


Mechanizm [http://en.wikipedia.org/wiki/Callback_%28computer_science%29 callback] to system, który pozwala bibliotece, takiej jak nasza biblioteka Coin, na odpowiadanie, czyli wywoływanie określonej funkcji z aktualnie uruchomionego obiektu Python. W ten sposób Coin może powiadomić Cię, że w scenie wystąpiło jakieś konkretne zdarzenie. Coin może obserwować bardzo różne rzeczy, takie jak pozycja myszy, kliknięcia przycisków myszy, wciśnięte klawisze klawiatury i wiele innych.
==Using callback mechanisms==


FreeCAD posiada łatwy sposób na wykorzystanie takich wywołań zwrotnych:
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.

FreeCAD features an easy way to use such callbacks:


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


Wywołanie zwrotne musi być zainicjowane z obiektu, ponieważ ten obiekt musi być nadal uruchomiony, gdy nastąpi wywołanie zwrotne.
The callback has to be initiated from an object, because that object must still be running when the callback will occur.
Zobacz także [[Code_snippets/pl#Obserwowanie_zdarze.C5.84_myszy_w_przegl.C4.85darce_3D_za_pomoc.C4.85_.C5.9Brodowiska_Python|kompletną listę]] możliwych zdarzeń i ich parametrów, lub oficjalną dokumentację Coin.
See also a [[Code_snippets#Observing_mouse_events_in_the_3D_viewer_via_Python|complete list]] of possible events and their parameters, or the official Coin documentation.
{{Top}}
==Dokumentacja==


Niestety, Pivy nie ma własnej dokumentacji. Ponieważ jednak jest to dokładny wrapper biblioteki Coin, możesz przeczytać referencję C ++ w celu uzyskania informacji. W tym przypadku musisz przetłumaczyć styl nazewnictwa klas C ++ na styl Pythona.
==Documentation==


W C++
Unfortunately, Pivy itself doesn't have its own documentation. However, since it is an accurate wrapper of the Coin library, you can read the C++ reference for information. In this case, you need to translate the C++ class naming style to Python style.

In C++:


{{Code|code=
{{Code|code=
Line 125: Line 129:
}}
}}


In Pivy:
W Pivy:


{{Code|code=
{{Code|code=
Line 131: Line 135:
}}
}}


* [https://github.com/coin3d Coin3d] homepage
* [https://github.com/coin3d Coin3D] strona domowa.
* [https://github.com/coin3d/pivy Pivy] homepage
* [https://github.com/coin3d/pivy Pivy] strona domowa.
* [https://grey.colorado.edu/coin3d/index.html Coin Documentation], at University of Colorado
* [https://github.com/coin3d/coin/wiki Coin3D wiki], na GitHubie.
* [https://github.com/coin3d/coin/wiki/Documentation dokumentacja Wiki dla Coin3D], na GitHubie.
* [https://coin3d.bitbucket.io/Coin/index.html Coin Documentation], at BitBucket
* [https://coin3d.github.io/Coin/html/ Coin3D Documentation], najnowsza, automatycznie generowana dokumentacja Doxygen.
* [https://webdocs.cs.ualberta.ca/~graphics/books/mentor.pdf (Open)Inventor Mentor] - zalecane.

===Starsze===

Te linki dostarczają dokumentacji referencyjnej dla Coin v3.x. Różnice w stosunku do v4.x są minimalne, więc nadal mogą one być przydatne.

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


{{Docnav
{{Docnav/pl
|[[Scenegraph|Scenegraph]]
|[[Scenegraph/pl|Scenogram]]
|[[PySide|PySide]]
|[[PySide/pl|PySide]]
}}
}}


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

Latest revision as of 17:41, 30 December 2022

Wprowadzenie

Pivy jest biblioteką wiążącą Python do Coin, biblioteką renderowania 3D używaną w FreeCAD do wyświetlania obiektów w oknie widoku 3D. Coin jest otwartą implementacją specyfikacji "Open Inventor" do obsługi grafiki. Dlatego w środowisku FreeCAD terminy Pivy, Coin lub Open Inventor odnoszą się zasadniczo do tego samego.

Po zaimportowaniu do działającego interpretera Python, Pivy pozwala nam na bezpośrednią komunikację z dowolnym działającym scenegrafem Coin, takim jak widok 3D, a nawet na tworzenie nowych. Pivy nie jest wymagany do kompilacji FreeCAD, ale jest wymagany podczas uruchamiania opartych na Pythonie środowisk pracy, które tworzą kształty na ekranie, takich jak Rysunek Roboczy i Architektura. Z tego powodu, Pivy jest zwykle instalowany podczas instalacji programu FreeCAD.

Biblioteka Coin jest podzielona na kilka części, sam Coin do manipulowania scenegrafami oraz wiązania dla kilku systemów GUI, takich jak Windows i Qt. Jeśli są obecne w systemie, moduły te są również dostępne dla Pivy. Moduł Coin jest zawsze obecny i to właśnie z niego będziemy korzystać, ponieważ nie będziemy musieli dbać o zakotwiczenie naszego wyświetlacza 3D w jakimkolwiek interfejsie, to już robi FreeCAD. Jedyne co musimy zrobić to:

from pivy import coin

Scenograf

Na stronie Scenogram zobaczyliśmy, jak zorganizowana jest typowa scena Coin. Wszystko, co pojawia się w oknie widoku 3D jest scenegrafem Coin, zorganizowanym w ten sam sposób. Mamy jeden węzeł główny, a wszystkie obiekty na ekranie są jego produktami pochodnymi.

FreeCAD posiada łatwy sposób dostępu do węzła głównego scenegrafu widoku 3D:

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

Spowoduje to zwrócenie węzła głównego:

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

Możemy skontrolować bezpośrednie obiekty pochodne naszej sceny:

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

Niektóre z tych węzłów, takie jak SoSeparator czy SoGroup, mogą mieć same elementy pochodne. Pełną listę dostępnych obiektów Coin można znaleźć w oficjalnej dokumentacji Coin.

Spróbujmy teraz dodać coś do naszego scenegrafu. Dodamy ładny czerwony sześcian:

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

A teraz spróbujmy tego:

col.rgb = (1, 1, 0)

Jak widać wszystko jest nadal dostępne i modyfikowalne w locie. Nie trzeba niczego rekompilować ani przerysowywać, Coin zajmuje się wszystkim. Możesz dodawać obiekty do swojego scenegrafu, zmieniać właściwości, ukrywać je, pokazywać obiekty tymczasowe, cokolwiek zechcesz. Oczywiście, dotyczy to tylko wyświetlania w widoku 3D. Ten widok jest ponownie obliczany przez FreeCAD przy otwieraniu pliku, oraz gdy obiekt wymaga ponownego obliczenia. Tak więc, jeśli zmienisz aspekt istniejącego obiektu FreeCAD, zmiany te zostaną utracone, gdy obiekt zostanie ponownie obliczony lub gdy ponownie otworzysz plik.

Jak już wspomniano, w scenegrafie OpenInventor kolejność jest ważna. Węzeł wpływa na to, co będzie następne. Przykładowo, jeśli chcemy mieć możliwość przesuwania naszego sześcianu, będziemy musieli dodać węzeł SoTranslation przed sześcianem:

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)

Aby przesunąć nasz sześcian możemy teraz zrobić:

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

Wreszcie usunięcie czegoś jest załatwione:

sg.removeChild(myCustomNode)

Przewiń na górę strony

Informacje zwrotne

Mechanizm callback to system, który pozwala bibliotece, takiej jak nasza biblioteka Coin, na odpowiadanie, czyli wywoływanie określonej funkcji z aktualnie uruchomionego obiektu Python. W ten sposób Coin może powiadomić Cię, że w scenie wystąpiło jakieś konkretne zdarzenie. Coin może obserwować bardzo różne rzeczy, takie jak pozycja myszy, kliknięcia przycisków myszy, wciśnięte klawisze klawiatury i wiele innych.

FreeCAD posiada łatwy sposób na wykorzystanie takich wywołań zwrotnych:

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

Wywołanie zwrotne musi być zainicjowane z obiektu, ponieważ ten obiekt musi być nadal uruchomiony, gdy nastąpi wywołanie zwrotne. Zobacz także kompletną listę możliwych zdarzeń i ich parametrów, lub oficjalną dokumentację Coin.

Przewiń na górę strony

Dokumentacja

Niestety, Pivy nie ma własnej dokumentacji. Ponieważ jednak jest to dokładny wrapper biblioteki Coin, możesz przeczytać referencję C ++ w celu uzyskania informacji. W tym przypadku musisz przetłumaczyć styl nazewnictwa klas C ++ na styl Pythona.

W C++

SoFile::getClassTypeId()

W Pivy:

SoFile.getClassId()

Starsze

Te linki dostarczają dokumentacji referencyjnej dla Coin v3.x. Różnice w stosunku do v4.x są minimalne, więc nadal mogą one być przydatne.

Przewiń na górę strony