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しても送った先のアプリケーションで処理は続いている。どうやってとめるの?