2024年1月22日月曜日

MAYAのファイル名をクリップボードに書き込む。いわゆるコピーのこと

 Mayaを使っていると現在開いているシーンの名称を使用したいときが、たまにあります。
 例えば、こんなような場面


 Game Exporterを使って FBXを出力するとき、出力ファイル名にシーン名を使いたいときなどです。

 簡単な方法としては、コマンドラインで

basenameEx(`file -q -sn`)

 を実行し、リザルトを選択後 [Ctrl]+[c]でコピー。

 その後テキストフィールドへ[Ctrl]+[v]で貼り付けという方法です。

 何度も同じコードを打たなくて良いように、こんな感じのコードをスクリプトエディタへ記述しておくのも良いでしょう。

{
    string $name = basenameEx(`file -q -exn`);
    print($name);
    
}

 しかし、大量にファイル名を設定しないといけない場合、[Ctrl]+[c],[Ctrl]+[v]の操作も面倒になってきます。
 そこで、上のスクリプトをこんな風に書換えます。

{
    string $name = basenameEx(`file -q -exn`);
    system("echo "+$name+" | clip");
    
}

 3行目の printコマンドを、シェルを実行する systemコマンドに変え、ファイル名表示(echo)の結果を clipというクリップボードへ書き込むコマンドに渡しています。

 echoの代わりに SETを使って変数へ代入したものを渡すのも良いかもしれません。

    system("SET /P TMP=\"+$name+"\" < nul | clip");

 この SET /P を使うと、改行コードを含まなくなるので、より安全にクリップボードに格納することが出来ます。
 confirmDialogのメッセージをコピーするボタンを追加したりしたときなどに役立つかもしれません。


 ここまでは、clipコマンドへ |(パイプ)することでクリップボードに記録していましたが、clipコマンドには、この書式の他にも、リダイレクトすることでテキストファイルの内容をクリップボードに送ることが可能です。

たとえば、テクスチャのファイルパスをコピーする場合、

{
    // ファイルノードをリスト化
    string $files[]=`ls -typ "file"`;
    
    // テクスチャをリスト化
    string $lines[];
    for($file in $files) $lines[size($lines)]=`getAttr ($file+".ftn")`;
    
    
    //------------------------------------------------------------------------------
    // 一時ファイルのパス
    string $tmpFile = "/tmpToClipBoard.txt";
    string $tmpdir =`getenv TMPDIR`;
    string $filePath = ($tmpdir + $tmpFile);
    
    // ファイルへ一時保存
    fwriteAllLines($filePath, $lines);
    
    
    //------------------------------------------------------------------------------
    // クリップボードへ転送
    system("clip<"+$filePath);
    
}

のようにファイルへ一時的に保存し、そのファイルパスを Clipコマンドへ送ることで内容をクリップボードへ格納しています。
 ただ、テンポラリフォルダにファイルが残ってしまうので、スクリプトの最後に

    // 一時ファイルの削除
    sysFile -del $filePath;
    
}

を追加しても良いかもしれません。


 ここで紹介した clipコマンドは、Windows用のコマンドなので、Linaxの場合にはシェルによって別のコマンドを使用する必要があります。

 Windowsでも、MS-DOSよりモダンな PowerShellを使って操作してみるのも良いかもしれません。



0 件のコメント:

コメントを投稿