2013-08-01 1 views
0
randoms = [rand.uniform(-1,1)for items in range(10)] 
x= 0 
for i in List: 
    cm.setKeyframe(at = "%s.cv[x].xValue"%i , t=5, v=rand.choice(randoms)) 
    x+=1 

Эта часть кода, которую я хочу использовать, но maya не может принять это [x]. кто-то сказал мне, что вы должны сделать это:значения прироста в майа-питоне

for i in List: 
    x = 0 
    cvAttrX = i+".cv["+str(x)+"].xValue" 
    cm.setKeyframe(at = cvAttrX , t=5, v=rand.choice(randoms)) 
    x+=1 

, но я получил эту ошибку:

# Error: line 1: can only concatenate list (not "str") to list 
# Traceback (most recent call last): 
# File "<maya console>", line 1, in <module> 
# File "<maya console>", line 7, in randList 
# TypeError: can only concatenate list (not "str") to list # 

если кто-то это исправить, пожалуйста, объяснить, что глубоко мне. я хочу узнать это очень хороший и исправьте этот пример тоже:

randoms = [rand.uniform(cm.floatField(Ceil, q = True , v = True),0.5)for i in range(30)] 
    for objects in myList: 
     cm.xform('%s.cv[0]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[1]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[2]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[3]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[4]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[5]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[6]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[7]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[8]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[9]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 
     cm.xform('%s.cv[10]'%objects , r = True , t = [(rand.choice(randoms)),(rand.choice(randoms)),(rand.choice(randoms))]) 

это часть моего сценария, если я могу сделать инкремент я не хочу писать эту линию exampla 100 раз, я могу сделать intField для этого и определить, сколько мне нужно

я хочу сделать что-то вроде этого, но я не знаю, как

import maya.cmds as cm 
import random as rand 
myList = cm.ls(sl =True) 
cvList = [] 
randomList = [] 
def Lister(): 
for i in myList: 
    cvList.append(cm.ls('%s.cv[:]'%i , flatten = True)) 
    return cvList 
def randomize(): 
    x = 0 
    randomList.append([rand.uniform(-1,1)for items in range(10)]) 
    for i in cvList: 
     cm.setKeyframe(at = "%s.cv[x].xValue"%i , t=5, v=rand.choice(randoms)) 
     x+=1 
+1

Это, вероятно, не проблема майи, потому что вы получаете общее сообщение об ошибке Python. Вы пытаетесь объединить списки и строки, это два разных типа, вам не разрешено это делать, вам нужно преобразовать один тип в другой. Какие предметы у вас есть в переменной List? Какой тип maya ожидает как значение аргумента ключевого слова? Не зная этого, можно только догадываться, что проблема, вероятно, лежит здесь: 'cvAttrX = str (i) + ". Cv [" + str (x) + "]. XValue"' –

+0

myList содержит cv информацию о двух кривых. myList = [['c1.cv [1]'], ['c1.cv [2]'], до конца списка] –

+0

Я обновил свой вопрос –

ответ

0
myCurve = cm.ls(sl=1) # Will return [u'curve1'] 

# Since it returned the object in a list in the next command you have to subscript it. 

myCVs = cm.ls(myCurve[0] + ".cv[:]", fl=1) 


# Result: [u'curve1.cv[0]', 
u'curve1.cv[1]', 
u'curve1.cv[2]', 
u'curve1.cv[3]', 
u'curve1.cv[4]', 
u'curve1.cv[5]', 
u'curve1.cv[6]', 
u'curve1.cv[7]', 
u'curve1.cv[8]', 
u'curve1.cv[9]', 
u'curve1.cv[10]'] # 

# We do not need to increment through these, flatten takes care of that. We need only iterate through the list of cvs and concatenate the attribute to the name. 

for i in myCVs: 
    cm.setAttr(i + ".xValue", random.uniform(-1, 1)) 
    print cm.getAttr(i + ".xValue") 

# This will move all the cvs on that curve by a random value between -1 and 1. 

-0.233699187896 
0.353531892619 
0.736778238244 
-0.767007983153 
0.672321920729 
0.0556060597496 
-0.340945469966 
0.252136119281 
-0.396852920849 
-0.683451384587 
0.926232431375 
+0

myList.append (cm.ls ('% s .cv [:] '% i, flatten = True)) –

+0

flatten flag сделать свой список по отдельным позициям –

+0

как этот Результат: [[u'curve1.cv [0]', u'curve1.cv [1] '] , u'curve1.cv [2] ' u'curve1.cv [3]', u'curve1.cv [4] ' u'curve1.cv [5]', u'curve1. cv [6] ', u'curve1.cv [7]', u'curve1.cv [8] ', u'curve1.cv [9]', u'curve1.cv [10] ', u'curve1.cv [11] ', u'curve1.cv [12]', u'curve1.cv [13] ', u'curve1.cv [14] ', u'curve1.cv [15]']] –

0

Ну первый O f все, что вы даже не настроили для анимации. Тебе нужно что-то водить. Прямо сейчас, если вы установите свой ключевой кадр, все это будет происходить на одном кадре. Вы могли бы сделать что-то вроде:

time = cm.currentTime(q=1) 
for i in range(10): 
    cm.setAttr(myCVs[0]+".xValue", random.choice(test)) 
    cm.setKeyframe(myCurve, shape=1, controlPoints=1) 
    time = cm.currentTime(time + 1) 

Или вы можете подключить я в time флаг cm.setKeyframe. Таким образом, это ключевой кадр всей кривой, преобразования, формы и контрольных точек. И вам не придется беспокоиться об итерации через все из них. Сначала установите значение, а затем установите ключевой кадр, как если бы вы были на самом деле анимацией.

+0

Это тот момент, когда вы используете softbodies – joojaa