Pivy/de: Difference between revisions

From FreeCAD Documentation
No edit summary
No edit summary
Line 58: Line 58:
}}
}}


Versuchen wir Folgendes:
<div class="mw-translate-fuzzy">
und da ist unser (schöner) roter Würfel. Jetzt wollen wir dies hier versuchen:
</div>


{{Code|code=
{{Code|code=

Revision as of 14:14, 8 August 2020

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 wird, erlaubt Pivy direkt mit jeder laufenden Coin zu kommunizieren Szenengraph, wie z.B. der 3D Ansicht, oder sogar neue zu erstellen. Pivy ist nicht erforderlich, um FreeCAD zu kompilieren, aber es wird zur Laufzeit benötigt, wenn Python basierte Arbeitsbereiche ausgeführt werden, die Formen auf dem Bildschirm erstellen, wie Entwurf Arbeitsbereich und Architektur. 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)

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.

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

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:

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

Zum Schluß etwas entfernen wird ausgeführt mit:

sg.removeChild(myCustomNode)

Anfang

Rückrufe

Ein Rückruf-mechanismus ist ein System, das einer Bibliothek erlaubt, wie zum Beispiel unserer Coin-Bibliothek, uns zurück zu rufen, das heißt, eine bestimmte Funktion von Ihrem laufenden Python-Objekt abzufordern. Das ist äußerst nützlich, weil COIN Sie auf diese Weise benachrichtigen kann, wenn ein bestimmtes Ereignis in der Szene eintritt. Coin kann sehr verschiedene Dinge beobachten, wie zum Beispiel Maus-Position, Mausklicks, gedrückte Tasten der Tastatur, und noch viele andere Dinge.

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

Der Rückruf muss von einem Objekt abgesetzt werden, weil das Objekt noch ausgeführt werden muss, wenn der Rückruf auftritt. Beachten Sie auch die complete list möglicher Ereignisse und deren Parameter, oder die offiziellen 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()

Anfang