« C4D Python R13 テスト:PythonでXPressoタグを試してみた。#4:ポートの変数型を調べる。 | トップページ | 更に久々… »

C4D Python R13 テスト:PythonでXPressoタグを試してみた。#5:設定済みXPressoタグ付のヌルオブジェクトをシーンに追加する。

今回はオブジェクトを選択してスクリプトを実行すると、「定数」ノードと「オブジェクト」ノードを追加。
「定数」ノードの出力をベクトル型に、「オブジェクト」ノードの入力に「絶対位置」を追加。
「定数」ノードのベクトル値に適当な数値を設定し、「オブジェクト」ノードの「絶対位置」を連結。
ここまでを一連でc4d.Pythonスクリプトで作ってみよう。

最終的には、下のような状態になるようにします。
立方体を選択して、スクリプトを実行すると、XPressoタグ付ヌルオブジェクトが追加されます。

Xpressotag_20

Xpressotag_19

何かの参考になれば良いですが…
使い道はあるのかなぁ…?

とりあえず、「オブジェクト」ノードに設定する任意のオブジェクトを先に追加しておく…
今回は、「立方体」オブジェクトを追加しました。

Xpressotag_21

まずは、XPressoタグ付のヌルオブジェクトをシーンに追加して見ましょう。

Python
"""
XPressoタグ付ヌルオブジェクトの追加。
"""

import c4d


def main():
    if not op:return

    #XPressoタグ付ヌルオブジェクトの追加
    obj = c4d.BaseObject(c4d.Onull)
    xpt = obj.MakeTag(c4d.Texpresso)
    doc.InsertObject(obj, None, None)


if __name__ == '__main__':
    main()
    c4d.EventAdd()

先ほど追加したオブジェクトを選択して実行すると、XPressoタグ付ヌルオブジェクトがシーンに追加されます。

Xpressotag_22

追加されたのを確認できれば問題ないね…
この段階では、XPressoタグ内はカラの状態です。

では、「定数」ノードと「オブジェクト」ノードを追加します。

その前に…
XPressoタグから、NodeMasterとRootNode(XGroup)を取得しておきます。

main()関数の続きに以下を追加。

Python
    #XPressoタグに「定数」ノードと「オブジェクト」ノードを追加。
    #GvNodeMasterとRootNodeのGvNodeの取得
    mast = xpt.GetNodeMaster()
    rootnode = mast.GetRoot()

NodeMasterへのノードの追加は…

GvNodeMasterクラス

  • CreateNode(parent, id)

これを使用してノードを追加します。

parentはRootNodeを、idは「定数」ノードのc4d.ID_OPERATOR_CONSTを渡します。

XPressoタグ内の座標を渡します。
左上がx,y = 0です。

Xpressotag_23

もちろん、先ほどの続きに追加します。

Python
    #定数ノードの設定
    node_1 = mast.CreateNode(rootnode, c4d.ID_OPERATOR_CONST, x = 0, y = 0)

これで、「定数」ノードが追加されます。

Xpressotag_24

「定数」ノードの「ノード」属性は、こんな具合だよね…

Xpressotag_25

この「データタイプ」と「値」を設定します。

Python
    node_1[c4d.GV_DYNAMIC_DATATYPE] = c4d.CUSTOMGUI_VECTOR #データタイプをベクトルに設定
    node_1[c4d.GV_CONST_VALUE] = c4d.Vector(100.0, 0.0, 0.0) #定数ベクトル値を設定

データタイプ[c4d.GV_DYNAMIC_DATATYPE]や値[c4d.GV_CONST_VALUE]は、属性マネージャの項目をスクリプトマネージャへドロップすると得ることができます。

Xpressotag_26

「定数」ノードの設定は、これで十分だと思います。
最後に出力ポートを取得しておきます。

Python
    out_port = node_1.GetOutPort(0)

これで、「定数」ノードの設定は終わりです。

確認のため実行すると「定数」ノードがベクトルに変更されているはずです。

Xpressotag_27

続いて「オブジェクト」ノードの設定です。

NodeMasterへのノードの追加は先ほどと同じく、GvCreatNode()を使い、座標も設定します。

