Pathfinderをスクリプトから
メニュー項目を実行するにしてもお約束事とか結構あって面倒です。まあ、素直にスクリプトからドライブできない場合というのは多々あるわけですが、それに限らずIllustratorのオブジェクトモデルというのはドキュメント化されていない部分というのが多く、多用されるであろうモノですらブラックボックスな部分を内包していたりします。
そんなこんなで、面倒なのですが、ひとつひとつ調べるしかありません。そして、先達の方々がドキュメントしてくれたものというのはもう、至宝と言っても過言ではありません。今回はカネムーさんとこのページに助けられたりしました。人柱もとい、パイオニアに感謝を込めて…
今回のは単純にパスファインダーパネルと同様の動作をするスクリプトを作ろうと言った趣旨で始めたものです。そんな大層なものでもありませぬが、ご覧下さい。
「効果→パスファインダー」を利用する場合、予めグループ化が必要になります。ですから、まずグループ化の処理を行ないますが、この処理の流れ自体もパラメーターに関する記述がとても分かりにくい場所にあります。自力で探し出せませんでしたw
最終的にはカネムーさんとこの記事を見て動作させる事が出来ました(^-^)/
あとはとても単純です。ただし、パスファインダーパネルと同様の結果を得る為には一手間かける必要があります。
とりあえずコードです。
var tg = app.selection;
var cmd = ["Live Pathfinder Add",
"Live Pathfinder Intersect",
"Live Pathfinder Exclude",
"Live Pathfinder Subtract",
"Live Pathfinder Minus Back",
"Live Pathfinder Divide",
"Live Pathfinder Trim",
"Live Pathfinder Merge",
"Live Pathfinder Crop",
"Live Pathfinder Outline",
"Live Pathfinder Hard Mix",
"Live Pathfinder Soft Mix",
"Live Pathfinder Trap"];
if (tg.length==2) {
var gp = app.activeDocument.groupItems.add();
tg[0].move(gp, ElementPlacement.PLACEATEND);
tg[1].move(gp, ElementPlacement.PLACEATEND);
gp.selected = true;
app.executeMenuCommand(cmd[2]);
app.executeMenuCommand('expandStyle');
}
cmd配列に収容されているのがパスファインダメニュー項目です。英語版メニューとも違う表記も見受けられますが、イメージ的にはずれているものは無いと思いますので適当に試してみて下さい。
さて、まずはグループ化が必要なのです。先に空のグループアイテムを生成します。
var gp = app.activeDocument.groupItems.add();
簡単ですね。続いてそのグループに選択範囲のオブジェクトを放り込むのですが、これにはmoveメソッドを利用します。しかしながら、この2つ目の引数の解説が見つかりません。で、検索するとカネムーさんとこのが一発でヒットして楽勝wwwってなったわけです。http://blog.kanemu.net/2009/07/illustrator_27.htmlなのでリンク(自分用メモ)貼っておきます。ありがとう!カネムーさん。
tg[0].move(gp, ElementPlacement.PLACEATEND);
tg[1].move(gp, ElementPlacement.PLACEATEND);
数が多ければループさせるのですが、2つなのでこんな感じで…
あとはメニューをinvokeするだけです。
さて、CS6以降はメニューをたたけるので以上の処理でOKですが、CS5以前はというと…救済処置が可能です。
こーんな感じでスタイルを登録してスクリプトから当てます。
vvar tg = app.selection;
var gp = app.activeDocument.groupItems.add();
tg[0].move(gp,ElementPlacement.PLACEATEND);
tg[1].move(gp,ElementPlacement.PLACEATEND);
app.activeDocument.graphicStyles.getByName("union").applyTo(gp);
残念ながらCS5以前のバージョンではスクリプトからアピアランスを拡張する事はできません。
最後に、流星号へ。やっぱredraw()いらねーわw