我遇到了递归函数的问题。我会尝试尽可能好地解释: 我有一个包含各种智能对象的photoshop文档:Smart_Objectname。 Smarts还可能包含其他Smarts。
我现在尝试编写一个运行整个文档并打开智能的函数(使用正则表达式搜索“智能”),如果它包含另一个,它将打开下一个,依此类推。如果到达最后一个,则开始将名为“Layername.png”的智能内的每个图层保存为png并再次关闭它。然后它会保存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 :(得分:0)
我找到了解决方案。对于递归部分的调用(我做得太早)只是一个小错误,如果在智能内部检查智能。所以if(exists)之后的代码的最后一位应该是:
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