逆引きmayaCommand辞典

renderableカメラを取得する

renderableかどうかのチェックは、カメラノードのアトリビュート renderable のチェックボックス。
なので、リストしたい場合は、シーン内のカメラをリストして、renderableが1になっているものを返すようにする。

Back To Top

キーフレームが打たれているフレームを取得する

特定のノードのキーフレームの位置をすべて見つける方法がわからなかったので、ジェネレーターのテストを兼ねてコマンド書いてみました。
キーを見つける自体は、findKeyframe でできますが、 探す方向は、 はじめ・最後・指定フレームの次 等と少々使いづらい。
ので、ジェネレーターで スタートフレームから次のキーフレーム位置を返してくれるようにしました。

使い方

キーフレームが打たれているフレームに対してなにか処理をしたい場合なんかに便利かな?

Back To Top

シーン内のテクスチャをまとめてリロードする

fileノードのリロードを押した時に実行されるのが、 AEfileTextureReloadCmd ”FIleNodeName.fileTextureName”;

ls -type で、シーン内のFileノードをリストして、リストしたノードに対して↑コマンドを実行。

Back To Top

DrivenKeyを設定する

driverは、-cd (ノード名.アトリビュート)
drivenは、コマンドの最後に ノード名.アトリビュート

値は、
driver は -dv num
driven は -v num

接線は -itt -ott で設定する。

Back To Top

Select Objects With Materials のコマンド

<Shader名> を、選択したいシェーダー名に置き換えると、SelectObjectsWithMaterialsと同じ効果になる。

Back To Top

指定のグループで使用しているテクスチャを取得する

引数は、stringであっても、pymelのTransformオブジェクトであっても大丈夫なように
isinstance で str かどうかをチェックしている。

アサインされているテクスチャを取得する方法は以下のとおり。

1 Meshノードにコネクトされている shadingEngine を取得
2 shadingEngineのsurfaceShaderアトリビュートにコネクトされているシェーダーを取得
3 シェーダーにコネクトされているFileノードを取得
4 Fileノードの fileTextureName アトリビュートを取得

※ サンプルでは 各オブジェクトの connections() 関数を使用しているが、
listConnections() に置き換え可能。

 

Back To Top

PymelでWeight情報を取得する

SkinClusterからWeight情報の取得方法についてとりあえず分かったところまでまとめ。

weightList

weightのset() get()方法は

コンポーネットエディタで見たときの、
vtx が weightList[num]  Influence が weight[1]

weightListとweightの要素数を取得する方法は

*注意点*
↑の添字は、たとえ存在しないところでも、get()することができます。
ただし、一度空のところでもget()すると、 .get(size=True) したときの最大数が、空の
添字になってしまいます。
(0~2 のweightがあるときに .weight[4].get() をすると、次に .get(size=True) したときは
5 が帰ってきます)

.get(size=True) で帰ってくるのは「要素数」なので1からカウントします。
添字は0から開始なので、ループで回すときは range(0,num) のように、0から開始です。

Back To Top

pymelで2ノードの間の距離を取得する

念のため、文字列でもOKなように isinstance(name,str) で判定入り。
getTranslate() のReturnは Vector型。

Vector型は、 – や + で計算が可能なので、 A – B で2点間のベクトルを取得して
Vector.length()で長さを取得する。

Back To Top

fileOpen時のWarningを表示しない設定

pymelのHelpには書いてないですが、 prompt=False を入れるとwarning表示が消されるようです。

Back To Top

選択しているノードの頭・後ろに文字を追加リネーム

 

リネーム方法は、 obj.rename(リネーム後)
文字列の前に や 後に 文字を挿入したい場合は、正規表現を使用する。
文字列の先頭を表すのが ^ 末尾を表すのが $
pythonで正規表現を使用したい場合は、 re というモジュールを使用。

re.sub(正規表現,変更後,変更する文字列) で、指定の文字列を置換する。

選択しているノードの子供すべてに 実行したい場合は、

listRelatives(ad=True,c=True) を使用して、子ノードすべてを取得して、同じように rename()する
ループ文を実行すればOK。

Back To Top

pymelでBoundingBoxの大きさを取得する

pymelでBoundingBoxを取得する場合は、
まず、 TransformObj.getBoundingBox()  でBoundingBoxのクラスオブジェクトを取得する。
高さを取得する場合は height() 幅は width() 奥行きは depth() で、それぞれBoundingBoxの大きさを取得。

