1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

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

Тема в разделе "Maya", создана пользователем Slavenin, 10 ноя 2010.

Модераторы: Dark™, Skif
  1. Slavenin

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    Всем доброго времени суток!

    Для 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;
     
  2. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Можно это как-то ужать в наглядный, автономный, но неработающий по циклам скрипт? Может и ошибка сама найдется.
     
  3. Styler

    Styler Мастер

    С нами с:
    19.08.2003
    Сообщения:
    669
    Симпатии:
    0
    Баллы:
    118
    Из примера не ясно что там храниться в переменных. Пробуй трейсить пошагово, проверяя значения в переменных
     
  4. Slavenin

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    все просто $mas_materials это массив со всеми материалами. в цикле пробегаемся по всем материалам этого массива. дальше идет проверка присоединена ли к этому материалу текстура. ели да то получаем информацию о ней и пишем ее в переменную $mas_file, далее разбиваем полученную строку по символу точки, получаем имя материала и имя присоединенного на канал color утилиты. Далее если утилита это file, то добавляем в соответствующие массивы: путь до этого файла, имя файла, имя шейдера.

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

    Styler Мастер

    С нами с:
    19.08.2003
    Сообщения:
    669
    Симпатии:
    0
    Баллы:
    118
    он не работает только в 2011? в других все нормально?
     
  6. Slavenin

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    да, все писалось под 2010 и там отлично работает, странности с печатью внутри цикла я заметил еще в 2010, но стоило принты из цикла убрать и он отрабатывал нормально, а в 2011 отказывается работать, вообще. Единственный вариант, который я пока вижу это попробовать поставить сервис пак, если и это не поможет тогда даж не знаю что делать...
     
  7. Styler

    Styler Мастер

    С нами с:
    19.08.2003
    Сообщения:
    669
    Симпатии:
    0
    Баллы:
    118
    попробуй "print" всегда вызывать как функцию, а не как оператор (со скобками):

    print "blahblah\n" -> print("blahblah\n")
     
  8. Slavenin

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    пробовал, не помогло
     
  9. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Стоит сделать проверку на пустой $mas_file, ведь связанной ноды может и не быть, а objectType без аргумента не работает.
    Например, такая конструкция ошибку не выводит:
    Код:
    string $abc = "";
    objectType $abc;
    
     
  10. Slavenin

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    проверка идет здесь
    Код:
    if(`objectType $mas_temp[0]` == "file")
    если связной ноды не будет то токенайз если не ошибаюсь вернет пустую строку, и соответственно проверка вернет ложь и материал не попадет в конечный массив.

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

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Резултьтат твоего кода:
    Код:
    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
    
     
  12. Slavenin

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    Dark™ (3D Award), скажи пожалуйста, а какая винда у тебя стоит, XP или 7? Возможно дело здесь далеко не в майке и скрипте а в винде...
     
  13. Dark™ vip

    Dark™ Administrator Команда форума

    С нами с:
    28.10.2001
    Сообщения:
    3.110
    Симпатии:
    217
    Баллы:
    1.520
    Попробуй такой тест у себя:
    Код:
    string $abc = ""; 
    objectType $abc;
    print "OK";
    
    Вернет ложь, точно? Или все-таки прервет выполнение?
    У меня 7, но дело, скорее, не в этом.
     
  14. Slavenin

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    выполнение прерывается... вот только я не могу понять, почему тогда в предыдущей версии все работало...

    и в справке про это нет ни слова в описании написано:
    и ни слова об аварийном прерывании...

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

    Slavenin Активный участник

    С нами с:
    22.06.2008
    Сообщения:
    264
    Симпатии:
    0
    Баллы:
    16
    заработало!!!! Dark™ (3D Award), большая тебе человеческая благодарность!!!
     
Модераторы: Dark™, Skif

Поделиться этой страницей