MAYA,Python Python list 配列を知らないと何も始まらない MAYAアーティストのスクリプト入門

Python list 配列を知らないと何も始まらない MAYAアーティストのスクリプト入門

python_list_topimage

Pythonのスクリプトで頻繁に使われる list(配列)

特にMAYAで使われるスクリプトの多くは list から始まってるといっても過言ではないぐらい重要です。

今回はMAYAでスクリプトを書く上で避けては通れない list の使い方を紹介します。

list もしくは 配列 どちらの言い方でも良いと思いますが、
この記事ではlist で統一したいと思います。
(Pythonでも便宜上 配列 という言い方はしますが list が正しいです)

以前にMAYAアーティストが初めて触るPythonスクリプトの記事を書いたので、MAYAでスクリプトを書き始める事前準備として、以下の記事も読んでもらえると良いと思います。

[初心者]MAYAアーティストが0から始めるpythonスクリプト入門

[Python] if文の使い方 MAYAアーティストのスクリプト入門

[Python] if文の使い方 MAYAアーティストのスクリプト入門


ls()で取得するのはlist

MAYAで使うスクリプトの多くが ls(sl=True) でオブジェクトや頂点、
マテリアルやライトなど実行させたい対象を取得するところから始まると思います。

python_list_01

例えばMAYAでオブジェクト等を幾つか選択した状態で下のスクリプトを実行すると

import maya.cmds as cmds

select_Objs_List = cmds.ls(sl=True)
print(select_Objs_List)

出力

[u’pTorus1′, u’pCone1′, u’pCylinder1′, u’pCube1′, u’pSphere1′]

と返されます。

見ての通り[]の中に選択した要素が並んで入っています。

ls(sl=True)で返されるのは list なんです。

なのでMAYAでスクリプトを書くためには何はなくとも list を扱える事が重要。

listから要素を取り出す

単純に順番に名前を取り出すだけであれば以下のように書けます。

import maya.cmds as cmds

select_Objs_List = cmds.ls(sl=True)

for i_obj in select_Objs_List:
    print(i_obj)

オブジェクトを複数選択して実行します。

pTorus1
pCone1
pCylinder1
pCube1
pSphere1

選択したオブジェクトが順番に出力されました。

listから順番を指定して要素を取り出すには list[] と書きます。

import maya.cmds as cmds

select_Objs_List = cmds.ls(sl=True)

print(select_Objs_List)
print(select_Objs_List[3])

幾つかオブジェクトを選択して実行します。

[u’pTorus1′, u’pCone1′, u’pCylinder1′, u’pCube1′, u’pSphere1′]
pCube1

一行目は選択したオブジェクトが順番に並んでいるlistが出力されました

二行目はその中から select_Objs_List[3] と指定した要素が出力されました。

順番は0から数え始めるので3と指定したら 0 1 2 3 の pCube1 が出力されます。

listに要素を追加 append() insert()

要素を追加する時は append()を使います。

空のlist new_list を作りました。

new_list = []
new_list.append("newItem")

print(new_list)

実行すると

[‘newItem’]

と空だったnew_listに ‘newItem’ が追加されて出力されました。

append()で追加するとlistの後ろに追加されます。
もう一度new_listに要素を追加します。

new_list.append("newItem2")

print(new_list)

実行します。

[‘newItem’, ‘newItem2’]

‘newItem’の後ろに’newItem2’が追加されました。

もし追加したい順番を指定したい場合は insert()を使います。

new_listの最初に追加してみましょう。

new_list.insert(0,"newItem3")

print(new_list)

実行します。

[‘newItem3’, ‘newItem’, ‘newItem2’]

‘newItem3’が先頭に追加されました。

new_list.insert(順番,要素)

と書くと指定した場所に追加することが出来ます。

listの要素の数を取得 len()

listの中に幾つ要素が入っているか知りたい場合はlen()を使います

print(len(new_list))

実行します。

3

new_list に要素が3個入っていると出力されました。

他のlistと結合 extend()

listは他のlistと結合することが出来ます。

結合する時は extend() を使います。

new_list に new_list2 のlistを結合してみましょう。

new_list2 = ["new_item10","new_item11","new_item12",100,200]

new_list.extend(new_list2)

print(new_list)

実行します。

