用于photoshop的JavaScript字符串通配符

时间:2016-06-01 17:39:53

标签: javascript photoshop-script

我正在学习用于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;

3 个答案:

答案 0 :(得分:0)

根据this bit of documentationArtLayers.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)
    }
  }
}