株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • 楽しいmayaハッキング(誤ペースト撲滅委員会)

楽しいmayaハッキング(誤ペースト撲滅委員会)

2013/5/27

Tag: ,,,

今回で3回目になります、たつみ(@mtazmi)です

DFに来て1年が過ぎましたが、すでに3年ぐらいいる気がしています笑
振り返ると密度の濃い1年でしたが、今年もいろんなことにチャレンジしていきたいと思います

さて仰々しいタイトルで始まりましたが、maya に不正アクセスしたりする内容ではありません
日ごろ maya を利用していて不便に思っている部分をカスタマイズしたい場合に、
どのような手順で行っていけばいいかという流れについて、簡単ですが解説していきたいと思います

それでは今回のお題、誤ペースト撲滅委員会編 はじまりはじまり~


 

はじめに

 みなさんはノード名の修正をしているときなどに、
 うっかりビューポートで Ctrl + v してなんだか分からないノードが出来たことは無いでしょうか?

 こんな感じに新しく Group が出来て、その下に pasted__ から始まる名前のノードがぶら下がっているやつ、、、
 

どこの馬の骨だ!

 もはやいつ作ったデータなのかも分かりません


 

気になることはとことん調べてみましょう

 ● コピーしたノードは、今開いている maya を終了しても次回起動時にペースト出来る
 (それがいつのか分からないノードがペーストされる原因…)

 ● テキストエディタや PhotoShop など他のツールにはペースト出来ない → クリップボードに送っているわけではない?
 
 (ユーザーガイドにクリップボードって書いてあるじゃん…)

 ● maya のバージョンすら飛び越えてペースト出来る
 
 (これはこれですごい笑)


 

コピー、ペーストの動作ってどうなってるの?

 妙な挙動だということは分かったので、実際何が行われているか調べてみましょう!

Script Editorで調べてみる

  Script Editor を開き、History → Echo all commands をオンにしておきます
  (これをオンにしないと、一部表示されないログがあります)
  

  それっぽいコマンドがいますね
  

whatIsで調べてみる

  ではそのコマンドたちに何者なのか問い詰めるため、MELのタブで、whatIs 調べたいもの; と打って実行します
  (whatIs は調べたいものがビルトインコマンドか、MEL/pythonスクリプト、変数かどうかを
   教えてくれる便利なコマンドです)
  

  CopySelected はよく分からない返答でしたが、
  cutCopyPaste はmaya本体のMELスクリプトの場所が返ってきました。
  とりあえずこれを探ってみましょう
  

MELを調べてみる

  出てきたパスのMELスクリプトを開き、cutCopyPaste 関数を探します
  長いので必要なとこだけ抜粋します
  

global proc cutCopyPaste (string $operation){
    // $operation:  cut
    //              copy
    //              paste

        ~中略~

    switch ($option){

        ~中略~

    case "nodes":
        if ($operation == "cut"){
            cutCopyScene 1;
        } else if ($operation == "copy"){
            cutCopyScene 0;
        } else {
            pasteScene;
        }
        break;

    case "none":
        // nothing selected - nothing required but a warning
        warning( (uiRes("m_cutCopyPaste.kNothingIsSelected")) );
        break;
    }
} 

 

  ↑ が呼んでいる関数 ↓
  

global proc cutCopyScene (int $cut){
    
    string $fileExt  = ".mb";
    string $fileType = "mayaBinary";
    if (`about -evalVersion`) {
        $fileExt  = ".mp";
        $fileType = "mayaPLE";
    }

    // determine temp directory
    string $tmpFile = "/maya_sceneClipBoard" + $fileExt;
    string $tmpdir = `getenv TMPDIR`;
    string $filePath = ($tmpdir + $tmpFile);
    
    // export selected nodes
    file -force
        -exportSelected 
        -constructionHistory true
        -channels true
        -expressions true
        -constraints true
        -shader true
        -type $fileType
        $filePath;
    
    // delete nodes if user asks for cut
    if ($cut){
        delete;
    }
}

  

