Pivy/de: Difference between revisions

From FreeCAD Documentation
(Created page with "Denken Sie daran, dass in einem OpenInventor-Szenengraph, die Reihenfolge wichtig ist. Ein Knoten beeinflusst das, was als nächstes kommt, so können Sie etwas sagen wie: Far...")
(Created page with "===Ältere===")
 
(63 intermediate revisions by 6 users not shown)
Line 1: Line 1:
<languages/>
[http://pivy.coin3d.org/ Pivy] ist eine Python-Bibliothek für Verbindung zu [http://www.coin3d.org Coin3d], die 3D-Rendering-Bibliothek, die FreeCAD verwendet. Wenn man diese in einen laufenden Python-Interpreter importiert, erlaubt es den direkten Dialog mit einem laufenden Coin3d [[Scenegraph|Szenengraphen]], wie die FreeCAD 3D-Ansichten oder man kann sogar neue erstellen. Pivy ist in der FreeCAD-Standardinstallierung bereits vorhanden.


{{Docnav/de
Die Coin3d-Bibliothek ist in mehrere Stücke geteilt, Coin selbst, für die Manipulation von Szenengraphen und Bindungen für mehrere GUI-Systeme, wie z.B. Windows, oder, wie in unserem Fall, qt. Diese Module stehen auch pivy zur Verfügung, abhängig davon, ob sie auf dem System vorhanden sind. Das coin-modul ist immer vorhanden, und es ist das, was wir ohnehin verwenden werden, somit brauchen wir uns nicht mehr um unsere Verankerung des 3D-Display in jeder Schnittstelle zu kümmern, dies wird bereits durch FreeCAD selbst getan. Alles, was wir tun müssen, ist dies:
|[[Scenegraph/de|Szenengraph]]
<syntaxhighlight>
|[[PySide/de|PySide]]
from pivy import coin
}}
</syntaxhighlight>
==Zugreifen auf und Ändern im Szenengraph==


{{TOCright}}
Wir sahen in der [[Scenegraph]]-Seite, wie eine typische Münze Szene organisiert ist. Alles, was in einer FreeCAD-3D-Ansicht erscheint, ist ein Coin-Szenengraph und immer auf die gleiche Weise organisiert. Wir haben einen Wurzelknoten, und alle Objekte auf dem Bildschirm sind seine Kinder.

<span id="Introduction"></span>
==Einführung==

[[Pivy/de|Pivy]] ist eine [[Python/de|Python]] Bindungsbibliothek für [https://github.com/coin3d Coin], die 3D Rendering Bibliothek, die in FreeCAD verwendet wird, um Dinge in einer [[3D_view/de|3D Ansicht]] anzuzeigen. Coin ist eine quelloffene Implementierung der "Open Inventor" Spezifikation zur Handhabung von Grafiken. Daher beziehen sich in FreeCAD die Begriffe "Pivy", "Coin" oder "Open Inventor" im Wesentlichen auf die gleiche Sache.

Wenn in einen laufenden Python-Interpreter importiert, erlaubt Pivy direkt mit jedem laufenden Coin-[[Scenegraph/de|Szenengraph]], wie z.B. der [[3D_view/de|3D-Ansicht]] zu kommunizieren, oder sogar neue zu erstellen. Pivy ist nicht erforderlich, um FreeCAD zu kompilieren, aber es wird zur Laufzeit benötigt, wenn auf Python basierende Arbeitsbereiche ausgeführt werden, die Formen auf dem Bildschirm erstellen, wie die Arbeitsbereiche [[Draft_Workbench/de|Draft]] und [[Arch_Workbench/de|Arch]]. Aus diesem Grund wird Pivy normalerweise installiert, wenn eine Distribution von FreeCAD installiert wird.

Die Coin Bibliothek ist in mehrere Teile unterteilt, Coin selbst zur Manipulation von Szenegraphen und Bindungen für verschiedene GUI Systeme wie Windows und Qt. Falls auf dem System vorhanden, sind diese Module auch für Pivy verfügbar. Das Coin Modul ist immer vorhanden, und wir werden es sowieso verwenden, da wir uns nicht darum kümmern müssen, unsere 3D Darstellung in irgendeiner Schnittstelle zu verankern, was bereits von FreeCAD getan wird. Alles, was wir tun müssen, ist dies:

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

<span id="Scenegraph"></span>
==Szenengraph==

Wir haben auf der [[Scenegraph/de|Szenengraph]] Seite gesehen, wie eine typische Coin szene organisiert ist. Alles, was in einer [[3D_view/de|3D Ansicht]] erscheint, ist ein Coin Szenegraph, der auf die gleiche Weise organisiert ist. Wir haben einen Wurzelknoten, und alle Objekte auf dem Bildschirm sind seine Kinder.


FreeCAD hat eine einfache Möglichkeit, auf den Root-Knoten eines 3D-Ansicht Szenengraph zugreifen:
FreeCAD hat eine einfache Möglichkeit, auf den Root-Knoten eines 3D-Ansicht Szenengraph zugreifen:

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

Dies gibt den Root-Knoten aus:
Dies gibt den Root-Knoten aus:

<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>
}}

