Render.ru

Не работает скрипт в Maya 2011(проблема с циклами)

Slavenin

Активный участник
Рейтинг
12
#1
Всем доброго времени суток!

Для 2010 версии разрабатывал скрипт, который ищет дубликаты текстур на материалах и удаляет их, в ней скрипт великолепно работает, а вот в 2011 что-то не так. Скрипт коммерческий поэтому весь я его привести не могу. Странность заключается в том, что очень странно работают циклы. Пример

Код:
for($i = 0; $i < 10: $i++)
{
  print $i;
}
работает прекрасно и распечатывает значения переменной, а вот цикл который отказывается работать, причем если выполнять последовательность действий вручную, то все хорошо, стоит его запустить проходит только одна итерация, причем если верить тому что распечатывается скрипт доходит только до "step2", значение переменной temp в цикле не выводится вовсе, хотя я точно знаю что там массив из двух строк, что показывает простое распечатывание значений, не в цикле. если заменить size($mas_materials) числом результата по прежнему нет, если честно я ничего не понимаю.... причем аналогичные результаты выдает и цикл while.

Код:
  string $mas_fileName[];
  string $mas_path[];
  string $mas_ShaderName[];
  string $mas_All[];
  int $mas_i = 1;

  
  for ($mas_i = 0; $mas_i < size($mas_materials); $mas_i = $mas_i+1)
    {
print ("step1 " + $mas_i +"\n");
print (`objExists ($mas_materials[$mas_i] + ".color")` +"\n");        
        if (`objExists ($mas_materials[$mas_i] + ".color")`)
            {
print "step2\n";  
              string $mas_file = `connectionInfo -sfd ($mas_materials[$mas_i] + ".color")`;
              string $mas_temp[2];
              tokenize $mas_file "." $mas_temp;
print ("array" + $mas_i +"\n");
        
              if(`objectType $mas_temp[0]` == "file")
                {
print "step3\n";  
                  $mas_path[size($mas_path)] = `getAttr ($mas_temp[0] + ".fileTextureName")`;
                  $mas_fileName[size($mas_fileName)] = $mas_temp[0];
                  $mas_ShaderName[size($mas_ShaderName)] = $mas_materials[$mas_i];
                }
            }
       }

print $mas_path;
print $mas_fileName;
print $mas_ShaderName;
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#2
Можно это как-то ужать в наглядный, автономный, но неработающий по циклам скрипт? Может и ошибка сама найдется.
 

Styler

Мастер
Рейтинг
117
#3
Из примера не ясно что там храниться в переменных. Пробуй трейсить пошагово, проверяя значения в переменных
 

Slavenin

Активный участник
Рейтинг
12
#4
все просто $mas_materials это массив со всеми материалами. в цикле пробегаемся по всем материалам этого массива. дальше идет проверка присоединена ли к этому материалу текстура. ели да то получаем информацию о ней и пишем ее в переменную $mas_file, далее разбиваем полученную строку по символу точки, получаем имя материала и имя присоединенного на канал color утилиты. Далее если утилита это file, то добавляем в соответствующие массивы: путь до этого файла, имя файла, имя шейдера.

Из примера не ясно что там храниться в переменных. Пробуй трейсить пошагово, проверяя значения в переменных
Проблема заключается в том, что если делать все построчно, то все работает хорошо, если запускать в цикле не работает ничего.
Эх, жаль нету в майке отладочной среды, типа как в excel для vba, с возможностью контроля значения переменных и построчным выполнением...
 

Slavenin

Активный участник
Рейтинг
12
#6
да, все писалось под 2010 и там отлично работает, странности с печатью внутри цикла я заметил еще в 2010, но стоило принты из цикла убрать и он отрабатывал нормально, а в 2011 отказывается работать, вообще. Единственный вариант, который я пока вижу это попробовать поставить сервис пак, если и это не поможет тогда даж не знаю что делать...
 

Styler

Мастер
Рейтинг
117
#7
попробуй "print" всегда вызывать как функцию, а не как оператор (со скобками):

print "blahblah\n" -> print("blahblah\n")
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#9
Стоит сделать проверку на пустой $mas_file, ведь связанной ноды может и не быть, а objectType без аргумента не работает.
Например, такая конструкция ошибку не выводит:
Код:
string $abc = "";
objectType $abc;
 

Slavenin

Активный участник
Рейтинг
12
#10
проверка идет здесь
Код:
if(`objectType $mas_temp[0]` == "file")
если связной ноды не будет то токенайз если не ошибаюсь вернет пустую строку, и соответственно проверка вернет ложь и материал не попадет в конечный массив.

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

Dark™

Модератор форума
Команда форума
Рейтинг
431
#11
Резултьтат твоего кода:
Код:
step1 0
1
step2
array0
step3
step1 1
1
step2
array1
С проверкой:
Код:
step1 0
1
step2
array0
step3
step1 1
1
step2
step1 2
1
step2
array2
step3
step1 3
1
step2
array3
step3



file1
file2
file3
lambert1
lambert2
lambert3
 

Slavenin

Активный участник
Рейтинг
12
#12
Dark™ (3D Award), скажи пожалуйста, а какая винда у тебя стоит, XP или 7? Возможно дело здесь далеко не в майке и скрипте а в винде...
 

Dark™

Модератор форума
Команда форума
Рейтинг
431
#13
Попробуй такой тест у себя:
Код:
string $abc = ""; 
objectType $abc;
print "OK";
Вернет ложь, точно? Или все-таки прервет выполнение?
У меня 7, но дело, скорее, не в этом.
 

Slavenin

Активный участник
Рейтинг
12
#14
выполнение прерывается... вот только я не могу понять, почему тогда в предыдущей версии все работало...

и в справке про это нет ни слова в описании написано:
This command returns the type of elements. Warning: This command is incomplete and may not be supported by all object types.
и ни слова об аварийном прерывании...

ладно сейчас попробую подправить этот скользкий момент...
 

Slavenin

Активный участник
Рейтинг
12
#15
заработало!!!! Dark™ (3D Award), большая тебе человеческая благодарность!!!
 
Сверху