Skip to main content
Known Participant
January 21, 2023
Answered

【Javascript】アートレイヤーだけを選択状態にしたい

  • January 21, 2023
  • 1 reply
  • 840 views

レイヤーセットとアートレイヤーが混在している時(レイヤーセットの中にレイヤーセット、その中にアートレイヤーが複数、のように階層もバラバラ状態です)、

アートレイヤーのみを選択状態にしたいのですが

レイヤーを複数選択するにはどうしたら良いのでしょうか。

 

スクリプトじゃなくてもいいのですが、何か良い方法ありますでしょうか?

 

 

This topic has been closed for replies.
Correct answer
こんばんは。
自身では組めなかったので、ネットで公開されている(いた?)コードを切り貼りしたものですけど、こんな感じでどうでしょうか。
実行するとアートレイヤーが選択されると思います。
 
selectArtLayers(app.activeDocument.layers);

 

function selectArtLayers(_layers) {
for (var i = 0; i < _layers.length; i++) {
if (_layers[i].typename == "LayerSet") {
selectArtLayers(_layers[i].layers); //自分自身を呼びだす
} else {
if (_layers[i].typename == "ArtLayer") {
selectByID(_layers[i].id)
}
}
}
}

 

function selectByID(id) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putIdentifier(charIDToTypeID('Lyr '), id);
desc1.putReference(charIDToTypeID('null'), ref1);
desc1.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
executeAction(charIDToTypeID('slct'), desc1, DialogModes.NO);
} // end of selectByID()
 
 

1 reply

Correct answer
January 21, 2023
こんばんは。
自身では組めなかったので、ネットで公開されている(いた?)コードを切り貼りしたものですけど、こんな感じでどうでしょうか。
実行するとアートレイヤーが選択されると思います。
 
selectArtLayers(app.activeDocument.layers);

 

function selectArtLayers(_layers) {
for (var i = 0; i < _layers.length; i++) {
if (_layers[i].typename == "LayerSet") {
selectArtLayers(_layers[i].layers); //自分自身を呼びだす
} else {
if (_layers[i].typename == "ArtLayer") {
selectByID(_layers[i].id)
}
}
}
}

 

function selectByID(id) {
var desc1 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putIdentifier(charIDToTypeID('Lyr '), id);
desc1.putReference(charIDToTypeID('null'), ref1);
desc1.putEnumerated(stringIDToTypeID("selectionModifier"), stringIDToTypeID("selectionModifierType"), stringIDToTypeID("addToSelection"));
executeAction(charIDToTypeID('slct'), desc1, DialogModes.NO);
} // end of selectByID()
 
 
Ten A
Community Expert
Community Expert
January 22, 2023

メインのループは整理したほうが良いでしょう。

 

 

var lyrs = app.activeDocument.layers
for (var i=0; i<lyrs.length; i++)
{
  if (lyrs[i].typename == "ArtLayer")
  {
    selectByID(lyrs[i].id)
  }
}


function selectByID(_layers[i].id)
{
......
}

 

 

January 22, 2023

そういう書き方もあるんですね。

でもそれだと、レイヤーセット内のアートレイヤーが選択されなくないですか?

私の勘違いでしょうか..