Pivy/ja

PivyはFreeCADで使われている3DレンダリングライブラリであるCoin3d用のPythonのバインディングライブラリです. 実行中のPythonインタプリタにインポートするとFreeCADの3DビューアーなどのCoin3dシーングラフと直に対話処理を行ったり、新しい3Dビューアーを作成することさえできます. Pivyは標準のFreeCADインストールに同梱されています.

Coinライブラリはいくつかに分割されています. Coin自体はシーングラフの操作を担い、Windowsといった複数のGUIシステム用のパッケージがありますが私たちの場合はQt用になります. これらの分割されたモジュールもシステム上に存在する場合にはPivyから利用することができます. Coinモジュールは常駐していて自由に利用することができます. 既にFreeCADによって行われているので3D表示をどのインターフェイスに紐付けするのか気にする必要はありません. 私たちがやらなければならないのは以下のコマンドを実行することだけです：

from pivy import coin

シーングラフへのアクセスと変更
典型的なCoinシーンがどの様に構成されているかはシーングラフページで見ました. FreeCADの3Dビューに表示されているものは全てCoinシーングラフであり、同じやり方で構成されています. ルートのノードが一つあり、画面上のオブジェクトは全てその子ノードです.

FreeCADでは3Dビューシーングラフのルートノードに簡単にアクセスすることができます：

sg = FreeCADGui.ActiveDocument.ActiveView.getSceneGraph print sg

こうするとルートノードが返されます.

 >

シーンの直下の子ノードを調べることもできます.

for node in sg.getChildren: print node

SoSeparatorsやSoGroupsといったこれらノードは自身の子ノードを持ちます. 利用可能なCoinオブジェクトの全リストはCoin公式ドキュメントにあります.

今度はシーングラフに何か追加してみましょう. すてきな赤い立方体を追加してみることにしましょう：

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

（すてきな）赤い立方体ができました. 以下を試してみてください：

col.rgb=(1,1,0)

Let's try to add something to our scenegraph now. We'll add a nice red cube:

and here is our (nice) red cube. Now, let's try this:

わかったでしょうか？実行中であっても全てのものに対してアクセスと変更を行うことができるのです. 再計算や再描画は必要ありません. Coinが全て面倒を見てくれます. 物体のシーングラフへの追加、プロパティの変更、物体の非表示、一時的なオブジェクトの表示、何でもできます. もちろん3Dビューに関係したことだけですが. この表示はFreeCADがファイルを開いた時とオブジェクトが必要とした時に再計算されます. 従って既存のFreeCADオブジェクトの外見を変更した場合、その変更はオブジェクトが再計算されるかファイルを再度開いた瞬間に失われます.

スクリプトでシーングラフを操作する場合の鍵となるのは必要な際に追加したノードの特定のプロパティにアクセスできるということなのです. 例えば立方体を動かしたいとしましょう. 自作のノードにSoTranslationノードを追加することになるでしょう. ちょうどこんな具合です：

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)

OpenInventorのシーングラフではその順番が重要であるということを思い出してください. ノードは以降のノードに影響を与えます. color red、cube、color yellow、sphere とすれば赤い立方体と黄色い球が表示されます. もし今、既存の自作ノードに移動を追加すると移動は立方体の後になり、立方体に影響を与えません. 上記のように作成時に挿入しておけば次のようにできます：

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

こうすると立方体が2単位分、右に移動します. 最後に何かを取り除くには次のようにします：

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:

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.

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