я следующий код, написанный в 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;
}
Это, и он должен. Но обратите внимание, что ExtendScript сильно использует коллекции (которые выглядят так же, как массивы, но на самом деле не являются *), и поэтому ваши манипуляции могут, например, изменить массив 'selectedLayers'. Можете ли вы показать немного больше контекста? [Один трюк, который может работать при некоторых обстоятельствах, - это прокрутка назад, а не вперед.] – usr2564301
Я отредактировал свой вопрос, чтобы добавить весь мой код. – PaulJ
Я просмотрел ваш код, и я не могу найти проблему, поскольку у меня нет опыта работы со слоями, но могу ли я предложить вам запустить ваш скрипт из инструментария ExtendScript и запустить его шаг за шагом, пока вы не поймете, где он, кажется, терпит неудачу в вашей петле? –