C4D.PYTHON: PYTHONオブジェクトで軸位置を底面の立方体を作る2

さて前回はPythonジェネレータで立方体を作って、上に移動するまでやりました。ただ、これだと立方体は常に同じ形なので、プリミティブと同じようにサイズを変更できるようにします。



ユーザデータの作成

立方体のサイズを変更できるように、立方体のサイズや分割数などに当たるユーザデータを作成します。ユーザデータはPythonジェネレータを選択して、属性マネージャのユーザデータのメニューからユーザデータの管理を選んで一つ一つ作成していけますが、面倒なので立方体からコピーしてきます。立方体を選んで、属性マネージャでコピーしたいパラメータ名をShiftキーを押しながらクリックして、名前がオレンジ色になるようにします。その状態で右クリックでユーザインタフェース/ユーザインタフェースをコピーを選びます。

それからPythonジェネレータを選んで属性マネージャのユーザデータメニューからユーザインタフェースをペーストを選びます。

するとユーザデータを管理のウインドウが開かれ、ユーザーデータがすべて追加されます。

この中のXYZは、サイズの中に含まれているので削除します。また、分かりやすいようにパラメータを追加してデータタイプをセパレータにして、サイズや分割、フィレットを分けます。

OKをしてダイアログを閉じると、Pythonジェネレータにユーザデータが追加されます。

サイズのデフォルトが0のままだと困るので、デフォルトの設定をするために再度ユーザデータメニューからユーザデータを管理を選びます。ダイアログのサイズを選びデフォルト値を200にしてOKを押して閉じます。

これで準備は完了です。

ユーザデータを反映させた立方体の作成

ユーザデータを参照して立方体を作成するコードがこちらになります。

import c4d
#Welcome to the world of Python


def main():

    size = op[c4d.ID_USERDATA,2]    #立方体のXYZのサイズを取得
    sizey = size[1]     #Yのサイズだけを取得

    #分割数を取得
    sbx = op[c4d.ID_USERDATA,3]
    sby = op[c4d.ID_USERDATA,4]
    sbz = op[c4d.ID_USERDATA,5]
    
    #ユーザデータに応じた立方体を作成
    obj = c4d.BaseObject(c4d.Ocube)
    obj[c4d.PRIM_CUBE_LEN] = size
    
    obj[c4d.PRIM_CUBE_SUBX] = sbx
    obj[c4d.PRIM_CUBE_SUBY] = sby
    obj[c4d.PRIM_CUBE_SUBZ] = sbz
    
    #Yの位置を変更
    obj[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y] = sizey/2

    return obj

ユーザデータの取得

ユーザデータのパラメータの取得は、c4d.ID_USERDATAでできます。ただ、どのオブジェクトのユーザデータを指定するため、オブジェクト指定する変数[c4d.ID_USERDATA,ユーザデータのID]という記述にします。

オブジェクトを指定する変数ですが、これは現在選択されているオブジェクトを変数に入れればいいのですが、記述しているPythonエレメント自身は非常によく使うためあらかじめ「op」として設定されていますので、ここではそのまま「op」と書きます。ですので、Pythonタグでスクリプトを記述しているなら、「op」はPythonタグになります。

どのIDかはその次の番号で指定します。IDはユーザデータの管理のウインドウで確認できます。

ユーザデータを変数化

    size = op[c4d.ID_USERDATA,2]    #立方体のXYZのサイズを取得
    sizey = size[1]     #Yのサイズだけを取得

sizeという変数に立方体のXYZのサイズを入れます。サイズのユーザデータは3つの数字がまとまったベクトルタイプなので、これ一つでXYZを取得できています。後から高さの値を使いたいので、sizeyという変数を作成してここにsizeのベクトルからYの値を抜き出します。ベクトルタイプの変数から一つの数字を取得するには、「変数[ID]」という入力すると取得できます。IDはベクトルがXYZの場合、X=0/Y=1/Z=2になっているので、ここではsize[1]と記述しています。

    #分割数を取得
    sbx = op[c4d.ID_USERDATA,3]
    sby = op[c4d.ID_USERDATA,4]
    sbz = op[c4d.ID_USERDATA,5]

分割数もそれぞれ変数化します。subdivideということでsb+xyzということで変数名を決めました。

立方体にパラメータを挿入

    #ユーザデータに応じた立方体を作成
    obj = c4d.BaseObject(c4d.Ocube)
    obj[c4d.PRIM_CUBE_LEN] = size
    
    obj[c4d.PRIM_CUBE_SUBX] = sbx
    obj[c4d.PRIM_CUBE_SUBY] = sby
    obj[c4d.PRIM_CUBE_SUBZ] = sbz

まずは、立方体を作成します。次に、サイズと分割数の値を立方体に入れます。入れ方は、

立方体の変数[入れたい立方体のパラメータ] = 入力するパラメータの変数

という形で記述します。入れたい立方体のパラメータはスクリプトログやコンソールで取得してもいいですし、立方体のパラメータを直接pythonエディタにドラッグ&ドロップしても持っていけます。

立方体の位置を変更する

    #Yの位置を変更
    obj[c4d.ID_BASEOBJECT_REL_POSITION,c4d.VECTOR_Y] = sizey/2
    return obj

最後に軸の位置を底面にするために、立方体の高さの半分だけ立方体を上に移動します。ここで最初に作っておいた変数sizeyを使います。sizeyは立方体の全体高さなので、これを2で割って値を立方体のY座標に入れてから、サイズと位置などが決まった立方体の変数objをreturnで返して完了です。

One thought on “C4D.PYTHON: PYTHONオブジェクトで軸位置を底面の立方体を作る2

Comments are closed.