PhotoshopUXP batchPlayでPhotoshopの特定の処理を実行する。

UXP

Photoshop UXPのドキュメンを眺めるとオブジェクトモデルの数が非常に少ないのがわかります。レイヤー、ドキュメント、アクション、選択範囲くらいしかないのですがその他のメソッドは?というとbatchPlayで実行できます。このあたりは何度かこのblogでも取り上げましたが具体的にその手順まで書いていませんでした。という事で早速やってみたいと思いますがまずjardicc氏のalchemistというUXPプラグインを使用します。これはAdobeのマーケットプレイスからもインストールできます。

market place

しかし情報の欄を読むと開発進行中のバージョンをGitHubからダウンロードして使用する方がおすすめと書かれています。なのでGit Hubからダウンロードして使いましょう。ターミナルからGit cloneするなりしてコピーしてください。コピーが終わったらAdove UXP devtoolからインストールします。

alchemist

実際にプラグインを使う前にbatch playのコードを見てみましょう。公式のドキュメントに詳細が載っていますがガイドを引くためのサンプルも載せておきます。

batchPlayメソッドの第一引数にオブジェクト形式でPhotoshopの処理の情報を渡します。このPhotoshopのAction Descriptorsのコードは前回の記事でも触れた通りScriptListenerで取得できるあの複雑怪奇なコードから取得できる情報なのですがおそらくほとんどの方がこのコードの中身について理解してないでしょうし私も理解してないです。例えば上のガイドを引くコードをScriptListenerから取得すると以下のようになります。

このScriptListenerからbatchPlayに当て込むオブジェクトの値を探すのは至難の技です。どこからどこがbatchPlayに渡すオブジェクトのキー、ヴァリューになるか全くわかりません。そこで便利なプラグインを使います。それがalchemistになります。基本の使い方はアクションやScriptListenerと同じで記録したい動作を実行前にPluginをrec状態にして特定の動作をPhotoshop上で行うとその動作のコードが書き出されます。試しに使ってみましょう。パネルの左下のListenerボタンを押しで適当にドキュメント上にガイドを引いてみます。ガイドを引いたらパネル右上のCodeボタンを押してみてください。

read code from alchemist

なんとbatchPlayのコードに変換されてそのまま表示されているではないですか。どのキーにどの値が対応しているかは大体想像がつくと思います。例えばガイドを引く位置はpositionキーの_valueの値になるでしょう。orientationの_valueの値はverticalかhorizontalで縦にガイドを引くか横に引くかが決まります。配列の後にくるオブジェクトはbatchPlay自体のオプションになります。synchronousExecutionのキーは同期処理にするかしないかのオプションですデフォルトの値はfalseで非同期処理になるのでasync、awaitを忘れずに。そして一部の処理は呼び出させないので注意(ScriptListenerでも記録されない、例えば調整レイヤーの作成等)。それでドキュメントに載っていないコードを実行する方法はわかりましたがどうやってこれらのコードをオブジェクトにまとめるか、Javascriptの場合prototypeからオブジェクトの拡張ができます。これを利用してphotoshop.app.Documentオブジェクトを拡張してみます。

ガイド作成のメソッドで引数に縦か横に引くかの方向を受け取りガイドを引く場所の値を第二引数で受け取る簡単なメソッドです。prototype拡張はjsで最初に実行させるべきですしbatchPlay自体コードが長くなりがちなのでinit関数にまとめて独立したファイルからexportしてメインのjsで読み込ませてinit関数を実行させる、という形をとるのがスマートなやり方ではないでしょうか?実際に実行する場合は以下のようになります。

まるで最初から実装されているメソッドのような振る舞いの自作関数が完成しました。公式でも触れられています通りアップデートによってDOMが拡張されるまではこうやって自身で拡張して開発するのが良いのではないでしょうか。

今回参考にした動画 Adobe UXP: Things you need to know! #7 BatchPlay (part 2): the Alchemist listener

Beer 寄付してサイトを応援する。