最後の旅を始めよう

-黒の英雄譚・零-

MAYA Python どっ基礎講座‗11 『UIテンプレート』

2024年09月14日 | MAYA_Pyhon...

前回、ChatGPTを使って自分好みのツールを作り放題になったところで
オリジナルツールを、UIにまとめたく成ってきたのではないでしょうか?


そこで、以下のUIテンプレートに、作ったツールを入れていく方法を解説します。



#---------------------------------------------------------------------------------------------------
def fTool_UI():
    
    cmds.window( title = "UI_Template", widthHeight = (200, 350) )
    
    # Menu Bar Layout ----------------------------------------------------------
    cmds.menuBarLayout()
    cmds.menu( label = "Editor" )
    cmds.menuItem( label = "エディタ_01", command =( "" ) )
    cmds.menuItem( label = "エディタ_02", command =( "" ) )
    cmds.menuItem( divider = True )
    cmds.menuItem( label = "エディタ_03", command =( "" ) )
    cmds.menu( label = "Help" )
    cmds.menuItem( label = "マニュアル", command =( "" ) )
    cmds.setParent( ".." )
    
    # Tabs Layout --------------------------------------------------------------
    oTabs = cmds.tabLayout(innerMarginWidth=5, innerMarginHeight=5)
    
    # [ Tab01 ] Tab ------------------------------------------------------------
    oTab01 = cmds.scrollLayout()
    cmds.tabLayout( oTabs, edit =True, tabLabel=(oTab01, "Tab01"))
    
    cmds.frameLayout( label = "Frame_01", collapsable = True, collapse = False, width = 170, backgroundColor = [0.36,0.39,0.48] )
    cmds.button( label="機能01", command= "")
    cmds.button( label="機能02", command= "")
    cmds.button( label="機能03", command= "")
    cmds.separator( height = 5, style = "in" )#-----------
    cmds.setParent( ".." )
    
    cmds.frameLayout( label = "Frame_02", collapsable = True, collapse = False, width = 170, backgroundColor = [0.36,0.39,0.48] )
    cmds.button( label="機能04", command= "")
    cmds.button( label="機能05", command= "")
    cmds.button( label="機能06", command= "")
    cmds.separator( height = 5, style = "in" )#-----------
    cmds.setParent( ".." )
    cmds.setParent( ".." )
    
    # [ Tab02 ] Tab ------------------------------------------------------------
    oTab02 = cmds.scrollLayout()
    cmds.tabLayout( oTabs, edit =True, tabLabel =(oTab02, "Tab02"))
    
    cmds.frameLayout( label = "Frame_03", collapsable = True, collapse = False, width = 170, backgroundColor = [0.36,0.39,0.48] )
    cmds.button( label="機能07", command= "")
    cmds.button( label="機能08", command= "")
    cmds.button( label="機能09", command= "")
    cmds.separator( height = 5, style = "in" )#-----------
    cmds.setParent( ".." )
    
    cmds.frameLayout( label = "Frame_04", collapsable = True, collapse = False, width = 170, backgroundColor = [0.36,0.39,0.48] )
    cmds.button( label="機能10", command= "")
    cmds.button( label="機能11", command= "")
    cmds.button( label="機能12", command= "")
    cmds.separator( height = 5, style = "in" )#-----------
    cmds.setParent( ".." )
    cmds.setParent( ".." )
    
    cmds.showWindow()
    
fTool_UI()
#---------------------------------------------------------------------------------------------------


ちょっと長いですが、このコードを走らせると以下の様なUIが作られます。



この、UIテンプレートの構成は
メニューバー、タブ、フレームのレイアウトで組んでおります。
以下に、それぞれの解説を致します。





メニューバーの編集



menuBarLayout」コマンド以下がメニューバーの内容のコードです。
menu」コマンドでメニュータイトルを決め
menuItem」コマンドでプルダウンメニューの中身を作成していきます。


試しに「エディタ_01」に「ハイパーグラフ」を適用してみましょう。
まず「menuItem」コマンドの「label」フラグの名前を「ハイパーグラフ」にします。
次に「command」フラグの「""」内にハイパーグラフを開くコマンドを入れます。