Python
    #オブジェクトノードノードの設定
    node_2 = mast.CreateNode(rootnode, c4d.ID_OPERATOR_OBJECT, x = 130, y = 0)

「オブジェクト」ノードのidはc4d.ID_OPERATOR_OBJECTです。

この段階では…

Xpressotag_28

「オブジェクト」ノードの「ノード」属性はこんな具合だ。

Xpressotag_29

参照が「ヌル」オブジェクトになっているので、アクティブオブジェクトopを設定します。

Python
    node_2[c4d.GV_OBJECT_OBJECT_ID] = op

「オブジェクト」ノードの「参照」の[c4d.GV_OBJECT_OBJECT_ID]も属性マネージャからドロップして得ます。

ここまでの結果は、こんな具合です。

Xpressotag_30

「オブジェクト」ノードの設定の最後に、「定数」ノードの出力を「絶対位置」に入力するので、入力ポートに「絶対位置」を追加し、このポートを取得します。

ノードへのポートの追加は…

GvNodeクラス

  • AddPort(io, id)

これを使います。

ioには、入力ポート[c4d.GV_PORT_INPUT]を…idには、「絶対位置」の[c4d.ID_BASEOBJECT_GLOBAL_POSITION]を渡します。

Python
    in_port = node_2.AddPort(c4d.GV_PORT_INPUT, c4d.ID_BASEOBJECT_GLOBAL_POSITION)

これで、「オブジェクト」ノードの設定と「絶対位置」ポートの取得は終わりです。

ここまでの結果は、こんな具合です。

Xpressotag_31

後はポートをつなげて終わりです。

GvPortクラス

  • Connect(port)

これを使います。

Python
    #node_1の出力とnode_2の入力を連結
    out_port.Connect(in_port)

結果は、このようになれば問題ありません。

Xpressotag_32

ノードを中心移動させるのは、まだ探っていないので今回はここまで…

最後に全体を…

Python
"""
XPressoタグ付ヌルオブジェクトの追加。
"""

import c4d


def main():
    if not op:return
   
    #XPressoタグ付ヌルオブジェクトの追加
    obj = c4d.BaseObject(c4d.Onull)
    xpt = obj.MakeTag(c4d.Texpresso)
    doc.InsertObject(obj, None, None)
   
    #XPressoタグに「定数」ノードと「オブジェクト」ノードを追加。
    #GvNodeMasterとRootNodeのGvNodeの取得
    mast = xpt.GetNodeMaster()
    rootnode = mast.GetRoot()
    #定数ノードの設定
    node_1 = mast.CreateNode(rootnode, c4d.ID_OPERATOR_CONST, x = 0, y = 0)
    node_1[c4d.GV_DYNAMIC_DATATYPE] = c4d.CUSTOMGUI_VECTOR #データタイプをベクトルに設定
    node_1[c4d.GV_CONST_VALUE] = c4d.Vector(100.0, 0.0, 0.0) #定数ベクトル値を設定
    out_port = node_1.GetOutPort(0)
    #オブジェクトノードノードの設定
    node_2 = mast.CreateNode(rootnode, c4d.ID_OPERATOR_OBJECT, x = 130, y = 0)   
    node_2[c4d.GV_OBJECT_OBJECT_ID] = op
    in_port = node_2.AddPort(c4d.GV_PORT_INPUT, c4d.ID_BASEOBJECT_GLOBAL_POSITION)
   
    #node_1の出力とnode_2の入力を連結
    out_port.Connect(in_port)
   
   
if __name__ == '__main__':
    main()
    c4d.EventAdd()

これで、何か面白いものを作ってみてください…

そう言えば…
記事のタイトルが、設定済みXPressoタグ付きヌルオブジェクト…
でしたが、XPressoタグ付きヌルオブジェクトを追加してからXPressoを設定してますけど…
許してください…

ま、BaseDocument.InsertObject()を最後にすれば、タイトル通りだけど…

|

« C4D Python R13 テスト:PythonでXPressoタグを試してみた。#4:ポートの変数型を調べる。 | トップページ | 更に久々… »

コメント

コメントを書く



(ウェブ上には掲載しません)




« C4D Python R13 テスト:PythonでXPressoタグを試してみた。#4:ポートの変数型を調べる。 | トップページ | 更に久々… »