カテゴリー「Maya様 Scripting」の22件の記事

2018年5月18日 (金)

こいつのキー全部選択してください。

.





選択中のキーを元に、そのアニメーションカーブにあるキーフレーム全部を選択するというスクリプトであります。



なんてことはない。  コメント除けば実質3行w

でも意外と便利に使ってますよ。



Python:

# -*- coding: utf-8 -*-
#
#    jjjPleaseSelectAllKeysOnThis.py
#    こいつのキー全部選択してください。
#
#    選択中のキーフレーム(複数Fカーブ可)からFカーブ全体を選択するスクリプト

import pymel.core as pm

#    選択中のキーからFカーブ取得
selectedAnimCurves = pm.keyframe( q=True, selected=True, name=True )

#    選択中のFカーブを対象に selectKey コマンドでキーを一網打尽
if len(selectedAnimCurves) != 0 : pm.selectKey( selectedAnimCurves, r=1 )

ダウンロード jjjPleaseSelectAllKeysOnThis.py (0.5K)





Maya さまのグラフエディタは、2017 以降すんげえ良くなったけど、やっぱり使いにくいことには変わりなくてね。

↓ こういう場合めんどくさいといつも感じます

Keysel1

この、Rotate Y のキーだけを、全部イッキに選択したい。 カーブ丸ごとドラッグして値やタイミングを変えたいとか、そういう時ね。

でも、目的のキー全体を囲うようにマウスドラッグすると、 その範囲に入った他のキーまで選択されやがりますよね。

何を当たり前のことを、と思うかも知れませんが、XSI 村ではですね、まずはキーなりFカーブなりを選択すると、次のドラッグではそのFカーブの中からしか選択できなくなってくれるんですよ。

つまり、Y のキーだけ選びたい、とかそういうことがすんげえ楽にできるんです。 いちいちFカーブの表示をオンオフしたり、左側のアウトライナなどにマウスポインタを持っていくことなく、サッと目的のキーのみ選択できるということです。   これがどれだけラクなことなのか想像できないあなたは、生粋のMaya インペリアル人です。




↓ で、やむなく、左側のアウトライナからアニメーションカーブを選択する。

Keysel2

こうすると、そのカーブが単独表示になりますよね。

この状態で、ガッとマウスドラッグして全部のキーを選択してしまう。

そのままいじってもいいけど、やはり、他のアニメーションカーブを見ながら、相対的な値を考慮しながら、いじりたいじゃないですか。 このままだと選択中のアニメーションカーブしか見えてないわけですから。



↓だからやむなく、左側のアウトライナでオブジェクト名をクリックして、全アニメーションカーブを表示復活させます。 

Keysel3

幸いにもこの時にキーの選択状態が変わったりはしないので、めでたく、「全カーブを見ながら、イッキに選択したキー全部をまるごとドラッグできる」 状態になりました。 ふう・・・・。



でもこれ、すんげえめんどくせえじゃないですか。

たったこれだけのことで、いったい何回クリックしたり、マウスをあちこちに動かさなければいけないんですか Maya さま。  支んで下さい Maya さま。





なので、ちょっとでも楽にならないかな、と思って書いてみたのがこのスクリプトです。

まずはキーを選びます。1個でも、いくつでも。 その状態でこのスクリプトを走らせると、そのキーが所属するアニメーションカーブ全体が選択されるというものです。

俺はホットキーに登録して使っています。 左側のアウトライナに手を伸ばさずに済むだけ、楽に感じます。 ホットキー押す手間はあるけど、マウス位置をあんまり動かさなくていいので、ラクだと思いました。





↓ ちなみに、選択を 「キー」 ではなく 「カーブ」 にすれば、カーブあるいはキーに触れた瞬間、アニメーションカーブ丸ごと選択されてくれますね。

Keysel4

これ、Curve の項目にたしかデフォルトで M のホットキーが付いてたんだよな。 でも 2017 だと、なぜかそのホットキーバインドが2重で登録されていて、片方を消さないとホットキーが効かないみたいなアフォな不具合があった気がする・・・。

いちいちこのメニューを出すのはもちろん面倒なので論外ですが、ホットキーさえちゃんと効く状態にしておけば、今回のこのスクリプトなんて使わずとも、ホットキーポンでカーブ選択モードになって、カーブ全体を選択後にまたホットキーでポンと戻せばいいかな、とも思いました。

でも全フレキーだったりすると、カーブとして選ぶのが困難なんだよな。 キーとキーの間の線の部分を狙ってクリックしないといけないからな。 これは論外か。  だから、ホットキーポンで、 Curve がオンかつ Key がオフという状態になればいいのかな。 これはこれでスクリプト書く必要がありますね・・・・・



グラフエディタ、もっと進化しないとですね~
だいぶ良くなったけど、まだまだですね~


俺は人生の大半の時間をグラフエディタの中で過ごしてしまっているので、ここ重要なんです。


やむなくたくさんスクリプト書きますが、Maya さまのキーフレーム系、アニメーションカーブ系のスクリプトって、ほんと書きにくい orz  

Fカーブオブジェクト、Fカーブオブジェクトのコレクション、そこから取得できるFカーブキーオブジェクトおよびコレクション。 こんな風にXSI 村では関連するオブジェクトを芋づる式に取得できたのでそんなに苦でもなかったのですが・・・・・ 


Maya さまの場合、選択中のキーからアトリビュートの名前を文字で取って、それを元に、フレームいくつからフレームいくつまでこれやって下さい、みたいな、そんな書き方なのかな? 全然しっくり来ないんだよなあ。
コマンドも keyFrame とか keyTangent とか selectKey とかに分かれていて分かりにくいし、ゲットもセットも同じコマンドのフラグ違いとか。  取得できるのはキーオブジェクトじゃなくてキー時間のリストだったり。
 
取得したものからメソッドやプロパティを使って連鎖的に何かをする感じがなく、 ぜ~~んぶ文字列とかで情報ゲットして、最後にコマンドに情報全部羅列して食わせてやっと何かできるみたいな?  違うことやろうと思ったら取得のプロセスをルートパスからやり直しているような、なんかそんなイメージがあるんです。 これまた頭から取得すんの?  みたいな。 


