ファイルメニューの「Bridgeで参照」、Bridgeが起動するだけで何も参照してくれないんだけど、せめて今開いてるドキュメントくらい参照してくれるようにならんかなー
っていう思いで前回、
InDesignの「Bridgeで参照」を改造する話をやったんですが、今回はそのイラレ編です。
しかしメニューコマンドの処理をスクリプトで書き換えるなんて大それたことをさせてくれるのはInDesignくらいのもので、イラレやフォトショのスクリプトではそこまでの自由度はありません。どうしよう。
ExtendScriptにはBridgeTalkという、Adobeアプリ間でスクリプトを送り合えるしくみがあるんですが、イラレのファイルメニューの『Bridgeで参照』にはBridgeTalkが使われています。
具体的には、『Bridgeで参照』を実行すると、次のコードがBridgeにBridgeTalkを介して送られています。
app.bringToFront();
if (app.documents.length == 0) app.browseTo();
else app.document.thumbnail = new Thumbnail();
これを
コードAと呼ぶことにしましょう。
ちなみにこのコード、ESTKからBridgeを対象に実行すると、なんとエラーが出ます。
3行目の new Thumbnail() が引数なしを許容してないんですね。
BridgeTalkから実行した場合もエラーになるんですが、「BridgeTalk内のエラーはアラートも何も表示されず、ただそこでスクリプトの実行が終わるだけ」という仕様と、1行目の app.bringToFront(); だけでBridgeを最前面に表示するという仕事が完了していることにより、これまで誰にもばれずにエラーを出し続けてきたんだと思われます。
それはともかくとして、『Bridgeで参照』を実行したときの通常の処理はこんなんです。
イラレで『Bridgeで参照』を実行
↓
BridgeTalkでコードAがイラレからBridgeに送信される
↓
Bridge上のBridgeTalk.onReceive関数がコードAを受け取る
↓
onReceive関数内でコードAがevalされる
↓
app.bringToFront();が実行された後、エラーが出て終わり
重要なのは、BridgeTalkで送られたコードというのは無条件で実行されるわけではなくて、BridgeTalk.onReceiveによって処理されるという点です。
んでBridgeTalk.onReceiveってどんな関数なのって言うと、ESTKからBridgeを対象に BridgeTalk.onReceive.toSource() してみると分かるんですが、次のようなコードです。
(function( msg ) {
app.lastSender = msg.sender;
app.displayDialogs = 'all';
var retval = eval( '$.level = 0; app.synchronousMode = false;\n' + msg.body );
app.displayDialogs = 'all';
app.synchronousMode = false;
return retval;
})
送られてきたコードを実行しているのは4行目のevalです。msg.bodyにコードが入っています。
他の行も見てみると、2行目はBridgeTalkを送りつけてきたアプリの名前をapp.lastSenderに代入しています。これによりファイルメニューの「〇〇に戻る」の〇〇がそのアプリになります。
イラレから「Bridgeで参照」した直後は「Illustratorに戻る」、フォトショから「Bridgeで参照」した直後は「PhotoShopに戻る」に変化するのはこういう仕組みだったんですね。
でー、このBridgeTalk.onReceiveなんですが、実は書き換え可です。
たとえば、送られてきたコードがコードAに完全に一致する場合のみ特別な処理を行い、それ以外の場合はデフォルトのBridgeTalk.onReceiveと同じ処理をする、ということもできちゃうわけです。
ここまでの説明は、「BridgeのBridgeTalk.onReceiveを書き換えることで、イラレの『Bridgeで参照』の挙動を変えてやろう」という企みを分かっていただくためのものだったのでした。
てことで、イラレの「Bridgeで参照」を、現在のドキュメントを参照するようにするBridge用スタートアップスクリプトです。
// イラレの「Bridgeで参照」を、現在のドキュメントを参照するようにするBridge用スタートアップスクリプト
var aiBridgeDeSansho1="app.bringToFront();if%20(app.documents.length%20==%200)%20%20%20%20app.browseTo();else%20%20%20%20app.document.thumbnail%20=%20new%20Thumbnail();";
var aiBridgeDeSansho2="app.document.thumbnail%20=%20new%20Thumbnail();";//Bridgeが起動してないときはこっちになるっぽい
var btOnReceive2=(function(msg) {
var body2=encodeURI(msg.body);
if(msg.sender.slice(0,11)=="illustrator" && (body2==aiBridgeDeSansho1 || body2==aiBridgeDeSansho2)){
app.bringToFront();
app.lastSender = msg.sender;
var bt=new BridgeTalk;
bt.target=msg.sender;
bt.body="app.documents.length==0?0:app.activeDocument.fullName";
bt.onResult=function(res){
if(res.body=="" || res.body=="0")return;
app.document.thumbnail=new Thumbnail(File(res.body));
}
bt.send();
return;
}
app.lastSender = msg.sender;
app.displayDialogs = 'all';
var retval = eval('$.level = 0; app.synchronousMode = false;\n' + msg.body);
app.displayDialogs = 'all';
app.synchronousMode = false;
return retval;
});
BridgeTalk.onReceive=btOnReceive2;
BridgeTalk.watch("onReceive",function(){return btOnReceive2});//スタートアップスクリプトの後にonReceiveが初期化されるのを防ぐ
インストール方法
①Bridgeを開いて、環境設定からスタートアップスクリプトの『マイスタートアップスクリプトを表示』をクリック
②Startup Scriptsフォルダが開くので、ここに上記スクリプトを拡張子.jsxで保存したものを置きます
③Bridgeを再起動すると「新しい機能を有効にしますか?」みたいなダイアログが出るのでOKを押します
これでイラレから「Bridgeで参照」したとき、現在の(最前面の)ドキュメントがBridge上で選択されるようになってるはずです。(ダメだったら教えてください)
関連記事
イラレ&Bridgeの昔書いたネタ(超便利だと思うんだけど特に褒められなった…)
イラレの画像再リンクをBridgeから行うためのスクリプトをつくったー
PR