[‘newItem3’, ‘newItem’, ‘newItem2’, ‘new_item10’, ‘new_item11’, ‘new_item12’, 100, 200]

new_list2 の中にあった要素が new_list に追加されました。

もし新たにlistを作って結合したい場合は + で結合します

new_list3 = new_list + new_list2

と + で結合すれば、どちらのlistの要素も含んだ新たなlist new_list3が作られます。

Pythonのlistは文字列や数字など違う型の要素を混在させることが出来ます。

listの中を検索 in count()

listの中に指定した要素が含まれているかを知りたい場合は in を使います。

"new_item10" in new_list

出力

# Result: True #

new_listの中に”new_item10″は存在すると返答されました。

存在していなかったら

"new_item17" in new_list

出力

# Result: False #

False と出力されます。


使い方の例としては

if "new_item12" in new_list:
    print("i found new_item12")

の様に if で使う事が多いと思います。

listの中に指定した要素が幾つ含まれてるか検索したい場合は count()を使います

new_list.count("new_item12")

出力

# Result: 1 #

イエスかノーかでは無くlist内に幾つ有るかで返答されます。

もしnew_listの中に”new_item12″が4個あったら 4 と返答されます。

もしnew_listの中に”new_item12″が存在しなかったら 

# Result: 0 #

と返されます。

listから要素を削除 del

listから指定した要素を削除する時は del を使います。

del new_list[2]
print(new_list)

出力

[‘newItem3’, ‘newItem’, ‘new_item10’, ‘new_item11’, ‘new_item12’, 100, 200]

元のnew_listの 0 1 2 番目にあった”newItem2″がなくなりました

listの中をソート sort() reverse()

sort() を使うとlistの順番を変えることが出来ます。

ランダムに並んだ数字の値を数字通りに並べ替えます。

num_list = [8,7,1,9,5,2]

num_list.sort()

print(num_list)

実行します。

[1, 2, 5, 7, 8, 9]

num_listの順番がきれいに数字の大小の順番が変わりました。

reverse()を使うと順番を逆順に出来ます。

num_list.reverse()

print(num_list)

実行します。

[9, 8, 7, 5, 2, 1]

大きい順に変わりました。

for文で使う

listはfor文と一緒に使うことが多いと思います。

最初の項目「listから要素を取り出す」で

import maya.cmds as cmds

select_Objs_List = cmds.ls(sl=True)

for i_obj in select_Objs_List:
    print(i_obj)

を紹介しました。

応用として要素の数を取得するlen() と 要素を取り出すlist[]  
そしてfor文を指定した数だけループさせるrange を使う方法を紹介します。

listの中から特定のオブジェクトの名前だけを出力、色を赤く変えます。

import maya.cmds as cmds

select_Objs_List = cmds.ls(sl=True)
print(select_Objs_List)

for i_obj in range(len(select_Objs_List)):
    if i_obj == 3:
        print(select_Objs_List[i_obj])
        cmds.polyColorPerVertex(select_Objs_List[i_obj], rgb=(1.0, 0.0, 0.0), cdo=True )

select_Objs_Listの要素のlen()で取得します。
あとは rangeで0から要素の数だけfor文のループをします。

if i_obj == 3:

0 1 2 3 番目のオブジェクトになったら

print(select_Objs_List[i_obj])
cmds.polyColorPerVertex(select_Objs_List[i_obj], rgb=(1.0, 0.0, 0.0), cdo=True )

if文で条件を満たした(3番目の)オブジェクトの名前を出力し色を赤に変えます。

複数のオブジェクト等を選択した状態で実行します。

python_list_02
[u’pTorus1′, u’pCone1′, u’pCylinder1′, u’pCube1′, u’pSphere1′]
pCube1

listの並び順で4番目のpCube1 が赤色に変わりました。

まとめ

listは説明する事が多く、それぞれが駆け足的に短く簡単になってしまいました。

まだまだ紹介しきれてない事がありますが、一通り理解してもらえたら
 list を使ってスクリプトが書けると思います。

MAYAでスクリプトを書くためには、日付や数値、名前などなど
ls(sl=True) 以外にも list は頻繁に使用するので是非覚えてほしいです。


Twitter Facebook Pocket LINE はてブ

おすすめの関連記事
コチラの記事も読まれています
あわせてよく読まれている記事