Wir können die unmittelbaren Kinder unserer Szene untersuchen:
Wir können die unmittelbaren Kinder unserer Szene untersuchen:

<syntaxhighlight>
{{Code|code=
for node in sg.getChildren():
for node in sg.getChildren():
print node
print(node)
</syntaxhighlight>
}}
Einige dieser Knoten, wie SoSeparators oder SoGroups, können selbst Kinder haben. Die vollständige Liste der verfügbaren Coin-Objekte kann man nachlesen in der [http://doc.coin3d.org/Coin/classes.html offiziellen coin-Dokumentation].

Einige dieser Knoten, wie {{incode|SoSeparator}} oder {{incode|SoGroup}}, können selbst Kinder haben. Die vollständige Liste der verfügbaren Coin Objekte findest du in der offiziellen Coin Dokumentation.


Lasst uns versuchen, jetzt etwas zu unserem Szenengraph hinzuzufügen. Wir fügen einen schönen roten Würfel ein:
Lasst uns versuchen, jetzt etwas zu unserem Szenengraph hinzuzufügen. Wir fügen einen schönen roten Würfel ein:
<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>
und da ist unser (schöner) roter Würfel. Jetzt wollen wir dies hier versuchen:
<syntaxhighlight>
col.rgb=(1,1,0)
</syntaxhighlight>
Sehen Sie? Alles ist immer noch zugänglich und on-the-fly modifizierbar. Keine Notwendigkeit, neu zu berechnen oder alles neu zu zeichnen, Coin kümmert sich schon um alles. Sie können Elemnte zum Szenengraph hinzufügen, Eigenschaften ändern, Dinge verbergen, temporäre Objekte anzeigen, einfach alles. Natürlich betrifft diese nur die Anzeige in der 3D-Ansicht. Diese Anzeige wird von FreeCAD bei öffnen einer Datei neu berechnet, und wenn ein Objekt eine Neuberechnung benötigt.
Also, diese Änderungen gehen verloren, wenn Sie den Aspekt eines vorhandenen FreeCAD-Objekts ändern, wenn das Objekt neu berechnet wird oder wenn Sie die Datei wiederer öffnen.


{{Code|code=
Ein Schlüssel zum Bearbeiten des Szenengraphen mit Ihren Skripten ist, in der Lage zu sein, auf bestimmte Eigenschaften der Knoten die Sie hinzugefügten, bei Bedarf zugreifen zu können. Zum Beispiel, wenn wir unseren Würfel bewegen wollten, hätten wir einen SoTranslation-Knoten zu unserem benutzerdefinierten Knoten hinzugefügt, und es hätte dann so ausgesehen:
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>
Denken Sie daran, dass in einem OpenInventor-Szenengraph, die Reihenfolge wichtig ist. Ein Knoten beeinflusst das, was als nächstes kommt, so können Sie etwas sagen wie: Farbe rot, Würfel, Farbe gelb, Kugel, und Sie werden einen roten Würfel und eine gelbe Kugel bekommen. Wenn wir das Verschieben jetzt zu unserem vorhandenen benutzerdefinierten Knoten hinzufügen würden, würde es nach dem Würfel kommen, und diesen nicht betreffen. Wenn wir es bei der Erstellung eingefügt hätten, wie hier oben, könnten wir jetzt folgendes tun:
<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==


Versuchen wir Folgendes:
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].


Wie du siehst, ist alles nach wie vor zugänglich und gleichzeitig veränderbar. Du musst nichts neu berechnen oder neu zeichnen, Coin kümmert sich um alles. Du kannst deinem Szenegraphen Sachen hinzufügen, Eigenschaften ändern, Sachen ausblenden, temporäre Objekte anzeigen, alles. Dies betrifft natürlich nur die Darstellung in der 3D Ansicht. Diese Anzeige wird von FreeCAD bei geöffneter Datei neu berechnet, und wenn ein Objekt neu berechnet werden muss. Wenn du also den Aspekt eines bestehenden FreeCAD Objekts änderst, gehen diese Änderungen verloren, wenn das Objekt neu berechnet wird oder wenn du die Datei erneut öffnest.
== Documentation ==


Wie bereits erwähnt, ist in einer openInventor Szenografie die Reihenfolge wichtig. Ein Knoten beeinflusst, was als nächstes kommt. Wenn wir zum Beispiel die Möglichkeit haben wollen, unseren Würfel zu bewegen, müssen wir einen {{incode|SoTranslation}} Knoten {{Emphasis|before}} dem Würfel hinzufügen
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)
}}


