【Maya】ノードのコピペの仕組みと活用

この記事はMaya Advent Calendar 2020の10日目の記事です。

はじめに

Mayaでこんな感じのシーンがあったとして…
f:id:tm8r:20201209133256p:plain

pSphere1とpCube1をコピーしてペーストすると…
f:id:tm8r:20201209133322p:plain

このようになります。
グループが新規作成され、その下に「pasted_」接頭辞がついた形でコピーしたノードがペーストされています。

Mayaを複数立ち上げて1つ目のMayaでコピー、2つ目のMayaでペーストしても同じ挙動を得ることができます。
果たしてどんな仕組みで実現しているのでしょうか。

仕組みを調べてみる

というわけで助けてwhatIs。

whatIs cutCopyPaste;
// Result: Mel procedure found in: C:/Program Files/Autodesk/Maya2019/scripts/startup/cutCopyPaste.mel //

詳しくは実際に読んでみていただければと思いますが、ざっくりいうと

  • コピー実行時にTempディレクトリにシーンファイルを出力
  • ペースト実行時に「maya_sceneClipBoard.m」で始まる更新日時の新しいファイルをグループつき、「pasted_」接頭辞つきでインポート

というようなことをしています。

シーンファイルの拡張子はmaシーンでコピーすればmaに、それ以外(未保存のシーンで実行した場合も含む)は基本的にmbになります。
(※MayaLTの場合はmlt)

ちなみにTempディレクトリはWindowsだと以下になります。

C:/Users/{ユーザー名}/AppData/Local/Temp/

なるほどー。
これならMayaを複数立ち上げていても同じ挙動するのは納得ですね。

活用してみる

グループを追加せず、「pasted_」接頭辞もなしにインポートすれば、純粋なコピペにできそうですね。

import glob
import os

tmp_dir = cmds.internalVar(userTmpDir=True)
copied_files = sorted([x for x in glob.glob(tmp_dir + "/maya_sceneClipBoard.m*")], key=lambda f: os.stat(f).st_mtime, reverse=True)
copied_file = copied_files[0]

pythonならこんな感じにすればコピーによって生成されたファイルを取得できます。

あとは単純にこれをインポートすればよいので、コピーはMaya標準機能にまかせて、ペースト機能だけを実装すれば期待する挙動にできます。やったぜ。

おわり

アドカレ連日埋めてしまった。
果たして完走できるのか…!

スポンサーリンク