cmds.HypergraphHierarchyWindow()








タブレイアウトの編集



タブの名前を変えるには、
tabLayout」コマンドの「tabLabel」フラグの「""」内を書き換える事で変更出来ます。



タブレイアウトは若干ややこしいのですが、
一度、「tabLayout」コマンドを使い、タブを配置した後で
再び「tabLayout」コマンドでタブ名を設定する必要があります。






フレームアウトの編集



フレームレイアウトは、ツール群を纏めて見やすくします。

label」フラグでフレームタイトルに表示される名前を変更出来ます。

collapsable」フラグでレイアウトを折り畳める様になります。
また、一緒に「collapse」をTrueにする事で最初から畳まれた状態にする事も出来ます。

backgroundColor」フラグでフレームタイトルの背景色を変更出来ます。
ただし、その仕様が少し特殊で、RGBの強さが0~1で表す必要があります。
Photoshop等でRGBの強さの最高値は255ですが、
そこから色を移植する場合は、数値を255で割り算する必要があります。

一つ一つ割り算をしても良いのですが、それだと非常に面倒なので、
いっぺんに計算出来るスクリプトを組んでみました。

#---------------------------------------------------------------------------------------------------
def fColorTranslation( vlRGB ):
    lColor = []
    for oRGB in vlRGB:
        lColor.append(round(oRGB/255,2))
    print("-"*75+"\n"+str(lColor))
    
fColorTranslation([ 46, 49, 146 ]) #カラーのPGBを記入
#---------------------------------------------------------------------------------------------------

fColorTranslationのValueに、
RGB値を入れると計算後の数値を吐き出してくれます。










前項 → 10_ChatGPTの活用
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ


編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAYA Python どっ基礎講座‗10 『ChatGPTの活用』

2024年09月11日 | MAYA_Pyhon...
ここまでの知識があれば、
簡単なツールは作れる様に成っていると思います。


…しかし、


いちいち、MELのログをPythonに置き換えるのも面倒だし
コマンドリファレンスでコマンド機能を調べるのも面倒だ
という方も居られると思います。


そんなときは、
ChatGPTにスクリプトを書いて貰いましょう!


やり方は、カンタンです。

まず、ChatGPTのサイトを開きます。
https://chatgpt.com/


あとは、メッセージ欄に
以下の処理を行うMayaPythonのスクリプトを書いてください。
という一文を書いた後に、作りたいスクリプトの内容を記述するだけです。


試しに、以下様な処理を行うスクリプトを頼んでみましょう。

----------------------------------------------------------------------------------------------
ロケータ10個を指定の範囲内にランダムに配置します。
X値 -10~10
Y値 0~10
Z値 0
----------------------------------------------------------------------------------------------


すると、ほぼ一瞬でPythonスクリプトを組んでくれます。




丁寧に中身の解説までしてくれております。
こんなに楽ちんで良いのでしょうか?
今のAIは凄すぎますね。まさか文明の利器もここまでくるとは・・・


もちろん、
このスクリプトを流すとちゃんとロケータがランダムで配置されます。





他にも、ChatGPTには
「作ったツールが上手く動かない」場合にエラー箇所と対策を教えてくれたり
「他の人のツールの仕組み」を解り易く教えてくれる等、
色々相談に乗ってくれるので初心者には嬉しい限りですね。

AI時代になったら、
プログラムを書くよりも、読むスキルの方が重要になってくるかも。。。


ちなみに、
以下の様に変数名の命名規則を頼むと視認性の良いコードになります。

----------------------------------------------------------------------------------------------
変数等の視認性を良くする為、またコマンド名と被らない様にする為に、
型の頭文字を名前の頭につける命名規則で記述をお願いします。

例として、
整数型    → iVariableName
オブジェクト → oVariableName
リスト型   → lVariableName
関数     → fVariableName
value     → vVariableName
ID      → idVariableName
----------------------------------------------------------------------------------------------





次項 →11_UIテンプレート
前項 →09_関数
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

三次元における2点AB間の距離をPythonを使って求めよ

2023年12月03日 | MAYA_Pyhon...
結論から申し上げますと
やっぱりAIは凄いな…という、お話です。

