ごんれのラボ

iOS、Android、Adobe系ソフトの自動化スクリプトのことを書き連ねています。

選択したpathitemと同じ高さなら線幅を5ptにする

[Illustrator][AppleScript]0.1mm未満の線幅のオブジェクトの線幅を0.1mmにするというエントリでアップしたAppleScriptですが、実はあれだと同僚の要件にあっていませんでした。

なら最初から要件を細かく言ってくれw

で、再度ヒアリングして聞き出したのが下記要件。

●線幅0.1mmは選択機能を使って自分でやれる

●特定のオブジェクトだけ線幅を太くしたい

●そのオブジェクトは1ファイルに20~30個あって、目視で探すのは時間がかかりすぎるし、絶対もれる

ほほー、なるほどね。

じゃあ特定のオブジェクトを判別させる仕組みを作ればいいのか。

ということでAppleScript辞書とにらめっこ。

あれ?オブジェクトを判別する命令がない…よ?

念のため【Illustrator CS自動化作戦】も確認してみたけど、やっぱない。

makeするときに使う命令は準備されてるのに。

えー、Illustratorって四角も丸も星も一回作成したら全部path itemにされちゃって、あとから判別できないの?(^^;

最低だ…。

と、うちひしがれててもしかたないので、別のアプローチを考えた。

普通図版などを作るときは一回作成したオブジェクトを複製して作っていくものだと思うので、簡単に取得できる要素としてオブジェクトのサイズに注目した。

幅と高さとあるけど、今回は高さを取得して、その高さが同じだったら処理させるというものにしようと思った。

で、書いてみてテストしてみた。

おい、半分ぐらいもれたぞw

原因は細かいサイズの違いまで検知しちゃってそのせいで処理対象から外されてしまったみたい。

ということで、ifの条件に幅をもたせることにした。

うん、これで動いた。

そして同僚の前でデモをやった。

……………ファイルごとにオブジェクトの大きさが違うなんてひどいお…………。

心が折れそうになりながら、再度違うアプローチを模索。

高さで検知させるのはいかしたいので、どうにかしてファイルごとのオブジェクトのサイズの差異を吸収できないかなーと悩む。

要は高さを固定じゃなくて変数にできればいいんだよね。

そっか、基準となるオブジェクトを選択させて高さを取得し、その高さと比較させれば、オブジェクトの高さを変数にできる!

で、書き直して、テスト。

おし!できた………ん?

おおぅ、図版内の斜線まで処理されちゃってる…。

えーと、たしかクローズパスでフィルタリングできたよね、っと。

よし、完成。

思考錯誤すること3時間ぐらいで書けました。

問題点として、同じ高さのオブジェクトすべてが処理されます(四角、丸、星、多角形などのクローズパスのオブジェクト)。

まぁ今回の案件ではこれで100%うまくいきました。

スクリプトに限らず行き詰まったときに違うアプローチがすぐ思いつくかどうかってのが重要ですよね。

一応デモ動画もあります。

(*

ファイルごとに処理対象の高さが違うので

基準となるオブジェクトを選択させて起動させて高さを取得し

処理対象と高さを比較し差分を算出。

その差分が規定値内なら処理をさせる。

この場合は線幅を5ptにする

斜線に反応しないように閉じているpath itemだけを対象とした

*)

tell application "Adobe Illustrator"

tell document 1

set selObj to selection

try

tell item 1 of selObj

--黒丸処理のために高さを調べる

set selObj_y1 to item 1 of geometric bounds -- of selObj

set selObj_y2 to item 3 of geometric bounds -- of selObj

set selObjHeight to selObj_y2 - selObj_y1 --高さを取得

end tell

set closedPathItem to every path item whose closed is true --パスが閉じている事で図形と判断させてみた

repeat with i in closedPathItem

tell i

--処理のために高さを調べる

set y1 to item 1 of geometric bounds

set y2 to item 3 of geometric bounds

set pathHeight to y2 - y1 --高さを取得

set sabun to selObjHeight - pathHeight

if sabun > -0.02 and sabun < 0.02 then

set stroke width to 5 --線幅を5ptに

end if

end tell

end repeat

display dialog "終わり"

on error

display dialog "基準となるオブジェクトを選択してください"

end try

end tell

end tell

ダウンロードは下記からどうぞ。

選択したpathitemと同じ高さなら5ptに