循环并行图层

时间:2015-03-16 15:20:29

标签: javascript loops recursion parallel-processing photoshop-script

我遇到了递归函数的问题。我会尝试尽可能好地解释: 我有一个包含各种智能对象的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

1 个答案:

答案 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