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#")