BridgeTalkにスクリプトを渡すにはuneval()を使うといいみたい。

先日のエントリーでBridgeTalkでbodyにスクリプトを渡すには
uneval(hoge)したらいいよというアドバイスを頂きさっそく試してみました。

(function(){
var CropImage = function(X){
	alert(typeof X);
	}
var bt=new BridgeTalk();
bt.target = "illustrator";
bt.body = uneval (CropImage)+"()";
bt.send();
})();

なるほど、とっても便利です。
いままでいちいちクォートで囲んでいたのがバカらしくなります。

(function(){
var NUM = 12.3;
var CropImage = function(X){
	alert(typeof X);
	}
var bt=new BridgeTalk();
bt.target = "illustrator";
bt.body = uneval (CropImage)+"("+NUM+")";
bt.send();
})();

引数を渡すにはこんな感じでいいみたい。

これを使って[イラストレーターに貼り付けた画像をパスを元に分割する:CropPlacedItem]を書き直すと
こんな感じ、クォートで囲まなくてもいいし、とっても見通しが。よくなりました

#include 'c.js';//http://svn.coderepos.org//share/platform/illustrator/javascript/lib/c.js
#include 'matrixConvert.js';//http://d.hatena.ne.jp/kamiseto/20090502/1241251512



(function(){
//
var i = 0;
//
if(c('S').f('PL').length > 1 )return false;
var PI =  c('S').f('PL')[0];
var PI_MATRIX = matrixConvert.getAll(PI);
//
if(c('S').f('P').length < 1)return false;

c('S').f('P').each(function(){	
	//画像を開く
	toOpen(PI.file,'photoshop');
	
	//画像を切り抜いて保存
	var x1 = (this.left-PI.left);
	var y1 = (PI.top-this.top);
	var x2 = (this.width+x1);
	var y2 = (this.height+y1);
	
	//保存するファイル名
	var f = (PI.file.path+'/CROP_'+(i++)+'_'+PI.file.toString().replace (PI.file.path+'/', "")).replace(/(jpeg|jpg|eps|tiff|png)$/,'psd');
	CropImage([
				x1/PI.width,
				y1/PI.height,
				x2/PI.width,
				y2/PI.height]
				,f);
	
	
	
	//画像が出来るまで待つ
	var timeout = 10*1000; //
	while(!File(f).exists && timeout > 0){
	               $.sleep (1000);
	               timeout = timeout-1000;
	}
	
	if(timeout > 0){
    	//画像の配置
    	var pA = app.activeDocument.placedItems.add();
    	pA.file = File(f);
    	//pA.matrix = PI.matrix;
    	pA.resize(PI_MATRIX.vs,PI_MATRIX.hs);
    	pA.position = this.position;
    	pA.moveBefore(this);
	}else{
	   return false;
	}
 	});

PI.remove();
})();



function toOpen(file,app){
var bt=new BridgeTalk();
bt.target = app;
bt.body ="open (File('"+file+"'));";
bt.send();
}

function CropImage(ract,f){
try{
    var bt=new BridgeTalk();
    bt.target = 'photoshop';
    bt.body = uneval (Photoshop_CropImage)+"("+ract[0]+","+ract[1]+","+ract[2]+","+ract[3]+",'"+f+"');";
    bt.onError = BridgeTalkErrorHandler;
    bt.onResult = function(res) {
            resF = res.body;
             }
    bt.send();
}catch(e){
    throw(e);
}
}

function BridgeTalkErrorHandler (btObj) {alert( btObj.body + " (" + btObj.headers ["Error-Code"] + ")" ); }

//
function Photoshop_CropImage(rac0,rac1,rac2,rac3,f){
var MakeRactangle = function(data){
var ract = [];
ract[0] = new SubPathInfo();
ract[0].operation = ShapeOperation.SHAPEADD;
ract[0].closed = true;
ract[0].entireSubPath = [
        MakepathPoint(data[0],data[1]),
        MakepathPoint(data[0],data[3]),
        MakepathPoint(data[2],data[3]),
        MakepathPoint(data[2],data[1])
    ];
return ract;
}

var MakepathPoint =function (x,y){
    var pd = new PathPointInfo();
    with(pd){
    		kind = PointKind.CORNERPOINT;
    		anchor=  [x, y];
    		leftDirection=  [x, y];
    		rightDirection =  [x, y];
    }
    return pd;
}
docObj = activeDocument;
var saveF = new File(f);
docHeight = docObj.height.toString().match(/[0-9.]+/);
docWidth = docObj.width.toString().match(/[0-9.]+/);
dw_pix=(docWidth/25.4*72);
dh_pix=(docHeight/25.4*72);
pObj = docObj.pathItems.add('made in javascript', MakeRactangle([rac0*dw_pix,rac1*dh_pix,rac2*dw_pix,rac3*dh_pix]));
var pp = pObj.subPathItems[0].pathPoints;
var xp = [];
var yp = [];
var sortOpt = function(a,b){return a-b}
for(i=0;i<pp.length;i++){
	xp.push(pp[i].anchor[0]);
	yp.push(pp[i].anchor[1]);
}
xp.sort(sortOpt);
yp.sort(sortOpt);
var pWidth = xp[xp.length-1] - xp[0];
var pHeight = yp[yp.length-1] - yp [0];
pObj.makeSelection(0,false);
pObj.remove();
app.activeDocument.selection.copy();
app.documents.add(UnitValue(pWidth,'pt'),UnitValue(pHeight,'pt'),docObj.resolution,'',getNewDocumentMode(),DocumentFill.TRANSPARENT,1,docObj.bitsPerChannel);
app.activeDocument.paste();
docObj.close(SaveOptions.DONOTSAVECHANGES);
app.activeDocument.saveAs(saveF);
app.activeDocument.close();
saveF;

function getNewDocumentMode(){
    switch(docObj.mode.toString().match(/DocumentMode.(.+)$/)[1]){
    		case 'CMYK' : return NewDocumentMode.CMYK;
    		case 'RGB' : return NewDocumentMode.RGB;
    		case 'GRAYSCALE' : return NewDocumentMode.GRAYSCALE;
    		default : return NewDocumentMode.RGB;
    }
}
}