BridgeTalkでPhotoshopをチョメ!チョメ!のテスター募集


まいど、かなり一方的にお世話になっております。
 ちょっとテストをお願いしたいのですが、よろしければご参加ください。
8月早々すみません(意味不明だけど)

やる事は、CS3以降のInDesignまたはIllustratorから、
 他CSバージョンのPhotoshopを制御しようとするテストです。



AJ_test120801.jsx



対象となる環境は、CS3以降の複数バージョンがインストールされたMac/Winです。
 CS3以降の、任意のバージョンのInDesignまたはIllustratorからスクリプトを実行して頂きます。
  その際、単体/複数バージョンのPhotoshop達の起動状況によっての挙動を知るためのテストです。
ソフトをCriativeSuiteではなく単体で導入された環境は特に貴重なサンプルとなります。

ぶっちゃけ、仕上げ屋の旦那様が過去にやった事そのまま、と言ってしまえば聞こえは悪いんですが、
 共有すべき情報の継承、とお考え下さい。

スクリプトを実行すると、数秒でログファイルの保存場所を指定するよう促されます。
 てけとうな名前を付けてください。
  まことお手数ですが、拡張子はセルフサービスとなっておりますorz
最後に、ターゲットとなったPhotoshop上で「check」とアラートが出て終了です。

複数あるバージョンのPhotoshopからドレをターゲットとして選定するかは、
 以下の優先順位にのっとります。
・起動している物 > 起動していない物
・実行アプリと同一のCSパッケージの物 > それ以外の最上位バージョン >>> 最下位バージョン

この優先順位を守った挙動が得られれば使用したバージョンのみの報告で十分です。
 そうでなかった場合、ログファイルの内容をコメント欄にペーストして頂ければすごく助かります。

InDesignかIllustratorかは、同じ結果が得られるのでどちらかだけで大丈夫です。
 InDesignCS4で一度実行したらIllustratorCS4からは不要、ということです。
これに対しPhotoshopの起動状況を手動で幾通りか変えてやらないといけません。これが面倒なのですが。。
・何も起動していない状態
・どれか1つだけ起動している状態
・複数バージョンが同時に起動しちゃってる状態(本数ぶん、組み合わせが多岐にわたります)

もちろん、できる範囲内で構いません。
 とはいえ、なるべく多様なサンプルをお待ちしております。

現状で判明しているイレギュラー
・PhotoshopCS2が起動した状態でInDesignCS3から実行すると締めのアラートが出ずに終了する。
  その後、PhotoshopCS2を終了させ再度スクリプトを実行するとPhotoshopCS3が自動で起動し、
  溜まったアラートが2回出る
・InDesignCS3から、PhotoshopCS5.1が見えなかった

ば関数:見た目優先のアンカーポイントを使う

今週もがきまくっているFitTextFrame.jsxですが。。
 当該のテキストフレーム単体に関してはver_i 以降でまぁまぁ安定という事で。
例外的にフィットしない局面もしばしばあるですが、これは実用を重ねながら追い込むです。

個人的に問題なのがオマケ機能の「別置きしたオビの調整」。
 こっちが実用面ではメインなのですが、極度に回転してあるブツに対してかなりよろしくない。

例えばこういうコード。以下ぜんぶInDesignCS3でやりました。
左上を基準にして15°回転するテスト。


tmObj=app.transformationMatrices.add(1, 1, 0, 15, 0, 0); //15度回転するマトリクス…的な
app.selection[0].transform (CoordinateSpaces.PASTEBOARD_COORDINATES, AnchorPoint.TOP_LEFT_ANCHOR, tmObj); //左上を基準に変形


これを、



こいつらにそれぞれ実行してみますと



こうなります。 おい、岩清水。

 このせいで、帯があらぬ方向に行く事がありまして。
つーか、横長いオブジェクトを90°回転して縦組みの見出しの下にひいて寄越す奴が悪い。。
 しかも困った事にザラに見る。
CoordinateSpacesとAnchorPointは無関係みたい。ぬかよろこび。
 このへん、未だに意味のわかっていない関数 resolve() あたりが怪しいと密かに思ってるんですが。
  わかりたいんですが、さっぱりわかれません。座標系のウンタラらしいのは確かなのだが。
 とりゃえず今回は関わらないようにして(関われないので)、

なんとかする関数を作りました。


function anchorSwitch(obj, anc){ //戻り値は [新しいアンカー, 90°ごとの補正値]
 if(arguments.length<2){ //引数省略の時はウィンドウのアンカーポイントを使用
  anc=app.activeWindow.transformReferencePoint;
  }
 if(anc==AnchorPoint.CENTER_ANCHOR || anc.reflect.name==“Array”) return anc; //中央と任意座標は未処理
 var rot=obj.rotationAngle;
 var anchorAry=[ //左上から時計まわりに
 AnchorPoint.TOP_LEFT_ANCHOR, 
 AnchorPoint.TOP_CENTER_ANCHOR, 
 AnchorPoint.TOP_RIGHT_ANCHOR, 
 AnchorPoint.RIGHT_CENTER_ANCHOR, 
 AnchorPoint.BOTTOM_RIGHT_ANCHOR, 
 AnchorPoint.BOTTOM_CENTER_ANCHOR, 
 AnchorPoint.BOTTOM_LEFT_ANCHOR, 
 AnchorPoint.LEFT_CENTER_ANCHOR  ];
 var rotateVal=Math.floor((rot+360+45)/90)*2; //45は見た目対策、*2で90度ぶん
 var newAnc;
 for(var i=0; i<8; i++){
  if(anchorAry[i]==anc){
   newAnc=i;
   break;
   }
  }
 return anchorAry[(newAnc+rotateVal+8)%8];
 }


要は、90°単位でアンカーポイントを見た目優先で融通する関数です。
 引数は(対象オブジェクト, 変換を要するアンカーポイント)
 引数2を省略した時はウィンドウに設定してあるアンカーポイントが使用されます。
 戻り値は変換後のアンカーポイント。
この関数を絡めてテストするコード。左上を基準に15°回転。


var doc=app.activeDocument;
var aW=app.activeWindow;
var sel=doc.selection;
for(var i=0; i<sel.length; i++){
 var asObj=anchorSwitch(sel[i]);
 var tmObj=app.transformationMatrices.add(1, 1, 0, 15, 0, 0);
 sel[i].transform (CoordinateSpaces.PASTEBOARD_COORDINATES, asObj, tmObj);
}


実行結果




この関数のキモは見た目を優先するというところなので、
 今度は45°を境に、水平寄りの物と垂直寄りの物に振り分けて回転するテスト。
45度ちょうどの時は反時計周りが優先となります。ここだけはしょうがない(ことにしてください)


for(var i=0; i<sel.length; i++){
 var asObj=anchorSwitch(sel[i]);
 var moyoAngle= sel[i].rotationAngle%90;
 moyoAngle=Math.abs(moyoAngle)>45? (Math.abs(moyoAngle)/moyoAngle*90)-moyoAngle : -moyoAngle;
 var tmObj=app.transformationMatrices.add(1, 1, 0, moyoAngle, 0, 0);
 sel[i].transform (CoordinateSpaces
.PASTEBOARD_COORDINATES, asObj, tmObj);
 }


実行前



実行結果



できましたな。

さぁ、FitTextFrame.jsx の完成が待たれます。
 何しろ自分の手元での使用頻度の高さといったら。。すごいのだ。
完成しだい、がっつり説明します。