melの場合は、 exactWorldBoundingBox $objName;
この場合の戻り値は、 xmin、ymin、zmin、xmax、ymax、zmax の配列なので、コレを元に長さを計算する
必要がある。

 

Back To Top

PolygonMeshのFaceをカーブ化する

polyToCurveコマンドを使用すると、選択しているEdgeをCurveにすることができる。
ので、選択しているMeshから構成するFaceを取得して、Faceを構成しているEdgeを取得
取得したEdgeを選択して、polyToCurve でカーブを生成する。

生成されたカーブは、元のメッシュとヒストリがつながっているので、
Meshを動かすとCurveもついてきます。

Back To Top

pymelでDrivenKeyの値を取得する

DrivenKeyのノードは animCurveU* とついている4つのノード。
アクセス方法は、基本通常のKeyと変わらない。
ただし、入力側がTimeではなくValueのため getTime(index) ではなくgetUnitlessIntpu(indes)になる。
indexは0スタート。

名称未設定 1

animCurveのAttributeに表示されているKeys。
左側の数字が getValue や getTime や getUnitlessInput するときの引数になるindex
しゅとくするコマンドは画像の通り。

Back To Top

pythonのコマンドをSourceする

mayaでPythonを読み込む際は、 sys.path.append(dir)でパスを通し、 import する必要がある…と思っていましたが
上記の方法でも .pyファイルを、melのsourceと同じように実行することができるようです。

Back To Top

不要なBindPoseを削除する

SkinClusterにコネクションが無いBindPose(DagPose)はいらないもの。
なので、シーンに存在するDagPoseをリストして、SkinClusterのコネクション数を調べ
0(存在しない)の場合はDagPoseノードを削除する

Back To Top

カレントパネルをワイヤーフレーム表示にする

 

Back To Top

2つのノードの間のコネクションを取得する

 
*補足*
connectionsでノードを取得する場合、 (input,output) で結果が帰ってくるのでは無く、
(thisNode,otherNode) で帰ってきてしまうので、
isSource() で 自分自身がinput側なのかoutput側なのかをチェックして、
(input,output) になるようにしてから結果を返す

Back To Top

pythonでプロジェクトセットする

Mayaのプロジェクトを制御するには workspace コマンドを使用します。
現在のプロジェクトを取得するのが
プロジェクトをセットするのが
このままだと、プロジェクト以下の構造が作成されていない(workspace.mel)ので、
mc.workspace(fr=(name,dir_name))
コマンドを使用して、主要な部分を登録し保存します。

Back To Top

アニメーションカーブの数値をまとめて変更する

AnimCurveノードごとにKeyの数を取得して、その数分だけ変更処理をする。
Keyの数値は getValue(index) 変更は setValue(index,value)

Back To Top

オブジェクトの絶対座標を取得する

オブジェクト名を書かない場合は、選択しているオブジェクトの絶対座標が帰ってくる。
-ws のところを -os にすると、オブジェクト空間での座標が帰ってくる。

なお、 xform のコマンド引数の順序には意味があり、 左側(上のサンプルであれば -qから)評価されて その結果が帰ってくる。
ので、
xform -q -t -ws (オブジェクト名)
とすると、ワールド座標系での座標を取ってこれないので注意が必要。

Back To Top

ファイルパスを一括変更する

シーン内のファイルノードをリストして、 fileTextureNameのパスを置換する。

Back To Top

Curveの長さを取得する

Back To Top

blendShapeにターゲットを新しく追加・削除する

ターゲットの追加と削除は blendSahpeコマンドを使うとできるのだが、
とても紛らわしいので扱いやすいようにしたのが上記のコマンド。コマンドはpythonで書いてあるが 全く同じ書き方でmelでも記述可能。

blendShapeコマンドの、 target(t)には、

string: ベース オブジェクト
int: インデックス
string: ターゲット オブジェクト
double: ターゲット値
を、タプル形式でセットして指定する

Back To Top

Curveの色を変える

curveのShapeノードの overrideEnabled にして、overrideColorに1から32までの整数を入れる。
サンプルでは、palettePortを使用して色を指定できるように記述。

Back To Top

指定のオブジェクトを構成する頂点(or Edge , Face)を取得する

polyListComponentConversion は、選択形式 Object Vtx Edge Face から 指定の形式に変換して配列で返す。
上の例だと、 -tv は 頂点に変換する。 -te (Edge) -tf(Face)  元がオブジェクト以外を選択していたら -fv -fe -ff のように ~から を、オプションで指定。
このままだと、 帰ってくる値が vtx[*] や vtx[1:4] のように固まった状態になるので、 filterExpandコマンドでこれを分解する。
-sm には、選択されているタイプを数字で指定。 31 は vtx 。
Edge は32 Face は 33 を指定する。
他の書き方としては、
でも同様の結果が得られる。

