在Javascript中循环遍历Photoshop图层

4
我正在尝试编写一个Photoshop脚本,以显示给定名称的所有图层。我需要循环遍历所有可能的嵌套图层集,并使用以下代码:
function showBounds(layerNode)
{
    for(var layer in layerNode.artLayers)
    {
        if (layer.name == "@bounds")
        {
            layer.visible = 1;
        }
    }

    showBounds(layerNode.layerSets);
}

showBounds(app.activeDocument.doc.layerSets);

但是当我运行它时,出现了以下错误:
Error 1302: No such element
Line: 5
->      for(var layer in layerNode.artLayers)

artLayers 应该是 LayerSets 的一个属性,所以我感到困惑。

这也是我第一次尝试编写 PS 脚本(并使用 javascript),因此可能有一些基本概念我没有掌握。


for(..in..) 语句中不需要使用 var - SomeKittens
在我看来,似乎有一些“layerNode”没有“layerNode.artLayers”。 - jfriend00
1个回答

7
我认为你需要更像这样的东西:
function showBounds(layerNode) {    
    for (var i=0; i<layerNode.length; i++) {

        showBounds(layerNode[i].layerSets);

        for(var layerIndex=0; layerIndex < layerNode[i].artLayers.length; layerIndex++) {
            var layer=layerNode[i].artLayers[layerIndex];
            if (layer.name == "@bounds") {
                layer.visible = 1;
            }
        }
    }
}

showBounds(app.activeDocument.layerSets);

另外,javascript的for...in语法与您认为的不同。它并不像foreach循环一样运行。它会遍历对象的属性名称。


这个可行(谢谢!)...但是我的天啊,PS脚本太慢了。在有20个图层的文件上运行需要30秒。在一个价值600美元的程序中,没有任何借口可以解释这种情况。谷歌搜索只显示了关于PS脚本速度慢的抱怨。哦,好吧...我尝试过了。 :-) - Roger Gilbrat
嗯...我在一个2000x2000的文件上尝试了一下,其中有36个图层都在同一个图层集中,只用了大约2秒钟。这是使用CS6完成的。 - aquinas
我也在使用CS6。有一个包含20个图层集的外部图层集,每个图层集都有4或5个艺术图层。我正在iMac上运行(8个核心)。当我运行脚本时,PS屏幕闪烁,就像在每个命令之后尝试更新一样。 - Roger Gilbrat
如果您有20个图层集,每个集合都有4或5个图层,那么这就超过了20个图层 :). 这是80-100个。:) 不过,循环遍历图层以获取图层名称应该会快得多。 - aquinas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接