はじめに
職場でスクリプトの制作依頼をもらわない限り、僕は基本的にIllustratorのスクリプトは作っていません。趣味で作るスクリプトは9割がInDesign用な自分ですが(なんたってスクリプトが素直なので)、食わず嫌いはいけないかなとIllustratorのスクリプトもぼちぼち勉強しようかなと思った次第です…(気が乗らないw
InDesignもIllustratorも、動く仕組みは同じなので別に新しい言語を覚えるとかそういうわけではないんですが、スクリプトのオブジェクトモデルが似ているようでまったく違うのです。InDesignのスクリプトであれば、だいたいのゴール(作りたいなと思ったスクリプトの大まかな方向性)が分かればなんとなく地図が書ける感じです。でもそれがIllustratorだと、まず自分がいるところからどんな道があるのか、拙いスクリプティングガイドやカンを頼りに道を探すところからのスタートするような感覚に近いのです。
そんな気乗りしないIllustratorのスクリプトですが、世間的にニーズがあるのはInDesignよりIllustratorということもあり、僕の試行錯誤が誰かの役に立ってくれたらうれしいなという思いでここに赤裸々に悩んだ道のりを記していきたいと思いますw
どんなスクリプトを作るか
オブジェクトを整列するような何かを作りたいとぼんやり思っているので、そんな感じのものをじわりじわりと作っていきます(雑
作業環境はmacOS10.12、Illustrator CC2017、ExtendScriptToolkit 4.0です(なお実際のコーディングはBrackets)。
オブジェクトを捕まえる
手始めに選択しているオブジェクトでも取得してみますかね。お作法は基本的にInDesignと同じなので、Applicationオブジェクトから順にプロパティを辿っていきます。
var myDoc = app.activeDocument; //最前面のドキュメント var mySels = myDoc.selection; //ここらへんはInDesignと同じ
selection
プロパティはブラケットをつけて[0]
とすることで、選択しているオブジェクトのうちのどれかを指定します。1個しか選択しなくても[0]
としないといけないところまで、当たり前ですがInDesignと同じ。
どういう順番で並んでいるのか
さて、selection
プロパティの中身のオブジェクトたちがどういう順序で並んでいるのか調べてみます。
とりあえず色成分が違う3つの長方形を用意してみました。InDesignでは選択した順番にselection
プロパティに入るので、同じ結果になるのか試してみようということです。
色成分って…?
選択した四角形の色成分を見ようと思ったのですが、早くもInDesignと違う…!w
InDesignの場合、オブジェクトの塗り色であるfillColor
はcolorValue
というプロパティを持っていて、4成分の配列が格納されています。これが順にC,M,Y,Kの値なのですが、IllustratorのfillColor
プロパティにcolorValue
がない…。
スクリプティングガイドをあたってもいいのですが、とりあえずデータブラウザで覗いてみますか。
var a = mySels[0].fillColor; $.bp();
こんな感じでブレークポイントを仕込んでESTKからスクリプトを実行します。んで、データブラウザはこんな感じでした。
なんと、それぞれの成分値がダイレクトにプロパティ名になって格納されていたのか。でもこれ、いちいち.cyan
とか.magenta
とか打ってられない。打ちたくないw
色成分を配列に取得する関数
スクリプトの本筋ではないのですが、色成分を簡単に見たい(そしてInDesignライクに読みたい)ので関数にしました。
var getColorValue = function (color){ return [color.cyan, color.magenta, color.yellow, color.black]; }
こうすれば、getColorValue関数の引数にObject.fillColorを渡せばCMYKの4成分の配列が取得できます*1。
選択したオブジェクトの順番がわかった
ではここまでを整理したコードです。
var myDoc = app.activeDocument; //最前面のドキュメント var mySels = myDoc.selection; //ここらへんはInDesignと同じ var getColorValue = function (color){ return [color.cyan, color.magenta, color.yellow, color.black]; } $.writeln(getColorValue (mySels[0].fillColor));
これで0番目に選択したオブジェクトの塗り色の成分値がコンソールに記述されます。つまり、どの順番でselection
プロパティに格納されているのかわかります。
こんな順序で選択してみました。ひょっとしたらレイヤーの前後関係で並べられるかもしれないと思ったので、一応レイヤーパネルの順序も確認しておきます。
そしてスクリプトの結果。
おぉ、InDesignと違って選択順序じゃなくてレイヤーの前後関係順なのか!(予感的中)
めんどくs
一応、ほかのもレイヤーの前後関係どおりか調べてみますか。
$.writeln(getColorValue (mySels[1].fillColor)); //結果は 0,20,0,0 $.writeln(getColorValue (mySels[2].fillColor)); //結果は 20,0,0,0
というわけで、選択順序に関係なく、レイヤーの前後関係でselection
に格納されるということで間違いなさそうです。
はー、しんどw
選択順序のことを調べるだけでこんなに苦労するとは…w
というわけで次回へ続きます(たぶん)。