かめ。ブログ

PhotoshopのJSXで選択中のレイヤーを取得する方法

2022年7月21日
2022年7月21日

目次

色々調べたいたのですが、簡単に選択中のレイヤーを取得する簡単な手段が見つかりませんでした。
自分で工夫して解決していたメモです。

選択中のレイヤーを取得する方法

取得する考え方

  • 選択レイヤーのリンクを一旦削除する
  • 選択レイヤーにリンクをつける
  • リンクされたレイヤーを取得する
  • リンクを削除する


リンクされたレイヤーは取得できるようなので、下記のような形で一度リンクしてから、リンクされているレイヤーを取得するようにしました。
書き方がいまいちなところもあると思います。Photoshopのjsxが繊細で書き方によってはレイヤーが取得できなかったりしたので下記の形に落ちつきました。

const allselLinkLys = []

UnLinkSelLys()
try {
  LinkSelLys()
}
catch(e){}
finally{}
SelLy()
UnLinkSelLys()

// 選択レイヤーをリンク付け
function LinkSelLys() {
  var lID1 = stringIDToTypeID( "linkSelectedLayers" );
  var lDesc1 = new ActionDescriptor();
  var lID2 = charIDToTypeID( "null" );
  var lRef1 = new ActionReference();
  var lID3 = charIDToTypeID( "Lyr " );
  var lID4 = charIDToTypeID( "Ordn" );
  var lID5 = charIDToTypeID( "Trgt" );
  lRef1.putEnumerated( lID3, lID4, lID5 );
  lDesc1.putReference( lID2, lRef1 );
  executeAction( lID1, lDesc1, DialogModes.NO );
}

//選択レイヤーのリンク解除
function UnLinkSelLys() {
  var uID1 = stringIDToTypeID( "unlinkSelectedLayers" );
  var uDesc1 = new ActionDescriptor();
  var uID2 = charIDToTypeID( "null" );
  var uRef1 = new ActionReference();
  var uID3 = charIDToTypeID( "Lyr " );
  var uID4 = charIDToTypeID( "Ordn" );
  var uID5 = charIDToTypeID( "Trgt" );
  uRef1.putEnumerated( uID3, uID4, uID5 );
  uDesc1.putReference( uID2, uRef1 );
  executeAction( uID1, uDesc1, DialogModes.NO );
}

// リンクされたレイヤーを取得
function SelLy() {
  const selLinkLys = activeLayer.linkedLayers;
  allselLinkLys[0] = activeLayer;
  u = 1;
  for(i=0; i < selLinkLys.length; i++)
  {
    allselLinkLys[u] = selLinkLys[i];
    u++;
  }
}


再度選択し直す

レイヤーに対してさまざまな処理を行なった場合に選択状態が外れてしまう場合があります。
再度下記のように実行することで、名前でマッチさせて再度選択状態にすることができます。
(レイヤー名に同一のものがある場合はうまくいかない時があります)

//選択(Ctrl+Click)
function ToggleSelect(TslName) {
  var oID12 = charIDToTypeID( "slct" );
  var oDesc3 = new ActionDescriptor();
  var oID13 = charIDToTypeID( "null" );
  var oRef3 = new ActionReference();
  var oID14 = charIDToTypeID( "Lyr " );
  oRef3.putName( oID14, TslName );
  oDesc3.putReference( oID13, oRef3 );
  var oID15 = stringIDToTypeID( "selectionModifier" );
  var oID16 = stringIDToTypeID( "selectionModifierType" );
  var oID17 = stringIDToTypeID( "addToSelection" );
  oDesc3.putEnumerated( oID15, oID16, oID17 );
  var oID18 = charIDToTypeID( "MkVs" );
  oDesc3.putBoolean( oID18, false );
  executeAction( oID12, oDesc3, DialogModes.NO );
}

//元のレイヤー選択状態に復元
function ReSelected() {
  for(i=0;i<allselLinkLys.length;i++) {
    ToggleSelect(allselLinkLys[i].name);
  }
}


実際の実装(レイヤー名の変更)

Github: レイヤーの名前を変更する
Photoshopのjsxは繊細な部分が多いので少し苦労しました。

履歴にログを残さないようにする(リンクをつけたり外したりする)

アクションでPhotoshopのヒストリーを汚させない!簡単に使えるスクリプトを使ってみよう
下記のように書くと、実行した関数内の履歴は全て「レイヤー名変更」にまとめられます。
不要な履歴が残らず一回戻るだけでよいので自作で作るときは設定しておくと良いです。

app.activeDocument.suspendHistory('レイヤー名変更', 'changeLayerName()')
function changeLayerName() {
}


操作履歴を書き出す

下記を行うことで操作履歴をjsxで使える形で書き出しを行うことができます。
自分で作りたい場合にはログ取得機能を使って必要な部分を抜き出して使うのが良いかと思います。


M1マックでログ取得を行う場合は少し工夫が必要なので注意です。下記の記事を参考にしてください。


参考




関連する記事