# Ошибка: Ошибка типа: файл <консоль maya> строка 49: Ошибка при получении аргументов по умолчанию #
Я пытаюсь импортировать значения XYZ из CSV-файла в некоторые объекты в Maya, используя следующий код:
import maya.cmds as cmds
def getDataByFrame(fileName):
# Open and read lines from some csv file
data = fileName
f = open(data)
line = f.readline()
dataPerFrame = []
original, object, x, y, z = line.split(",")
while line:
frame, object, x, y, z = line.split(",")
if frame != original:
print dataPerFrame
return dataPerFrame
#print frame
#print x
#print y
#print z
else:
dataPerFrame.append(line)
line = f.readline()
f.close()
def animate(data):
for i in range (len(data)):
print "dada"
frame, objectName, x, y, z = data[i].split(",")
print frame
print objectName
print x
print y
print z
frame = float(frame)
x = float(x)
y = float(y)
z = float(z)
**cmds.currentTime(frame)
cmds.setAttr (objectName+".tx", x)
cmds.setKeyframe( v=x, at='translateX' )
cmds.setAttr (objectName+".ty", y)
cmds.setKeyframe( v=y, at='translateY' )
cmds.setAttr (objectName+".tz", z)
cmds.setKeyframe( v=z, at='translateZ' )**
data = getDataByFrame("C:/Users/User/Desktop/Stickman/testing.csv")
animate(data)
Проблема в том, что я получаю сообщение об ошибке: "Ошибка при получении аргументов по умолчанию". Выделенный код был переведен с кода mel, который я нашел на официальном веб-сайте справки Maya:
global proc getAnim(string $fileName, string $objectName)
{
//open the file for reading
$fileId=`fopen $fileName "r"`;
//get the first line of text
string $nextLine = `fgetline $fileId`;
//while $nextline is not emtpy(end of file) do the following
while ( size( $nextLine ) > 0 ) {
//tokenize(split) line into separate elements of an array
string $rawAnimArray[];
tokenize ($nextLine, " ",$rawAnimArray);
//place each element of the array into separate variables
print $rawAnimArray;
float $frame=$rawAnimArray[0];
float $x=$rawAnimArray[1];
float $y=$rawAnimArray[2];
float $z=$rawAnimArray[3];
//change the currentTime and set keys for tx, ty, tz
currentTime $frame ;
setAttr ($objectName+".tx") $x;
setKeyframe ($objectName+".tx");
setAttr ($objectName+".ty") $y;
setKeyframe ($objectName+".ty");
setAttr ($objectName+".tz") $z;
setKeyframe ($objectName+".tz");
//get the next line in the ascii file.
$nextLine = `fgetline $fileId`;
}
//close file
fclose $fileId;
}
Я не уверен, что это потому, что я неправильно перевел эти строки кода на Python или это произошло из-за чего-то другого.
1 ответ
Просто глядя на ваш код, вот две ошибки:
строка 47: **cmds.currentTime(frame)
-> cmds.currentTime(frame)
строка 53: cmds.setKeyframe( v=z, at='translateZ' )**
-> cmds.setKeyframe(objectName, v=z, at='translateZ' )
Для анимации я бы сделал что-то подобное. Первые оси attr и attr приведены здесь просто в качестве примера, если вы хотите добавить вращение и масштабирование в свой csv.
def animate(data):
for d in data:
visibility = []
frame, objectName = d.split(",")[:2]
values = [float(i) for i in d.split(",")[2:]]
# just for the fun to see if there is a visibility value
guess = [len(values)/3, len(values)%3
if guess[1]:
visibility = ('v', values[0])
values = values[1:]
attr = ['t','r', 's'][:guess[0]/3]
attr_axes = [i+j for i in attr for j in ['x', 'y', 'z']]
feed = zip(attr_axes, values)
if visibility:
feed += visibility
for d in feed:
cmds.setKeyframe(objectName, v=d[1], at=d[0], t=frame)
data = ["10, pSphere1, 1,2,3", "20, pSphere1, 5,6,7"]
# EXAMPLE : data = [ "10, pSphere1, 1, 1, 2, 3, 4,5 , 6, 1.1, 1.2, 1.3"]
# EXAMPLE : data = [frame, obj, visibility, tx, ty, tz, rx, ry, rz, sx, sy, sz]
animate(data)
если вы хотите просто необходимый код:
def animate(data):
for d in data:
frame, objectName = d.split(",")[:2]
values = [float(i) for i in d.split(",")[2:]]
attr = ['t']
attr_axes = [i+j for i in attr for j in ['x', 'y', 'z']]
feed = zip(attr_axes, values) # + visibility
for d in feed:
cmds.setKeyframe(objectName, v=d[1], at=d[0], t=frame)
data = ["10, pSphere1, 1,2,3", "20, pSphere1, 5,6,7"]
animate(data)
---РЕДАКТИРОВАТЬ---
Последние советы: если вы хотите редактировать много объектов, я перегруппирую объекты и атрибуты с одним и тем же значением, так как в противном случае это может быть очень медленным