3DCG系のDCCツールを使用していると、
どうしてもオブジェクト同士の距離を求めるツールが必要な場面が出て来ますよね。

まあ↓この公式に当てはめれば三次元における2点間の距離出るのですけど、
√(xA−xB)^2+(yA−yB)^2+(zA−zB)^2

問題は…
これを、どうやってPythonで表してやればいいのか
さっぱり見当が付かないとういうところですね。

そもそも、ルート計算はどう表せば良いか解りませんし、
べき乗の計算も「^」をPythonは受け付けない様で、一体どうすれば良いのか
途方に暮れていた訳ですが…

ただ、これをChatGPTに聞いてみたら
一発で答えが出てしまいました!すごい!

Pythonでは
↓*を二つ重ねる事でべき乗計算を表して、
(xA-xB)**2

↓0.5でべき乗計算する事でルートを表すみたいです。
** 0.5

・・・なるほど!


という訳で、
Mayaで指定した二つのオブジェクトの距離を求めるスクリプトを書いてみました。


#三次元における2点AB間の距離を求める
def fFindDistance( vStart, vEnd ):
    lAp = cmds.xform(vStart,worldSpace=True,translation=True,q=True)
    lBp = cmds.xform(vEnd,worldSpace=True,translation=True,q=True)    
    oDistance = (lAp[0]-lBp[0])**2+(lAp[1]-lBp[1])**2+(lAp[2]-lBp[2])**2    
    return oDistance ** 0.5
fFindDistance( "locator1", "locator2" )



"locator1", "locator2" の名前を、
任意のオブジェクトの名前に変える事で距離を測る事が出来ます。




コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Python_MAYA_ちょっとしたツール集

2023年04月03日 | MAYA_Pyhon...
MayaPythonの備忘録的なものです。
自分用のメモですので、なんだか見難くて申し訳ありません。
gooブログでもシンタックスハイライトとか出来ればいいのに・・・

Python_MAYA機能メモ
Python_ネイティブ機能メモ


# 親子付けされたロケータを作成
def fCteateLocatorParent( vlCteateLocators, vParent ):
    for oLoc in vlCteateLocators:
        if not cmds.objExists( oLoc ):
            cmds.spaceLocator( name = oLoc )
            if cmds.objExists( vParent ):cmds.parent( oLoc, vParent )
        vParent = oLoc

fCteateLocatorParent( ["RIDER","BLACK","RX"], "ExistingObj" )


# 全ての骨のローカル軸表示をON/OFF
def fAllBoneDisplayLocalAxis( vBool ): 
    for oJoint in cmds.ls( type ="joint" ):
        cmds.setAttr( oJoint + ".displayLocalAxis", vBool )

fAllBoneDisplayLocalAxis( True )# Falseで非表示


# 真のノードタイプを取得(トランスノードからシェイプノードのタイプを導き出す)
def fDeepType( vObj ):
    oType = cmds.nodeType( vObj )
    if oType == "transform":# タイプがtransformの場合深く探る
        for oChild in cmds.listRelatives( vObj, children =True ) or []:
            if cmds.nodeType( oChild ) in ("nurbsCurve","locator","mesh"):
                return( cmds.nodeType( oChild ) )
        return( "transform" )
    return( oType )
    
fDeepType( cmds.ls( selection =True )[0] )
# やっている事がだいぶトリッキーなので、なんかもっと良い方法は無いものだろうか…


# 二つのオブジェクト間の距離を求める(ピタゴラスの定理)
def fFindDistance( vStart, vEnd ):
    lSP = cmds.xform( vStart,worldSpace=True, translation=True, query=True )
    lEP = cmds.xform( vEnd,  worldSpace=True, translation=True, query=True )
    return((lSP[0]-lEP[0])**2+(lSP[1]-lEP[1])**2+(lSP[2]-lEP[2])**2)**0.5


関連-------------------------------------
Python_MAYA機能メモ
Python_ネイティブ機能メモ
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAYA Python どっ基礎講座‗09 『関数』

