[AI]スクリプトからのエフェクト操作

今回の投稿はクリスマスシーズンに入りましたので、DTPアドベントカレンダーへの投稿として簡単にまとめてみました。
これから年末にかけて多忙な日が続くとは思いますが、皆様が健康にクリスマス〜新年を迎えられますように(^-^)/
 
さて、IllustratorのスクリプトではapplyEffectというメソッドが存在します。これはIllustratorの効果メニューの各項目をスクリプトから適用するためのメソッドです。これに関しては
 
で言及してあります。しかし、この記事にも限界があります。FXG形式の書き出しはCS6以降では廃止された為、それ以降に実装された効果に関しては引数であるXMLを組み立てるためのパラメータがわからないのです。
ということで様々な方たちが色々なところを掘り返してパラメータを調べ始めました。以降でまとめられる手法は上海のスクリプターmoluappleがまとめたものを解説したものです。
 
 
 

コンテンツリカバリーモードを設定する

以下のスクリプトをIllustratorで1回実行し、コンテンツリカバリーモードを設定する。(on/offトグル動作なのでもう一度実行するとリカバリモードを抜ける)
 
app.preferences.setBooleanPreference("aiFileFormat/enableContentRecovery",
!app.preferences.getBooleanPreference("aiFileFormat/enableContentRecovery"));
 
 

Illustrator書類をテキストエディタで開けるようにする

効果をかけたオブジェクトを含むファイルを予め作成しておき、そのファイルをコンテンツリカバリモードで保存します。
 
  1. Illustrator上でファイルを開くダイアログを表示。(まだファイルを開いてはいけません)
  2. 対象ファイルを選択した状態で「Command + Option + Shift(Mac)」「Ctrl + Alt + Shift (Windows)」をプレスしたまま開くボタンをクリックする。
  3. 空のドキュメントが開いた状態で対象ファイルが開かれるのでそのまま閉じる。
 
以上の手順で対象ファイルと同一のフォルダに頭に「_」が付いたファイルが保存されています。
このファイルをテキストエディタで開いて以下の正規表現で検索します。
「BasicFilter\s:\n\((.+?)\)\s1\s0\s\/Filter」
 
以下は「角を丸くする…」の記述部分がヒットしたものです。
/BasicFilter :
(Adobe Round Corners) 1 0 /Filter ,
1 /Visible ,
(Adobe Illustrator.app) /PluginFileName ,
(\212p\202\360\212\333\202\255\202\267\202\351) /Title ,
/Dictionary : /NotRecorded ,
2 /Real (radius) ,←逆ポーランド記法で値とDict名称が書かれている。
/Dict ;
 /Part ,
 
このままではapplyEffectメソッドの引数のXML構造にはなりませんので整形が必要となります。
 
テンプレート
'<LiveEffect name="">'
+'<Dict data="'
+' '
+' I Adobe Effect Expand Before Version 16 " />'
+'</LiveEffect>'
 
上記のテンプレートのDict dataの値として検索でヒットした/Dictのパラメータを成形加工します。
角を丸くする…コマンドの/Dictは以下に抜き出した1行のみです。
2 /Real (radius) ;
  ↓
R radius 2 //(データ型を表すアルファベット1文字、データ名称、数値の3点をスペース区切りで記述する)
 
上記のパターンで/Dictにエントリされている全てのパラメータを整形します。
データ型は、Real→R、Integer→I、Boolean→Bの3点が存在します。
この例ではDictエントリが1点だけなので最終的なXMLは以下の様になります。
'<LiveEffect name="Adobe Round Corners">'
+'<Dict data="'
+'R radius 2'
+'I Adobe Effect Expand Before Version 16 " />'
+'</LiveEffect>'
 
これを用いてスクリプトを書くと「角を丸くする…」は以下のようなスクリプトになります。
var xmlstring = '<LiveEffect name="Adobe Round Corners">'
+'<Dict data="'
+'R radius 2 '
+'I Adobe Effect Expand Before Version 16 " />'
+'</LiveEffect>';
app.selection[0].applyEffect(xmlstring);
 
エフェクトを検索する作業も楽しいので是非お試し下さい。


[AI]世界一単純な図形交差検出関数

Illustratorに限らずオブジェクトの重なりの判断というのは2次元空間内における座標を取得して曲線ならバーンスタインがどうとかこうとか演算が必須となっております。おそらくみんな泣きながらやればある程度のものは出来るんじゃないかなぁって思うのです。

しかしながら、一言申し添えると「面倒くさい」です。こんなん、手早く書き捨てたいと思うぐらいものなんですけどそうも行かないのが世の常なのです。で、今回はその圧倒的に面倒くさい部分を全てショートカットする仕組みを提供いたします。

続きを読む……

[AI]回転された配置画像の縮尺を計算するスクリプト

これ、この前詰まってた数学的な問題を解消できたやつです。
元ネタはいつものごとくフォーラムです。
https://forums.adobe.com/thread/2455224
して、コードはこちら