global proc pasteScene(){
    
    string $fileExt = ".mb";
    if (`about -evalVersion`) {
        $fileExt = ".mp";
    }

    // determine temp directory
    string $tmpFile = "/maya_sceneClipBoard" + $fileExt;
    string $tmpdir = `getenv TMPDIR`;
    string $filePath = ($tmpdir + $tmpFile);
    
    // import scene
    string $newTransforms[] = `file -force
        -import
        -renameAll true
        -renamingPrefix "pasted_"
        -groupReference
        -returnNewNodes
        $filePath`;
    
    select -replace $newTransforms;
    select -replace `ls -sl -head 1`;
}

エクスポートセレクションとインポートかよ!!

  すいません、取り乱しました
  どうやら tempフォルダに maya_sceneClipBoard.mb を作ってるだけみたいです
  
  うん、いたいた(MayaClashLogを添えて)

  むしろ、エクスポートセレクションとインポートという動作ということが
  分かったので安心して使えます


 

誤爆対策をしよう

 とはいえ、まだ手が滑って意図しない Ctrl + v を押してしまう事故は避けられません
 そもそも、確認も無しにペーストするのが問題だと思うのでそこを直してしまいます

修正スクリプトを配置する

  まず、先ほどのスクリプトを以下のような起動時にスクリプトを読み込んでくれる場所にコピーします
  こうしておく事でmaya本体のMELは保持しつつ、起動時に関数が上書きされてるようになります
  C:\Users\ユーザー名\Documents\maya\2012-x64\scripts

  そして、pasteScene 関数を以下のように加工します(色が付いているのが書き加えた部分です)
  ペーストアクションが起きたら、確認ダイアログを出し、Yes ならペースト、No ならしないで終わらせます

  

global proc pasteScene(){
    string $check = `confirmDialog -title "確認"
                                   -message "ペーストしますか?"
                                   -button "Yes"
                                   -button "No"
                                   -defaultButton "Yes"
                                   -cancelButton "No"
                                   -dismissString "No"
                                   -icon "information"`;

    if($check == "Yes"){
        string $fileExt = ".mb";
        if (`about -evalVersion`) {
            $fileExt = ".mp";
        }

        // determine temp directory
        string $tmpFile = "/maya_sceneClipBoard" + $fileExt;
        string $tmpdir = `getenv TMPDIR`;
        string $filePath = ($tmpdir + $tmpFile);
        
        // import scene
        string $newTransforms[] = `file -force
            -import
            -renameAll true
            -renamingPrefix "pasted_"
            -groupReference
            -returnNewNodes
            $filePath`;
        
        select -replace $newTransforms;
        select -replace `ls -sl -head 1`;
    }
    else{
        print "ペーストはキャンセルされました\n";
    }
}

  ペースト時に確認ダイアログが出て意図しない場合はキャンセルすることが出来るようになりました
  


 

 このように、ある動作はどんなコマンドが呼ばれているか、そのコマンドはどんなコードで動いているかを知れば、
 mayaのカスタマイズの第一歩になります。

 mayaのカスタマイズについては、Autodesk の AREA でも紹介されていますのでぜひ参考にしてみてください。
 読んで触ってよくわかる!Mayaを使いこなす為のAtoZ
 ・第34回:テクスチャの情報を調べてみよう(1/3)
 ・第35回:テクスチャの情報を調べてみよう(2/3)アトリビュートエディタの仕組み
 ・第36回:テクスチャの情報を調べてみよう(3/3)アトリビュートエディタに表示しよう



 ただし、maya本体の機能に手を入れることになりますので細心の注意をはらい、
 何か問題が起きたらすぐに配置したスクリプトを削除するなどの対応をお願いします


 

おまけ

 そもそもコピペ自体いらない!という人は、以下の方法でそもそも無いものとしてしまうことも出来ます

 Windowメニュー → Settings/Preferences → Hotkey Editor

 Edit → CopySelected → Ctrl+c の部分を選択して、【Remove】ボタン

 Edit → PasteSelected → Ctrl+v の部分を選択して、【Remove】ボタン

 この記事全てをくつがえしますけど、こっちのほうがいいかもしれませんね笑

 



 ※免責事項※
 本記事内で公開している全ての手法・コードの有用性、安全性について、当方は一切の保証を与えるものではありません。
 これらのコードを使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
 自己責任でご使用ください

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*