Adobe Bridge CS3/CS4/CS5編 アプリケーション間でやりとりする(1)

Bridge最後のネタはBridgeTalk(ブリッジトーク)です。これはAdobeアプリケーション間でやりとりするための機能です。BridgeTalkを使えばPhotoshopで作成した画像をIllustratorで貼り付けて文字などを追加した後、InDesignに配置する、といったことが一応可能になります。一応と書いたのは、場合によってはうまく動かないパターンもあるということです。また、一度実行中にしくじってしまうと、そのファイル名からの処理を受け付けなくなることがあります。ファイル名を変更すれば対処できますが、どこに不具合があるか分からないというのも正直なところです。
BridgeTalkは便利そうですが、いざやってみると大変そうだと感じるかもしれません。特に指示を出した後は非同期で処理が行われるため、3つ以上のアプリケーションをまたぐ処理は面倒です。
まず、簡単なところでPhotoshop CS3を呼び出してみましょう。以下のスクリプトを実行すると、ぱっと見ではアラートダイアログには「1」「2」「3」と表示されそうですが実際には「3」「1」「2」または「1」「3」「2」の順番で数字が表示されます。


var btObj = new BridgeTalk;
btObj.body = "alert(1)";
btObj.target = "photoshop-10"; // Photoshop CS3
btObj.onResult = function(resObj){
alert(2);
}
btObj.send();
alert(3);

Photoshop → Bridge→Illustratorを呼び出したりすると面倒になっていきます。

var btObj = new BridgeTalk;
btObj.body = "alert(1)";
btObj.target = "photoshop-10"; // Photoshop CS3
btObj.onResult = function(resObj){
alert(2);
var btObj2 = new BridgeTalk;
btObj2.body = "alert(4)";
btObj2.target = "illustrator-13"; // Illustrator CS3
btObj2.onResult = function(resObj){
alert(5);
}
btObj2.send();
alert(6);
}
btObj.send();
alert(3);

連携させようとすればするほど泥沼のように面倒になってしまいます。これではアプリケーション間でやりとりする前に気力が萎えてしまいます。そこで一工夫して以下のようにすると指定した順番でスクリプトが実行されるようになります。

(function(){
var PSCS3 = "photoshop-10";
var AICS3 = "illustrator-13";
var AECS3 = "aftereffects-8";
var IDCS3 = "indesign-5";
var BRCS3 = "bridge-2";
var DWCS3 = "dreamweaver-9";
var funcList = [];
funcList[0] = { target : PSCS3, func : "alert(0)" };
funcList[1] = { target : AICS3, func : "alert(1)" };
funcList[2] = { target : AECS3, func : "alert(2)" };
funcList[3] = { target : BRCS3, func : "alert(3)" };
funcList[4] = { target : IDCS3, func : "alert(4)" };
funcList[5] = { target : DWCS3, func : "alert(5)" };
funcList[6] = { target : PSCS3, func : "alert(6)" };
var count = 0;
myBTalk();

function myBTalk(){
var btObj = new BridgeTalk;
btObj.body = funcList[count].func;
btObj.target = funcList[count].target;
btObj.onResult = function(resObj){
if (count++ < funcList.length) myBTalk();
}
btObj.send();
}
})();

funcList配列に順番に実行したいアプリケーション名とスクリプトを指定します。targetがアプリケーション名、funcがアプリケーションで実行したいスクリプトになります。
アプリケーション間で値を受け渡す場合には、もう少し工夫が必要になります。

[サンプルをダウンロード]