sendScriptMessageメソッドはこう使う
ScriptSlotってシングルアクションのリボルバーなんです。スロットが6コだし、登録もパネルでちまちまスクリプトを選択していくという結構なアナログインターフェースなのです。しかし、リボルバーにはワンタッチで弾を装填できる仕組みがあったりします。
ScriptSlotにもクイックローダーが設定されているのは内緒だったのですが、βもファイナルまで進んでいますのでそろそろ具体的に使い方を明らかにしておこうかと思います。
まずはファンクションを2つ
function saveSlots() {
var f = File.saveDialog("Save Quick Loader File...");
if (f.open('w')) {
var slots = ["slot0","slot1","slot2","slot3","slot4","slot5"];
for (var i=0;i<6;i++) {
f.writeln(app.preferences.getStringPreference("scriptSlot/" + slots[i]));
}
f.close();
}
else alert("Save Error...");
}
function loadSlots() {
var f = File.openDialog("Select Quick Loader File.");
if (f.open("r")) {
var os = ($.os.indexOf("Macintosh")>-1);
var dlm = "/";
if (!os) dlm = "\\";
var pth = "";
var slots = ["slot0","slot1","slot2","slot3","slot4","slot5"];
for (var i=0;i<6;i++) {
pth = f.readln();
app.preferences.setStringPreference("scriptSlot/" + slots[i], pth);
app.sendScriptMessage("ScriptSlot", slots[i], pth.split(dlm).pop());
}
}
else alert("Quick Loader READ ERROR.");
}
とっても特殊なコードです。多分ほかでは見たことがない構成だと思います。それはプレファレンス周りをダイレクトに操作するというのもありますが、このスクリプト自身がプラグインをダイレクトにコントロールするようになっていると言う部分に負うところが大きいでしょう。
元来、プラグインライ用のCPPライブラリにはExtendscriptからダイレクトにアクセス可能なライブラリが整備されています。そのExtendscript側のインターフェースがsendScriptMessageというメソッドなんですね。この仕組は、IllustratorSDKにもサンプルプロジェクトがきちんと用意されています。しかし、Adobe社がIllustratorにバンドルするプラグインの大半がこのインターフェースを実装していないのです。実際にプラグインを作った事のある方は分かるでしょうが、このインターフェースを実装する事はそう手間ではありません。このあたりをしっかりやっておけばライブエフェクトの類なんか殆ど引数渡すだけでExtendscriptから高速に処理出来るはずです。根本的な部分で手を抜きすぎなんですね。
脱線しました。このScriptSlotというプラグインはスクリプトのパスをプレファレンスに保持します。このプレファレンスに書かれているパスを操作することによって登録スクリプトを変更できるのですが、AIのメニュー自体も書き換えないと整合性が崩れます。この部分をExtendscriptからダイレクトに引数を受け取ることによって処理しています。しかしながらβリリースではエクステンション側にコールバックを実装していませんので、QuickLoaderでスロットセットを読み込むとパネル表示ではスロットが空になったように見えてしまいます。ここんところはそのうち直すとして、とりあえずは放流しておきます。
QuickLoaderは以下からダウンロード出来ます。
えーと、本体の方も一般には出回ってないかもしれませんから念の為にリンク貼っときます。
まあ、何が面白いかって、ネイティブ系からExtendscriptへブリッジする手段が無いって所です。だから手法としては外部からフックかけるか内部的に利用可能なオブジェクト介して渡り歩くぐらいしか手がないというw
このプラグインと同様の手法で内部的なライブラリをたたいてスクリプトを実行するのがScriptBayとかJSX Luncherで、前者は内蔵のAIRランタイムを経由して実行する仕組み。後者はCEPを利用して実行します。
最後に、流星号へ業務連絡:長々と検証に付き合ってくれてありがとう。ついでにこのスクリプト、ウインドウズで不具合出ないか確認しといて。
ちなみに、作業に応じてスロットセットを複数用意しておいて切り替えることで使いやすいショートカットを「使いまわす」と便利だったりします。