kick the base

Houdiniと、CG技術と、日々のこと。

Illustrator/JSX:「オブジェクトの選択範囲をパスに制限」をスクリプトでトグルする 2

前回に引き続き「オブジェクトの選択範囲をパスに制限」をスクリプトでトグルするという内容です。

今回は実際にスクリプトを制作していきます。非常に短いコードですが、いつも通り一行づつ解説していきます。ランチャーの活用に関する話は次回投稿します。

JSXの作成

ツール作成のきっかけ

前回お話したようにぼくは「オブジェクトの選択範囲をパスに制限」を常にオンにして使用しているのですが、以前Twitterでアンケートをとったところ、ケース・バイ・ケースで切り替えて使用しているという方がおられたので、それならスクリプトでトグルできるツールを使ったほうが楽になるだろうなというわけで作ってみました。

実際のコード

最初にコードを示します。完成したときは下記状態でした。

(function() {app.preferences.setIntegerPreference ("hitShapeOnPreview", !app.preferences.getIntegerPreference("hitShapeOnPreview"));})();

男気あふれるワンライナーです。これくらいのコードであればワンライナーでぜんぜん良いのですが、解説の都合上分かりやすいものではないので、下記のように整頓してみました。

(function() {
    var pref = app.preferences;
    const HIT = "hitShapeOnPreview";
    pref.setIntegerPreference(HIT, !pref.getIntegerPreference(HIT));
})();

整頓してもたったの5行です。初学者の方のためにちょうどいい長さではないでしょうか。

コード解説

var pref = app.preferences;
const HIT = "hitShapeOnPreview";
pref.setIntegerPreference(HIT, !pref.getIntegerPreference(HIT));
  1. var pref = app.preferences;ですが、これは単純にapp.preferencesが2回出てくるので短くなるよう変数prefに代入しただけです。
  2. const HIT = "hitShapeOnPreview";これも全く同じ理由で2回出てくるので定数HITに代入しました。*1
  3. この3行目が重要なので、ちょっと細かく見ていきます。

setIntegerPreference(key:string,value:Int32)

これは引数をふたつとるメソッドで、環境設定のkey(項目)にvalue(値)をセットするよという意味になります。

これだとまだ分かりにくいので実際に「オブジェクトの選択範囲をパスに制限」をオンにするコードと、オフにするコードの両方を見てみましょう。それでイメージがつかめると思います。

  • app.preferences.setIntegerPreference ("hitShapeOnPreview",0); //オン
  • app.preferences.setIntegerPreference ("hitShapeOnPreview",1); //オフ

keyである"hitShapeOnPreview"が「オブジェクトの選択範囲をパスに制限」を示す環境設定項目にあたり、その値を01にセットすることでオン・オフを切り替えているのです。

オンにするのが0でオフにするのが1ってのが謎ですが、まあ置いておいて

上記のコードをそれぞれhit_shape_path_on.jsxhit_shape_path_off.jsxなどに保存し、オンにしたいとき、オフにしたいときに使い分ければ運用できない事はありません。

しかし、ひとつのツールでオン・オフをトグルできた方が良いですよね?

それを可能にする方法を続けてみていきましょう。

valueの値を0,1とトグルする

先程の例で見たとおり、valueの値が実行されるたびに0,1と交互変化させてあげればトグル機能が完成しそうです。

ここでワンライナーのコードを見てみましょう。

!app.preferences.getIntegerPreference("hitShapeOnPreview")

valueに相当する箇所はこのようになっています。これはどういう意味でしょう。

このコードは!app.preferences.getIntegerPreference("hitShapeOnPreview")に分けて考えると理解しやすいでしょう。

コード 意味
! 論理否定演算子と呼ばれ、後ろに続くフラグを反転させる
app.preferences.〜略 現在の「オブジェクトの選択範囲をパスに制限」の状態を取得

このコードは現在の「オブジェクトの選択範囲をパスに制限」の状態を0,1で取得し、それを!演算子で反転させるという意味になります。

現在の状態を反転する。この考え方が重要です。

実際のコードの流れ

上記をまとめると、こんな感じになります。

  1. !app.preferences.getIntegerPreference("hitShapeOnPreview")で現在の状態を取得し、それを反転
  2. setIntegerPreferenceメソッドで、「オブジェクトの選択範囲をパスに制限("hitShapeOnPreview")」に先程の反転済みの値をセット

この2つの行程でトグルを実現していたんですね。タネを明かせば実に簡単です。

最後に即時関数にくるんでおしまい

(function() {
    var pref = app.preferences;
    const HIT = "hitShapeOnPreview";
    pref.setIntegerPreference(HIT, !pref.getIntegerPreference(HIT));
})();

(function() { ... })();で処理をくるむことでグローバルスコープへの名前空間汚染がなくせます。

まとめ

これで実行するたび現在の「オブジェクトの選択範囲をパスに制限」の状態を取得し、それを反転した値を再度セットするという処理ができました。

setIntegerPreferenceメソッドのvalue01を直値で設定してしまうと繰り返すたびにトグルするスクリプトは実現できません。オンにするスクリプトとオフにするスクリプトのようにふたつのスクリプトを用意して人間が使い分けるのはナンセンスです。

状態を取得し、それを利用することにより、ひとつのコードでオン・オフ両方に対応できました。

次回で本連載は終りとなります。作成したスクリプトをランチャーに登録し、いつでもすぐに呼び出せるようにしましょう!

*1:constキーワードを使うと明示的に変更不可にできます。ここでは定数名をすべて大文字にしていますが、プロジェクトの命名規則に合わせると良いでしょう