2017-09-01 8 views
0
var Doc = activeDocument; 
var newLayerSet = Doc.layerSets.add();   
var count = 0; 

alert(Doc.layers.length); //A 
for(var i=0; i<Doc.layers.length ; i++){ 
    if(Doc.layers[i].name.indexOf ("MMRE") != -1){ 
     Doc.layers[i].move(newLayerSet, ElementPlacement.INSIDE); 
    } 
    count++; 
} 
alert(count); //B 

スクリプトです。 私はプログラムの結果を理解していません。Photoshopスクリプトエラー(レイヤー数)

alert(Doc.layers.length); //A' result is 73. 
but 'alert(count); //B result is 45. 

可能でしょうか?どうして?

+0

あなたは 'Doc.layers'を変更しているあなたはそれを反復しながら、それは(短くなります私が想定し)。 – deceze

答えて

0

まず、スクリプトを実行するたびに新しいグループを追加します。スクリプトはグループ内のレイヤーを数えません。すべてのレイヤー(グループとサブグループを含む)を見つけるには、再帰的な関数を持たなければなりません。グループでの作業は苦痛です:(

私は再帰関数を可能にするようにコードを変更した:

var Doc = activeDocument; 
var newLayerSet = Doc.layerSets.add();   
var count = 0; 

var allLayers = new Array(); 
var theLayers = collectAllLayers(app.activeDocument, 0); 
count = theLayers; 

alert("A: " + allLayers.length); //A 
alert("B: " + count); //B 


// function collect all layers 
function collectAllLayers (theParent, level) 
{ 
    for (var m = theParent.layers.length - 1; m >= 0; m--) 
    { 
    var theLayer = theParent.layers[m]; 

    // apply the function to layersets; 
    if (theLayer.typename == "ArtLayer") 
    { 
     if(theLayer.name.indexOf ("MMRE") != -1) 
     { 
      theLayer.move(newLayerSet, ElementPlacement.INSIDE); 
     } 
    } 
    else 
    { 
     allLayers.push(level + theLayer.name); 
     collectAllLayers(theLayer, level + 1) 
     count++; 
    } 
    } 
    return count; 
} 
関連する問題