リモートからの MEL コマンド実行
リモートからの実行方法
Maya上でポートを開くことによって、Maya 以外のプロセスから MEL コマンドを実行できるようになります。
commandPort
Maya 上で外部から接続するポートを開くには maya.cmds.commandPort() を使用します。
(使用例)
- maya.cmds.commandPort()
- 引数無しで関数を実行するとデフォールトで /tmp/mayaCommand に
UNIX ドメインソケットが作られます。(Linux)
- maya.cmds.commandPort(name='myMayaCommand')
- /tmp/myMayaCommand に UNIX ドメインソケットを作ります。
- maya.cmds.commandPort(name=':8888')
- Tcp ポート 8888 番にソケットを作ります。
commandPort のフラグ
close=boolean (cl)
- ポートを閉じます。
name=string (n)
- 作成するドメイン ソケット・ポートの名前を指定します。
- string が/または:で始まらない場合は、/tmp/string
にローカル ホストの UNIX ドメイン ソケットを作成します。
- string が/で始まる場合、string は UNIX ドメイン ソケットのフルパスを表します。
- stringが:で始まる数値の場合は、その数値によって指定されたポートを開きます。
noreturn=boolean (nr)
- 実行したコマンドからの結果をスクリプトエディタ(Script Editor)のヒストリウィンドウに表示します。
returnNumCommands=boolean (rnc)
- コマンドを実行しないで、実行されたコマンドの数を返します。
noreturn フラグを指定すると、このフラグは無視されます。
prefix=string (pre)
- 送られたデータを、コマンド string の引数として実行します。
echoOutput=boolean (eo)
- すべてのコマンド出力をコマンド ポートに送信します。
securityWarning=boolean (sw)
- コマンド ポートの入力のセキュリティ警告を有効化します。
bufferSize=int (bs)
- Maya との通信に使用するバッファ サイズを指定します。
デフォルト バッファ サイズは、4096 バイトです。
ポート番号について
ネットワーク上でデータを送信するには、あるアドレス(IPアドレス)のパソコンなどのホストで、
開いているポート(TCPポート)にデータを送ります。
ポートを表すポート番号は、0〜65535までのありますが、
以下のような種類に分けられます。
- 0〜1024
- WELL KNOWN (一般的なポート番号)
普通は変更しません。
- 1025〜49151
- REGISTERED (登録済みポート番号)
アプリケーションで使用します。
- 49152〜65535
- DYNAMIC AND/OR PRIVATE PORTS (自由に使用できるポート番号)
ユーザが自由に使用できます。
Mayaで、MELコマンドを受け取るためのポートを開くには、
WELL KNOWN以外の現在使用されていないポート番号を使用する必要があります。
通常は、1024 より大きい、空いている番号を使用します。
- プロセスとポート番号の対応を記述したファイル
(Linux)
/etc/services
(Windows)
%WINDIR%/System32/drivers/etc/services
- 使用中のポート番号を調べるコマンド
(Linux)
% netstat -anp
(Windows)
% netstat -an
実行例 (Linux)
以下に、Linux においてローカルホストのポート8888番を使用した、スクリプト例をあげておきます。
- 以下のPythonスクリプトを rmc.py というファイル名で保存します。
import socket
import sys
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8888))
com = sys.stdin.read()
com = com.replace('\n', '')
sock.send(com)
s = sock.recv(4096)
print(s)
- Mayaを起動し、スクリプトエディタのPythonタブで以下の関数を実行します。
import maya.cmds
maya.cmds.commandPort(name=':8888')
- MEL コマンドを rmc.py を通して Maya に送って実行させます。
シェル上で、以下のコマンドを実行します。
% echo sphere | python rmc.py
nurbsSphere1 makeNurbSphere1
- Maya のシーンに NURBS の球体が作成されます。
スクリプトの解説
import socket
- socket モジュールをインポートします。
TCP/IP によって通信するために必要です。
import sys
- sys モジュールをインポートします。
MEL コマンドを読み込むために必要です。
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- ソケットを開きます。
socket.AF_INET
- IPv4プロトコルを表します。
アドレスの指定を (ホスト名, ポート番号) の形で行ないます。
socket.SOCK_STREAM
- 接続を、TCPのバイトストリーム指向によって行ないます。
sock.connect(('localhost', 8888))
- ソケットを、ローカルホスト(localhost)の 8888 番ポートに接続します。
com = sys.stdin.read()
- 標準入力からデータを読み込みます。
この場合のデータは、MELコマンドである必要があります。
com = com.replace('\n', '')
- データ中の改行('\n')を取り除きます。
こうしないと、プロシージャなどが正しく実行されません。
sock.send(com)
- ソケットにデータを送ります。
s = sock.recv(4096)
- MayaからMELコマンドを実行した結果を受け取り、文字列 s に代入します。
受け取るデータの大きさは最大 4096 バイトです。
print(s)
- 結果を表示します。
Windowsにおける注意
Windowsでは、ファイアウォールによって、ポートへのデータ送信がブロックされていることがあります。
その場合は、
コントロールパネル → セキュリティセンター → Windows ファイアウォール
ウィンドウで 有効 にチェックを入れて、
例外タブで、Mayaを追加してください。(Windows XP)
参考
- Maya
Maya, MEL 関係(Tips, FAQ, コマンド)のページ
Prev
Home | Contents
Mail