« C4D Python R13 テスト:ダイアログのタブを試すの忘れていた… | トップページ | C4D Python R13 テスト:PythonでXPressoタグを試してみた。#2:ノードのポートを取得 »

C4D Python R13 テスト:PythonでXPressoタグを試してみた。#1:ノードの取得

PythonスクリプトからXPressoの処理をする事があるのかは分かりませんが…
ちょっと試してみる。

「Python」ノードの記事ではありません…

適当にオブジェクトを追加して、XPressoタグを取り付けて…

Xpressotag_01

適当に幾つかのノードを配置してみた。

Xpressotag_02

配置した各ノードを取得できれば、Pythonで何らかの処理ができるだろうか?
C4D Python SDKを読んでもピンとこなかったので、適当に試してみる。
とりあえず今回は、ノードが取得できれば良いかな…

Pythonスクリプトで試してみます。
スクリプトマネージャに次のコードを入力します。

オブジェクトに取り付けられたXPressoタグの取得。

Python
import c4d


def main():
    if not op:return
    xpt = op.GetTag(c4d.Texpresso)
    print xpt


if __name__=='__main__':
    main()
<c4d.modules.graphview.XPressoTag object called 'XPresso/XPresso' with ID 1001149 at 0x234D4800>

オブジェクトを選択し実行すると、上記の結果がコンソールに表示される事だろう…

表示された結果からXPressoタグは、c4dモジュールのmodules.graphview.XPressoTagという事が分かる。
SDKのBaseTagのページに書いてあるね。

XPressoTagクラスのメソッドは…

  • __init__()
  • GetNodeMaster() #ノードマスターの取得

この2つだけ…
それで、ノードマスターってナニ者? 「GvNodeMaster」

GvNodeMaster:GvNodeMasterはGvNodeのコレクションを格納します。

「GvNode」って何だろう…?
SDKによると、どうやらこれがXPressoタグを開いたときに表示されるノードのようだ…

XPressoTagからGvNodeMasterを取得して…
GvNodeMasterクラスのメソッドの中から、GvNodeを取得するメソッドは…
えぇ…GetRoot()メソッドね…

では、GetRoot()でルートのGeNodeを取得してみよう。

Python
"""
C4D PythonでXPressoタグを試してみる。
"""

import c4d
from c4d.modules import graphview


def main():
    #アクティブオブジェクトに取り付けられているXPressoタグの取得
    if not op:return
    xpt = op.GetTag(c4d.Texpresso)
    if not xpt:return
   
    #XPressoタグのノードマスターの取得
    mst = xpt.GetNodeMaster()
    print '== node master =='
    print mst
    if not mst:return
   
    #ノードの取得
    root_node = mst.GetRoot()
    print '== node =='
    print root_node


if __name__=='__main__':
    main()
== node master ==
<c4d.modules.graphview.GvNodeMaster object called 'GvNodeMaster/GvNodeMaster' with ID 1001103 at 0x234D4820>
== node ==
<c4d.modules.graphview.GvNode object called 'XGroup/XGroup' with ID 1001102 at 0x234D48F0>

先ほどと同じように実行すると、上記のような結果が表示されます。

ルートノードは、一番外側のXGroupなんだね。

Xpressotag_13

「オブジェクト」ノードや「結果」ノードは、多分XGroupの子となるのだろうね…
GeListNodeクラスを継承しているからGetUp()/GetDown()/GetNext()などが使えるだろう…
とりあえず試してみよう…

Python
"""
C4D PythonでXPressoタグを試してみる。
"""

import c4d
from c4d.modules import graphview


def main():
    #アクティブオブジェクトに取り付けられているXPressoタグの取得
    if not op:return
    xpt = op.GetTag(c4d.Texpresso)
    if not xpt:return
   
    #XPressoタグのノードマスターの取得
    mst = xpt.GetNodeMaster()
    print '== node master =='
    print mst
    if not mst:return
   
    #ノードの取得
    root_node = mst.GetRoot()
    print '== node =='
    print root_node
    if not root_node:return
   
    node = root_node.GetDown()
    while node:
        print node
        node = node.GetNext()
    print '='*14


if __name__=='__main__':
    main()
== node master ==
<c4d.modules.graphview.GvNodeMaster object called 'GvNodeMaster/GvNodeMaster' with ID 1001103 at 0x234D4820>
== node ==
<c4d.modules.graphview.GvNode object called 'XGroup/XGroup' with ID 1001102 at 0x234D48F0>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4900>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4910>
<c4d.modules.graphview.GvNode object called '結果/結果' with ID 1001101 at 0x234D4900>
==============

まぁ、予想通りの結果だったね。

こんなイメージかな…?

Xpressotag_08

ヌル2個は、「オブジェクト」ノードだよ…

XGroupが複数設定されていると、やはりそのXGroupの子になるのだろうか…?

Xpressotag_03

とりあえず、上のスクリプトをそのまま実行してみると…

== node master ==
<c4d.modules.graphview.GvNodeMaster object called 'GvNodeMaster/GvNodeMaster' with ID 1001103 at 0x234D4600>
== node ==
<c4d.modules.graphview.GvNode object called 'XGroup_1/XGroup' with ID 1001102 at 0x234D4900>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4910>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4920>
<c4d.modules.graphview.GvNode object called '結果/結果' with ID 1001101 at 0x234D4910>
<c4d.modules.graphview.GvNode object called 'XGroup_2/XGroup' with ID 1001102 at 0x234D4920>
==============

結果は、2個目のXGroup内の「オブジェクト」ノードや「コメント」ノードは取得できていないね。

Xpressotag_11

GetNext()では取得できないという事は、やはり更に階層になっているのか…?

Xpressotag_12

そうすると、XGroup_2からGetDoun()で階下層を取得する…

では、次のように変更して確認してみる。

Python
"""
C4D PythonでXPressoタグを試してみる。
"""

import c4d
from c4d.modules import graphview


def main():
    #アクティブオブジェクトに取り付けられているXPressoタグの取得
    if not op:return
    xpt = op.GetTag(c4d.Texpresso)
    if not xpt:return
   
    #XPressoタグのノードマスターの取得
    mst = xpt.GetNodeMaster()
    print '== node master =='
    print mst
    if not mst:return
   
    #ノードの取得
    root_node = mst.GetRoot()
    print '== node =='
    print root_node
    if not root_node:return
   
    node = root_node.GetDown()
    while node:
        print node
        if node.GetDown(): #子オブジェクトがあれば…
            node = node.GetDown()
        elif node.GetNext(): #次のオブジェクトがあれば…
            node = node.GetNext()
        else: #子オブジェクトも次のオブジェクトが無ければ…
            node = node.GetUp().GetNext()
    print '='*14


if __name__=='__main__':
    main()
== node master ==
<c4d.modules.graphview.GvNodeMaster object called 'GvNodeMaster/GvNodeMaster' with ID 1001103 at 0x234D45D0>
== node ==
<c4d.modules.graphview.GvNode object called 'XGroup_1/XGroup' with ID 1001102 at 0x234D4600>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4820>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4920>
<c4d.modules.graphview.GvNode object called '結果/結果' with ID 1001101 at 0x234D4820>
<c4d.modules.graphview.GvNode object called 'XGroup_2/XGroup' with ID 1001102 at 0x234D4920>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4820>
<c4d.modules.graphview.GvNode object called 'コメント/コメント' with ID 1001101 at 0x234D4920>
==============

問題なく2個目のXGroup内の「オブジェクト」ノードと「コメント」ノードが取得できています。

Xpressotag_09

では、2個目のXGroupの「XGroup_2」を複製して「XGroup_3」を作ります。
ここでは、「Ctrl」キーを押しながら「XGroup_2」をドラッグし複製しました。

Xpressotag_04

そのままスクリプトを実行すると、以下のような結果になりました。

== node master ==
<c4d.modules.graphview.GvNodeMaster object called 'GvNodeMaster/GvNodeMaster' with ID 1001103 at 0x234D4660>
== node ==
<c4d.modules.graphview.GvNode object called 'XGroup_1/XGroup' with ID 1001102 at 0x234D4920>
<c4d.modules.graphview.GvNode object called 'XGroup_3/XGroup' with ID 1001102 at 0x234D4820>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4910>
<c4d.modules.graphview.GvNode object called 'コメント/コメント' with ID 1001101 at 0x234D4820>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4930>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4820>
<c4d.modules.graphview.GvNode object called '結果/結果' with ID 1001101 at 0x234D4930>
<c4d.modules.graphview.GvNode object called 'XGroup_2/XGroup' with ID 1001102 at 0x234D4820>
<c4d.modules.graphview.GvNode object called 'オブジェクト/オブジェクト' with ID 1001101 at 0x234D4930>
<c4d.modules.graphview.GvNode object called 'コメント/コメント' with ID 1001101 at 0x234D4820>
==============

「XGroup_2」よりも「XGroup_3」の方が先に取得されています。

Xpressotag_10

結果から分かるように、ノードは追加された順番という事ではないようですね。

|

« C4D Python R13 テスト:ダイアログのタブを試すの忘れていた… | トップページ | C4D Python R13 テスト:PythonでXPressoタグを試してみた。#2:ノードのポートを取得 »

コメント

コメントを書く



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




« C4D Python R13 テスト:ダイアログのタブを試すの忘れていた… | トップページ | C4D Python R13 テスト:PythonでXPressoタグを試してみた。#2:ノードのポートを取得 »