・・・・・うーむ、上手く説明できないし、なんかこう、不正確なこと言ってたらすいません。 でもほんと、キーフレーム系、グラフエディタ系はほんと、何度書いてもピンと来ない感じです。 しんどい。


カンニング集みたいなのまとめるしかないな。 考えるのは最初の1回だけで、1か所にまとめてメモしておけば、あとはコピペすりゃいいやみたいなやつ。  いつかそういうのまとめたい。 です。 しんどい。






.

| | コメント (0) | トラックバック (0)

2018年5月16日 (水)

再生速度トグる~~~ん。

.


またもや発作的に書いたスクリプトを載せてみるんですけどね。


なんかヘンなところあったら突っ込み下さいね。 シロートがほんと、手探りで書いているようなものなので・・・・





ビューポートの再生速度を、通常の 0.5 倍とか2倍とか、スピードを切り替えることができますよね。  


でもいちいち Preference 開くのが面倒なので、n倍の速度で再生する、っていう n の数値を2つだけ登録しておいて、その2つの値でトグルするというスクリプトです。



Pyhon:

# -*- coding: utf-8 -*-
#
#    jjjPlaybackSpeedToggleooon.py
#    再生速度トグる~~~ん
#
#    再生速度を2つの値でトグルするスクリプト
#    1倍速再生と 0.5倍速再生を切り替えるとか。 スクリプトの冒頭の2つの値を適当に書き換えて運用
#    モーション作業でこれ欲しいときあるじゃないですか。いちいち pref 開くのめんどくせえし。


#再生速度切り替えの数値  テキトーに書き換え
speed1 = 0.5
speed2 = 1.0

import sys
import pymel.core as pm

#現在の再生速度取得  play every frame = 0.0
currentSpeed = pm.playbackOptions( playbackSpeed=1, q=1 )

#    Play Every Frame だった場合 = 最大再生速度を2つの値でトグル
if currentSpeed == 0.0 :
    currentMaxSpeed = pm.playbackOptions( maxPlaybackSpeed=1, q=1 )
    #print ( "play every frame : currentMaxSpeed = " + str( currentMaxSpeed ) )
    if currentMaxSpeed == speed1 : pm.playbackOptions( maxPlaybackSpeed=speed2 )
    else : pm.playbackOptions( maxPlaybackSpeed=speed1 )
    
    currentMaxSpeed = pm.playbackOptions( maxPlaybackSpeed=1, q=1 )
    msg = u"再生速度 = 全フレ再生 : 最大速度 =  " + str(currentMaxSpeed) + u"   (゚∀゚)"

#    Play Every Frame じゃなかった場合 = そのまんま再生速度を2つの値でトグル
else:
    #print ( "currentSpeed = " + str( currentSpeed ) )
    if currentSpeed == speed1 : pm.playbackOptions( playbackSpeed=speed2 )
    else : pm.playbackOptions( playbackSpeed=speed1 )

    currentSpeed = pm.playbackOptions( playbackSpeed=1, q=1 )
    msg = u"再生速度 =  " + str(currentSpeed) + u"   (゚∀゚)"

#    結果をお知らせしておしまい。    
sys.stdout.write( msg + "\n" )
pm.inViewMessage( amg= msg, pos='topCenter', fade=True, fadeStayTime=1500, fadeInTime=100, fadeOutTime=400 )

ダウンロード jjjPlaybackSpeedToggleooon.py (1.7K)


Playbackspeed

↑ここの設定のことです。

いちいち Preference 開くの面倒だから、ホットキーにしたくてね。 当然のことながら、ホットキーにするなり、すぐに手が届くシェルフとかに登録するなり、 Preference を開いてこの設定をいじるよりもラクな起動方法で使わないと意味ないですね。




モーションビルダーは、確か UI 上にこの設定が出ているんじゃなかったっけ? すぐに切り替えられて便利でしたよね。  Maya さまもそうだといいのになあ。 なぜ Preference の奥に隠してしまうのだ。 前から、楽にこれが切り替えられるといいなあと思ってたんですが、なんか書けそうな気がしてしまったので、今日書きました。 こんなんで合ってるかなあ?



再生速度が Play Realtime の時は、単に再生速度を2つの値でトグルします。  Play Every Frame の時は、最大再生速度の方を2つの値でトグルします。  2つの値は、スクリプトの冒頭の数値を好みで書き換えればいいんじゃないのかな。 デフォルトでは 1 と 0.5 です。 つまり、1倍速=ノーマル速度と、 0.5倍速=半分の速度(ゆっくり)のトグルになります。

アレですね、例えば 60fps のゲームモーションなんかをいじっている時に最も使いたくなりますね。 特に、クイックで激しいモーションとかは、カクりとか、軸のブレみたいなのを見つけるのに、ゆっくり再生してみたくなる。 そんな時にポンポンと気軽にスピードを切り替えたいという、アレです。






ちなみにですが、ずいぶん前にも書いた けど、heads up display の FPS 表記は、1ビュー再生の時以外は信用しちゃダメですからね。 

さっきも Maya 2018 で試してみたけど、まだ直ってねえや。 2倍速だろうが 0.5 倍速だろうが、2ビュー以上で再生すると不正確な数値が出てます。  嘔吐デスクさま、いつまで放置すんの。 やる気あるんでしょうか。 



まあ、ないですよね。 

知ってます嘔吐デスクさま





.

| | コメント (0) | トラックバック (0)

2018年5月11日 (金)

ニュートラルじゃないやつ一歩前に出ろ。

.


リグのコントローラとかって、初期状態の TRS が 000, 000, 111 であることが望ましいですね。 リセットすればデフォルトポーズに戻る、みたいなね。   XSI 村出身の人間は、これを 「ニュートラル状態」 「ニュートラルポーズの状態」 と言ったりしますね。 



XSI の Set Neutral Pose。 素晴らしい機能だったね。 Maya さまにはこれが無いんだよなあ。 Freeze じゃないですよ。 ニュートラルポーズは可逆性のものです。 アトリビュートとして、ニュートラルになるためのオフセット値を保持しているというものです。  Maya さまの Freeze は基本的に不可逆じゃないですか。  


