2016-06-01 3 views
-1

私はPhotoshopで使用するJavaScriptを学習しています。ドキュメント内のワイルドカードを使用してレイヤーを選択しようとしています。私はmaxscriptの背景から来て、 "*"を文字列のワイルドカードとして使用します。フォトショップ用のJavaScript文字列ワイルドカード

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

"*"両側のt。私は何らかの理由でそれをタイプさせません。 – sdds

+0

PS JavaScriptと通常のJSの間に大きな違いがあるかどうかはわかりませんが... "getByName"にはワイルドカードや正規表現を使用できません。代わりに 'document.querySelector()'へのアクセス権があるかどうかを確認してください。 – Makaze

答えて

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 
    } 
} 
+0

これはまた、 'ArtLayers'型の' artLayers'が配列として機能すると仮定しています。ドキュメント内の他の場所は 'array of 'を呼び出すが、このタイプのドキュメントは 'ArtLayers'としか言わない。 Lousyのドキュメント... – naomik

+0

私がリンクしているドキュメントでは、 '[]'がメソッドとしてリストされています。これから、私はそれが配列として機能することが期待されます。 –

+0

ニースキャッチ。私が見ていたドキュメントには言及していませんでした。 – naomik

0

おかげでそうif文の行にそのバック投げ未定義ないオブジェクトを閉じ

そのをCobra_Fast。しかし、あなたと同じように、アートレイヤーは配列として動作しているので、ちょっと混乱します。

+0

私はもう少し掘り下げをして、adobeがindexOfの使用をサポートしていないことを発見しました。まだ別のオプションを探しています。 – sdds

0

ようこそ。あなたの質問が嫌なdownvotesにもかかわらず、私は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) 
    } 
    } 
} 
関連する問題