1

У меня проблема с рекурсивной функцией. Я попытаюсь объяснить как можно лучше: У меня есть фотошоп-документ, содержащий различные смарт-объекты, все имена: Smart_Objectname. Smarts может также содержать другие Smarts.Loop trough parallel Слои

Теперь я попытаюсь написать функцию, которая проходит через весь документ и открывает смарт (ищет с регулярным выражением для «Smart»), если он содержит другой, он откроет следующий и так далее. Если последнее достигнуто, он начинает сохранять каждый слой внутри умного имени с именем «Layername.png» в виде png и снова закрывает его. Затем он сохраняет слои Smart до тех пор, пока не вернется к корневому документу.

«Идет более глубоко в умную часть» уже работает. Но если у меня есть два Smart-объекта в одной и той же иерархии, он не будет работать и будет устанавливать неправильный слой как активный, когда он будет углубляться в первый. Я просто не могу найти ошибку, но что-то кажется неправильным с моим кодом. Любая помощь или простой способ сделать это было бы здорово :)

Вот мой код до сих пор ... может быть немного сложнее:

findSmart(app.activeDocument.layerSets); //call it 

function findSmart(layerNode) {  
for (var i=0; i<layerNode.length; i++) { 


    var res = /Smart/;// a reg exp 
    var mat = collectNamesAM(res);// get array of matching layer indexes 
     for(var y = 0; y < mat.length; y++){ 
      makeActiveByIndex(mat[y], false); 
      // do something with layer 

      var activeLayer = app.activeDocument.activeLayer; 


       //Open smart 
       //======================================================= 
       var idplacedLayerEditContents = stringIDToTypeID("placedLayerEditContents"); 
       var desc45 = new ActionDescriptor(); 
       executeAction(idplacedLayerEditContents, desc45, DialogModes.NO); 
}//next Smart match if any 


    //Go deeper 
    findSmart(layerNode[i].layerSets);  


     var len = app.activeDocument.layers.length; 

     for (var i = 0; i < len; i++) { 
     var layer = app.activeDocument.layers[i]; 

     //search for all .png Layers to save 
     var id = ".png"; 
     var exist = layer.name.slice(-id.length) == id; // true 
     app.activeDocument.activeLayer = layer; 
     var activeLayer = app.activeDocument.activeLayer; 

     //save pic if .png 
     if(exist){ 

      saveAll(); //just opens each layer in another doc and saves it as png then closes the documents without saving    

     }//end if 

    }//end for 

    // Close the Smart Object and move to next one 
    activeDocument.close(SaveOptions.DONOTSAVECHANGES); 

}//first smart 

}//end function 

ответ

0

Я нашел решение. это была небольшая ошибка с вызовом рекурсивной части (я сделал это слишком рано), и если это проверяет умный внутри умного. поэтому последний бит кода сразу после объекта if (существует):

if(y == 0){   
    findSmart(layerNode[y].layerSets); 
    } 

    //Close the Smart Object and move to next one 
    activeDocument.close(SaveOptions.DONOTSAVECHANGES); 

    }//next smart if any 
    }//end for 
}//end function 
Смежные вопросы