それに、Maya帝國の人々はなんでもかんでもこの Freeze をしたがる傾向があるように思えますね。 チュートリアルビデオとかで、 「値が入っていてはいけない。 必ずフリーズして、かつヒストリ削除」 っていつも言ってるもん。  

ヒストリ削除はもちろんいいとして、フリーズの方は時と場合に依りますよねえ。  それフリーズしてしまったら、傾きの数値とか分かんなくなるじゃねえかーーーーっ  てのが多い。 

この無条件フリーズ教の教義は間違っていると俺は思う。 残しておかなければいけない数値も多い。  だからニュートラル状態にしたい時はトランスフォームノード(グループノード)などを親に挟むなどの方が良い場合も多い。 俺は自作の ぬるぬる というツールでやったり、 ys さんのスヴァらしき SiSideBar にモロその機能があるのでそれを使ったりしてます(そういえば、この機能は俺が ys さんにリクエストして搭載してもらったんだっけ? どうだったっけ?)。




で、本題はそれじゃなくて、ええと、ニュートラルになったかどうかのチェッカが欲しかったのですよ。 

リグ作業とかやってて、最後に、各コントローラがちゃんとニュートラルの状態になっているかどうかをチェックするツールね。  別にどうということはない、選択したオブジェクトの TRS がニュートラルになってるかどうかを次々に調べてくれるだけのスクリプトです。 

いつものように屋良マーティンくんに教えてもらったりしながら書いてみたんですが、こんなんで合ってますかね?  一応、正しく機能しているようには見えるんですが、おかしいところあったら、どなた様でも、なにとぞ教えて下さい。


Python:

# -*- coding: utf-8 -*-
#
#    jjjStandForthNonNeutralGuys.py
#    ニュートラルじゃないやつ一歩前に出ろ。
#
#   オブジェクト(複数可)を選んで実行。ニュートラルじゃないやつだけ選択に残る

import pymel.core as pm
import sys

##########################
def roundVal( inList ):
    retList = []
    for i in inList:
        retList.append( round( i, 10 ) )

    return retList
##########################

sels = pm.selected()
motherFuckers = []

if len(sels) != 0:
    for obj in sels:
        if obj.nodeType() == "transform" or obj.nodeType() == "joint" :
            t = roundVal( pm.xform( obj, q=1, translation=1, objectSpace=1, relative=1 ) )
            r = roundVal( pm.xform( obj, q=1, rotation=1,    objectSpace=1, relative=1 ) )
            s = roundVal( pm.xform( obj, q=1, scale=1,       objectSpace=1, relative=1 ) )
 
            if not ( t == [0,0,0] and r == [0,0,0] and s == [1,1,1] ):
                motherFuckers.append( obj )
                pm.warning( obj + u" -- お前一歩前に出ろ。 : " + str(t) + ", " + str(r) + ", " + str(s) )
        
    pm.select( motherFuckers, r=1 )
    if len( motherFuckers ) == 0 : sys.stdout.write( u"ニュートラルじゃない野郎はいませんですた。" )
    else : pm.warning( u"ニュートラルじゃない野郎を選択しますた。 : "  + str( len( motherFuckers ) ) )

ダウンロード jjjStandForthTheNonNeutralGuys.py (1.3K)

こういうことでいいのかなあ。