Um unseren Würfel zu bewegen, können wir jetzt folgendes tun:
[[Category:Poweruser Documentation]]


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

Zum Schluß etwas entfernen wird ausgeführt mit:

{{Code|code=
sg.removeChild(myCustomNode)
}}
{{Top}}
<span id="Callbacks"></span>
==Rückrufe==

Ein [http://en.wikipedia.org/wiki/Callback_%28computer_science%29 callback mechanism] ist ein System, das es einer Bibliothek, wie z.B. unserer Coin Bibliothek, erlaubt, Sie zurückzurufen, d.h. eine bestimmte Funktion von deinem aktuell laufenden Python Objekt aus aufzurufen. Auf diese Weise kann Coin dich darüber informieren, dass ein bestimmtes Ereignis in der Szene aufgetreten ist. Coin kann sehr unterschiedliche Dinge beobachten, wie z.B. Mausposition, Mausklicks, das Drücken von Tasten auf der Tastatur und vieles mehr.

FreeCAD bietet eine einfache Möglichkeit, solche Rückrufe zu verwenden:

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

Die Rückmeldung muss von einem Objekt initiiert werden, da dieses Objekt zum Zeitpunkt der Rückmeldung noch laufen muss.
Siehe auch die [[Code_snippets#Observe_mouse_events_in_the_3D_viewer_via_Python|komplette Liste]] von möglichen Ereignissen und deren Parametern, oder die offizielle Coin-Dokumentation.
{{Top}}
<span id="Documentation"></span>
==Dokumentation==

Leider verfügt Pivy nicht über eine eigene Dokumentation. Da es sich jedoch um einen genauen Wrapper der Coin Bibliothek handelt, kannst du zur Information die C++ Referenz lesen. In diesem Fall musst du den C++ Klassennamensstil in Python Stil übersetzen.

In C++:

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

In Pivy:

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

* [https://github.com/coin3d Coin3D] Startseite.
* [https://github.com/coin3d/pivy Pivy] Startseite.
* [https://github.com/coin3d/coin/wiki Coin3D wiki], auf GitHub.
*[https://github.com/coin3d/coin/wiki/Documentation Coin3D wiki documentation], auf GitHub.
* [https://coin3d.github.io/Coin/html/ Coin3D Documentation], die neueste automatisch generierte Doxygen-Dokumentation.
* [https://webdocs.cs.ualberta.ca/~graphics/books/mentor.pdf (Open)Inventor Mentor] - empfohlen.

<span id="Older"></span>
===Ältere===

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/de
|[[Scenegraph/de|Szenengraph]]
|[[PySide/de|PySide]]
}}

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

Latest revision as of 07:47, 9 April 2023

Einführung

Pivy ist eine Python Bindungsbibliothek für Coin, die 3D Rendering Bibliothek, die in FreeCAD verwendet wird, um Dinge in einer 3D Ansicht anzuzeigen. Coin ist eine quelloffene Implementierung der "Open Inventor" Spezifikation zur Handhabung von Grafiken. Daher beziehen sich in FreeCAD die Begriffe "Pivy", "Coin" oder "Open Inventor" im Wesentlichen auf die gleiche Sache.

Wenn in einen laufenden Python-Interpreter importiert, erlaubt Pivy direkt mit jedem laufenden Coin-Szenengraph, wie z.B. der 3D-Ansicht zu kommunizieren, oder sogar neue zu erstellen. Pivy ist nicht erforderlich, um FreeCAD zu kompilieren, aber es wird zur Laufzeit benötigt, wenn auf Python basierende Arbeitsbereiche ausgeführt werden, die Formen auf dem Bildschirm erstellen, wie die Arbeitsbereiche Draft und Arch. Aus diesem Grund wird Pivy normalerweise installiert, wenn eine Distribution von FreeCAD installiert wird.

Die Coin Bibliothek ist in mehrere Teile unterteilt, Coin selbst zur Manipulation von Szenegraphen und Bindungen für verschiedene GUI Systeme wie Windows und Qt. Falls auf dem System vorhanden, sind diese Module auch für Pivy verfügbar. Das Coin Modul ist immer vorhanden, und wir werden es sowieso verwenden, da wir uns nicht darum kümmern müssen, unsere 3D Darstellung in irgendeiner Schnittstelle zu verankern, was bereits von FreeCAD getan wird. Alles, was wir tun müssen, ist dies:

from pivy import coin

Szenengraph

Wir haben auf der Szenengraph Seite gesehen, wie eine typische Coin szene organisiert ist. Alles, was in einer 3D Ansicht erscheint, ist ein Coin Szenegraph, der auf die gleiche Weise organisiert ist. Wir haben einen Wurzelknoten, und alle Objekte auf dem Bildschirm sind seine Kinder.

FreeCAD hat eine einfache Möglichkeit, auf den Root-Knoten eines 3D-Ansicht Szenengraph zugreifen:

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

Dies gibt den Root-Knoten aus:

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

Wir können die unmittelbaren Kinder unserer Szene untersuchen:

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

Einige dieser Knoten, wie SoSeparator oder SoGroup, können selbst Kinder haben. Die vollständige Liste der verfügbaren Coin Objekte findest du in der offiziellen Coin Dokumentation.

Lasst uns versuchen, jetzt etwas zu unserem Szenengraph hinzuzufügen. Wir fügen einen schönen roten Würfel ein:

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

Versuchen wir Folgendes:

col.rgb = (1, 1, 0)

Wie du siehst, ist alles nach wie vor zugänglich und gleichzeitig veränderbar. Du musst nichts neu berechnen oder neu zeichnen, Coin kümmert sich um alles. Du kannst deinem Szenegraphen Sachen hinzufügen, Eigenschaften ändern, Sachen ausblenden, temporäre Objekte anzeigen, alles. Dies betrifft natürlich nur die Darstellung in der 3D Ansicht. Diese Anzeige wird von FreeCAD bei geöffneter Datei neu berechnet, und wenn ein Objekt neu berechnet werden muss. Wenn du also den Aspekt eines bestehenden FreeCAD Objekts änderst, gehen diese Änderungen verloren, wenn das Objekt neu berechnet wird oder wenn du die Datei erneut öffnest.

Wie bereits erwähnt, ist in einer openInventor Szenografie die Reihenfolge wichtig. Ein Knoten beeinflusst, was als nächstes kommt. Wenn wir zum Beispiel die Möglichkeit haben wollen, unseren Würfel zu bewegen, müssen wir einen SoTranslation Knoten before dem Würfel hinzufügen

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)

Um unseren Würfel zu bewegen, können wir jetzt folgendes tun:

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

Zum Schluß etwas entfernen wird ausgeführt mit:

sg.removeChild(myCustomNode)

Anfang

Rückrufe

Ein callback mechanism ist ein System, das es einer Bibliothek, wie z.B. unserer Coin Bibliothek, erlaubt, Sie zurückzurufen, d.h. eine bestimmte Funktion von deinem aktuell laufenden Python Objekt aus aufzurufen. Auf diese Weise kann Coin dich darüber informieren, dass ein bestimmtes Ereignis in der Szene aufgetreten ist. Coin kann sehr unterschiedliche Dinge beobachten, wie z.B. Mausposition, Mausklicks, das Drücken von Tasten auf der Tastatur und vieles mehr.

FreeCAD bietet eine einfache Möglichkeit, solche Rückrufe zu verwenden:

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

Die Rückmeldung muss von einem Objekt initiiert werden, da dieses Objekt zum Zeitpunkt der Rückmeldung noch laufen muss. Siehe auch die komplette Liste von möglichen Ereignissen und deren Parametern, oder die offizielle Coin-Dokumentation.

Anfang

Dokumentation

Leider verfügt Pivy nicht über eine eigene Dokumentation. Da es sich jedoch um einen genauen Wrapper der Coin Bibliothek handelt, kannst du zur Information die C++ Referenz lesen. In diesem Fall musst du den C++ Klassennamensstil in Python Stil übersetzen.

In C++:

SoFile::getClassTypeId()

In Pivy:

SoFile.getClassId()

Ältere

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

Anfang