Pivy

From FreeCAD Documentation
Jump to: navigation, search
This page is a translated version of the page Pivy and the translation is 70% complete.

Outdated translations are marked like this.
Other languages:
čeština • ‎Deutsch • ‎English • ‎español • ‎français • ‎Bahasa Indonesia • ‎italiano • ‎日本語 • ‎polski • ‎română • ‎русский • ‎svenska • ‎Türkçe

Pivy este o bibliotecă de coduri care servește drept punte între Python și coin Coin3d, biblioteca de randare 3D utilizată de către FreeCAD. Atunci când este importat într-un interpretor python care rulează, Pivy permite dialogul direct și imediat cu orice procedură Coin3d care rulează scenegraphs, ca dexemplu vizualizările FreeCAD 3D , sau chiar creare unora noi. Pivy este inclus în pachetul standard de instalare FreeCAD .

Biblioteca coin este împărțită în mai multe piese, coin însuși, este pentru manipularea scripturilor și legăturilor pentru mai multe sisteme GUI, cum ar fi ferestrele sau, ca în cazul nostru, qt. Modulele respective sunt disponibile și pentru piv, în funcție de situația în care sunt prezente în sistem. Modulul coin este întotdeauna prezent și este ceea ce vom folosi oricum, deoarece nu va trebui să ne pese de ancorarea afișajului nostru 3D în orice interfață, deoarece este deja făcută de cpătre FreeCAD. Tot ce trebuie să facem este:

from pivy import coin

Accesarea și modificarea unui scene grafice 3D

Am văzut în pagina Scenegraph cum Coin organizează o scenă tipică. Tot ce este afișat 3D în FreeCAD este construit și festionat de către Coin. Avem o rădăcină, iar toate obiectele de pe ecran sunt copiii lui.legat prin noduri

Free cad are un mod facil de a accede la radacina unei scene 3D:

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

Radăcina scenei va fi :

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

Putrem inspecta imediat copii scenei noastre:

for node in sg.getChildren():
    print node

Unele dintre aceste noduri, cum ar fi SoSeparators sau SoGroups, pot avea proprii copii. Lista completă a obiectelor disponibile pentru programul Coin poate fi găsită în official coin documentation.

Acum să încercăm să adăugăm ceva la scenă (proiect). Vom adăuga un frumos cub roșu:

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

și aici este (frumosul ) nostru cub roșu. Acum. hai să încerca aceasta:

col.rgb=(1,1,0)

Ai văzut? Totul este încă accesibil și editabil din voleu. Nu este nevoie să recalculați sau să reproiectați nimic, Coin are grijă de tot. Puteți adăuga ceea ce doriți la scenă (proiectul), schimbați proprietățile, ascundeți obiecte, expuneți temporar obiecte, faceți ceva. Desigur, acest lucru afectează numai afișarea vizualizării 3D. Afișarea documentului deschis este recalculată de FreeCAD și recalculează un obiect atunci când trebuie să fie. Deci, dacă modificați aspectul unui obiect existent în FreeCAD, aceste modificări se vor pierde dacă obiectul este recalculat sau când redeschideți fișierul.

Un lucru, pentru a lucra cu scripturile în scenariile tale, poți, când este necesar, să accesezi câteva proprietăți ale nodurilor pe care le-ai adăugat. De exemplu, dacă vrem să mutăm cubul, am fi adăugat un nod SoTranslation la nodul nostru personalizat și,el ar fi arătat astfel:

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)

Rețineți că într-un scenariu openInventor, ordinea este importantă. Un nod afectează ceea ce urmează, astfel încât să puteți spune ceva de genul: culoarea roșie, cubul, culoarea galbenă, sfera și veți obține un cub roșu și o sferă galbenă. Dacă am adăugat traducerea la nodul nostru personalizat existent, acesta va veni după cub și nu îl va afecta. Dacă am fi introdus-o

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

Și cubul nostru ar sări 2 unități la dreapta. În cele din urmă, eliminarea a ceva se face cu:

sg.removeChild(myCustomNode)

Utilizarea mecanismului de trecere în argument a unei alte funcții

La callback mechanism, Un mecanism de Callback este sistem care permite unei bilbioteci pe caer o utilizați , ca de ex bilbioteca Coin de a trece în argumente a unei alte funcții pentru l'Objet Python în curs de execuție. Acest lucru este extrem de util, deoarece în acest mod coin vă poate avertiza dacă un anumit eveniment apare în scenă. Coin poate vedea lucruri foarte diferite, cum ar fi poziția mouse-ului, clicurile pe un buton al mouse-ului, tastele de tastatură care sunt apăsate și multe alte lucruri.

FreeCAD are o modalitate ușoară de a utiliza aceste callbacks:

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

Callback-ul a fost pornit de la un obiect, deoarece obiectul trebuie să ruleze în continuare când apare apelul invers. Vezi de asemenea complete list a posibilelor evenimente și parametrii lor, sau în official coin documentation.

Documentație

Din păcate, pivy nu dispune încă de o documentație potrivită, dar deoarece există o traducere exactă a lui coin, puteți utilizat în toată securitatea documetația de referință a lui coin, și utilizați stilul Python în locul stilului c ++ ( par exemple SoFile::getClassTypeId() en c++, serait SoFile.getClassId() en pivy ) c++ style (for example SoFile::getClassTypeId() would in pivy be SoFile.getClassId())

In C++:

SoFile::getClassTypeId()

In Pivy

SoFile.getClassId()