Hatena::ブログ(Diary)

なにする?DTP+WEB

2009-07-21

BridgeTalkまとめ…というか覚え書き【修正】

イラストレーターのtoSource,unevalがObjectでスタックオーバーランしていたのは自分の書いたスクリプト[c.js]が悪さしていたようです。オブジェクトを安易に汚染するのは良くないですね。

とういうことで上記に関わる部分を削除しました。


BridgeTalkについてできるだけまとめてみる。

というか、現在自分が理解できている範囲の覚え書きです。


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

bt.target = "illustrator";

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

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


投げた処理が終わったら実行する。

投げた処理が終わり次第、実行させるものを書いておく。

ここで処理が終わるまでは待っていてはくれない。

非同期になるのでそれを踏まえた書き方をしなくてはいけない。

詳しくは中綴千頁さんが解説されている。Double-talk Publisher BridgeTalk考

bt.onResult = function(resObj) {};

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

BridgeTalkは非同期なのかと勘違いしていたんだけど、

onResultに無名関数でもいいのでonResultに関数を設定すれば、

処理が終わるまで待ってくれるみたい。

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 bt = new BridgeTalk;
bt.target = "bridge";

//ターゲットへ送るScriptを記入
//コメントアウトを含めていたりするとエラーが出たりする。
bt.body = function(Value){
	$.sleep (5000);
	return Value.toSource();
}.toSource()+"("+uneval({message:"bridgeでの処理が終わりました。"})+");";

//返り値に対しての処理を記入
bt.onResult = function(resObj) {
	Value = eval(resObj.body);
	alert(Value.message);
	flag = false;
};

//TimeOutした場合の処理を記入
bt.onTimeout = function(resObj){
	alert('タイムアウトになりました。');
}

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

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

//TEST
alert('非同期なので先にこのメッセージが表示される');
})();

課題

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

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/kamiseto/20090721/1246622746
ver_b ドキュメントの綴じ方向を変えるテスト。カット&ペーストじゃ? ...
//test_id_bindingSwitcher by(z-) ver_b   function layerCond(vis, loc)&
ver_el フレームを中のテキストにフィットする。各種オプションあり。?? ...
//FitTextFrame.jsx by(z-) ver_el   ///////////////// UIパーツ表示関連 /////////// function pointSi
ver_d 仕上がりに沿ったアタリ罫があればプリント前に警告するイベント ...
//id_findTrimLines.jsx プリント前に仕上がり罫さがして警告 2011.11.18 (z-) ver_d #targetengine "findTrimLines
VBAのJS移植版。三点リーダーで埋めもらした右インデントタブを探しち? ...
// 右インデントタブ幅計算して三点リーダ入るか調査隊() by Javascript   var doc=app.activeDocument;   //三点リー
複数行を一行毎に分割する(縦組みもOK)
/* 選択したテキストを行毎に分割します 2011-10-8 お披露目 2011-10-14 縦組みにも対応   */ #include "doEx.jsx&
この日記のはてなブックマーク数