Back To Top

Frame/Animation ext の設定をmelで変更する

renderGlobal の Frame/Animation ext のアトリビュートは 四つのパラメーターの組み合わせで設定する。

defaultRenderGlobals.animation
連番かどうか
defaultRenderGlobals.outFormatControl(0 or 1)
拡張子をつけない
defaultRenderGlobals.periodInExt(0 or 1 or 2)
0 名前とFrameの間になにも置かない
1 名前とFrameのあいだにピリオドをつける
2 名前とFrameのあいだに_をつける
defaultRenderGlobals.putFrameBeforeExt(0 or 1)
0 後ろに拡張子をつけない
1 後ろに拡張子をつける

数字の組み合わせは以下のとおり。

name.###.ext
1 1 0 1
name.ext.###
1 1 0 0
name.###
1 1 1 1
name###.ext
1 0 0 1
name_###.ext
1 2 0 1

Back To Top

renderGlobal mentalRay のAmbient Occlusion のOn/Offをチェック・変更する

stringOptionsは、stringArray型のアトリビュートで、Cの構造体のように値を持っている。
持っているのは、 name value type の3つで それぞれ、 アトリビュート名 値 型 が入っている。
注意が必要なのは、 .valueに入るのは true または false のBoolだが、構造体自体はstring型なので
-type “string” “true” のように、値はstring型としてセットする。
実際の型は .type の中に保存されている。

Back To Top

起動しているmayaのインストールフォルダを取得する

Back To Top

開いているシーンファイルのフルパスを取得する

Back To Top

トップノードを取得する

maya.cmdsの場合。

引数に与えたノード名のトップノードを、再帰処理を使って取得

pymelの場合は、DAGノードオブジェクト.root() で、トップノードを取得できる。

Back To Top

Mayaの背景色を変更する

1 0 0 になっているところは、左から R G B の値を0 – 1のFloatで記述する。

Back To Top

カーブのCVを選択する

カーブ名の後ろに .cv[*] を入れると、カーブ名のCVを選択できる。
変数に入れたいなら、このあとに
string $val[] = ls -sl -fl;

cv[*] の * は、構成するものすべて を表し、連続した1部分(1から4のような)を選択する場合 .cv[1:4] のように、コロンを間にいれる。

Back To Top

pythonコマンドから、melファイルをsourceする

melコマンドを実行する時は、maya.mel モジュールを使う。

mm.eval( Melコマンド )
で、 () 内に書かれたメルコマンドを実行することができる。
上のコマンドの場合は、 mm.eval(‘source “‘ + mel + ‘”;’) で melファイルを実行する。

keyFile = re.sub(‘\’,’/’,keyFile)
の行は、ファイルPathが で区切られている場合でも大丈夫なように / に置換している。

Back To Top

リファレンスのファイル一覧を取得する

リファレンスファイルの一覧は
mc.file(q=True,r=True)
で取得できるが、この場合、同じファイルが複数リファレンスされていた場合、ファイル名の後ろに
{数字} がくっついてしまう。
ので、{数字}をが駆除して、重複しているものは1つだけになるようにして ファイルパスを返す

Back To Top

タイムスライダーのStartとEndを取得する

Back To Top

シーン全体のアニメーションのキーを一括でオフセットする

animCurveの種類は、 input がTimeなら animCurveT(L U A T)
DrivenKeyのように  inputがDouble(数値)なら animCurveU(L U A T)
それぞれ、
L distance
A angle
T time
U double
の意味。
OffsetするのはDrivenKey以外のTimeと接続しているものなので animCurveT系のノードをリストし、
keyframe に -r(相対移動)のフラグを付ける。

Back To Top

UV座標を取得

pythonの時は

melの時は

エディットコマンドをクエリで読んであげれば、UV座標を取得できる。
値は、Float配列。 [0]がU、 [1]がV座標値になる。

Back To Top

現在フレームにKeyが打たれているか調べる

引数でしていしたオブジェクトの現在フレームにkeyがある場合、1を返すスクリプト。

selectKeyを使うと、指定されたフレームのKeyを選択し、選択されたCurveの数を返す。
それを利用して、
selectKeyの戻り値が1以上=そのフレームにKeyがある
0の場合、Keyがない と判断する。

Back To Top

コメントを残す

メールアドレスが公開されることはありません。

*