2014-11-22 2 views
0

я следующий код, написанный в ExtendScript обрабатывать серию слоев в After Effects композиции:Extendscript: как пропустить текущую итерацию в цикле for?

for (var i=0; i < selectedLayers.length; i++) { 
     var layer = selectedLayers[i]; 
     if (!layer.hasVideo || !layer.enabled) { 
      //Go for the next one 
      continue; 
      } 
     //Do stuff 
     } 

Если элемент не включен или не имеет видео в нем, цикл должен пропустить Это; если это так, то оно должно быть обработано.

Теперь все работает нормально, если нет элементов, которые удовлетворяют этому значению "if", но если один элемент выполняет эту проверку ... тогда цикл застревает на следующей итерации. То есть: представьте, если элемент в i = 2 не имеет видео. Выполняется «continue» ... и затем цикл зацикливается бесконечно на i = 3 и никогда не заканчивается.

Почему это происходит? Я думал, что «продолжить» - это именно инструкция пропустить итерацию цикла в Javascript/Extendscript. Что происходит?

EDIT: в соответствии с запросом, вот мой весь код. Возможно, я забыл скобки где-то в одном из вложенных «если» ... но в этом случае, как код может работать в некоторых случаях, а не в других?

var nombreDelPlugin="Denoiser II"; 

var rutaRender="/Users/paulj"; 

var activeItem = app.project.activeItem; 
if ((activeItem == null) || !(activeItem instanceof CompItem)) { 
    alert("Please select or open a composition first."); 
    } 
else { 
    var selectedLayers = activeItem.selectedLayers; 
    if (activeItem.selectedLayers.length == 0) { 
     alert("Please select at least one layer in the active comp first."); 
     } 
    else { 
     var comp = app.project.activeItem; 
     var width=comp.width; 
     var height=comp.height; 
     var par=comp.pixelAspect; 
     var fps=comp.frameRate; 

     var tempFolder = comp.parentFolder.items.addFolder(comp.name + " - Temp Comps"); 
     var ClipsAnadidos=Array(); 
     var nombresUsados={}; 

     for (var i=0; i < selectedLayers.length; i++) { 
      alert("Mooo: " + i); 
      var layer = selectedLayers[i]; 
      if (!layer.hasVideo || !layer.enabled) { 
        alert("Meeept: " + i); 
        continue; 
        } 
    /*   if (!esFootage(layer)) { 
       alert("Meeept: " + i); 
       break; 
       } 
*/ 
      //¿Hemos renderizado ya este layer? Si es así, nos lo saltamos. 
      var original=layer.source; 
      if (inArray(original, ClipsAnadidos) > 0) { 
       continue; 
       } 
      ClipsAnadidos.push(original); 

      //¿Hay otra comp ya con este mismo nombre? 
      var vecesUsado=nombresUsados[original.name]; 
      if (!vecesUsado) { vecesUsado=0; } 
      var nombre= original.name + "_" + vecesUsado; 
      nombresUsados[original.name]=vecesUsado + 1; 

      //Creamos la nueva comp con el clip dentro 
      var newcomp=app.project.items.addComp(nombre, width, height, par, original.duration, fps); 
      var newlayer=newcomp.layers.add(original, original.duration); 
      newcomp.parentFolder=tempFolder; 

      //Si la escala no es 100, usamos la de la comp original 
      if ((layer.scale.value[0] != 100) || (layer.scale.value[1] != 100)) { 
       newlayer.scale = layer.scale.value; 
       } 

      var denoise = newlayer.property("Effects").addProperty(nombreDelPlugin); 

      //Añadimos al render queue, y establecemos la ruta de salida 
      var rqi = app.project.renderQueue.items.add(newcomp); 
      var om = rqi.outputModule(1);        // Assumes at least one output module 
      om.file=new File(rutaRender + "/" + original.name); 
      } 
     } 
    } 



function esFootage(lay) { 
    if (lay.source instanceof FootageItem) { 
     //alert(lay.name + " es footage"); 
     if (lay.source.mainSource instanceof SolidSource) { return false; } 
     else { return true; } 
     } 
    if (lay.source instanceof CompItem) { 
     return true; 
     } 
    else { return false; } 
    } 


function inArray(v, arr) { 
    for (i=0; i < arr.length; i++) { 
     if (arr[i] == v) { return i; } 
     } 
    return -1; 
    } 
+1

Это, и он должен. Но обратите внимание, что ExtendScript сильно использует коллекции (которые выглядят так же, как массивы, но на самом деле не являются *), и поэтому ваши манипуляции могут, например, изменить массив 'selectedLayers'. Можете ли вы показать немного больше контекста? [Один трюк, который может работать при некоторых обстоятельствах, - это прокрутка назад, а не вперед.] – usr2564301

+0

Я отредактировал свой вопрос, чтобы добавить весь мой код. – PaulJ

+0

Я просмотрел ваш код, и я не могу найти проблему, поскольку у меня нет опыта работы со слоями, но могу ли я предложить вам запустить ваш скрипт из инструментария ExtendScript и запустить его шаг за шагом, пока вы не поймете, где он, кажется, терпит неудачу в вашей петле? –

ответ

0

Это прекрасно работает для меня:

var selectedLayers = [ 
    {hasVideo: true, enabled: true}, 
    {hasVideo: true, enabled: true}, 
    {hasVideo: true, enabled: false}, 
    {hasVideo: true, enabled: true}, 
    {hasVideo: false, enabled: true} 
]; 

for (var i=0; i < selectedLayers.length; i++) { 
    var layer = selectedLayers[i]; 

    if (!layer.hasVideo || !layer.enabled) { 
    //Go for the next one 
    continue; 
    } 

    //Do stuff 
    console.log(i); 
} 

Он пропускает 2 и 4 и выходы:

0 
1 
3 


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

Смежные вопросы