ON-BLOG

CGのこと、あれこれ書いてます。

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#")

使い方は実行するだけですね。
頂点を選んで
f:id:tommy_on:20150817110301j:plain
ボタンを押すだけ。
f:id:tommy_on:20150817110456j:plain

正直めちゃくちゃ簡単なんで、内容は省きます。

と今回は手抜き…


以上です。

【覚書】maya python入門 其の十一

かなり番外編ですが、11…





とある理由でデータが壊れる事があったので、MAYAで自動バックを作成する
ツールを作りました。



このスクリプトはセーブ実行時にそのデータを指定フォルダに
コピーし、日時で細かく管理、バックアップするツールです。
誤ってセーブしてしまい、一個前に戻りたい…
とかいう時に使用して下さい。
個人的に、あまりナンバリングをシーンにつけるのが
好きじゃないので作成しています。
私はナンバリング派だから。
という人はスルーして下さい。


下記に記載している、コマンドを「AutoBackUP.py」として保存し

C:\Users\ユーザー名\Documents\maya\バージョン\ja_JP\prefs\scripts
英語の場合は
C:\Users\ユーザー名\Documents\maya\バージョン\prefs\scripts
に配置して下さい。

んでMAYA起動。
その後このスクリプトをセーブのショートカットに割り当てます。
手順は以下の通り。
まずはホットキーに新規マッピングします。
マッピングは以下の所から変更できます。
f:id:tommy_on:20150807170317j:plain

続けて
ホットキーエディタで、コマンドを作成します。
「カテゴリー」から今回は「File」を選択します。
f:id:tommy_on:20150807170448j:plain

さらに右下の「新規」を押して
下部にあるコマンドに以下のコマンドを入力してください。

import AutoBackUP
AutoBackUP.Auto()

f:id:tommy_on:20150807170257j:plain

入力が完了したら、ホットキーを割り当てます。
右上にある、「新しいホットキーの割り当て」
にて、ご自身の好きなコマンドを割り当ててください。
私はショートカットのセーブ時に必ず行いたいので
「Ctrl+S」にしてます。
なので、既存のセーブシーンの上書きです。
※普通のセーブシーンがホットキーから外れます。
後は下にある、「割り当て」を実行して下さい。
以上で完了です。

実行してみると、こんな感じになります。
これが実行前。
f:id:tommy_on:20150807170357j:plain

んで実行すると
f:id:tommy_on:20150807170352j:plain

こんな感じでプロジェクトフォルダのシーンフォルダ内に「Ver」と命名されたフォルダができます。
この中にバックアップデータができていきます。
f:id:tommy_on:20150807170339j:plain

画像にも書いてますが、セーブ事にできるので容量には気をつけて下さい。

あと、これは改善予定ではあるんですが、バージョン違いでシーンを開いた時は
このスクリプトがうまく適用できない事があるかと思います。
その時は、一度メニューのセーブを行なってから実行してみてください。
これで大概いけるはずです。

以上です。



以下コード

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入門 其の十

今回も動画で学んだコマンドを紹介。

前回に続いて軽めのコードになります。
こんな感じのやつです。
f:id:tommy_on:20150727114016g:plain
シーン一覧を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入門 其の九

今回からは、動画とかで学んだ事書いていきます。
昔勉強で作成したモノになります。
リンクはすみません。忘れました。


今回スクリプトの内容はこんな感じ。
画像を読み込み→キューブを作成→入力されて名前にリネーム
とこんな感じの簡単なツールです。
画像を↓
f:id:tommy_on:20150708111713g:plain


ではコードです。

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作成が簡易な為、簡単に実現できました。
こんな感じ。
画像はネットに落ちてたものです。
f:id:tommy_on:20150715152547p:plain


コードも。

# -*- 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入門 其の七

今回は昔作った勉強用のスクリプトがあったので
それを紐解いていきたいと思います。

内容は、スライダーで設定された値を持って
球を作成するというモノになります。
こんな感じです。↓
f:id:tommy_on:20150708114857g:plain

では早速コード

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コンストを行うスクリプト?(マクロ)です。
実行するとこんな感じ。↓
f:id:tommy_on:20150708114935g:plain

コード。

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に全く同じやつが載ってるはずです・・・

こんなやつです。↓
f:id:tommy_on:20150708115002g:plain


コード↓

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'


これが本当によく使うコードなので
覚えておきたいんですが、すぐ忘れるんですよね・・・。



とまぁ今回はこの辺りで。

以上。