Pivy/ro: Difference between revisions

From FreeCAD Documentation
No edit summary
No edit summary
Line 60: Line 60:
sg.addChild(myCustomNode)
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
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])

Revision as of 19:50, 18 August 2018

Pivy este o bilbiotecă de coduri care servește drept pasarelă între python și coin Coin3d, bilbioteca 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 dexempălu vederile FreeCAD 3D , sau chiar creare unor anoi. Pivy este inclus în instalarea standard 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ță, este deja făcut de FreeCAD. Tot ce trebuie să facem este:

from pivy import coin

Accederea și modificarea unui scene grafioe 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)
mtCustomNode.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])

And our cube would jump 2 units to the right. Finally, removing something is done with:

sg.removeChild(myCustomNode)

Using callback mechanisms

A 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:

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

The callback has to be initiated from an object, because that object must still be running when the callback will occur. See also a complete list of possible events and their parameters, or the 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())

Scenegraph/ro
PySide/ro