Cinema 4Dで自作タグプラグインを作成する過程で,ユーザデータに追加したボタンを押したときの動作についてテストを行いました.
Matrixグループに加え,Original Matrixというグループを作成し,GetとSetのボタンとMatrix Originalというマトリックス型データを用意してあります.
ここでは簡単な動作として,
Getボタン: タグが付いているオブジェクトのマトリックスを取得してMatrix Originalに保存する
Setボタン: Matrix Rootに設定したマトリックスをオブジェクトにセットする
ということを行ってみます.
ボタンを押した時にはボタンを押したことを知らせるメッセージが必要です.これはMSG_DESCRIPTION_COMMANDを使います.Python SDKに次のサンプルが記載されています.
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に設定したマトリックスをオブジェクトにセットしてみました.
さらにResetボタンを追加し,Matrix Originalに保管したマトリックスに復帰できるようにしています.
以上の機能には特に意味があるわけではないのですが...ようやくタグプラグインからオブジェクトに対して何かを行うことができるようになりました.
では,次からはこのタグの最も行いたかった機能である,マトリックス同士を使った行列変換をテストしていきたいと思います.