DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

Illustratorのスクリプト勉強中①

はじめに

職場でスクリプトの制作依頼をもらわない限り、僕は基本的にIllustratorスクリプトは作っていません。趣味で作るスクリプトは9割がInDesign用な自分ですが(なんたってスクリプトが素直なので)、食わず嫌いはいけないかなとIllustratorスクリプトもぼちぼち勉強しようかなと思った次第です…(気が乗らないw

InDesignIllustratorも、動く仕組みは同じなので別に新しい言語を覚えるとかそういうわけではないんですが、スクリプトのオブジェクトモデルが似ているようでまったく違うのです。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プロパティに入るので、同じ結果になるのか試してみようということです。

f:id:uske_S:20180508111428p:plain

色成分って…?

選択した四角形の色成分を見ようと思ったのですが、早くもInDesignと違う…!w
InDesignの場合、オブジェクトの塗り色であるfillColorcolorValueというプロパティを持っていて、4成分の配列が格納されています。これが順にC,M,Y,Kの値なのですが、IllustratorfillColorプロパティにcolorValueがない…。
スクリプティングガイドをあたってもいいのですが、とりあえずデータブラウザで覗いてみますか。

var a = mySels[0].fillColor;
$.bp();

こんな感じでブレークポイントを仕込んでESTKからスクリプトを実行します。んで、データブラウザはこんな感じでした。

f:id:uske_S:20180508111442p:plain

なんと、それぞれの成分値がダイレクトにプロパティ名になって格納されていたのか。でもこれ、いちいち.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プロパティに格納されているのかわかります。

f:id:uske_S:20180508111530p:plain

こんな順序で選択してみました。ひょっとしたらレイヤーの前後関係で並べられるかもしれないと思ったので、一応レイヤーパネルの順序も確認しておきます。
そしてスクリプトの結果。

f:id:uske_S:20180508111504p:plain

おぉ、InDesignと違って選択順序じゃなくてレイヤーの前後関係順なのか!(予感的中)
めんどくs
一応、ほかのもレイヤーの前後関係どおりか調べてみますか。

$.writeln(getColorValue (mySels[1].fillColor)); //結果は 0,20,0,0
$.writeln(getColorValue (mySels[2].fillColor)); //結果は 20,0,0,0

というわけで、選択順序に関係なく、レイヤーの前後関係でselectionに格納されるということで間違いなさそうです。

はー、しんどw
選択順序のことを調べるだけでこんなに苦労するとは…w

というわけで次回へ続きます(たぶん)。

*1:ドキュメントのカラーモードがCMYKカラーの場合。ちゃんとした関数にするなら、ドキュメントがCMYKかRGBかをtypenameプロパティから読み取り、条件分岐して取得する値を変更します。今回は簡易的なもので事足りるので割愛しました。