Photoshop UXP batchPlay

head img
    Photoshop
    batchPlay

PhotoshopUXPのapiでできない処理を行う

PhotoshopUXPのapiについては公式ドキュメンを見るとわかりますがまだまだできることが限られています。 apiでアクセスできないアプリケーション部分にアクセスするためにbatchPlayが必要になります。 中のコードに関してはある程度の説明は公式のドキュメントでもされていますが最終的には scriptEventListenerのように実際に目的のアプリケーションのアクションを実行して 確かめるしかありません。とりあえずサンプルコードを見てみましょう。

これはガイドを引くためのコードです。初見でもなんとなくpositionでガイドを引く位置、orientationのverticalが縦線というのは 大体予想できると思います。とはいえこれらのコードの詳細が公式のドキュメントにあるわけではないので自力で目的のコードを発見する必要 があります。ExtendScriptでさえ未だにscriptEventListenerが現役な事を考えるとこのUXPScriptを書く上でbatchPlayも避けて通れません。 という事でまずはこのbatchPlayのコードを取得する方法を以下紹介してゆきます。

アクションを記録

アクションを記録

PhotoshopCC2022からの標準機能に「アクションコマンドを記録機能」が追加されました。これはまんまscriptEventListenerの後継のような存在ですね。 メニューからアクションを記録機能バーを押すとアクション作成のようにPhotoshop上のユーザーの動作の記録が始まります。scriptEventListenerと 違ってメニューバーを押すと動作の内容のjsonを保存する場所をダイアログで選ぶ必要があります。その後再度メニューバーからアクションの記録の中止を 押すまで記録は保存され続けます。それでは適当に長方形の選択範囲を作ってjsonの内容を見てみましょう。

長方形の選択範囲を作成するbatchPlayのコードがjsonファイルとして書き出されました。これをbatchPlayメソッドの引数として渡すと 実際に選択範囲が作成されます。

取得したオブジェクトをこのようにbatchPlayメソッドに渡すと記録された内容が実行されます。ちなみに第二引数は空でも良いのでオブジェクトを渡してください。 非同期、同期のオプション等の値をここにオブジェクト形式で渡すのでがデフォルトの設定で構わない場合も空のオブジェクトだけでも渡さないとエラーで 止まります。ちなみに「アクションコマンドを記録機能」とは別に「アクション通知コマンドを記録機能」があります。これは「アクションコマンドを記録機能」の内容に加えて Photoshop上の状態の変化も記録、取得してくれます。

select,ref,magicWandToolといった項目が最初のオブジェクトで確認できますがこれは自動選択ツールの選択になります。その他historyStateChangedといった ヒストリーの変化等こういった「アクションコマンドを記録機能」では記録しないドキュメントの状態も記録してくれます。

アクションの保存

「アクションの保存」はアクションパネルの右側のメニューバーから選んで選択中のアクションフォルダーの内容をbatchPlayのコードとして 書き出します。あれ?それって単にアクションファイルをatnファイルとして保存やり方ではないですか?そうです。ただしPhotoshopCC2022以降 macの場合shift+option+command、winの場合shift+control+altのキーを押しながらアクションの保存を押すとbatchPlayの内容をjsonとして 書き出してくれます。書き出し前に拡張子がjsonになっているのを確認してください。

JavaScriptとしてコピー

Photoshop 23.3(CC2022の4月頃にアップデートしたバージョン)からサポートされました。これはアクションパネルから個別のアクションを どれか選択して右側のメニューバーから先程の「アクションの保存」の下にある項目「JavaScriptとしてコピー」を選びます。するとアクションの内容が batchPlayのコードとしてクリップボードにコピーされます。これをテキストエディターにペーストするとそのままコードとして使えます。

アクションの内容がコメントで書かれていてどこのオブジェクトがどのアクションの内容に該当するのかわかりやすくなっています。

UXP plugin Alchemist

PhotoshopのbatchPlayのコードを生成してくれるプラグインです。基本の使い方はアクションを作るようにレコード中に 行ったアクションをコードとして生成するscriptEventListenerのような使い方ができるプラグインです。ダウンロードしましょう。

alchemist
Alchemistプラグイン

一応Adobeマーケットプレイスからもダウンロードできますが作者自身はGitHubからコピーする事を勧めています。 ということでGitHubからコピーしてDeveloperToolでインストールしましょう。

alchemist panel

立ち上げると複数のパネルが立ち上がると思いますがまず使用するのは上記のパネルです。基本はユーザーの動作をbatchPlayのオブジェクトコードとして 書き出すプラグインです。scriptEventListener、「アクションを記録」機能と同じように使います。まずは下のパネルの左下のListenerボタンを押して 適当にドキュメント上にガイドを引いてみます。ガイドを引いたらパネル右上のCodeボタンを押してみてください。

プラグイン記録中

基本はscriptEventListener、「アクションを記録」機能と同じではありますが動作を即時、細かく 確認できます。その他オブジェクトモデルのプロパティーを調べることもできます。

プロパティの取得

上位のパネルではアクティブドキュメントのXMPMetaデータプロパティを取得しようとしています。Typeで取得したい オブジェクトの種類(Document,Application,Layer...etc)を選択。場合によってはターゲット、DocumentやLayerの場合は アクティブなDocumentやLayerをターゲットにするのか具体的に開かれている特定のDocumentを指定するか。

Document idを取得

上記の場合アクティブなドキュメントからDocument idのプロパティを選択して取得しています。

プロパティを取得する具体的なやり方

取得したDocument idはContentのTreeウインドウに表示されます。rootのTreeはオブジェクトモデルをTree上に 表示するのでもっと複雑なオブジェクトプロパティを取得した場合は上から辿ってオブジェクトモデルを調べる事ができます。

オブジェクトモデルの表示

上記の場合プロパティを指定しないで全てDocumentのプロパティを取得しています。各種プロパティ名の横の三角形矢印 で内部のプロパティを折りたたんだり開いたりできます。

DOM live

DOM liveのタブで見れるのは該当のTypeのAPIのオブジェクトモデルでしょう。公式ドキュメントの内容と一致します。

get code

ユーザーのアクションのコードやプロパティを取得するコードが取得できるのは既に説明しましたが 実際に取得したコードすぐに実行も可能です。dispatchタブから実行できます。

dispatch tab

上記のコードはレイヤーを新しく追加するbatchPlayでsendボタンを押すと実行されてレイヤーを作成します。

difference tab

differenceタブを表示してdescriptor(下のヒストリーパネルのような項目の部分)から二つの 項目を選択すると両者のオブジェクトの内容の違いを表示してくれます。例えば上記では documentのwidthの値を取得する項目を二つ選んでいます。それぞれ異なるdocumentから取得した widthの値を参照してどのように異なっているのか表示しています。

Occultist

別パネルのOccultistではアクションの解析もできます。(ただ日本語は文字化けを起こす) Read .ATN Fileを押してダイアログでアクションを選んで読み込ませてください。

occultist