2023年01月09日 | MAYA_Pyhon...
さて、ここまでで「3つの基礎」を完璧に理解して頂けたかと思います。
貴方は既にPythonでツールを作れる様に成っている事でしょう。

そうなると、そんなツールを
UIのボタンから発動させたくなるのが人の性では無いでしょうか。

それをするのに便利なのが「関数」です。



関数とは

関数とはなにかを平たく言うと、数学の授業でやった y=ax2 みたいなアレです。
変数ⅹに入力した数値によってyの値が変ってくるみたいなものです。
一次関数とか、二次関数とか、そういったやつです。
拒絶反応が出て来た人もご安心下さい。
解りやすく解説致しますので、この機会に関数が得意に成るかも知れませんよ。


それでは、試しに y=x*2 の式を
Pythonの関数にすると以下の様になります。
#---------------------------------------------
def fFunction( vValue ):
    return vValue * 2
    
print( fFunction( 7 ) )
print( fFunction( 5 ) )
print( fFunction( 3 ) )
#---------------------------------------------

fFunction()に任意の数値を入れる事で
それが二倍された値が吐かれます。

def 関数名( 値 ):
で関数を宣言して、以下のコードブロック内の処理が関数の中身となります。


サンプルコードとしてロケータを作成して親子付けする命令を関数にすると以下の様になります。
(戻り値が必要無ければ入力値を設定する必要はありません)
#---------------------------------------------
import maya.cmds as cmds
def fParentingLocator():
    oLoc_01 = cmds.spaceLocator( p = [0, 0, 0] )
    oLoc_02 = cmds.spaceLocator( p = [0, 0, 0] )
    cmds.parent( oLoc_02, oLoc_01 )
#---------------------------------------------

これを実行しても、何も作成はされませんが、
ここで定義した関数を実行するとロケータが作成されます。

#---------------------------------------------
fParentingLocator()
#---------------------------------------------


この様に一度関数を定義しておけば、複数の命令群を
関数の名前だけで実行する事が出来ます。

関数は、重複し易い処理を纏めておけるので
コードをスマートにする事が出来ます。


これを利用してUIのボタンを押した際にロケータを作成する様にします。
やり方は非情に簡単です。
以前、使ったUIの「command =""」に「fParentingLocator()」関数を指定するだけです。

#---------------------------------------------
import maya.cmds as cmds
cmds.window( title ="MyUI", width = 200 )
cmds.columnLayout( adjustableColumn =True )
cmds.button( label ="ボタン A", command ="fParentingLocator()" )
cmds.button( label ="ボタン B", command ="" )
cmds.button( label ="ボタン X", command ="" )
cmds.button( label ="ボタン Y", command ="" )
cmds.showWindow()

#---------------------------------------------


これで「ボタン A」を押すとロケータを作成する様になりました。
この要領で自分のオリジナルツールを作る事が出来ます。

次項 →10_ChatGPTの活用
前項 →08_リスト
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAYA Python どっ基礎講座‗08 『リスト』

2023年01月08日 | MAYA_Pyhon...
ここでは、
前項で出てきた「リスト」について詳しく解説していこうと思います。



リストとは

繰り返しの項では「イテラブルオブジェクト」の一つとして紹介させて頂きましたが
「リスト」とは、イテラブルオブジェクトとしても使える
「オブジェクト群」と認識して貰う方が正しいでしょう。

表記方法は、複数のオブジェクトを [] で囲み , で区切る事で表します。
また、以下の様にリスト自体を変数に代入して扱う事も出来ます。

#---------------------------------------------
lChildren = [ "Rei", "Shinji", "Asuka", "Touji" ]
print( lChildren )
#---------------------------------------------


リストに格納された個々のオブジェクトは「要素」と呼ばれます。
要素には格納順に「インデックス番号」が振られており、
その番号を指定する事で個別で要素を取得出来ます。

#---------------------------------------------
print( lChildren[1] )
print( lChildren[2] )
#---------------------------------------------





リストの使用方法

MayaPythonでのリストの使い処は、
イテラブルオブジェクトとして繰り返し処理に使うのが殆どの場合となるでしょう。

