argsってなんですのん?
会社の人に説明するときに、単純に【引数の事】でアーギュメントの略だよ。
と伝えても、うん?
って感じだったので、コードと共に説明した事をメモ。
def test_code(*args): print args[0] print args[1] test_args1 = "code1" test_args2 = "code2" test_code(test_args1,test_args2)
結果
>>> code1 code2 >>>
これも
def test_code(*args): print args[0] print args[1] print args test_code("test1","test2")
結果
>>> test1 test2 ('test1', 'test2') >>>
こうすると、理解されたので、そのままメモしときます。
要は、【*Args】としておけば
関数の引数をタプルで指定したまま使用できる感じです。
キーワード付きの場合は、【kwargs】で代用できます。
def keyward_args(**kwargs): for key, value in kwargs.iteritems(): print key , value keyward_args(test1="test1_code",test2="test2_code",test3="test3_code")
結果
>>> test1 test1_code test3 test3_code test2 test2_code >>>
こんな感じです。
この辺りが微妙にややこしいのがハードル高くしてますよね。
あ、あとこれは私感なんですが、これ記述しておけば
体外の引数が受け取ってくれるような気がしますね。
以上です。
【覚書】maya python入門 其の十二
今回もWEBで学んだことを書いていきます。(確かWEBだったはず…)
内容は頂点にモデルを配置するといった、簡単なモノです。
ここから、ランダムにしたり、計算によって配置したりできますね。
いきなりコードを…
import maya.cmds as cmds if cmds.window("RandomWindow" , exists=True ): cmds.deleteUI("RandomWindow") RandomWindow = cmds.window( "RandomWindow" , t="Ramdom Set Script" , w=300 , h=300 ) cmds.columnLayout( adj=True ) cmds.separator( h=10 ) cmds.text( "Ramdom_Vertex" ) cmds.separator( h=10 ) cmds.button( l="Ramdom_Tree" , h=50 , c="ramGenerator()") cmds.separator(h=10) cmds.showWindow(RandomWindow) def ramGenerator(): oSel = cmds.ls(selection = True , fl = True) for i in oSel: vertexPos = cmds.xform(i, q=True , ws=True , t=True ) GetTree = tree() cmds.move(vertexPos[0],vertexPos[1],vertexPos[2],GetTree) def tree(): Tree_Trunk = cmds.polyCylinder( r=0.3 , h=6 , sx=8 , n="Green_Trunk") cmds.move( 0 , 6/2.4 , 0 , Tree_Trunk ) Tree_Leaves = cmds.polySphere( r=3 , sx=8 , sy=8 , n="Green_Leaves") cmds.move( 0 , 5 , 0 , Tree_Leaves ) cmds.scale( 0.5 , 1.25 , 0.5 ,Tree_Leaves ) cmds.select( Tree_Trunk , Tree_Leaves ) Marge_Tree = cmds.polyUnite( ch=False ) cmds.rename("Tree#")
使い方は実行するだけですね。
頂点を選んで
ボタンを押すだけ。
正直めちゃくちゃ簡単なんで、内容は省きます。
と今回は手抜き…
以上です。
【覚書】maya python入門 其の十一
かなり番外編ですが、11…
とある理由でデータが壊れる事があったので、MAYAで自動バックを作成する
ツールを作りました。
このスクリプトはセーブ実行時にそのデータを指定フォルダに
コピーし、日時で細かく管理、バックアップするツールです。
誤ってセーブしてしまい、一個前に戻りたい…
とかいう時に使用して下さい。
個人的に、あまりナンバリングをシーンにつけるのが
好きじゃないので作成しています。
私はナンバリング派だから。
という人はスルーして下さい。
下記に記載している、コマンドを「AutoBackUP.py」として保存し
C:\Users\ユーザー名\Documents\maya\バージョン\ja_JP\prefs\scripts
英語の場合は
C:\Users\ユーザー名\Documents\maya\バージョン\prefs\scripts
に配置して下さい。
んでMAYA起動。
その後このスクリプトをセーブのショートカットに割り当てます。
手順は以下の通り。
まずはホットキーに新規マッピングします。
マッピングは以下の所から変更できます。
続けて
ホットキーエディタで、コマンドを作成します。
「カテゴリー」から今回は「File」を選択します。
さらに右下の「新規」を押して
下部にあるコマンドに以下のコマンドを入力してください。
import AutoBackUP
AutoBackUP.Auto()
入力が完了したら、ホットキーを割り当てます。
右上にある、「新しいホットキーの割り当て」
にて、ご自身の好きなコマンドを割り当ててください。
私はショートカットのセーブ時に必ず行いたいので
「Ctrl+S」にしてます。
なので、既存のセーブシーンの上書きです。
※普通のセーブシーンがホットキーから外れます。
後は下にある、「割り当て」を実行して下さい。
以上で完了です。
実行してみると、こんな感じになります。
これが実行前。
んで実行すると
こんな感じでプロジェクトフォルダのシーンフォルダ内に「Ver」と命名されたフォルダができます。
この中にバックアップデータができていきます。
画像にも書いてますが、セーブ事にできるので容量には気をつけて下さい。
あと、これは改善予定ではあるんですが、バージョン違いでシーンを開いた時は
このスクリプトがうまく適用できない事があるかと思います。
その時は、一度メニューのセーブを行なってから実行してみてください。
これで大概いけるはずです。
以上です。
以下コード
import maya.cmds as cmds import os.path import shutil import datetime def BackUPP(): day = datetime.datetime.now() Time = day.strftime("%m-%d_%Hh%Mm%Ss") ScenePath = cmds.file( query=True, lastTempFile=True).rpartition( "/" )[0] Scene_Name = cmds.file( query=True, sn=True) Scene_Name_Only = cmds.file( query=True, sn=True , shn=True) Path = ScenePath + "/ver/" if not os.path.exists(Path): os.makedirs(Path) Rename = str(Path)+str(Scene_Name_Only)+"_"+str(Time)+".ma" shutil.copyfile(Scene_Name, Rename) def Auto(): cmds.file( save=True) BackUPP()
【覚書】maya python入門 其の十
今回も動画で学んだコマンドを紹介。
前回に続いて軽めのコードになります。
こんな感じのやつです。
シーン一覧をMAYAディレクトリから取得して
一覧表示し、選択後読み込みといったやつだったと思います。
ではコード
import maya.cmds as cmds import os def UI(): if cmds.window( "Selector_Window" , exists=True ): cmds.deleteUI( "Selector_Window" ) Create_Window = cmds.window( "Selector_Window" , t="Selector" , w=300 , h=300 ,mnb=False , mxb=False , s=False ) oLayout = cmds.columnLayout( w=300 , h=300 ) ImagePath = cmds.internalVar( upd=True ) + "icons/title.jpg" cmds.image( w=300 , h=100 , image=ImagePath ) cmds.separator( h=15 ) Menu_01 = cmds.optionMenu("Menu_01" , w=300 , l="Select Project" , cc=Charactor_Set) Project_Set() cmds.separator( h=15 ) Menu_02 = cmds.optionMenu("Menu_02" , w=300 , l="Select Charactor") Charactor_Set() cmds.separator( h=15 ) cmds.button( l="Open Scene" , w=300 , h=80 , c=Set ) cmds.showWindow(Create_Window) def Project_Set(): projectPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" projects = os.listdir(projectPath) for i in projects: cmds.menuItem( l=i , parent="Menu_01") def Charactor_Set(*args): menuItems = cmds.optionMenu( "Menu_02" , q=True , itemListLong=True) if menuItems != None: for r in menuItems: cmds.deleteUI(r) selProject = cmds.optionMenu( "Menu_01" , q=True , v=True ) charactorPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" + selProject +"/" sceneFils = os.listdir(charactorPath) charactors = [] for j in sceneFils: if j.rpartition( "." )[2] == "mb": charactors.append(j) for k in charactors: ScnceName = k.rpartition(".")[0] cmds.menuItem( l=ScnceName , parent="Menu_02") def Set(*args): selProject = cmds.optionMenu( "Menu_01" , q=True , v=True ) charactorPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" + selProject +"/" SelectScene = cmds.optionMenu( "Menu_02" , q=True , v=True ) SceneName = charactorPath + SelectScene + ".mb" cmds.file( SceneName , open=True , force=True , prompt=False ) print "opening Scene " + SceneName UI()
以外に長いんですよね。
使っている物は今までさほど変わらないので、違った部分だけ参照してみます。
Menu_01 = cmds.optionMenu("Menu_01" , w=300 , l="Select Project" , cc=Charactor_Set)
プルダウンのメニューの詳細を指定しています。
projectPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" projects = os.listdir(projectPath)
ディレクトリフォルダパスで「prefs」で区切って(パスを戻って)
「projects」というパスを指定しています。
要は、
C:\Users\ユーザー名\Documents\maya\2016\prefs
が、
C:\Users\ユーザー名\Documents\maya\2016\projects
に変更した感じです。
んで、次に「listdir」にて作成したパスにあるファイル、フォルダを取得しています。
一応ここも
for i in projects: cmds.menuItem( l=i , parent="Menu_01")
このFOR文でプロジェクトフォルダを取得し、それをプルダウンのメニューに仕込んでます。
続けてそのプロジェクトにあるシーンファイル一覧を取得する部分。
charactorPath = cmds.internalVar( upd=True ).rpartition( "prefs" )[0] + "projects/" + selProject +"/"
ここはプロジェクト取得とほぼ一緒です。
さらに「selProject」というサブフォルダを取得しているだけです。
んで、シーンを取得するのですが、その時に下記のコードで「mbファイル」
だけを取得しております。
charactors = [] for j in sceneFils: if j.rpartition( "." )[2] == "mb": charactors.append(j)
単純に空の配列を作成して、IFで引っ掛かったシーンファイルを
配列に格納しているだけです。
後はその配列に格納されたデータを元に
メニューに登録していきます。
for k in charactors: ScnceName = k.rpartition(".")[0] cmds.menuItem( l=ScnceName , parent="Menu_02")
あとは今までと同じなので、おいておきます…
そんな感じでした。
以上です。
【覚書】maya python入門 其の九
今回からは、動画とかで学んだ事書いていきます。
昔勉強で作成したモノになります。
リンクはすみません。忘れました。
今回スクリプトの内容はこんな感じ。
画像を読み込み→キューブを作成→入力されて名前にリネーム
とこんな感じの簡単なツールです。
画像を↓
ではコードです。
import maya.cmds as cmds if cmds.window("PyWindow",exists=True): cmds.deleteUI("PyWindow") Create_Window = cmds.window( "PyWindow", t = "pythonScirpt_Panel", w=300 , h=300 , s=False , mnb=False , mxb=False) cmds.columnLayout( adj=True ) imagepath = cmds.internalVar( upd=True )+"icons/Window_image02.jpg" cmds.image( w=300 , h=100 , image = imagepath ) cmds.separator( h=10 ) cmds.text("Create And Rename Tool") cmds.separator( h=10 ) sliderW = cmds.intSliderGrp( l="Width" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderH = cmds.intSliderGrp( l="Hight" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderD = cmds.intSliderGrp( l="Depth" , min=1.0 , max=30.0 , field=True , v=1.0 ) cmds.button( l="Create Cube" , c="SetCube()") cmds.separator( h=20 ) Re_name = cmds.textFieldGrp( l="Rename" , ed=True , text="InputChangeName") cmds.button( l="Rename_Cube Name" , c="Rename_Set()") cmds.showWindow(Create_Window) def SetCube(): SetCubeWidth = cmds.intSliderGrp(sliderW, q=True ,v=True ) SetCubeHight = cmds.intSliderGrp(sliderH, q=True ,v=True ) SetCubeDepth = cmds.intSliderGrp(sliderD, q=True ,v=True ) GetCube = cmds.polyCube(w=SetCubeWidth,h=SetCubeHight,d=SetCubeDepth,n="SRT_Cube",ch=False) cmds.move(0,SetCubeHight/2.0,0,GetCube,r=True) def Rename_Set(): Set_name = cmds.textFieldGrp(Re_name, q=True , text=True ) cmds.rename(Set_name)
結構そのまま写したような気がします。
内容は簡単ですね。
では中身を見ていきます。
if cmds.window("PyWindow",exists=True): cmds.deleteUI("PyWindow")
これは今も多用している記載方法です。
「PyWindow」この名前のウィンドウがあれば、削除する。
といった内容になります。
フラグ「exists」で存在の有無を確認しています。
Trueなら、deleteUIで既存UIを削除している状態です。
続いて
Create_Window = cmds.window( "PyWindow", t = "pythonScirpt_Panel", w=300 , h=300 , s=False , mnb=False , mxb=False) cmds.columnLayout( adj=True )
特に難しい所ではないですね。
大きさ、名前を設定し、ウィンドウを作成。
縦にレイアウトを設定している感じです。
では次。
imagepath = cmds.internalVar( upd=True )+"icons/Window_image02.jpg" cmds.image( w=300 , h=100 , image = imagepath ) cmds.separator( h=10 ) cmds.text("Create And Rename Tool") cmds.separator( h=10 )
「C:\Users\ユーザー\Documents\maya\バージョン\prefs\」+「icons\Window_image02.jpg」
のパスを取得しています。
「cmds.internalVar( upd=True )」でMAYAのユーザーフォルダを取得しています。
それに+して、iconsフォルダ内にある画像のパスを取得しています。
その後「cmds.image」で画像を読み込み
セパレートで少し範囲を区切り、テキストのラベルを配置しています。
sliderW = cmds.intSliderGrp( l="Width" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderH = cmds.intSliderGrp( l="Hight" , min=1.0 , max=30.0 , field=True , v=1.0 ) sliderD = cmds.intSliderGrp( l="Depth" , min=1.0 , max=30.0 , field=True , v=1.0 ) cmds.button( l="Create Cube" , c="SetCube()") cmds.separator( h=20 )
スライダーとボタンを配置しています。
キューブの高さ、奥行き、幅を1-30の間で値をアサインできるようにし
キューブを作成するボタンを作成。
Re_name = cmds.textFieldGrp( l="Rename" , ed=True , text="InputChangeName") cmds.button( l="Rename_Cube Name" , c="Rename_Set()") cmds.showWindow(Create_Window)
リネーム用の入力ボックスと、リネームを実行するボタンを実行。
上記で設定したウィンドウを表示しています。
これでウィンドウは生成されたので、これ以下は
各ボタンの実行文になります。
def SetCube(): SetCubeWidth = cmds.intSliderGrp(sliderW, q=True ,v=True ) SetCubeHight = cmds.intSliderGrp(sliderH, q=True ,v=True ) SetCubeDepth = cmds.intSliderGrp(sliderD, q=True ,v=True ) GetCube = cmds.polyCube(w=SetCubeWidth,h=SetCubeHight,d=SetCubeDepth,n="SRT_Cube",ch=False) cmds.move(0,SetCubeHight/2.0,0,GetCube,r=True)
設定された高さ、奥行き、幅を取得し、キューブを作成。
底辺を原点になるように設定。
def Rename_Set(): Set_name = cmds.textFieldGrp(Re_name, q=True , text=True ) cmds.rename(Set_name)
入力された値をもって、キューブの名前を変更します。
これで以上ですね。
内容は簡単なんですが以外と長くなりました。
ただ、値の取り方なんかは役にたったかと思います。
以上。
【覚書】maya python入門 其の八
かなり番外編ですが、
折角なんで、タイトルは続けてみようと思います。
先日、大阪でGTMFと呼ばれるセミナーがあり、1セッションだけ受講したので
その報告と同時にコードの紹介をしたいと思います。
「Autodesk Maya;大人気!カスタム・グラフエディタと便利ツールをPythonで!!」
こんなやつです。
中身はダイキンのサイトwww.comtec.daikin.co.jp
の振り返りです。
一点だけ気になることをおっしゃったので実演したいと思います。
それはMAYAPythonでセレクターを作るというもので
SIでいうシノプティックビューにあたるものです。
MAYA非常にUI作成が簡易な為、簡単に実現できました。
こんな感じ。
画像はネットに落ちてたものです。
コードも。
# -*- coding: UTF-8 -*- #------------------------------------------------------------------------------- import maya.cmds as cmds def Sel(*args): print "selection" window = cmds.window() form = cmds.formLayout() JPG = cmds.image(image = 'c:/test.jpg') b1 = cmds.button(l="R_Hund" , bgc = [1.0,0.5,0.3] , c=Sel) b2 = cmds.button(l="L_Hund" , bgc = [0.0,0.5,1.0] ,c=Sel) cmds.formLayout( form, edit=True, attachForm=[(JPG, 'top', 0),(JPG, 'left', 0),(JPG, 'right', 0),(JPG, 'bottom', 0),(b1,'top',330),(b1,'left',130),(b2,'top',330),(b2,'left',320)] ) cmds.showWindow( window )
このコード自体は私個人が適当に書いたコードなので
ダイキンさんのそれとは少し違います。
Cドライブのtest.jpgを読み込んで
ボタンをフォトショなので調べた値に、置いてるだけです。
こんな感じでセレクターが簡単に作れました。
この詳細は後日サイトにて公開されるみたいなので
そちらをみるとより理解が深まると思います。
詳しく知りたい方は、SDKまで…
以上。
【覚書】maya python入門 其の七
今回は昔作った勉強用のスクリプトがあったので
それを紐解いていきたいと思います。
内容は、スライダーで設定された値を持って
球を作成するというモノになります。
こんな感じです。↓
では早速コード
import maya.cmds as cmds if cmds.window("Obj_EditWindow",exists=True): cmds.deleteUI(Set_Window) Set_Window = cmds.window("Obj_EditWindow",t="Edit_Radius",w=300,h=300) cmds.columnLayout(adj = True) cmds.text("Input RadiusValue") SetRadius = cmds.intSliderGrp( l = "Radius_Value", min = 0.01 , max = 100 , f = True) cmds.button( l = "Create_Sphere",c="Create_Sphere()") cmds.showWindow(Set_Window) def Create_Sphere(): GetRadius = cmds.intSliderGrp(SetRadius, q=True , v=True) C_Sphere = cmds.polySphere(r=GetRadius, n="Sphere_SetRadius")
とても簡単なツールなんで、行も少ないですね。
細かい説明は今度するとして、もう一個スクリプトがあったので
こちらも貼ってみたいと思います。
Aimコンストを行うスクリプト?(マクロ)です。
実行するとこんな感じ。↓
コード。
import maya.cmds as cmds oSel = cmds.ls(orderedSelection=True) if len( oSel ) >= 2: target = oSel[0] oSel.remove( target ) for i in oSel: cmds.aimConstraint(target,i,aimVector=[0,1,0]) else: print 'plase two selection!'
こちらも特に説明がなくてもいい気がしますね。
最後にもう一個。
これは今でも偶に観ています。
ってかHELPに全く同じやつが載ってるはずです・・・
こんなやつです。↓
コード↓
mods = cmds.getModifiers() print 'Modifiers are:' if (mods & 1) > 0: print ' Shift' if (mods & 2) > 0: print ' CapsLock' if (mods & 4) > 0: print ' Ctrl' if (mods & 8) > 0: print ' Alt'
これが本当によく使うコードなので
覚えておきたいんですが、すぐ忘れるんですよね・・・。
とまぁ今回はこの辺りで。
以上。