Maya コントローラー作成 : 複数カーブを1トランスフォームに統合 Python

import maya.cmds as cmds

def merge_curves_to_one_ctrl(name="ctrl_combined#"):
    sel = cmds.ls(sl=True, long=True) or []
    if not sel:
        cmds.warning("NURBSカーブを選択してくれ")
        return None

    # nurbsCurveシェイプを持つトランスフォームだけ
    xforms = []
    for n in sel:
        shapes = cmds.listRelatives(n, s=True, ni=True, f=True) or []
        if any(cmds.nodeType(s) == "nurbsCurve" and not cmds.getAttr(s+".intermediateObject") for s in shapes):
            xforms.append(n)

    if not xforms:
        cmds.warning("有効なnurbsCurveが見つからんかった")
        return None

    cmds.undoInfo(openChunk=True)
    try:
        ctrl = cmds.group(em=True, name=name)

        for xf in xforms:
            # 親ごと複製(インスタンス/ヒストリ回避)
            dup = cmds.duplicate(xf, rr=True, ic=False)[0]

            # まずターゲット(ctrl)の子にする(相対保持)
            cmds.parent(dup, ctrl, r=True)

            # ここでフリーズしてdupローカルに形状を焼く
            cmds.makeIdentity(dup, a=True, t=True, r=True, s=True, n=False)

            # 有効シェイプだけctrl直下へ移植
            dshapes = cmds.listRelatives(dup, s=True, ni=True, f=True) or []
            for ds in dshapes:
                if cmds.nodeType(ds) != "nurbsCurve": 
                    continue
                if cmds.getAttr(ds + ".intermediateObject"): 
                    continue
                cmds.parent(ds, ctrl, s=True, r=True)  # 位置維持で形状だけ上げる

            # 空になったdupは削除
            cmds.delete(dup)

        # 仕上げ:表示系少し整理(任意)
        try:
            # ピボットを中心へ(必要ならコメントアウト)
            cmds.xform(ctrl, cp=True)
        except:
            pass

        cmds.select(ctrl)
        print(u"複数カーブを1トランスフォームに統合:", ctrl)
        return ctrl
    finally:
        cmds.undoInfo(closeChunk=True)

# 実行
merge_curves_to_one_ctrl("ctrl_combined#")

おすすめ