« C4D Python R12 テスト:マウスポインタを変更してみる。 | トップページ | ダイアログ付きC4D Python スクリプトを作る時の参考に… »

C4D Python R12 テスト:スプラインのハンドルの長さを2倍にしてみる。

ハンドルの調整をすると言う事は、スプラインタイプは自ずとベジエと言う事になりますね。
今回は、スプラインオブジェクトを生成するのではなく、選択したスプラインオブジェクトのハンドルの長さを2倍にします。

Bzspline_x2_01

Python
"""
ベジエスプラインのハンドルの長さを2倍にする。
2011.3.18
"""


import c4d

def main():
    #アクティブオブジェクトがスプラインオブジェクトでなければ中断
    if not isinstance(op, c4d.SplineObject):
        return
    #スプラインオブジェクトがベジエでなければ中断
    if op[c4d.SPLINEOBJECT_TYPE] != c4d.SPLINETYPE_BEZIER:
        return

    scl = 2.0 #倍率
    tgc = op.GetTangentCount() #ハンドル数の取得
    for c in xrange(tgc):
        tgs = op.GetTangent(c) #ハンドルの取得
        op.SetTangent(c, tgs['vl']*scl, tgs['vr']*scl) #ハンドルをスケーリングして適用
    op.Message(c4d.MSG_UPDATE) #スプラインオブジェクトの更新


if __name__ == '__main__':
    main()
    c4d.EventAdd() #c4dを更新

実行すると、選択したベジエスプラインのハンドルの長さを2倍にします。
ただし、このままではオブジェクトの選択は1つのみにしか対応できません。

複数選択されたオブジェクトの内、ベジエスプラインのみを抽出してハンドルの長さを2倍にしてみよう。

Bzspline_x2_02

Python
"""
複数選択ベジエスプラインのハンドルの長さを2倍にする。
2011.3.18
"""


import c4d
from c4d import Document

#複数選択されたオブジェクトの中からベジエスプラインの抽出
def GetBezierSplineObject():
    BzSplines=[] #抽出用リスト
    for objs in doc.GetSelection():
        if isinstance(objs, c4d.SplineObject):
            if objs[c4d.SPLINEOBJECT_TYPE] == c4d.SPLINETYPE_BEZIER:
                BzSplines.append(objs) #ベジエオブジェクトをリストへ追加
    return BzSplines

def main():
    sel_objs = GetBezierSplineObject() #複数選択されたベジエのみの取得
    scl = 2.0 #倍率

    for obj in sel_objs:
        tgc = obj.GetTangentCount() #ハンドル数の取得
        for c in xrange(tgc):
            tgs = obj.GetTangent(c) #ハンドルの取得
            obj.SetTangent(c, tgs['vl']*scl, tgs['vr']*scl) #ハンドルをスケーリングして適用
        obj.Message(c4d.MSG_UPDATE) #スプラインオブジェクトの更新


if __name__ == '__main__':
    main()
    c4d.EventAdd() #c4dを更新

これで、複数選択のベジエスプラインに対応できるわけですが…
できる事なら、選択されたポイントにも対応したいよね。

Bzspline_x2_03

Python
"""
複数選択ベジエスプラインの選択されたポイントのハンドルの長さを2倍にする。
2011.3.18
"""


import c4d
from c4d import Document

#複数選択されたオブジェクトの中からベジエスプラインの抽出
def GetBezierSplineObject():
    BzSplines=[] #抽出用リスト
    for objs in doc.GetSelection():
        if isinstance(objs, c4d.SplineObject):
            if objs[c4d.SPLINEOBJECT_TYPE] == c4d.SPLINETYPE_BEZIER:
                BzSplines.append(objs) #ベジエオブジェクトをリストへ追加
    return BzSplines


def main():
    sel_objs = GetBezierSplineObject() #複数選択されたベジエのみの取得
    scl = 2.0 #倍率

    for obj in sel_objs:
        tgc = obj.GetTangentCount() #ハンドル数の取得
        sel_pts = obj.GetPointS() #スプラインのBaseSelectの取得
        for c in xrange(tgc):
            if sel_pts.IsSelected(c): #選択されたポイントならば
                tgs = obj.GetTangent(c) #ハンドルの取得
                obj.SetTangent(c, tgs['vl']*scl, tgs['vr']*scl) #ハンドルをスケーリングして適用
        obj.Message(c4d.MSG_UPDATE) #スプラインオブジェクトの更新


if __name__ == '__main__':
    main()
    c4d.EventAdd() #c4dを更新

これで、複数選択ベジエ/選択ポイントにも対応できたわけだね。
ベジエハンドルの変更には十分ですが、他の大事なことが抜けてますけどね。

|

« C4D Python R12 テスト:マウスポインタを変更してみる。 | トップページ | ダイアログ付きC4D Python スクリプトを作る時の参考に… »

コメント

コメントを書く



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




« C4D Python R12 テスト:マウスポインタを変更してみる。 | トップページ | ダイアログ付きC4D Python スクリプトを作る時の参考に… »