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

BridgeTalkを使ってアプリケーションを呼び出す際に、処理したデータなどを渡したい場合があります。BridgeTalkで呼び出された場合、呼び出し元にデータを戻すにはapp.bodyに戻り値を入れます。ただし、InDesignはapp.bodyではなくbodyに戻り値を入れます。
以下のスクリプトは呼び出したアプリケーションからの戻り値をESTKのコンソールに表示します。


(function(){
var PSCS3 = "photoshop-10";
var AICS3 = "illustrator-13";
var AECS3 = "aftereffects-8";
var IDCS3 = "indesign-5";
var BRCS3 = "bridge-2";
var funcList = [];
funcList[0] = { target : PSCS3, func : "alert(0);app.body='Photoshop'" };
funcList[1] = { target : AICS3, func : "alert(1);app.body='Illustrator'" };
funcList[2] = { target : AECS3, func : "alert(2);app.body='AfterEffects'" };
funcList[3] = { target : BRCS3, func : "alert(3);app.body='Bridge'" };
funcList[4] = { target : IDCS3, func : "alert(4);body='InDesign'" };
funcList[5] = { target : PSCS3, func : "alert(5);app.body='Photoshopその2'" };
var count = 0;
myBTalk();

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

これだけだと戻すだけですが、実際には次のアプリケーションにデータを渡したいので以下のようにします。

(function(){
var PSCS3 = "photoshop-10";
var AICS3 = "illustrator-13";
var AECS3 = "aftereffects-8";
var IDCS3 = "indesign-5";
var BRCS3 = "bridge-2";
var funcList = [];
funcList[0] = { target : PSCS3, func : "alert(arg);app.body='Photoshopから'" };
funcList[1] = { target : AICS3, func : "alert(arg);app.body='Illustratorから'" };
funcList[2] = { target : AECS3, func : "alert(arg);app.body='AfterEffectsから'" };
funcList[3] = { target : BRCS3, func : "alert(arg);app.body='Bridgeから'" };
funcList[4] = { target : IDCS3, func : "alert(arg);body='InDesignから'" };
funcList[5] = { target : PSCS3, func : "alert(arg);app.body='Photoshop最後'" };
var count = 0;
myBTalk(2010);

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

BridgeTalkで何でも渡せるわけでないので、必要に応じてファイルにデータを保存するといった対処も必要になります。また、上記のサンプルは直接配列内にスクリプトコードを書いていますが、スクリプトは別ファイルにして読み込み、それをBridgeTalkオブジェクトのbodyプロパティに代入するようにした方がミスは軽減されるでしょう。

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