2017-01-19 8 views
0

Я пытаюсь проверить, имеет ли объект skinCluster. Мой код довольно простой. Вот пример:Maya Python skinCluster возвращает тип не строка?

cmds.select(d=True) 
joint = cmds.joint() 
skinnedSphere = cmds.polySphere(r=2) 
notSkinnedSphere = cmds.polySphere(r=2) 

skinTestList = [skinnedSphere, notSkinnedSphere] 

# Bind the joint chain that contains joint1 to pPlane1 
# and assign a dropoff of 4.5 to all the joints 
# 
cmds.skinCluster(joint, skinnedSphere, dr=4.5) 

for obj in skinTestList: 

    objHist = cmds.listHistory(obj, pdo=True) 

    skinCluster = cmds.ls(objHist, type="skinCluster") 

    if skinCluster == "": 
     print(obj + " has NO skinCluster, skipping.") 
    else: 
     print obj, skinCluster 
     #cmds.select(obj, d=True) 

Моя проблема заключается в том, что даже если он не может найти skincluster, он все равно выводит «OBJ, skincluster», а не ошибка, что он не может найти skinCluster.

Я думал, что skinCluster возвращает строку. Поэтому, если строка пуста, она должна распечатать ошибку, а не «obj, skincluster».

Любая помощь будет оценена!

+0

Есть разные философии, что вернуть, если такого объекта нет. Также может быть «Нет» или «Неверно». Просто выполните отладочную печать для каждого объекта: 'print repr (skinCluster), type (skinCluster)', и вы должны это выяснить. – mkiever

+1

вы также можете проверить, не является ли skinCluster :, что означает, что skinCluster пуст –

+0

ls возвращает пустой список -> []. Вы можете проверить, как сказал вам Ари Голд: если не skinCluster, эквивалент if skinCluster == [] – DrWeeny

ответ

3

Это классическая проблема майя - проблема в том, что Майя часто хочет дать вам списки, а не отдельные предметы, даже если вы знаете, что результат должен быть одним элементом. Это означает, что вы в конечном итоге написали кучу кода, чтобы либо получить один элемент из списка из одного элемента, либо избежать ошибок, возникающих при попытке получить индекс в пустой список.

У вас есть основы, это == "" который Мессинг вас:

for obj in skinTestList: 
    objHist = cmds.listHistory(obj, pdo=True) 
    skinCluster = cmds.ls(objHist, type="skinCluster") or [None] 
    cluster = skinCluster[0] 
    print obj, cluster 

The or [None] гарантирует, что вы всегда получите список с что-то в нем, так что это безопасно использовать [0], чтобы получить единственное значение. Здесь нет хорошего значения возврата, потому что (как указано в комментариях) вы можете if cluster: и пропустить пустые значения.