Pivy/de

Pivy ist eine Python-Bibliothek für Verbindung zu 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 Szenengraphen, wie die FreeCAD 3D-Ansichten oder man kann sogar neue erstellen. Pivy ist in der FreeCAD-Standardinstallierung bereits vorhanden.

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:

from pivy import coin

Zugreifen auf und Ändern im Szenengraph
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.

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:

 >

Wir können die unmittelbaren Kinder unserer Szene untersuchen:

for node in sg.getChildren: print node

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

und da ist unser (schöner) roter Würfel. Jetzt wollen wir dies hier versuchen:

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) mtCustomNode.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])

Und unser Würfel würde damit 2 Einheiten nach rechts springen. Schließlich wird das Entfernen von etwas, wie folgt erledigt:

sg.removeChild(myCustomNode)

Verwenden von Rückruf-mechanismen
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:

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

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.

Dokumentation
Leider hat pivy selbst noch keine richtige Dokumentation, aber da es eine genaue Übersetzung von Coin gibt, können Sie problemlos die Coin-Dokumentation als Referenz nutzen, und Python-Stil verwenden, anstatt C++-Stil (z. B. SoFile::getClassTypeId würde in pivy zu dem werden: SoFile.getClassId)