リストはむしろ、取得方法が重要です。
特に良く使うのが「選択オブジェクトをリスト化」です。
任意のオブジェクトを複数選択した状態で、以下のコードを走らせると
lSelectObj変数に選択したオブジェクトのリストを作成します。

#---------------------------------------------
import maya.cmds as cmds
lSelectObj = cmds.ls( selection = True )
print( lSelectObj )
#---------------------------------------------



また、
オブジェクトのノードタイプを指定したリスト化も使い勝手が良いです。
以下のコードでは、タイプをジョイントに設定する事で、
シーン内の骨を全てリストとして取得出来ます。

#---------------------------------------------
import maya.cmds as cmds
lAllJoint = cmds.ls( type = "joint" )
print( lAllJoint )
#---------------------------------------------



ちなみに、ノードタイプを調べるには
対象のノードを選択して以下のコードを実行します。

#---------------------------------------------
import maya.cmds as cmds
lSelectObj = cmds.ls( selection = True )
print( cmds.nodeType( lSelectObj[0] ) )
#--------------------------------------------






次項 → 09_関数
前項 →07_繰り返し処理
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAYA Python どっ基礎講座‗07 『繰り返し処理』

2023年01月07日 | MAYA_Pyhon...
プログラム3つの基礎の最後
「繰り返し」について解説していきたいと思います。


繰り返し処理は
特にスクリプト制御の恩恵を得られる機能の一つでしょう。
単純な作業の連続を、迅速かつ正確に行うのは
人間よりもコンピュータの方が遥かに優れております。



for文を使った繰り返し

それでは、一番単純な形のコードを走らせてみましょう。
#---------------------------------------------
for i in range( 5 ):
    print( i )
#---------------------------------------------



これを走らせると、0~4までの数字がログにプリントされます。


もう、お解りかとは思いますが、
この「for」文は range( 5 ) に指定している回数分
コードブロック内の処理を実行します。


これを応用する事で、指定の回数だけ同じ処理を行う事が出来ます。
以下のコードは「ロケータを二つ作成し親子付けする」というものを5回繰り返します。
(ちなみに、ポジションXの値を i にする事で、X方向へずらす差分も設けております)
#---------------------------------------------
import maya.cmds as cmds
for i in range( 5 ):
    oLoc_01 = cmds.spaceLocator( p = [i, 0, 0] )
    oLoc_02 = cmds.spaceLocator( p = [i, 0, 0] )
    cmds.parent( oLoc_02, oLoc_01 )
#---------------------------------------------

この range の様な繰り返し処理の回数等を決める要素を
「イテラブルオブジェクト」といいます。

for 変数 in イテラブルオブジェクト:
繰り返し処理をするコード


イテラブルオブジェクトには、
rangeの代わりに「文字列のリスト」を使用する事も出来ます。
以下のコードを走らせると、リスト内の文字列を変数として繰り返しの処理を行います。
#---------------------------------------------
for o in [ "No1", "No2", "V3" ]:
    print( o )
#---------------------------------------------
リスト内の文字列が順番にログにプリントされましたでしょうか。

こちらも応用すると、繰り返し処理を指定の名前で行う事が出来ます。
以下のコードでは、スケルトンをリスト内の名前のジョイントで作成します。
#---------------------------------------------
import maya.cmds as cmds
iHeight = 0
for oName in [ "Root", "Hips", "Spine", "Neck", "Head" ]:
    cmds.joint( name = oName,  p = [0, iHeight, 0] )
    iHeight = iHeight + 5
#---------------------------------------------

この様に、繰り返し処理は、工夫次第でいくらでも効率を上げられる
そんな可能性を秘めた機能と言えるでしょう。



あと、あまり使う機会は無さそうですが
イテラブルオブジェクトには文字列をそのまま使う事も出来ます。
#---------------------------------------------
for s in "Maya":
    print( s )
#---------------------------------------------
このコードを走らせると、Mayaを一文字づつログにプリントします。

本当に何処に使えるのか解りませんが
覚えていたら何処かで使う機会もあるかも知れません。



while文を使った繰り返し

繰り返し処理には「while文」を使うという方法もあります。
回数で指定する「for文」に対して
「while文」は条件によって繰り返すか否かを決めます。
#---------------------------------------------
iNo = 0
while iNo < 5:
    print( iNo )
    iNo = iNo + 1
