JavaScript for Adobe Illustrator 覚え書き

written by noncoderスクリプトを作成する上で色々と気付いたことをこちらにまとめました。
なにぶん素人なので、このサイト全体やスクリプトそのものに目を疑うような初歩的な間違いが平然と書かれている可能性があるとおもいます。そういった間違いのご指摘や、スクリプト作成上のアドバイスを心からお待ちしています。どうか、どんな細かいことでも気付かれたことがありましたら、ページ左下のお問い合わせフォームなどからお知らせください。

Illustratorのスクリプト作成に挑戦してみようと思われた方は、ここと合わせて、こちらのページもぜひご覧になってください。
Illustrator CS自動化作戦 with JavaScript一撃必殺JavaScript日本語リファレンス
初心者にもとてもわかりやすいJavaScriptの解説があります。
Photoshop CS自動化作戦 with JavaScript」のページの「よく使われる省略した書き方」もあわせてご覧になることをお勧めします。
AI CS JavaScript 覚え書きPICTRIX)にも、このページと同様の覚え書きがあります。
また、 Illustrator CS : スクリプトについて/life/cycle/)に、とても参考になる解説があります。
 
 
 

行送りが「自動」になっているとjavascriptでは数値を得られない

[確認環境:Ver10, MacOS 9.2.2]
テキストの行送りはleadingというプロパティで取得できます。(バージョン10とCSで親オブジェクトは違います)ところが、この行送りが「文字設定」ウィンドウ上で「自動」に設定されている(行送りの数値がカッコで囲まれている)状態だと、leadingの数値は「0」になって返ってくるんです。えーっ?
このサイトで配布している「テキストばらし」では、テキスト分割後の位置を行送りに合わせるため、仕方がないので、行送りが自動(leadingが0) のときは文字サイズを1.2倍して四捨五入したものを行送りの数値に設定するようにしました。こうすると、実際の数値とさほど違わないものになりますが、 実際のアプリケーション上では0.5単位で数値を調整しているようなので、文字サイズによっては微妙にずれることもあります。

 
 

Mac OS9 + Ver10では正規表現がうまくいかない?

[確認環境:Ver10, MacOS 9.2.2]
Mac OS 9.2.2 + Ver10で正規表現を使うと、特殊文字を¥(バックスラッシュ)でエスケープすることができません。
たとえば、文字列のなかにスラッシュ(「/」)が入っているかどうかをチェックしたいとき、下のようにやってもエラーが出てしまいます。「¥w」のような形でも使えないようです。

txt = "abc/ABC" ;

txt.match( /[^a-zA-Z]/ ) ? alert("y") : alert("n") ;  // y
txt.match( /[^a-zA-Z¥/]/ ) ? alert("y") : alert("n") ;  // error " Expected: , "
txt.match( /[^¥w¥/]/ ) ? alert("y") : alert("n") ;  // error " Expected: , "
 
 

ズームの数値が違います

画面の拡大率は、viewオブジェクトのzoomプロパティで指定できます。の数値は、リファレンスでは10でもCSでも100のときに画面の拡大率が100%になると記されていますが、実際には、1.00のときに100%になります。

 
 

こまったPlugin Item

JavascriptでするIllustrator操作の自由度を少なくしているのが、このPlugin Itemです。「合体」をはじめとするパスファインダの機能など、Illustratorの機能のけっこうな範囲がプラグインによって実現されています。で、一度プラグインによる操作を通してしまうと、スクリプト上ではPlugin Itemというものになって、その中の塗りやパスポイントを操作するなどということが出来なくなってしまうんです。また、プラグインによる操作をスクリプトから命令することもできません。
パスファインダで中抜きなどを行った場合は、そのままだとPluginItemとして扱われ、「分割・拡張」を行ってはじめてcompoundPathItemと認識されて、いろいろいじれるようになります。
Scriptographerではパスファインダを扱うことができますので、やりたい事の内容によってはこちらでスクリプトを組むほうがいいかもしれません。

 
 

日本語テキストの選択範囲は正しく取得できない

テキストオブジェクト(バージョン10ならTextArtItem、CSならTextFrame)のテキストの一部をカーソルで選択しているとき、色が反転しているこの選択部分の範囲を取り出すのは、バージョン10ならDocumentオブジェクトのselectionプロパティ、バージョンCSなら選択したTextFrameオブジェクトのselectionプロパティとして取得できます。選択部分の文字列を拾いたかったら、それぞれselectioncontentsプロパティとして取得します。ところが、テキストに日本語が含まれていると、これが正しく取得できません。
まず、2バイト文字ひとつ1バイト文字2つ分と認識して、倍の文字数でカウントします。それから、中身を拾うときだけはきちんと2バイト文字をひと文字として、戻してくれるわけです。選択範囲の始まり位置も同様に倍の文字数のところから始まり、倍で終わります。
つまり、こうなります。

我輩は猫である。名前は山田。名字が島田。  ←実際の選択範囲
我輩は猫である。名前は山田。名字が島田。  ←取得できる選択範囲

「4文字めから7文字めまで4文字分」の選択範囲が「7文字めから14文字めまで8文字分」と認識されてしまうわけです。
テキストの内容が日本語だけか半角英数文字だけの場合はまだ対応できそうですが、両方の混じった文の場合は、半角のところだけを正常にカウントし、正常に拾うので、とても厄介です。

 
 

テキストオブジェクト周りの構成について

バージョン10とCSでは、スクリプト上のけっこう大きな変更がいくつかあり、その一番大きな違いがテキスト周りの構成です。アプリケーション自体がテキスト周りの機能に関しては盛り沢山に変更されてしまったので、仕方がないといえば仕方がないのかも知れません。
古籏さんのサイトの「ver 10との互換性について」にも書かれている通り、どちらのバージョンでも使えるスクリプトを書くのは、テキスト周りに関してはなかなか大変です。
自分の作業のためにまとめた構成図をアップしておきます。リファレンスを眺めるだけだともうこんがらかってわけがわからないんですが、これを作ってみてよ うやく把握できました。「うわあ、10とCSでこんなに違うんだ」というウンザリ感を共有していただけるならこれにまさる喜びはありません。

Illustrator 10・テキスト関連のオブジェクト構成(PDF)
Illustrator CS・テキスト関連のオブジェクト構成(PDF)