イラストレーターで吹き出しを作る時に使うスクリプト

雲形の吹き出しを作る時どうしてますか?
パスの変形から「パンク・膨張…」を使ったり、
円を繋げて作ったり、手で書いた物をトレースしたり
適当にペンツールで作ったり。
やり方はいろいろあると思います。
さて今日は、
その中にスクリプトで作るという選択肢を一つ
追加したいと思います。



たとえば、こんな感じの図形をパスで描きます。



てっとり早く「パンク・膨張…」で作ろうとするとこんな形になります。
正直、あまり好きな形ではありません。
いかにもイラストレーターの「パンク・膨張…」を使いましたという形になります。



そこでスクリプトを使います。
僕の好みの形です。
(だってその為にスクリプトを書いたんだから…)
これからは、このスクリプトを使いましたという形でいこうと思います。



ダウンロードはこちらから
イラストレーターで吹き出しを作る
イラストレーターCS3以降で動作します。
※終了するときはESCキーで抜けることが出来ます。

doEx.jsxについての簡単な説明2

舌の根が乾かないうちに、勢いにまかせて連投します。
というか、機能を追加しました。すでにダウンロードされている方はダウンロードしなおしてください。
追加した機能は「選択したものを表のようにあつかうため?のクラス(多方向対応/インデザイン・イラストレーター対応版)」です。
あといろいろ。肥大化したソースはとうとう1000行を超えてしまいました。




目玉機能の紹介

説明が難しい機能なんですが無理矢理説明すると…

#include 'doEx.jsx'
doEx(activeDocument.pathItems).hvg().view();

上のスクリプトを実行するとこうなります。
横の■と□で表現したグリッド的なものがスクリプトで認識したオブジェクトの形状になります。

また別の場合は、こうなります……。

なんだかちょっと違うな〜ってときは

#include 'doEx.jsx'
doEx(activeDocument.pathItems).hvg(0.5).view();

引数に絞り値(今回は0.5:デフォルトは1です。)を入れることで、納得の結果が得れるかもしれません。





■オブジェクトを吐き出す順番

ある程度、気に入った結果が得られたことろで、次に行うのはeachです。eachです。
例えば、認識したオブジェクトの形状がこんな形だった場合。

eachしていく順番はこうなります。eachで取り出せるのは常にZ方向です。(Z方向で判るかな)





じゃ…じゃぁ他の順番にしたい時はどうするの?
当然の疑問です。
そういう場合はrotateで形状を回転させます。

doEx(app.activeDocument.pathItems).hvg().rotate().view();

そうすると形状が回転してこうなります。

これをeachするとこの順番になります。

さらにrotateとreverseを駆使することであらゆる方向から順番にオブジェクトを取り出すことが可能です。

doEx(app.activeDocument.pathItems).hvg().rotate().reverse().view();


目玉機能です。




■その他

hvg()した後はhvgオブジェクトとしてメソッドチェーンしていくことになります。
そこで他の形式に変換したい場合はこうします。
Arrayに変換

doEx(app.activeDocument.pathItems).hvg().rotate().toArray();

doExオブジェクトに変換

doEx(app.activeDocument.pathItems).hvg().rotate().doEx();

レッツ、メソッドチェーン!




■おまけ

doEx(app.activeDocument.pathItems).view();

とするとこんなダイアログが表示されます。

ここでeachした場合のオブジェクトを確認することができます。




ところでhvgの意味なんですが、Human Visual Gridとかそんな感じです。
……
うん、まぁ。今日はここまで。

doEx.jsxについての簡単な説明

doEx.jsxを公開してしばらくたちました。
意外とダウンロード(ScriptClip)されているようですが…、ろくに使い方の説明もしていないので本当に使って貰っているのか…。
多少使い方の説明をしておかないといけないかなと…。
ということで簡単に使い方の説明をします。

doEx.jsxの使い方

■読み込み

インクルードします。CS4だと同じフォルダ階層にあれば読み込んでくれるようです。
CS3で同じフォルダ階層にない場合などはincludepathにパスを記述します。

#includepath "doEx.jsxが置いてあるフォルダまでのパス"
#include "doEx.jsx"





■まず初めに

まず初めにdoExにアクティブなドキュメントのテキストフレームを取り込んでみましょう

var Tf = doEx(app.activeDocument.textFrames);