各オブジェクトの TRS値を取得するのに xform コマンドを使っていますが、relative フラグがほんとに要るのかどうかとか、実はよく分かってません(汗



あと、TRS を持たないオブジェクトを選んでいたらエラーになるので、 nodeType を調べて  "transform" か "joint" だったら処理するようにしているつもりなんですが、この2つ以外に TRSを持っている種類のオブジェクトってありますでしょうか? これ実は前から知りたかった。 

Light とか Camera は、transform で引っかかってくれるからこれでいいんだけど、joint は TRS 持っているのに、nodeType の分類は transform ではないんんですよね。 joint の他にもそういうタイプのもの、あるかなあ? と思って。  どなた様でも、知っていたらなにとぞ教えて下さい。











さあこのスクリプトを使って、ニュートラルにし忘れているコントローラを見つけよう。 全員きっちりニュートラルになれば、こいつのリグ作業はたぶん終わり。 またひとつクソリグを作ったぜ。 けけけけけけけけ。  


リグには2種類しかない。 リグとクソリグだ。  


世の中にあふれるクソリグを集めて1冊の本にしたい。  世界クソリグ大全。  愛情あふれるクソリグの解説を書きたい。  俺自身も立派なクソリガーになって、俺のクソリグをその1ページに入れるんだ。 けけけけけけけけ。



.

| | コメント (2) | トラックバック (0)

2018年5月 3日 (木)

ヂョイントらべる~~ん。

.





またもや唐突にスクリプトを載せてみる。

たったさっき書いたやつ。


Dyointlabeloooon_2



ヂョイントを選んで実行すると、名前を元にヂョイントラベルの設定をします。



誰か使ってみてくれないか。 おかしいところ教えてくれないか。 書きたてホヤホヤで、まだちっとも練られてないですけど。



ダウンロード jjjDyointLabelooon_alpha1.py (2.1K)

Python :

# -*- coding: utf-8 -*-
#
#    jjjDyointLabeLoooon.py
#    ヂョイントらべる~~ん
#
#    ジョイントのラベル設定の自動化を試みたスクリプト
#    スキンウェイトのミラーで重要かと思って。
#    ヂョイントの名前付けがちゃんと終わっていることが前提
#    ヂョイントを選んで実行
#
#    例) ヂョイント名 = jnt_L_arm1  --->  ラベル = arm1(L)

import pymel.core as pm

#   ここらへんテキトーに書き換えて下ちい
strToDel = "jnt"    #   ← ヂョイントの名前に入っている文字列で、ラベルに入れたくないものがあれば
cSideList = [ "_C_", "_c_", "_CENTER_", "_center_", "_Center_", "_CT_", "_ct_", "_Ct_" ]
lSideList = [ "_L_", "_l_", "_LEFT_", "_left_", "_Left_", "_LFT_", "_lft_", "_Lft_", "_LT_", "_lt_", "_Lt_" ]
rSideList = [ "_R_", "_r_", "_RIGHT_", "_right_", "_Right_", "_RGT_", "_rgt_", "_Rgt_", "_RT_", "_rt_", "_Rt_" ]

def machoInList( inObj, inList ):
    for item in inList :
        if item in str(inObj):
            matcho = item
            break
        else : matcho = ""

    return matcho

def fuckinDyointSide( dyointName ):
    
    L = machoInList( dyointName, lSideList )
    R = machoInList( dyointName, rSideList )
    C = machoInList( dyointName, cSideList )
    
    if   C != "" : return [ dyointName.replace( C, "" ), 0, "Center" ]
    elif L != "" : return [ dyointName.replace( L, "" ), 1, "Left" ]
    elif R != "" : return [ dyointName.replace( R, "" ), 2, "Right" ]
    else         : return [ dyointName,                  3, "None" ]

############################
sels = pm.selected()
for dyoint in sels:
    
    if pm.objectType( dyoint, isType="joint" ) :
        
        dyointName = str( dyoint ).replace( strToDel, "" )
        dyointSideList = fuckinDyointSide( dyointName )
        
        pm.setAttr( dyoint + ".type", 18 )
        pm.setAttr( dyoint + ".drawLabel", 1 )
        
        pm.setAttr( dyoint + ".otherType", dyointSideList[0] )
        pm.setAttr( dyoint + ".side", dyointSideList[1] )
        
        sys.stdout.write( dyoint + " --> " + dyointSideList[2] + " : " + dyointSideList[0] + "\n" )
         


俺、まだスキニング周りが不慣れでよく分かってないかもだけど、ええと、Maya さまでスキンウェイトを左右対称コピーするときって、ヂョイントの名前を基準に L R の対応マッピングを決めるわけじゃないんだよね?


名前の代わりに Joint Labelling の文字と Side の値を使ってマッピングはできるように見える。  そのためにも、ラベル付けはちゃんとやっておかなければいけない気がしている。 


Mirrorw

ウェイトのミラーリングだけでなく、ウェイトの設定の時も、この名前のホネはどれだ? ってのちゃんと視覚的に分かるためにも、ラベルが必要な気がするね。  XSI ならウェイトエディタでホネ選ぶとハイライトされて判別が付くので、ラベル的なものはあんまり要らないんだけどね~


でもこのラベルをいちいち設定していくのが超めんどくさい。 補助ツールは標準機能で少しあるけど、これがまたちっとも使いやすくない。


だから、ジョイント名を元にラベルの設定を自動化できればいいなと思ったわけですよ。 どうですか。  どのみちオブジェクト名をちゃんと付ける習慣は持っているのでね、その名前を利用できれば、ラベル設定のコストが最小限になるかなあ、と。  ネットで少し探してみたら、そういうツールはあったけど、名前を元に自動判別してくれるわけではなかったので、ちょっと使いづらかった。 だから書いてみた。




そもそもね、名前でマッピングしてくれればそれでいいんですよ Maya さま。 XSI みたいに、シンメトリマッピングテンプレートのようなものがあればそれで済むじゃないですか。 アレさえあれば、たとえ名前の付け方がテキトーでも、左は hogehoge_joint、 対応する右は hageJoint2 みたいに強引に対応を決めることすらもできちゃうわけでね。


どうしてもラベルを使えと言うならば、このスクリプト程度の自動化補助ツールは搭載して欲しいなあ。  っていうかウェイトのミラーリングのデフォルト設定で、左右のマッピングが Closest Joint になっているのも、なんかおかしいと思う。 複数の骨の位置がぴったり重なっている場合なんてよくあるわけで、骨の位置を見てマッピングするなんて、そりゃおかしい結果になることが多いだろうなあ、とか思うわけです。






ほんと、ひとつひとつの機能が、親切過ぎる不親切さで作られていますね Maya さま。






.

| | コメント (0) | トラックバック (0)

2018年4月30日 (月)

ワイからさん for Maya。

.




世の中にたくさんある、Maya さまのワイヤカラー設定ツール



どれもこれも、微妙に自分が求める使い勝手と違ったり、自分にとっては無駄に高機能だったり。  なぜか俺の環境で動いてくれないものもある。



やっぱ書くしかないのかしら。

XSI 時代にも書いた ワイカラさん  が、現代に蘇る。

Waikarasan


Python:

# -*- coding: utf-8 -*-
#    ワイカラさん for Maya v0.1

import pymel.core as pm

def colSetter( target, colIndex, valOutliner, valRGB ):
    if target != None :
        if colIndex == -1 : 
            pm.setAttr( target + ".overrideEnabled", 0 )
            pm.setAttr( target + ".overrideColor", 0 )
            pm.setAttr( target + ".useOutlinerColor", 0 )
            #pm.setAttr( target + ".outlinerColor", 0, 0, 0 )
        else :
            colRGB = pm.colorIndex( colIndex, q=1 )
            pm.setAttr( target + ".overrideEnabled", 1 )
            pm.setAttr( target + ".overrideColor", colIndex )
    
            if valRGB == True:
                pm.setAttr( target + ".overrideRGBColors", 1 ) 
                pm.setAttr( target + ".overrideColorRGB", colRGB[0], colRGB[1], colRGB[2] )
                    
            if valOutliner == True :
                pm.setAttr( target + ".useOutlinerColor", 1 )
                pm.setAttr( target + ".outlinerColor", colRGB[0], colRGB[1], colRGB[2] )


def setWireColor( colIndex ):
    valTransf = pm.checkBox( cbTransf, q=1, value=1 )
    valShape =  pm.checkBox( cbShape, q=1, value=1 )
    valOutliner=pm.checkBox( cbOutliner, q=1, value=1 )
    valRGB    = pm.checkBox( cbRGB, q=1, value=1 )
    valDesel  = pm.checkBox( cbDesel, q=1, value=1 )

    sels = pm.selected()
    for obj in sels:
        shp = obj.getShape()
        if valTransf == True : colSetter( obj, colIndex, valOutliner, valRGB )
        if valShape == True  : colSetter( shp, colIndex, valOutliner, valRGB )
    if valDesel == True : pm.select( clear=1 )


windowName = u"ワイからさん for Maya"
if pm.window( windowName, exists=True ) : pm.deleteUI( windowName )


waikaraWin = pm.window( windowName )
pm.columnLayout( adjustableColumn=1 )


pm.frameLayout( cll=1, cl=0, mw=4, mh=3, lv=0, bv=1)
pm.rowColumnLayout(  numberOfColumns= 16 )
for i in range(31):
    colRGB = pm.colorIndex( i+1, q=1 )
    pm.nodeIconButton( style="textOnly", bgc=( colRGB[0], colRGB[1], colRGB[2] ),
                        marginWidth=1, marginHeight=1, width=20, height=18,
                        command = "setWireColor(%d)" % (i+1)
                     )

pm.nodeIconButton( style="textOnly", bgc=( 0.4, 0.4, 0.4 ), label="K",
                    marginWidth=1, marginHeight=1, width=20, height=18, 
                    command="setWireColor(%d)" % -1 )

pm.setParent( ".." )

pm.rowColumnLayout(  numberOfColumns= 5 )    
cbTransf = pm.checkBox( label="Transform", v=1 )
cbShape =  pm.checkBox( label="Shape", v=1 )
cbOutliner=pm.checkBox( label="Outliner", v=1 )
cbRGB =    pm.checkBox( label="RGB" )
cbDesel =  pm.checkBox( label="Delesect", v=1 )

pm.showWindow( waikaraWin )    

ダウンロード wikaraSan_v01.py (2.7K)




とりあえず、最低限必要なものだけ書いた。


これをひな型として、まずは運用してみて、必ず不満点が出てくるから、ちょっとずつ改良していく。 昔からそうやって自分用のツールを書いてきた。 

低レベルなものばかりだけどね。 そのスジの人に見られたら、プッと笑われそう。 でもいいの。 俺様の需要を満たしてくれているから。 俺の需要に合わせて書いたツール以上に俺の需要を満たしてくれるものはないのです。 






しかし、Maya さまのワイヤカラーのしくみ、めんどくせえなあ。 XSI のは、普通にオブジェクトごとに1つ色を持っているだけだったんだけどなあ。


Maya さまのワイヤカラーは、トランスフォームノード、シェイプノードにそれぞれ色を持っていて、かつ、アウトライナ表示用の色も別に持っている。


しかもそれぞれ、インデクスカラーと RGB カラーと持っていて、でもアウトライナ用のカラーは RGB しかない。


そしてどうやら、ハイパーグラフ内では、RGBカラーの表示ができない。インデクスカラーしか反応してくれない。


そしてインデクスカラーの種類が全31色と、どうにも足りない。 いい塩梅の色が多ければ31色もあれば十分なのだが、なにやら半端で見づらい色が多い。


そしてまだ調査不足で仕組みを理解できていないのだが、上記のトランスフォームノードとシェイプノードの Drawing overrides で決める色以外に、Display > Wireframe Color などというメニューも存在する。

Wirecol

なんぞこれ。

この Wireframe Color よりも、トランスフォームノードやシェイプノードの Drawing Overrides で決めた色の方が優先されるように見える。 そちらに色が入っている時(=Enable Overrides がオフになっている時、またはオンになっていてもインデクスカラーが0 の時)は、この Wireframe Color が反映されないから。

また、この Wireframe Color の方で決めた色は、どこにデータを持っているのか、いまだに発見できていない。 アトリビュートエディタで探してみたが、見つからない。 どこに情報しまってあるんだ。 スクリプトエディタで Echo All にすれば見つかるかな。 めんどくせえなw



なんでこんな複雑な仕組みにしたのでしょう?
なんか、トラップをいっぱい仕込まれているような気が?
わざとやってんですか?
Maya さま?




おかげで仕事は進まず、
問題対処の能力が高まります。

本当にありがとうございますMayaさま。










.


| | コメント (0) | トラックバック (0)

2018年4月26日 (木)

なんでジョイントをイッキに選ばせてくれないんですか。

.




Mayaさまって、ビューポート上でイッキにジョイントを選ぼうとマウスドラッグしても、親のジョイントしか選ばせてくれないですよねえ?




Jointsel1


                 ↓


Jointsel2




なぜなんでしょう。
親だけが選ばれてくれた方が都合のいい場合って、
どういう場合なのでしょう。

おれ、本当に想像できなくて。

普通に子供まで選ばせて頂きたいのですが。
Maya さま。




と、もう何年も思い続けてきたのですよね。


人に聞くと、大抵、ジョイント選んで Select > Hierarchy ってやれば全体選択できるよ、と言われるんですが、必ずしも全体を選択したいわけじゃない時も多いじゃないですか。 10階層あるジョイント階層の中の、第2ジョイントから第6ジョイントまで選択したい時とか、あるじゃないですか。 普通にビューポートで、選択範囲に入ったやつだけ、親だろうが子だろうが複数イッキに選択されて欲しいんだよなあ。



あと、ジョイント階層の中にジョイント以外のものが入っている時、それは選択したくないって場合も多いんですよね。 例えばジョイントの表示上の太さを変えたい時とかね。 ジョイント以外のものが選択に含まれていると、Radius のアトリビュートがチャネルボックスに現れてくれないもんだから。   だから、Select > Hierarchy じゃ都合悪い場合も多いわけですよ。 まあ、いったん Select > Hierarchy してから、要らないものはちまちま選択から外していくという作業をすればいいんですけどね。 でももちろん、それも面倒です。数が多いと無理ですよ。



今のところ、アウトライナなどで選択するか、どうしてもビューポートで選択したい時は Shift + クリックを繰り返すとかしていますが、面倒です。すんげえ面倒です。 面倒というだけでなく、なんかこう、馬鹿馬鹿しい気がして、非常にストレスフルです。 納得いかない感がつのると言うか。



で、さっき、スクリプトで少しは楽にできないかな~と思って書いてみたら、まあなんか、ちょっとだけマシになったかな、と思いました。 ちょっとだけです。 ほんのちょっとだけ。


python:
#jjjSelectGoddamnJointsOnly
import pymel.core as pm
pm.select( hierarchy=1 )

goddamnJoints = pm.ls( sl=1, type="joint" )
pm.select( goddamnJoints, r=1 )

ジョイント(複数可)をまず選んで、実行すると、その階層下のジョイントだけを、最下層まで、イッキに選択します。

つまり、Select > Hierarchy に 「ジョイントしか選択に残さない」 という機能を付けただけです。実際コードもそのまんまです。いったん Select > Hierarchy を実行して、そこからジョイントだけを抽出しているというコードになっています。
だから、マウスドラッグで一気に選択できない問題は何一つ解決してないです。 せめてこれだけでも、と、ジョイントだけを選んでくれるようにしたら、ちょっとだけ便利な場合が増えましたというだけのことです。 むしろため息の方がつのるw





これ、なんとかならんでしょうか?

俺が知らないだけ?

マウスドラッグで、親だけでなく全部、フツーに選びたいのですよ。


Maya さま?






.

| | コメント (6) | トラックバック (0)

2017年12月23日 (土)

カメラだホイ。

.





ずっと前に書いたスクリプトを、最近になってちょっと手直しして、もうちょっとだけ汎用的に使えるようにしたつもり。 のものです。



Maya さまのカメラのアトリビュートを、ちょっといじりやすくしたつもりというか。 ま、俺様ワークフロー的に都合の良いようにしただけなんですけどね。


カメラだホイ。 ( Python Script )
ダウンロード cameraDaHoy_v2.0.py (6.3K)

Cameradahoy



現状は素の Python スクリプトなので、起動方法はスクリプトエディタから実行してもシェルフに入れても、なんでも。 個人的にはこういうのには UnitBus さんのランチャとか使ってますけど。



カメラ、あるいはカメラシェイプ、あるいはカメラグループ、あるいはエイムのどれかを選んで実行すると、このようなウインドウが出てきます。



いくつか俺的によく使うスライダをまとめ、

かつ、俺的に使いやすいスライダのレンジにし、

かつ、カメラを選択したり、エイムを選択したりとかできるようにしたものです。

スライダのレンジ(最大最小幅)は、スクリプトの冒頭の数値を書き換えれば好みの範囲に変えることができると思います。





緑色のボタンは選択ボタンです。押すとそれらが選択されます。shift 押しながら実行すると選択追加かな。



中断の紫っぽい色のボタンは、カメラのフラスタムとかの表示オンオフをします。 フラスタム(コーン)、コネクタ、選択ハンドルのそれぞれをオンオフトグルですね。  

コネクタなんて俺要らない。いつもオフります。 逆に、フラスタムはほとんどの場合オンにします。 選択ハンドルは、主にエイムがブツに埋もれて見づらい時にオンにしたり。 でもハンドル小さいんだよね~ これを使って選択とか、あり得ないよね~ ハンドルの大きさは任意に設定できないしね~ 師んで下さい Maya さま。




下段の赤いボタンはキーを打つボタンです。カメラ、エイムのポジションと、エイム無しカメラの場合は回転も。 Focal Length や Twist などスライダがあるアトリビュートは、Maya の元からの機能で数値入力ボックスを右クリックするとキーが打てるので、そちらを使うということで、あえてキー打つボタンは作りませんでした。




これらのスライダやボタンは、一度ウインドウが出てしまえば、カメラやエイムを選択してないといけないということはありません。 ウインドウがカメラを覚えていますので、現在何が選択されてるかにかかわらず、スライダもボタンも効きます。 

まあ、ウインドウ開いている間にそのカメラを削除しちゃったりしたらエラーになるとは思うけど。 ちゃんとそういうチェックをしてないテキトースクリプトなので、よろしくどうぞ。

そうそう、これもスクリプト書いた動機だったかも。 アニメ作品の3Dレイアウトみたいな作業をしてると、カメラとオブジェクトをしょっちゅう選択切り替えたりするので、いちいちカメラ選択しなくても主要なアトリビュートはいじれるようにしたかった。 



Maya さまはアトリビュートエディタをロックして作業とか、あんまりやりやすくないもんなあ。 XSI の場合は、PPG のロックがあまりにも快適だった。 ロックしちまえば、選択状態なんか気にせずスライダいじれた。

あるいはカスタムプロパティをパッと作って、欲しいパラメータのアイコンをドラッグ&ドロップすればプロキシパラメータになるじゃないですか。こうやってあちこちのパラメータを集めた俺様パラメータセットを一瞬で作れるので、あえてこのスクリプトみたいなものを書く必要もなかった感じですよ。ねえ Maya さま。支んで下さい。







もともとはね、アトリビュートエディタで、カメラの Focal Length のスライダのレンジが、すんげえ使いにくかったから書いたんですよ。 

ほら。

2.5ミリ から  3,500ミリ。

Mayasamafuckinfocallengthslider

なんですかそのスライダ範囲は。

ちょっと触っただけで、

どわーーーーーーーーーーーーー

とイッキにレンズが寄ったり引いたり。

まるでドリフの だめだこりゃ の後のズームイン/バックのようです。

ほんと、ダメだこりゃ。

Mayaさま。

詞んで下さい。





最近ツイッタで、同じことを思っていた人がいたので、じゃあ少し整備してスクリプト出しますよ~ って言っていたんですが、ちょっと忙しくて、時間かかっちゃった。 すいませんでした。



でも最近、ツイッタでは俺の周辺にすごい優秀なツール開発の人がたくさんいて、俺が書いたスクリプトなんてほんとは、恥ずかしくて出せたもんじゃないですねw  いやマジで。  Maya も Python もあんまりちゃんと理解してねえし。 とりあえず動いたからいいか、意味わかんなくてもいいか、って、ほんと、それだけでスクリプト書いてます。 俺が俺のために書いてるわけだから、当たり前だけど便利にはなるわけですよ。要るから書くわけで。  だからそれでいいや、って。

大企業のツール開発者のみなさんも大変ですね。テキトーなスクリプトじゃ、色んな意味で、ダメなんですよね。 大勢の人が使うんだろうし、色んな場合に対処する必要があるだろうし、どんなに慎重に色んな場合を想定して書いていても、必ずナナメ上を行くアクロバチックで変態的な使い方をして 「すいません、動きません!」 とか言ってくる人も出てくるんでしょw 

俺は俺ひとりが便利になればそれでいいって感じだからなあ。 でも逆に、全てのトラブル対処も、スクリプト書くのも、自力でしなきゃならんので、それはそれで大変さがあります。 っていうか絶望的になります。 こんなん、シロートが一人じゃ無理だって。 立ち向かう壁が高すぎるというか、高いというよりもイビツな壁で、非常に登りづらい気がする。 ほんとは登りたくないですこんな壁は。 Maya さま。


あ、話が大いにそれるw
毎回だがw
Maya さまが俺にそう仕向けるのです。毎回。

ええと、
なんか動かなかったりしたら、教えて下さい。
カメラだホイ。 でした。

ホイ。









.

| | コメント (3) | トラックバック (0)

2017年10月12日 (木)

ヂョイントの Xray をオンオフしたかっただけなんだ俺。

.



fuckinToggleXrayJoint.mel
-------------------------------------------------------

string $panel = `getPanel -wf`;

modelEditor -e -jointXray ( !`modelEditor -q -jointXray $panel` ) $panel;

-------------------------------------------------------

アクティブなビューの、ヂョイントの Xray 表示をオンオフするスクリプト。 

これ書くだけですげえ疲れた。 っていうか書いてすらいない。ほとんどコピペです。ネットからのパクり。








今に始まったことじゃないけど、Maya さまでは、ちょこっとしたスクリプト書くのがすんごくつらいですね。


ジョイントの Xray 表示のオンオフをホットキーに割り当てたかったのですが、ホットキーエディタにそれらしきコマンドが見当たらず、やむを得ず自前でスクリプトを書いてそれをランタイムコマンドにしホットキーを割り当てる、っていういつものやつをやろうとしたんです。




そしたらドツボにはまって、やたら時間かかっちゃった。




ログをサッとコピペしてはい終了、みたいな XSI 風のスクリプトの書き方は、できないんですかね Maya さまは。  

操作しても何もログされなかったり、 Echo All Commands をオンにすると、なんかこう、UI のパネルの名前とかズラズラ出てきて、やたら長く、なんというか、直球コマンドではない。 そして何より、コピペしても動かない orz 



だって、ジョイントの Xray 切り替える操作のログが、これですよ↓

-------------------------------------------------

modelPanelBarXRayCallback("XRayJointsBtn", "MainPane|viewPanes|modelPanel4|modelPanel4|modelPanel4", "MainPane|viewPanes|modelPanel4|modelPanel4|modelEditorIconBar"); restoreLastPanelWithFocus();

updateModelPanelBar MainPane|viewPanes|modelPanel4|modelPanel4|modelPanel4;

dR_setModelEditorTypes;

-------------------------------------------------


わ~~ 

長いね! 
複雑だね!




長くても、複雑でも、そのままコピペでとりあえず動いてくれるならいいんだけどね、

動かないんだよね(^∀^)ゲラゲラ 

今やった操作のログを、そのまま実行しても、動かないログ(^∀^)ゲラゲラ 

士んで下ちい Maya さま。



動かないっていうか、エラーは出ないけど、変化は無いんだよね。 UI から操作した、その操作の記録というだけで、Maya 様にどういうコマンドを送ったかというログではないのですかね?




結局 whatIs コマンドとかでコマンドなのかプロシージャなのかとか調べたり、プロシージャが記述されている mel ファイルに深く潜って中身を調べたりとか、やってらんねえっス。  whatIs とかもう、なんなんですか。 Hey, what is whatIs?    I said what the fuck is whatIs,  Maya さま??


Maya さまの国のお方はこれが普通なのでしょうが、俺のようにあの村で育った人間はもう、それはそれはもうだらしない人間でしてね、ほとんどの操作は明確にログされ、そのほとんどがネイティブコマンドなので直接ドキュメント参照できるし、あっちのファイルやこっちのファイルに記述されたプロシージャをぐるぐるぐるぐる巡る必要なんてないし、ほとんどそのままコピペでとりあえず動いちゃうもんだから、すっかり堕落してしまったのです。




結局、こんなちょっとしたことで大調査になってしまい、やってられるかとモニタを窓から射出し、ドキュメントや mel ファイルを読むのをあきらめ、ネットで安易に検索したら安易に見つかって、ほんの一部だけ書き換えたのが冒頭のスクリプトです。






俺の調査の苦労は意味なし。
今度からすぐネット検索することにしよう。







.

| | コメント (1) | トラックバック (0)

2017年7月 4日 (火)

ダブルクォーテーションの中にダブルクォーテーション。





すっかり忘れていて、こんなくだらないことで2~30分あたふたしてしまった orz



久しぶりに userSetup.mel をいじったんですが、つまり、Maya さまを起動するときに走らせるスクリプトをいじったんですが、愛用中の UnitBusUI がなぜか自動で起動されなくなっちゃった。


なにやら、UnitBusUI を呼び出すコマンドが、Maya の UI がロードされる前に実行されるようになってしまったように見えたので、以前も試した evalDeferred を使って実行を遅らせてみたら、 ちゃんとロードされました。



今までは userSetup.mel の中で

UnitBusUI;

とだけ書いていて問題なかったのに、起動されなくなっちゃったので、

evalDeferred "UnitBusUI";

と書いてみたら、うまく起動するようになったということです。




ここまでは良かったんだが・・・・





次に comet script というやつをロードするために

source "cometMenu.mel";

と書きたかったんだが、やはり実行を遅らせないとダメなようで、同じく evalDeffered を使おうとしたんですが、この evalDeffered コマンド、引数に与えるコマンドをダブルクォーテーションで囲まないといけないのですね。


そして今回引数として与えるコマンドは source コマンドで、これまたダブルクォーテーションで囲った引数が必要なコマンドです。


つまり、ダブルクォーテーションで二重に囲う構造になるわけで、あれれ? こういう場合、ダブルクォーテーションをどうやって記述するんだっけ? というのであたふたしてしまったのです。


evalDeferred "source "cometMenu.mel";";

これじゃダメなんですね。 どちらかの囲いをシングルクォーテーションにしてもダメだし、カッコにしてみてもダメだった。






で、ちょっと調べたらすぐ分かりました。  MEL でダブルクォーテーションを二重にしたい場合は、 囲われる内側のダブルクォーテーションの前に \ (バックスラッシュ・円記号)を付ければよかったんですね。


evalDeferred "source \"cometMenu.mel\";";
このように書けばよかったという。

そうなのね。 MEL はそういう文法なのね。はい分かりますた。




ほんとそれだけの話なんですが、半年後以降とかにまた同じ問題が起きて、対処を忘れて、あたふたと2~30分も狼狽する自分の姿が非常にクリアに脳内レンダリングできたので、ここにメモしただけです。 すぐ忘れちゃうからなあ。 自分のブログにメモすると、ほんと助かってるw  ありがとう過去の俺。  っていうか1回で覚えろ現在の俺。







UnitBusUI 便利です。 スクリプトランチャメニューですね。
UnitBus さまありがとうございます。 毎日使ってます。



.

| | コメント (0) | トラックバック (0)

2017年7月 3日 (月)

選択中のオブジェクトからコンストレインを取得。したい。

ちょっとしたスクリプト書くにも、もうヒーヒー言ってますよ。いまだに。
調べても、これぞ!ってのがすぐ見つからないんだよなあ。




コンストレイン関係のスクリプト、XSI 時代にもさんざん書いたので、自分の仕事を楽にするためにちょっとしたものを色々書きたいんです。



まずは最も基本、 「このオブジェクト、コンストレインされていたら、そのコンストレインを取得せよ」 ってのをやりたいんですが、 こんなんでいいのでしょうか?



Python:
---------------------------------------
import maya.cmds as mc
sel = mc.ls(sl=1)
for obj in sel:
    constraints = mc.listConnections( obj + '.parentInverseMatrix[0]',type="constraint" )
    if constraints == None: print( obj + " -- no fuckin' constraints on this.")
    else:
        for cns in constraints:
            print( cns  + " -- cns type : " + mc.nodeType(cns) )
---------------------------------------

ほとんど根拠ないです。 ひと様のスクリプトを見たり、今まで教えてもらったりしたことを元に、こう書いてみたら、一応ちゃんと動いているように見えるというだけです。 オブジェクトを選んで実行すると、そのオブジェクトが誰かにコンストレインされていた場合、そのコンストレインおよびコンストレインの種類を表示するというものです。



これで合ってますか?
詳しいお方、是非突っ込みを入れてくれませんか?
コンスト取得したいなら、それじゃおかしいよ、とか。
こうやった方がいいよ、とか。






constraints = mc.listConnections( obj + '.parentInverseMatrix[0]',type="constraint" )

↑ ここが特によく分かってません。

xxx.parentInverseMatrix[0] ってのが、ほんと、コピペしただけで全然意味がわかってない。コンストレインの取得にはこういう風に書くんだとかって、どっかマニュアルとか誰かのブログに書いてありませんでしょうか? [0] はなんで 0 番目なんでしょうか。 1 じゃいけないんですか。

根拠ないコピペじゃ、ここから発展させてツールを書くのが非常に厳しいですからね。 ちゃんと理解したいなあ・・・・。






試しに、意味がわかってない parentInverseMatrix[0] を取っ払って

constraints = mc.listConnections( obj, type="constraint" )


このように書いてみたんですけどね。このオブジェクトの、コネクションをチェックしろ。コンストだけな。 って感じでパッと見は合ってそうに見えてしまう俺はどシロート。


で、ポイントコンストレインを1個だけ持っている(コンストされている)オブジェクトを選んで実行した結果がこれです。 ↓

Cns

なんで6個・・・・?

1個のポイントコンストレインを持つオブジェクトなんですが、listConnection コマンドの結果は6個も返ってきています。しかも名前は全部同じ。 意味がわかりません。


最初のスクリプトなら、ちゃんと1個だけのコンストレインが返ってきます。 ためしに同じオブジェクトに、例えばペアレントコンストレインも与えると、ポイントコンスト1個、ペアレントコンスト1個の合計2個がちゃんと返ってきます。 


だから、意味不明の parentInverseMatrix[0] がなにやらいい仕事をしてくれているようですが、意味が分かってないゆえに、ある場合ではエラーになっちゃったり、そしてその原因を突き止められなかったりしそうです。 だから意味を知りたい。



こういうの、どっかに説明書かれてませんか?
Maya でバリバリいろんなツールを書いているお方、どこでどうやって調べたのですか? 
教えて下さい m(_ _)m











大昔、XSI でスクリプトを書き始めた時も、大いに苦労したんだよなあ。日本語の情報はまずないので、海外のユーザフォーラムに入り浸って、がんばって英語で質問書いたりしてたんだよなあ。  今もそれをやればいいのか?  AREA のフォーラムとかで質問すれば、丁寧に教えてくれる人もいるかな?


この数年で、数回はそんなことしたこともありますが、あんまり丁寧には教えてもらえなかったなあ。 「そんなのスクリプトでやる必要ない。メニューのここを選べば一瞬でできる」 とかね。 いや、そういう問題じゃないから!  ミス防止のための自動化ツールとか大量処理のツールを作りたいんだから、GUI から操作する方法を知りたいわけじゃないの! みたいなこともよくあったw  「MEL 書けば簡単にできるよ」 くらいの話で終わったり。 簡単なら書き方教えてよw  っていうか書いてよw

大昔の XSI ユーザフォーラムは、すんげえ助け合い精神があったので多くの人が教えてくれたり助けてくれたりしたものですが、この数年 Maya でそれをやろうとしても、あんまり反応良くなくてくじけそうになりますねw  また頑張ってトライしてみるか・・・・英語読んだり書いたり、すんげえ時間かかるんだよなあ。







.

| | コメント (2) | トラックバック (0)