#---------------------------------------------

上記のコードは「iNo」変数の値が5以下の場合のみ
コードブロック内の処理を実行します。

その為、回数に縛られる事無く処理を行う事が出来ますが、
逆にコードブロック内の処理で、条件を達成出来ないと
無限に処理を繰り返す状態になってしまいます。

サンプルコード内の「iNo = iNo + 1」を消した状態で走らせると再現出来ますが
Mayaを強制終了するまで処理が止まらなくなるので、お勧めはしません。

ですので、
初心者のうちは「for文」の方をメインで使用する事を推奨致します。



次項 → 08_リスト
前項 → 06_インデント
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAYA Python どっ基礎講座‗06 『インデント』

2023年01月06日 | MAYA_Pyhon...

前項の条件分岐の際に
「インデント」の説明が全く出来なかったので
ここで解説したいと思います。



インデントとは
端的に言ってしまうと、行の頭に空白を入れて文字下げをする事です。
if文のサンプルコードで、分岐後の命令文の先頭にスペースが入っているアレの事です。
#---------------------------------------------
iTestInt = 7
if iTestInt > 5:
    print( "iTestInt は 5 以下です" )
# ↑ コレ
#---------------------------------------------

この、インデント、
多くのスクリプト言語の場合
「視認性を良くする」くらいの目的でしか使われず
別にやらなくても問題無いのですが、
いかんせんPythonの場合は、話が違ってきます。

たとえば、ifの条件分岐の後に処理される命令文は
ifの眷属として”一括りのもの”であるという扱いをする必要があります。
これを『コードブロック』と言います。
大抵の言語では、コードブロックを示すのに{}で囲むのですが、
Pythonではインデントがコードブロックとして使われているのです。





もし仮にインデントが無いコードを走らせた場合・・・

#---------------------------------------------
iTestInt = 7
if iTestInt > 5:
print( "iTestInt は 5 以下です" )
#---------------------------------------------



・・・と、怒られてしまいます。


この、インデントエラー
なかなかシビアな判定の為、初心者泣かせな仕様だったりします。

Pythonのインデントに対する厳しさには鬼気迫るものがあり
少しでも規律を乱す奴が居たら絶対に許してくれません。

たとえば・・・


何もないところでインデントを使う
#---------------------------------------------------------------------
    print( "インデントエラーになるサンプルコード―その①" )
#---------------------------------------------------------------------


コードブロック内でインデントが揃っていない
#---------------------------------------------------------------------
if 100 == 100:
    print( "-------------------------------------------------------" )
     print( "インデントエラーになるサンプルコード―その②" )
    print( "-------------------------------------------------------" )
#---------------------------------------------------------------------

等々・・・

その上、Mayaさんはインデントエラーだけ、何故かエラー箇所を教えてくれないので
慣れないうちは、悩みの種となる部分でもあります。

Maya2023から教えてくれる様になりました。



まあPythonは、これのおかげで
誰が書いていても、ある程度の視認性が約束されるので
むしろメリットの方が多いのですけどね。



ちなみに、
ちょっとした便利機能として
以下のショートカットでインデントの追加と削除が出来ます。

 Ctrl + [  (インデント除去)
 Ctrl + ]  (インデント追加)



次項 → 07_繰り返し処理
前項 → 05_条件分岐
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAYA Python どっ基礎講座‗05 『条件分岐』

2023年01月05日 | MAYA_Pyhon...
さて、寄り道が長くなりましたが、
プログラム3つの基礎の二つ目
「条件分岐」について解説していきたいと思います。


プログラムは基本的に上から順に実行されますが、
時と場合によって
“処理順を変えたい”、“状況に応じて処理の実行を切り替えたい”
という状況が出てきます。


サンプルとして以下のコードを走らせてみて下さい。

#---------------------------------------------------------------------------------------------------
import maya.cmds as cmds

if cmds.confirmDialog(message="分かれ道、どちらに進む?",button=["←","→"],icon="question") == "←":
    cmds.confirmDialog(message="熊さん に 出会った・・・",button=["close"],icon="warning")
