BridgeTalkまとめ…というか覚え書き

BridgeTalkについてできるだけまとめてみる。
というか、現在自分が理解できている範囲の覚え書きです。

BridgeTalkするアプリケーションのバージョンを指定

bt.target = "illustrator";

と書いていて、同じCSのバージョン同士でしか使えないと思ってたんだけど、CS3以降であればCSバージョンをまたいで指定することができる。

bt.target = "illustrator-13.0";//Bridge CS3
bt.target = "illustrator-14.0";//Bridge CS4

BridgeTalkは同期も非同期もいける

BridgeTalkは非同期なのかと勘違いしていたんだけど、
onResultに無名関数でもいいのでonResultに関数を設定すれば、
処理が終わるまで待ってくれるみたい。

bt.onResult = function(resObj) {};

onResultで帰ってきたオブジェクトはBridgeTalkObjectでbodyに返り値が入ってる。

bt.onResult = function(resObj) {processResult(resObj.body);};

実際に送るbodyに入れるScriptは、uneval()やtoSource()を使うとよい。

普通にfunctionを書くように書けるので楽。

bt.body=uneval(function(){})+"()";
bt.body=function(){}.toSource()+"()";

引数で渡す場合や戻り値は、uneval()やtoSource()を使うとよい。

引数で渡す場合

bt.body=uneval(function(val){ 
val = eval(val);
})+"("+['A','B','C'].toSource()+");";

戻り値にする場合

return val.toSource();

ただし、イラストレターのuneval()とtoSource()はObjectに摘要するとスタックエラーが出てしまう。
回避策としては、こんな感じでfunctionで包んでしまうといける。

uneval(function(){return {sleep:5000};});

この場合は

eval('val =' +val+"();");

としてもとに戻す。

send()にはタイムアウトまでの秒数を引数として指定できる。

bt.send(30);

onTimeoutにタイムアウト時の処理を書けばいいらしい。

bt.onTimeout = function(){...}

まとめて書いたらこんな感じ。

(function(){
//TEST用
var flag = true;

var bt = new BridgeTalk;
bt.target = "bridge";

//ターゲットへ送るScriptを記入
//コメントアウトを含めていたりするとエラーが出たりする。
bt.body = function(Value){
	eval('Value =' +Value+"();");
	$.sleep (Value.sleep);
	return Value.toSource();
}.toSource()+"("+(function(){
//イラストレーターのuneval()とtoSource()は腐ってるのでオブジェクトだとエラーが出るからFunctionでラッピング
//イラストレーターでないならvar sendValue = {sleep:1000}.toSource();でもいける。
		return uneval(function(){
			return {sleep:5000};
		});
})()+");";

//返り値に対しての処理を記入

bt.onResult = function(resObj) {
	Value = eval(resObj.body);
	alert(Value.sleep/1000+"秒待ってました。");
	flag = false;
};

//TimeOutした場合の処理を記入
bt.onTimeout = function(resObj){
	$.bp();
}

//使い方がよく判らない。
/*
bt.onReceive = function(resObj){
	$.bp();
};
*/
//送ったスクリプトでエラーが出た場合の処理を記入
bt.onError = function(resObj){alert( resObj.body + " (" + resObj.headers ["Error-Code"] + ")" );};

//スクリプトの送信を実行。引数にはタイムアウトまでの秒数を指定。
bt.send(1);

//TEST
if(flag)alert("同期出来てない");
})();

課題

  • onRecive()の使い方がよく判らない。AIRと併用するものなのか?
  • Timeoutしても送った先のアプリケーションで処理は続いている。どうやってとめるの?