Tfにテキストフレームを取り込んだdoExオブジェクトが入りました。




■処理をする

取り込んだテキストフレームのコンテンツを取得してみましょう。

function getContent(O){return O.contents};
var Contents = Tf.each(getContent);

Contentsにテキストフレームのコンテンツを取り込んだdoExオブジェクトが入りました。
each(Function)とすることで、取り込んだオブジェクトを次々と処理します。また、戻り値[return]があればそれを取り込んだdoExオブジェクトが生成され戻り値に入ります。
ということで、Contentsはcontentsを取り込んだdoExオブジェクトとなります。




■配列[Array]に戻す

doExオブジェクトを配列に変換します。

var Contents = Contents.toArray();

toArrayでdoExオブジェクトを配列に変換することができます。
では、ちょっとどんな内容が入っているか表示してみましょう。

alert("テキストフレームの内容\n"+Contents.join("\n");

どうでしょう、テキストフレームの内容が表示されましたでしょうか。
ここまでの内容をまとめると以下のソースになります。

#include "doEx.jsx"
var Tf = doEx(app.activeDocument.textFrames);
function getContent(O){return O.contents};
var Contents = Tf.each(getContent);
Contents = Contents.toArray();
alert("テキストフレームの内容\n"+Contents.join("\n"));





■短く簡潔に書く

また、doExはメソッドチェーンができるので
上のソースをなるべく繋げて書くとこうなります。

#include "doEx.jsx"
var Contents = doEx(app.activeDocument.textFrames).each(function(){return this.contents}).toArray();
alert("テキストフレームの内容\n"+Contents.join("\n"));

さらに短く書くとこうなります。

#include "doEx.jsx"
alert("テキストフレームの内容\n"+doEx("textFrames").find("contents").toArray().join("\n"));

かなりの省略形です。これはうまくいくパターンです。
ものによってはうまく動かない場合もあったり…素直に書いた方が早かった…という事もあります。




■まとめ

書き方によってはこれまで面倒だった処理が短く簡潔に書けるようになります。
簡単ではありますが、doExの簡単な使い方でした。

jQuery風にドキュメントのオブジェクトを抽出するかもしれない「c.js」を改名します。

「c.js」は自分がExtendScriptを学習するにあたり、jQueryのソースを手本に書き始めたのが始まりです。そこそこうまく動いてくれていましたが継ぎ足し継ぎ足しのソースはもうボロボロの状態。
これ以上いじるのも辛くなってきました、そこで書き直すついでに名前も変えることに、といってもまったくいちから書き直した訳ではないのでまだまだツギハギだらけです。本当は一から書きなおせばもっとスッキリするのですが。それはもう少し気力が溜まってからということで。。
新しい名前は
Document(ドキュメント)
Object(オブジェクト)
Extract(抽出)の頭文字を取って「doEx.jsx」にします。
どうでしょう?
とはいっても自分ぐらいしか使っているの見たことありませんが…
甘〜いテストしかしておりませんので使用する場合は自己責任でお願いします。
doEx.js

順調にCS4に移行中

順調にCS4に移行中であります。

CS4といえばマルチアートボードであります。
待望だった人もそうでない人もいろいろであります。
久々なのでこんなテンションでいいのか不安であります。

メニューをまさぐっていると、
「オブジェクト」>「アートボードに変換」というのがあるようで…
これを使えばパスをアートボードに変換することもできるようで…

たとえばこんなハード型のパスを選択して

アートボードに変換

できません。


とうぜん怒られます。残念。

Photoshopのアクションをスクリプトで取得してUIで選択

Photoshopのアクションを取得するスクリプト
ScriptUIで選択できるように仕上げてみた。
只それだけ、
いつものことですがこのままでは何もできません。


いちおうPhotoshopIllustratorInDesignで動作することを確認。







ん?
PhotoshopIllustratorInDesignで動いてるのはなぜ?
そうです。今回のポイントは実はここなんです。
ちょっと実験的な試みとして
Photoshopで実行した場合と、Illustrator,InDesignで実行した場合でスクリプトの流れが変わるようになっています。
そして、このスクリプトを直接実行した場合と、他で読み込んだ場合で違う動作になるように仕込んであります。

けっこう実験的。
興味のある方はコチラから。
ダウンロード