else:
    cmds.confirmDialog(message="埋蔵金 を 発見!!",button=["close"],icon="information")
#---------------------------------------------------------------------------------------------------

この様に、ユーザーに選択を任せたい場合も
条件分岐で、実行される処理を変える事が出来ます。






if文の使い方

条件分岐には「if」という「もし~だったら」という構文を使います。
上記のコードは若干複雑なので、以下にシンプルなコードを用意しました。

#---------------------------------------------
iTestInt = 7
if iTestInt > 5:
    print( "iTestInt は 5 以上です" )
else:
    print( "iTestInt は 5 以下です" )
#---------------------------------------------

これを走らせるとスクリプトエディタのログに
以下の様な結果が吐かれます



「iTestInt は 5 以上です」と判定されました。

それでは、試しに「iTestInt = 7」を「iTestInt = 3」に書き換えて走らせてみます。



判定が、5以下に変わりました。


さて、
「iTestInt = 7」という、新要素である「変数」が
いきなり出てきて混乱されたかも知れませんが
全く難しいものではありませんので、ご安心下さいませ。

この「変数」というのは、
若き日に受けた数学の授業を思い出して頂きたいのですが
「x」や「y」といった、数値を代入出来る文字を「変数」と呼んでおりましたよね
正にアレです。

違う点としては、代入出来るのは「数値」だけではなく
「文字列」や「リスト」等、なんでも入れる事が出来ます。
(特にPythonは、変数の型を自動で定義してくれるので
本当に何でも入れられてしまいます)

更に「x・y・z」だけではなく、どんな文字列でも変数として扱う事が出来ます。
(ただし、一部例外もあります・・・コマンド名・フラグ名・環境変数等)
サンプルでは「x」ではなく「iTestInt 」を変数としている訳ですね。


つまり・・・


if iTestInt > 5:


↑この、サンプルのIF文の意味は、
「もし、変数 iTestIntの値 が 5 よりも大きかったら」となります。
大きかった場合に分岐後の処理を行うわけです。



else の使い方
もう、お分かりかとは思いますが
else:」は「If」で提示された条件以外の場合の処理となります。

サンプルコードの場合、
「もし iTestInt が 5 よりも大きかったら」以外の条件であれば、
else分岐後の処理を行います。

もちろん、条件を満たさない場合の処理が必要無ければ
else:」は作らなくても問題ありません。



if not の使い方
if文」には「not」を付けるだけで条件を「条件以外もの」に変更出来ます。

#---------------------------------------------
iTestInt = 7
if not iTestInt > 5:
    print( "iTestInt は 5 以下です" )
#---------------------------------------------

サンプルコードを「if not」にすると
「iTestInt」変数の値が「5」以上ではなく「5」以下のときに
ログがプリントされます。



elif の使い方
elif」は 「if」の条件に当てはまらなかった「else」の中から
更に条件をかけて分岐させるというものです。

#---------------------------------------------
iTestInt = 7
if iTestInt > 5:
    print( "iTestInt は 5 以上です" )
elif iTestInt > 2:
    print( "iTestInt は 2 以上です" )
else:
    print( "iTestInt は 2 以下です" )
#---------------------------------------------

サンプルコードに「elif」で2以上のものという条件を足しました。
これで「iTestInt」変数が「7」の場合は「iTestInt は 5 以上です」という結果を吐き、
「3」の場合は「iTestInt は 2 以上です」という結果を吐く様になります。



「条件分岐」の実践例として
よくある使われ方としては、
処理を走らせる前の「OK・キャンセル」のダイアログがあります。

#---------------------------------------------------------------------------------------------------
import maya.cmds as cmds

#UI作成
cmds.window( title ="MyUI", width = 200 )
cmds.columnLayout( adjustableColumn =True )
cmds.button( label ="ロケータを作成して親子付け", command ="fCreateLocatorParent()" )
cmds.showWindow()

#ロケータ作成関数
def fCreateLocatorParent():
   if cmds.confirmDialog(message="ロケータを作成しますか?",button=["OK","Cancel"],icon="question") == "OK":
        cmds.spaceLocator( p = [0, 0, 0] )
        cmds.spaceLocator( p = [0, 0, 0] )
        cmds.parent( "locator2", "locator1" )
