DTPab

印刷やデザイン、アドビ製アプリやスクリプトなど、雑多な技術ブログ

選択したmm単位の数字をinchに変換するAutomatorワークフロー(JXA)

f:id:uske_S:20220407205323p:plain

事の経緯

Illustrator上のテキスト(mm単位で表記された数字)を異なる単位系(今回はinch)に変換したい、という話がTwitterでたまたま流れてきました。
元の話だとクリップボードに取り込んだテキストの処理ということだったので、ajabon師匠がAppleScriptを経由したスクリプトでの解決策を提示されていました*1

ただ、後々の話からどうやらIllustratorだけでの動作ではない(別のアプリケーションに経由させる?)のかなと思って、僕はAutomatorを利用したJXAによるテキスト置換を提案しました。

f:id:uske_S:20220331123155g:plain
CotEditorでの動作

ご覧の通り、テキストを選択してコンテクストメニューを開き、サービスからAutomatorのクイックアクションを実行させます。こうすればAdobeのアプリケーションに限らず利用できるツールになります。

今回はワークフローの作り方から書いてみますが、とっととコードが見たい、という方は記事末尾まで飛ばしてください。

Automatorクイックアクションの作り方

サービスメニューに登録できる、一連の処理をまとめたスクリプトのようなものです。
Automatorというアプリから作成します。

  1. Automatorを起動、クイックアクションを選択して新規作成
    f:id:uske_S:20220331124040p:plain
  2. 「JavaScriptを実行」アクションを検索してワークフローに追加
    f:id:uske_S:20220331124323p:plain
  3. ダイアログ上部の設定項目を2箇所変更する
    f:id:uske_S:20220331124615p:plain
  4. コード(JavaScript)を入力し、名前をつけて保存

という流れで作成できます。

ご自身でゼロから開発する場合は、デバッグに少し癖がありますので気をつけてください(今回はコードを全文掲載するので割愛します)。

コード

解説

デフォルト状態でrun()関数が設定されていて、これの引数が2つあります。
第一引数のinputはその名の通り、ワークフローが受け取る項目(今回はテキスト)です。
形としては配列になっているので、input[0]として取り出せます。
小数点を含んだ数字の文字列を想定しているので、JavaScriptの組み込みメソッドであるparseFloat()*2でNumber型に変換します。

return文では、mm単位からinch単位への換算を行っています。頭から見ていきましょう。
計算結果を四捨五入するために、Math.round()という静的メソッド*3を利用しました。
1 inch ≒ 25.4 mm なので、入力された値を単純に25.4で除算したいところですが、JavaScriptは浮動小数点の計算に誤差を生みやすいため、このような計算式としました。
小数点以下第二位まで欲しいという話だったのでMath.round(input * 100 / 25.4) / 100とすれば求める結果になるのですが、小数点以下の計算をさせないように、あえてMath.round(input * 1000 / 254) / 100としました。
最後についてる+ ""ですが、実はテキストを置き換えるタイプのクイックアクションは、戻り値もしっかりString型に変換しておかないとうまく置き換わりません。
なので末尾に空の文字列を加算するという簡便な方法で対応しました。

以上がコード全文の解説です。

使い方

この画像のように、テキストを選択し、コンテクストメニューから実行させてください。

f:id:uske_S:20220331123155g:plain
CotEditorでの動作

AdobeのアプリケーションからはAutomatorのサービスメニューが表示されないので実行できないです。
もしAdobeのアプリケーションで同じものを、となれば普通にスクリプトとして開発になるかもしれません。

サービスメニューの管理

コンテクストメニュー>サービスとたどってクイックアクションがずらっと表示されますが、増えてくると選ぶのが大変ですよね。
なのでショートカットキーを登録したり、使わなくなったものは非表示にするなどしてしまうと便利です。

サービスメニューの管理は、サービスが呼び出せるアプリケーション(Finder、CotEditor、Automatorなどいろいろ)のメニューから、「"サービス"環境設定...」を開きます。
f:id:uske_S:20220331130534p:plain

そうするとシステム環境設定のダイアログが開きますので、そこから図のような管理が可能です。 f:id:uske_S:20220331130937p:plain

ちなみに、Automatorで作ったクイックアクション(サービス)は一部のアプリケーションからは実行できないようになっています(Adobeのアプリケーションはたいていできない)。

Automatorで作ったワークフローであれば、右クリックからAutomatorで開いたり、保存場所をFinderで開いたりすることもできます。
f:id:uske_S:20220331131320p:plain

以上、ちょっとAutomatorの取り扱いも含めて記事にしてみました。
他にもいろいろAutomatorを利用したJavaScriptの処理については記事を書いていますので、右のカテゴリーカラムからAutomator、JXAなどをぜひご覧ください。

*1:鍵アカウントの方へのリプライなのでTweet自体は紹介しません。あしらかず

*2:詳細はMDNなどを参照のこと

*3:詳細はMDNなどを参照のこと