マトリックスの世界:JavaScriptからイラストレーターに貼付けてある画像の拡大率と角度を得る
イラストレーターで配置した画像の変形情報をJavaScriptから参照できないか調べた。
AppleScriptの情報は出てくるのだけど、JavaScriptで書いたものが出てこない。
そこでいろんなところを参考にしながら、JavaScriptでとりあえず書いてみた。
どうも、「Matrix(マトリックス)」が鍵を握っているようなんだけど、
いまいち扱い方がよく判ってなかったりします。
参考にしたのは:
Adobe Forums: get text frame's angle of rotation
(DTPtechNote:1747) Re: Illustratorのオブジェクト情報
var matrixConvert ={ 'isObj' : function(obj){return typeof obj == 'object' ? true : false}, 'hasMatrix' : function(obj){return obj.hasOwnProperty ('matrix') ? true : false}, 'isMirrorX' : function(obj){ if(!this.isObj(obj) || !this.hasMatrix(obj))return false; return obj.matrix.mValueA > 0 ? false : true; }, 'isMirrorY' :function(obj){ if(!this.isObj(obj) || !this.hasMatrix(obj))return false; return obj.matrix.mValueD < 0 ? false : (this.getRotation(obj) < -90 ? true : false); }, 'getAll' : function(obj){ if(!this.isObj(obj) || !this.hasMatrix(obj))return false; return {'hs' : this.getHorizontalScale(obj), 'vs' : this.getVerticalScale(obj), 'angle' : this.getRotation(obj) } }, 'getScale' : function(obj){ if(!this.isObj(obj) || !this.hasMatrix(obj))return false; return {'hs' : this.getHorizontalScale(obj), 'vs' : this.getVerticalScale(obj) } }, 'getHorizontalScale' : function(obj){ if(!this.isObj(obj) || !this.hasMatrix(obj))return false; return Math.round((Math.sqrt((Math.pow(obj.matrix.mValueA,2)) + (Math.pow(obj.matrix.mValueB,2)))*100000))/1000; }, 'getVerticalScale' : function(obj){ if(!this.isObj(obj) || !this.hasMatrix(obj))return false; return Math.round((Math.sqrt((Math.pow(obj.matrix.mValueC,2)) + (Math.pow(obj.matrix.mValueD,2)))*100000))/1000; }, 'getRotation' : function(obj){ if(!this.isObj(obj) || !this.hasMatrix(obj))return false; if(this.getHorizontalScale(obj) === this.getVerticalScale(obj)){ var rad = Math.round((Math.atan2(obj.matrix.mValueC, obj.matrix.mValueD)*180/Math.PI)*1000)/1000; if(obj.constructor.name == 'PlacedItem')return rad > 0 ? rad-180 : rad+180; if(obj.constructor.name == 'TextFrame' || obj.constructor.name == 'RasterItem')return rad*-1; if(obj.constructor.name == 'PatternColor' || obj.constructor.name == 'GradientColor')return rad; } return false; } }
使う時はこんな感じ
//角度を得る var object = app.activeDocument.selection[0]; //RasterItem or PlacedItem or TextFrame //var object = app.activeDocument.selection[0].fillColor; //PatternColor or GradientColor alert(matrixConvert.getRotation(object));
PatternColorとGradientColorにもマトリックスのプロパティがあるみたいなんでパターンの角度が判るようにしてみました。