var tg = app.selection[0];
var mx = tg.matrix;
var deg = Math.atan2(mx.mValueB, mx.mValueA) * 180 / Math.PI;
var nm = new Matrix;
nm.mValueA = nm.mValueD = 1;
nm.mValueB = nm.mValueC = 0;
var rtmx = app.concatenateRotationMatrix(nm, deg);
var sc = mx.mValueA / rtmx.mValueA;
alert(sc*100);

選択した画像の縮尺を計算します。(^-^)/


[AI]アフィン変換の活用[AI]

アフィン変換の活用Illustratorはいくつかのオブジェクトがmatrixプロパティを持ちます。そして、appクラスには各種matrix操作メソッドがあり、それを利用することによって色々と出来ることがあります。

上の画像のようにinverseMatrixを利用して回転角・縮尺をリセットするような操作が可能です。もっと単純に処理できるのはテキストオブジェクトでスケール等の情報が全て級数や長平体に移行されるためmatrixが回転角のみとなります。その為matrixの一部の数値からasinを利用して回転角を計算することが可能です。

var m = app.selection[0].matrix;
alert(-Math.asin(m.mValueC)/Math.PI*180);

メソッドが返すのはラジアンですから上の様にdgreeに変換する必要があります。とまあ、こんな感じで上手く使うと非常に便利なアフィン変換のマトリクスですが、なんだかなぁ〜って思っている方に以下のブツをおすすめします。

var $_affine={
var $_affine={
 win:function(){
 var w = new Window ('dialog', "affine matrix", undefined);
 var p1 = w.add('panel',undefined,"a"); p1.size = [100,45];
 var tx1 = p1.add('edittext',undefined,'1',{multiline:false});
 tx1.characters = 5;
 var p2 = w.add('panel',undefined,"b");
 p2.size = [100,45];
 var tx2 = p2.add('edittext',undefined,'0',{multiline:false});
 tx2.characters = 5;
 var p3 = w.add('panel',undefined,"c");
 p3.size = [100,45];
 var tx3 = p3.add('edittext',undefined,'0',{multiline:false});
 tx3.characters = 5;
 var p4 = w.add('panel',undefined,"d");
 p4.size = [100,45];
 var tx4 = p4.add('edittext',undefined,'1',{multiline:false});
 tx4.characters = 5;
 var cl = w.add('button', undefined, 'cancel', {name:'cancel'});
 var bt = w.add('button', undefined , 'apply', {name:'ok'});
 bt.onClick = function (){
 $_affine.applyTransform(tx1.text,tx2.text,tx3.text,tx4.text);
 } w.show();
 },
 applyTransform:function(a,b,c,d){
 var tm = new Matrix();
 tm.mValueA = Number(a);
 tm.mValueB = Number(b);
 tm.mValueC = Number(c);
 tm.mValueD = Number(d);
 tm.mValueTX = 0;
 tm.mValueTY = 0;
 //alert(tm.mValueA+tm.mValueB+tm.mValueC+tm.mValueD);
 app.selection[0].transform(tm,true,true,true,true,1);
 app.redraw();
 }
 }
$_affine.win();


ScriptUIで各パラメータを入力して選択したオブジェクトを回したり拡大したりと試せるようになっています。一度使ってみてください。


AI rotaterの新版などを…

あけおめ、どぞよろ(^-^;
という事で、リクエスト来てたローテーターのアップデートです。
zxpパッケージは以下のリンクから
https://drive.google.com/open?id=1qwRLfqrMp9hdjUesZ_ArFzXkDxswo-3o

ZXP Installer等を利用してインストールして下さい。対応はver.17以降を全てサポートしています。

利用方法
このツールは曲線中のアンカーポイントにおける接線に対して平行にオブジェクトを自動的に配置するためのものです。平たく言うと選択したアンカーポイントを見て良い感じに一緒に選択したオブジェクトを回してくれるというものです。
例えは、以下のようにテキストとアンカーポイントを選択しておきます。

この状態からボタンをワンクリックで設定したオフセット位置に角度を合わせた状態に回転して配置し直してくれる優しい子です。

もう一例挙げておきましょう。

この様に路線に対して駅の四角を手早く配置する際に便利です。


[AI]消費税を8→10%に変更するスクリプト

さて、皆様におかれましてはご清祥の事とお慶び申し上げます。中には本年中のお仕事も納まってしまって年越しの準備を進められている方も多いかと存じます。
皆様はどんな一年だったでしょうか?良かった人も散々だった人もいらっしゃることとは思いますが、良かった人はそれなりに、悪かった人もそれなりに適当に新年を迎えればよろしいかと思いますです。

そんなこんなで、わたしも来年の準備をやってみました。来年は消費税の増税があります。恐らく既存データの流用等がたくさんあるはずで、ある日を境に全て数字を変更しなければならない様な羽目になるわけですが、それを少しだけ楽にします。

続きを読む……