Pivy/ro: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
 
(48 intermediate revisions by 2 users not shown)
Line 1: Line 1:
<languages/>
<languages/>
[http://pivy.coin3d.org/ Pivy] is a python binding library for [http://www.coin3d.org Coin3d], the 3D-rendering library used in FreeCAD. When imported in a running python interpreter, it allows to dialog directly with any running Coin3d [[Scenegraph|scenegraphs]], such as the FreeCAD 3D views, or even to create new ones. Pivy is bundled in standard FreeCAD installation.


{{Docnav
The coin library is divided into several pieces, coin itself, for manipulating scenegraphs and bindings for several GUI systems, such as windows or, like in our case, qt. Those modules are available to pivy too, depending if they are present on the system. The coin module is always present, and it is what we will use anyway, since we won't need to care about anchoring our 3D display in any interface, it is already done by FreeCAD itself. All we need to do is this:
|[[Scenegraph|Scenegraph]]
|[[PySide|PySide]]
}}

{{TOCright}}

==Introduction==

<div class="mw-translate-fuzzy">
[http://pivy.coin3d.org/ Pivy] este o bibliotecă de coduri care servește drept punte între Python și coin [http://www.coin3d.org 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ă [[Scenegraph|scenegraphs]], ca dexemplu vizualizările FreeCAD 3D , sau chiar creare unora noi. Pivy este inclus în pachetul standard de instalare FreeCAD .
</div>

When imported in a running Python interpreter, Pivy allows us to communicate directly with any running Coin [[Scenegraph|scenegraph]], such as the [[3D_view|3D view]], or even to create new ones. Pivy is not required to compile FreeCAD, but it is required at runtime when running Python-based workbenches that create shapes on screen, like [[Draft_Workbench|Draft]] and [[Arch_Workbench|Arch]]. Because of this, Pivy is normally installed when installing a distribution of FreeCAD.

<div class="mw-translate-fuzzy">
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:
</div>

{{Code|code=
{{Code|code=
from pivy import coin
from pivy import coin
}}
}}
==Accessing and modifying the scenegraph==


<div class="mw-translate-fuzzy">
We saw in the [[Scenegraph]] page how a typical Coin scene is organized. Everything that appears in a FreeCAD 3D view is a coin scenegraph, organized the same way. We have one root node, and all objects on the screen are its children.
==Accesarea și modificarea unui scene grafice 3D==
</div>

<div class="mw-translate-fuzzy">
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
</div>

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


FreeCAD has an easy way to access the root node of a 3D view scenegraph:
{{Code|code=
{{Code|code=
sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph()
print sg
print(sg)
}}
}}

This will return the root node:
Radăcina scenei va fi :

{{Code|code=
{{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> >
}}
}}

We can inspect the immediate children of our scene:
Putrem inspecta imediat copii scenei noastre:

{{Code|code=
{{Code|code=
for node in sg.getChildren():
for node in sg.getChildren():
print node
print(node)
}}
}}
Some of those nodes, such as SoSeparators or SoGroups, can have children themselves. The complete list of the available coin objects can be found in the [http://coin3d.bitbucket.org/Coin/classes.html official coin documentation].


<div class="mw-translate-fuzzy">
Let's try to add something to our scenegraph now. We'll add a nice red cube:
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 [http://coin3d.bitbucket.org/Coin/classes.html official coin documentation].
</div>

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

{{Code|code=
{{Code|code=
col = coin.SoBaseColor()
col = coin.SoBaseColor()
col.rgb=(1,0,0)
col.rgb = (1, 0, 0)
cub = coin.SoCube()
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode = coin.SoSeparator()
Line 36: Line 68:
sg.addChild(myCustomNode)
sg.addChild(myCustomNode)
}}
}}

and here is our (nice) red cube. Now, let's try this:
<div class="mw-translate-fuzzy">
și aici este (frumosul ) nostru cub roșu. Acum. hai să încerca aceasta:
</div>

{{Code|code=
{{Code|code=
col.rgb=(1,1,0)
col.rgb = (1, 1, 0)
}}
}}
See? everything is still accessible and modifiable on-the-fly. No need to recompute or redraw anything, coin takes care of everything. You can add stuff to your scenegraph, change properties, hide stuff, show temporary objects, anything. Of course, this only concerns the display in the 3D view. That display gets recomputed by FreeCAD on file open, and when an object needs recomputing. So, if you change the aspect of an existing FreeCAD object, those changes will be lost if the object gets recomputed or when you reopen the file.


<div class="mw-translate-fuzzy">
A key to work with scenegraphs in your scripts is to be able to access certain properties of the nodes you added when needed. For example, if we wanted to move our cube, we would have added a SoTranslation node to our custom node, and it would have looked like this:
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.
</div>

<div class="mw-translate-fuzzy">
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:
</div>

{{Code|code=
{{Code|code=
col = coin.SoBaseColor()
col = coin.SoBaseColor()
col.rgb=(1,0,0)
col.rgb = (1, 0, 0)
trans = coin.SoTranslation()
trans = coin.SoTranslation()
trans.translation.setValue([0,0,0])
trans.translation.setValue([0, 0, 0])
cub = coin.SoCube()
cub = coin.SoCube()
myCustomNode = coin.SoSeparator()
myCustomNode = coin.SoSeparator()
myCustomNode.addChild(col)
myCustomNode.addChild(col)
mtCustomNode.addChild(trans)
myCustomNode.addChild(trans)
myCustomNode.addChild(cub)
myCustomNode.addChild(cub)
sg.addChild(myCustomNode)
sg.addChild(myCustomNode)
}}
}}

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:
<div class="mw-translate-fuzzy">
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
</div>

{{Code|code=
{{Code|code=
trans.translation.setValue([2,0,0])
trans.translation.setValue([2, 0, 0])
}}
}}

And our cube would jump 2 units to the right.
<div class="mw-translate-fuzzy">
Finally, removing something is done with:
Și cubul nostru ar sări 2 unități la dreapta.
În cele din urmă, eliminarea a ceva se face cu:
</div>

{{Code|code=
{{Code|code=
sg.removeChild(myCustomNode)
sg.removeChild(myCustomNode)
}}
}}
{{Top}}
==Using callback mechanisms==
<div class="mw-translate-fuzzy">
==Utilizarea mecanismului de trecere în argument a unei alte funcții==
</div>


<div class="mw-translate-fuzzy">
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.
La [http://en.wikipedia.org/wiki/Callback_%28computer_science%29 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.
</div>

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


FreeCAD features an easy way to use such callbacks:
{{Code|code=
{{Code|code=
from pivy import coin

class ButtonTest:
class ButtonTest:
def __init__(self):
def __init__(self):
self.view = FreeCADGui.ActiveDocument.ActiveView
self.view = FreeCADGui.ActiveDocument.ActiveView
self.callback = self.view.addEventCallbackPivy(SoMouseButtonEvent.getClassTypeId(),self.getMouseClick)
self.callback = self.view.addEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.getMouseClick)

def getMouseClick(self,event_cb):
event = event_cb.getEvent()
def getMouseClick(self, event_cb):
if event.getState() == SoMouseButtonEvent.DOWN:
event = event_cb.getEvent()
if event.getState() == coin.SoMouseButtonEvent.DOWN:
print "Alert!!! A mouse button has been improperly clicked!!!"
print("Alert!!! A mouse button has been improperly clicked!!!")
self.view.removeEventCallbackSWIG(SoMouseButtonEvent.getClassTypeId(),self.callback)
self.view.removeEventCallbackPivy(coin.SoMouseButtonEvent.getClassTypeId(), self.callback)

ButtonTest()
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 [[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].


<div class="mw-translate-fuzzy">
== Documentation ==
Callback-ul a fost pornit de la un obiect, deoarece obiectul trebuie să ruleze în continuare când apare apelul invers.
Vezi de asemenea [[Code_snippets#Observing_mouse_events_in_the_3D_viewer_via_Python|complete list]] a posibilelor evenimente și parametrii lor, sau în [http://doc.coin3d.org/Coin/classes.html official coin documentation].
</div>
{{Top}}
<div class="mw-translate-fuzzy">
== Documentație ==
</div>


<div class="mw-translate-fuzzy">
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())
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())
</div>


In C++:
{{docnav/ro|Scenegraph/ro|PySide/ro}}


{{Code|code=
[[Category:Poweruser Documentation/ro]]
SoFile::getClassTypeId()
}}

In Pivy:

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

* [https://github.com/coin3d Coin3D] homepage.
* [https://github.com/coin3d/pivy Pivy] homepage.
* [https://github.com/coin3d/coin/wiki Coin3D wiki], at GitHub.
* [https://github.com/coin3d/coin/wiki/Documentation Coin3D wiki documentation], at GitHub.
* [https://coin3d.github.io/Coin/html/ Coin3D Documentation], latest automatically generated Doxygen documentation.
* [https://webdocs.cs.ualberta.ca/~graphics/books/mentor.pdf (Open)Inventor Mentor] - recommended.

=== Older ===

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

<div class="mw-translate-fuzzy">
{{docnav/ro|Scenegraph/ro|PySide/ro}}
</div>


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

Latest revision as of 21:15, 2 June 2022

Introduction

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 .

When imported in a running Python interpreter, Pivy allows us to communicate directly with any running Coin scenegraph, such as the 3D view, or even to create new ones. Pivy is not required to compile FreeCAD, but it is required at runtime when running Python-based workbenches that create shapes on screen, like Draft and Arch. Because of this, Pivy is normally installed when installing a distribution of 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)

Top

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:

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

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.

Top

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

Older

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

Top

Scenegraph/ro
PySide/ro