我正在学习用于photoshop的JavaScript。我试图使用通配符选择文档中的图层。我来自maxscript背景所以使用" *"作为字符串中的通配符。
var srcDoc = app.activeDocument;
var a = srcDoc.artLayers.getByName("*t*"); //trying to select a layer that has t in it..
app.activeDocument.activeLayer = a;
答案 0 :(得分:0)
根据this bit of documentation,ArtLayers.getByName()
仅支持搜索完全匹配
如果Photoshop不提供搜索机制,则必须遍历所有元素以尝试查找匹配的元素
您的代码可能如下所示:
var search = "t";
for (var i in srcDoc.artLayers)
{
var layer = srcDoc.artLayers[i];
if (layer.typename.indexOf(search) >= 0)
{
// assuming ArtLayer.typename is the correct name property
// then this layer matches the search!
// do with it what you want here
}
}
答案 1 :(得分:0)
感谢Cobra_Fast
它如此接近它的返回未定义而不是if语句行中的对象。但就像你说artLayers充当阵列,所以我有点困惑。
答案 2 :(得分:0)
欢迎来到SO。尽管我喜欢你的问题,但我很惊讶PS已经没有模糊的图层名称搜索了。
我会让你加快速度:
在图层上循环很容易。
var srcDoc = app.activeDocument;
var numOfLayers = srcDoc.layers.length;
for (var i = numOfLayers -1; i >= 0 ; i--)
{
var thisLayer = srcDoc.layers[i];
}
然而,对于图层组而言,这会变得更加复杂,并且有时会成为正确的痛苦。所以你必须有一个能够找到它们的递归函数。我花了一段时间才绕过那一个!由于我们只处理艺术图层,我们会将它们添加到特殊的艺术层阵列中。
然后,您可以使用正则表达式(在Maxscript :)中不可用)来查看图层名称数组。
// group layer vegetables
var allLayers = new Array();
var artLayers = new Array();
var theLayers = collectAllLayers(app.activeDocument, 0);
var artLayerNames = "";
// loop over art layers backwards
for (var i = artLayers.length -1; i >= 0 ; i--)
{
var temp = artLayers[i];
var regEx = new RegExp(/t/gim);
if (temp.match(regEx))
{
// if the layer contains the letter "t" show it!
alert(temp);
}
artLayerNames+= artLayers[i] + "\n";
}
// print out all layers
alert(artLayerNames);
// 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")
{
// get the art layers
artLayers.push(theLayer.name);
}
else
{
allLayers.push(level + theLayer.name);
collectAllLayers(theLayer, level + 1)
}
}
}