maya
シーンオブジェクトの検索
サーチ…
名前でオブジェクトを検索する
ls()コマンドを使用して名前でオブジェクトを検索します。
freds = cmds.ls("fred")
#finds all objects in the scene named exactly 'fred', ie [u'fred', u'|group1|fred']
*をワイルドカードとして使用する:
freds = cmds.ls("fred*")
# finds all objects whose name starts with 'fred'
# [u'fred', u'frederick', u'fred2']
has_fred = cmds.ls("*fred*")
# [u'fred', u'alfred', u'fredericka']
ls()は複数のフィルタ文字列引数をとります:
cmds.ls("fred", "barney")
# [u'fred', u'|group1|barney']
iterable引数を受け入れることもできます:
look_for = ['fred', 'barney']
# cmds.ls(look_for)
# [u'fred', u'|group1|barney']
ls()の結果を扱う
ls()をフィルタとして使用すると、奇妙な結果が得られることがあります。誤ってフィルタ引数を渡して引数なしでls()を呼び出すことを忘れた場合は、Mayaシーンのすべてのノードのリストを取得します。
cmds.ls()
# [u'time1', u'sequenceManager1', u'hardwareRenderingGlobals', u'renderPartition'...] etc
これの一般的な原因は、 ls()内の* argsを使用することです。
cmds.ls(["fred", "barney"]) # OK, returns ['fred', 'barney']
cmds.ls([]) # OK, returns []
cmds.ls(*[]) # not ok: returns all nodes!
Maya 2015およびそれ以前
2015年以前のMayaでは、何も見つからないls()クエリは空のリストの代わりにNoneを返します。結果を使用する場合、例外が発生する可能性があります。
for item in cmds.ls("don't_exist"):
print item
# Error: TypeError: file <maya console> line 1: 'NoneType' object is not iterable
この問題を回避する最もクリーンなイディオムは、Noneが返されたときにls()操作の後にor []追加したときに常に代替出力を追加することです。これは、戻り値がNoneではなく空のリストであることを保証します。
for item in cmds.ls("don't_exist") or []:
print item
# prints nothing since there's no result -- but no exception
タイプによるオブジェクトの検索
ls()にはtypeフラグがあり、特定のタイプのシーンノードを見つけることができます。例えば:
cameras = cmds.ls(type='camera')
// [u'topShape', u'sideShape', u'perspShape', u'frontShape']
同じコールで複数のタイプを検索することができます。
geometry = cmds.ls(type=('mesh', 'nurbsCurve', 'nurbsSurface'))
Mayaの内部クラス階層に対応する「抽象」型を検索することもできます。特定のオブジェクトが表すノードの種類を調べるには、 nodeTypeコマンドを使用しnodeType 。
cmds.nodeType('pCubeShape1', i=True) # 'i' includes the inherited object types
// Result: [u'containerBase',
u'entity',
u'dagNode',
u'shape',
u'geometryShape',
u'deformableShape',
u'controlPoint',
u'surfaceShape',
u'mesh'] //
# in this example, ls with any of the above types will return `pCubeShape1`
ls()を使ってオブジェクトが存在するかどうかを調べる
ls()は名前でオブジェクトを見つけるので、オブジェクトがシーン内に存在するかどうかを調べる便利な方法です。オブジェクトのリストを持つls()は、シーンにあるものだけを返します。
available_characters = cmds.ls('fred', 'barney', 'wilma', 'dino')
# available_characters will contain only the named characters that are present
コンポーネント選択の操作
頂点やUVポイントなどのコンポーネントを操作する場合、Mayaではデフォルトで個々の項目ではなくコロンで区切られた範囲が返されます。
print cmds.ls('pCube1.vtx[*]') # get all the vertices in the cube
# [u'pCube1.vtx[0:7]']
flattenオプションでlsを使用すると、範囲記法を個々のコンポーネントエントリに拡張することができます。
expanded = cmds.ls('pCube1.vtx[*]', flatten=True)
print expanded
# [u'pCube1.vtx[0]', u'pCube1.vtx[1]', u'pCube1.vtx[2]', u'pCube1.vtx[3]', u'pCube1.vtx[4]', u'pCube1.vtx[5]', u'pCube1.vtx[6]', u'pCube1.vtx[7]']
pCube1.vtx[0:7]ような文字列を複数の個別の項目に変換するコードを書く必要がないので、この形式は通常はループするときに優れています。
filterExpandコマンドを使用して同じ結果を得ることもできます。
lsから単一のオブジェクトを安全に取得する
多くのls()クエリは単一のオブジェクトを見つけることを目的としていますが、 ls常にリストを返します(古いMayaでは単一のNone )。これは、簡単な質問に対して複雑なエラーチェックを作成します。
どのような状況でもlsから単一の値を取得する最も簡単な方法は次のlsです。
result = (cmds.ls('your query here') or [None])[0]
or最低でもあなたが単一含まないリストを取得しますことを保証None 、あなたがそれにいつものインデックスをすることができます。
このスタイルでは、複数の結果が得られているかどうかはわかりません。単一の結果を取るだけで安全です。