#---------------------------------------------------------------------------------------------------





次項 → 06_インデント
前項 → 04 _コマンドリファレンスの使い方
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

MAYA Python どっ基礎講座‗03 『MELのログをPythonに翻訳』

2023年01月03日 | MAYA_Pyhon...
前項
処理の順番が上から行われるという事を解説しました。



ここまで解れば、
自分専用のツールを作りたく成って来るのではないでしょうか?

でも、どうやったら作れるのか見当も付かない。。。

そんな初心者にオススメの方法が
『MELのログをPythonに翻訳』です。




MELログを取得

それでは、簡単な処理のログをとってみましょう。
試しに、ロケータを二つ作成してそれを親子付けしてみます。



するとスクリプトエディタのログ画面に、以下の様なログが生成されます。

CreateLocator;
spaceLocator -p 0 0 0;
// 結果: locator1
CreateLocator;
spaceLocator -p 0 0 0;
// 結果: locator2
parent locator2 locator1 ;
// 結果: locator2

この中からコマンドだけを抽出したいと思います。
試しにMELタブにコピーするとシンタックスハイライトで色分けされます。
ここで水色にハイライトされたものがコマンドです。




CreateLocator」は、ロケータを作成するコマンドです。
spaceLocator」は、ロケータの場所を決めるコマンドですが
実は、これだけでもロケータの作成が出来てしまいます。
その為、今回は「spaceLocator」コマンドのみを使います。


という訳で、以下の三行が必要なコマンドとなります。

spaceLocator -p 0 0 0;
spaceLocator -p 0 0 0;
parent locator2 locator1 ;

これをPythonに翻訳してすれば良い訳ですね。


やり方は、カンタンです。
以前、01_二行で解るMAYA Pythonの構造でやった構造、
要はアレに書き換えれば良い訳です。

試しに「spaceLocator」で行うとこんな感じです。

spaceLocator -p 0 0 0;
   ↓
cmds.spaceLocator( p = [0, 0, 0] )


・コマンドの頭にモジュール名「cmds.」を追加する
・フラグは()で囲いまとめる
・MELでフラグ名を表す「-」は要らないので削除
・フラグの引数は「=」で繋ぐ
・引数が複数存在する場合は[]等で囲い、間を「, 」で区切る(リスト型にする)
・MELのコマンドの終了を表す「;」は要らないので削除
・文字列は「’」「”」囲む(サンプルコードにはありませんが…)



これを全てに行うとこうなります。

cmds.spaceLocator( p = [0, 0, 0] )
cmds.spaceLocator( p = [0, 0, 0] )
cmds.parent( "locator2", "locator1" )

このスクリプトを実行すると
ロケータを二つ作成してそれを親子付けするという
一連の作業を再現してくれます。

この様に大抵のMayaの操作であれば、
MELのログを翻訳し並べる事でPythonスクリプトに置き換えツールを作る事が出来ます。



ちなみに、
作成したツールをUIのボタンから起動出来る様にする為には、関数を使用します。
関数については、『09_関数』にて詳しく解説しますが、
とりあえず以下の様にする事でボタンからの呼び出しが出来る様になります。

#---------------------------------------------------------------------------------------------------
import maya.cmds as cmds

#UI作成
cmds.window( title ="MyUI", width = 200 )
cmds.columnLayout( adjustableColumn =True )
cmds.button( label ="ロケータを作成して親子付け", command ="fCreateLocatorParent()" )
cmds.showWindow()

#ロケータ作成関数
def fCreateLocatorParent():
    cmds.spaceLocator( p = [0, 0, 0] )
    cmds.spaceLocator( p = [0, 0, 0] )
    cmds.parent( "locator2", "locator1" )
#---------------------------------------------------------------------------------------------------



次項 → 04_コマンドリファレンスの使い方
前項 → 02_処理の順番
一覧へ

関連-------------------------------------
Python_MAYA機能メモ
Python_MAYA_ちょっとしたツール集
Python_エラーメモ
編集
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする