Pyhton
Cinema4D

[Cinema 4D] ボタンの動作について

Cinema 4Dで自作タグプラグインを作成する過程で,ユーザデータに追加したボタンを押したときの動作についてテストを行いました.

Matrixグループに加え,Original Matrixというグループを作成し,GetとSetのボタンとMatrix Originalというマトリックス型データを用意してあります.

20180108-3.jpg

ここでは簡単な動作として,

Getボタン: タグが付いているオブジェクトのマトリックスを取得してMatrix Originalに保存する
Setボタン: Matrix Rootに設定したマトリックスをオブジェクトにセットする

ということを行ってみます.

ボタンを押した時にはボタンを押したことを知らせるメッセージが必要です.これはMSG_DESCRIPTION_COMMANDを使います.Pyhton SDKに次のサンプルが記載されています.

MSG_DESCRIPTION_COMMAND

Here is how to process MSG_DESCRIPTION_COMMAND message:
def Message(self, node, type, data):
  if type==c4d.MSG_DESCRIPTION_COMMAND:
    if data[‘id’][0].id==THE_BUTTON_ID:
      print “Pushed button with command ID”, THE_BUTTON_ID
      return True

if data[‘id’][0].id==THE_BUTTON_ID:の後に続けて固有のボタンIDで分岐させ,それぞれのボタンを押した時の動作を記述していきます.ここではGetボタンを押したとき,get_matrix_obj関数を呼び出します.引数はマトリックスをセットするためのIDとします.

# Get Matrix the object
if data['id'] == idButton[Const.UI_BUTTON_GET]: # GetボタンのID
    print ( data['id'] )
    print ( "Press Button Get" )
    self.ud.get_matrix_obj(Const.UI_MATRIX_DISPLAY_ORIGINAL)

get_matrix_obj関数はTagDataからGetObject().GetMg()でタグが適用されているオブジェクトのマトリックスを取得し,UI_MATRIX_DISPLAY_ORIGINALにセットするだけです.

def get_matrix_obj(self, matrixId):
    ObjMg = self.obj.GetObject().GetMg()
    self.obj[self.idMatrix[matrixId]] = ObjMg

同様にSetボタンの動作も記述します.set_matrix_obj関数へはMatrix Rootを引数として渡し,オブジェクトのマトリックスにセットします.

# Set Matrix the objext
    if data['id'] == self.ud.idButtons[Const.UI_BUTTON_SET]:
        print(data['id'])
        print("Press Button Set")
        self.ud.set_matrix_obj(Const.UI_MATRIX_DISPLAY_ROOT)
def set_matrix_obj(self, matrixIdRoot):
    RootMat = self.obj[self.idMatrix[matrixIdRoot]]
    self.obj.GetObject().SetMg(RootMat)

試しにオブジェクトを適当に移動させて,Getボタンを押して現状のマトリックスをMatrix Originalにセットしておき,Setボタンを押してMatrix Rootに設定したマトリックスをオブジェクトにセットしてみました.

20180108-1.jpg

さらにResetボタンを追加し,Matrix Originalに保管したマトリックスに復帰できるようにしています.

20180108-2.jpg

以上の機能には特に意味があるわけではないのですが...ようやくタグプラグインからオブジェクトに対して何かを行うことができるようになりました.

では,次からはこのタグの最も行いたかった機能である,マトリックス同士を使った行列変換をテストしていきたいと思います.