Action Manager は、ExtendScript(.jsx)から、DOM で書けない Photoshop の操作を実行する仕組みです。
ScriptingListener で記録したコードは、この Action Manager の書き方で出てきます。
- 記録できる操作なら、Action Manager で実行できる(ほかの会社のフィルターも)
- executeAction(イベントID, 記述子, ダイアログの扱い) で実行する
- charIDToTypeID は4文字のコード、stringIDToTypeID は文字列の名前を、実行時の ID に変える
- DialogModes.NO でダイアログを出さずに実行する
この記事は、Adobe の Photoshop Scripting Guide と JavaScript Reference(公開されている最新の2020年版)にもとづいています。
当方には Photoshop が無いため、実行の再現は含まず、画面の名前は英語版の表記です。
ScriptingListenerで記録する
ScriptListener のプラグイン(ScriptListener.8li)を Photoshop の Plug-Ins フォルダーに置いて再起動すると、画面の操作がコードとして記録されます。
記録はデスクトップの ScriptingListenerJS.log(JavaScript)と ScriptingListenerVB.log(VBScript、Windows だけ)に出ます。
入れたままだとログが大きくなり Photoshop も遅くなるので、コードを取るときだけ入れるよう、ガイドに書かれています。
入れ方は、ScriptingListenerの使い方で紹介しています。
記録されたコードを読む
公式ガイドの、エンボスのフィルターを記録した例です。
var id19 = charIDToTypeID( "Embs" );
var desc4 = new ActionDescriptor();
var id20 = charIDToTypeID( "Angl" );
desc4.putInteger( id20, 135 );
var id21 = charIDToTypeID( "Hght" );
desc4.putInteger( id21, 3 );
var id22 = charIDToTypeID( "Amnt" );
desc4.putInteger( id22, 100 );
executeAction( id19, desc4 ,DialogModes.NO);| 行 | 意味 |
|---|---|
| charIDToTypeID( “Embs” ) | エンボスのイベントの ID |
| new ActionDescriptor() | 設定の値を入れる入れ物 |
| desc4.putInteger( 角度の ID, 135 ) | 角度を135にする |
| desc4.putInteger( 高さの ID, 3 ) | 高さを3にする |
| desc4.putInteger( 量の ID, 100 ) | 量を100にする |
| executeAction( イベント, 記述子, DialogModes.NO ) | ダイアログを出さずに実行する |
charIDToTypeIDとstringIDToTypeID
| 関数 | 変えるもの |
|---|---|
| charIDToTypeID | 4文字のコード(”Embs” など)→ 実行時の ID |
| stringIDToTypeID | 文字列の名前(”pixelScaleFactor” など)→ 実行時の ID |
| typeIDToCharID | 実行時の ID → 4文字のコード |
| typeIDToStringID | 実行時の ID → 文字列の名前 |
ScriptingListener の記録には、両方が混ざって出てきます。
意味を調べたいときは、typeIDToStringID で文字列の名前に変えると、読みやすくなります。
alert( typeIDToStringID( charIDToTypeID( "Embs" ) ) );上の1行は、4文字のコードを文字列の名前に変えて表示する書き方の例です(当方では Photoshop が無いため、表示される名前は確かめていません)。
Action Managerの入れ物
| オブジェクト | 役割 |
|---|---|
| ActionDescriptor | 名前と値の組を入れる(設定の値) |
| ActionList | 値の並び |
| ActionReference | 対象(レイヤーや書類)を指す |
値を取り出すときは、executeActionGet(ActionReference) で ActionDescriptor を受け取ります。
これらは AppleScript からは使えません。
関数にするコツ
- id19 のような番号の変数は、意味の分かる名前に変える
- 135 や 3 のような値を、関数の引数にする
- DialogModes.NO を DialogModes.ALL にすると、ダイアログを出して値を選ばせられる
function emboss(angle, height, amount) {
var desc = new ActionDescriptor();
desc.putInteger(charIDToTypeID("Angl"), angle);
desc.putInteger(charIDToTypeID("Hght"), height);
desc.putInteger(charIDToTypeID("Amnt"), amount);
executeAction(charIDToTypeID("Embs"), desc, DialogModes.NO);
}
emboss(135, 3, 100);公式ガイドの同じ章の関数にした例は、desc4 と desc7 が混ざる誤記があり、そのまま写すと動きません。
スマートオブジェクトの中身の置き換え
スマートオブジェクトの「Replace Contents」も、記録すれば Action Manager で実行できる操作です。
Adobe の C++ SDK の用語表には placedLayerReplaceContents という名前がありますが、Scripting Guide には書き方の例がありません。
使うときは、ScriptingListener で実際に記録してコードを取るのが確実です。
UXPへの移行
UXP では、Action Manager の代わりに batchPlay を使います。
書き方は、PhotoshopのbatchPlayの使い方で紹介しています。
まとめ
- Action Manager は、記録できる操作を ExtendScript から実行する仕組み
- executeAction(イベント, ActionDescriptor, DialogModes.NO) の形
- charIDToTypeID は4文字、stringIDToTypeID は文字列の名前
- 変数名と値を整理して関数にすると使い回せる
参考:Adobe「Photoshop Scripting Guide」「Photoshop JavaScript Reference」(2020年版)。
