この記事はMaya Advent Calendar 2020の10日目の記事です。
はじめに
Mayaでこんな感じのシーンがあったとして…
pSphere1とpCube1をコピーしてペーストすると…
このようになります。
グループが新規作成され、その下に「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標準機能にまかせて、ペースト機能だけを実装すれば期待する挙動にできます。やったぜ。
おわり
アドカレ連日埋めてしまった。
果たして完走できるのか…!