DTPab

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

DTPerのスクリプトもくもく会#21を開催しました

2月20日、DTPerのスクリプトもくもく会#21(オンライン)を開催しました。
参加してくださった皆さま、ありがとうございました。

dtpmkmk.connpass.com

完全オンライン開催

今回はオンラインのみでGoogle Meetを使って開催*1しました。
合間に息子が顔を出したりしましたが、概ね問題なく開催できたと思います。

当日の様子

Slackの#event-mkmk21チャンネルに思いつきのまま書き込んでいます。メンバーのかたは覗いてみてください。
Slackのいいところは(ChatworkやSkypeと違って)コードが貼れる、markdown書式で書ける、チャンネル管理が楽、というところですかね。
Twitterではハッシュタグ#dtpscriptmkmkでつぶやいています。

自分の進捗

今回の作業目標は「スクリプトに定型処理(関数)を書き込むスクリプトを作りたい」でした。
どういうことかというと、いま仕事で書いているスクリプトの中に使用期限を定めるものが出てきたので、その処理部分*2を毎回コピペしないで済むように自動的に記述したいな〜と思ったのです。
処理の流れとして想定したのはこんな感じ。

  1. スクリプトファイルをドロップレットに投げる
  2. 使用期限(年、月、日)をダイアログから入力する
  3. スクリプトのファイル名をダイアログから入力する
  4. 適当な場所に、使用期限が設定された新しいスクリプトが生成される

ドロップレットにしたかったので、今回はAppleScriptで書くことにしました。

結果

使用期限を入力し、スクリプトファイルを指定(D&Dは未実装)したら特定の処理が書き込まれる、というAppleScriptまではできました。

f:id:uske_S:20210223170722g:plain
VSCodeから試すとこんな感じ

開発にはVSCodeを使った

GIFの通り、今回スクリプトエディタを使わずVSCodeで開発しました(おかげでストレスがだいぶ軽減されました)
標準ではAppleScriptに対応していないVSCodeですが、さすがの対応力というか、やはりプラグインがマーケットプレイスにありました。

marketplace.visualstudio.com

デバッグは Option+Shift+R で行うことができます(デフォルト)。
スクリプトエディタではコンパイル時にコードが勝手に整形されますが、VSCodeならそんなことないし、スニペットも使えるし行の移動や複製など便利なショートカット類がまるっと使えるわけです。当然ライブラリは参照できないのですが、デバッグのしかたを工夫すればそこまで深刻ではないかも*3

ハマったところ

ファイルの読み書きをAppleScriptでやると文字コードや改行コードで躓くぞと僕の中のゴーストが囁いたので、ファイルの中身の読み書きはシェルでやりました*4

もくもく会で出た質問など

記憶の範囲で(順不同)。不足があればご指摘いただけるとうれしいです。

  • Illustrator ExtendScript:Illustratorのファイルを保存する際のICCプロファイルの埋め込みをデフォルトにしたい
  • CEP:パネルがアクティブじゃない状態でもキー入力を察知して動作させたい(擬似ショートカットキーのようなこと)
  • ExtendScript:線幅0.1mmのストロークを探したいのに==0.1falseになる
  • ExtendScript:Folder.selectDialog()がキャンセルされたときの処理

Illustrator:ICCプロファイルをデフォルトで埋め込みたい

単体ではembedICCProfile = true;で埋め込みはできるものの、これをスクリプトでデフォルト設定にできるんですかね? という話。
僕は詳しくないのですが、なんとなく無理そう? 詳しい方教えて下さい〜!

CEP:擬似ショートカットキー対応

CEPからSwift動かして対応するために、Swiftに挑戦するそうです。強い。。。
ある程度形になったらぜひ知見を共有していただきたいです。

ExtendScript:等価演算子で小数がtrueにならない

JavaScriptの浮動小数点(float)の不具合でした。

var a = 0.1;
var b = 0.2;
if (a + b === 0.3) {alert("true");}
else {alert("false");}

この結果がfalseになっちゃう。これを回避するには、小数点以下で演算しないように数を大きくしてから比較するか、等価演算子(厳密等価演算子)ではなく不等号で比較するかです。

整数で比較する

グローバルメソッドparseInt()で整数にする形。

var a = 0.1;
var b = 0.2;
if (parseInt((a + b) * 10, 10) === 3) {alert("true");}
else {alert("false");}

Mathの静的メソッドMath.floor()で小数点以下を切り捨てる形。

var a = 0.1;
var b = 0.2;
if (Math.floor((a + b) * 10) === 3) {alert("true");}
else {alert("false");}

不等号で比較する

こっちのほうが直感的で分かりやすいかも。しきい値をどうするかは比較対象によって適宜調整。

var a = 0.1;
var b = 0.2;
var sum = a + b;
if (sum < 0.4 && sum >= 0.3 ) {alert("true");}
else {alert("false");}

Folder.selectDialog()がキャンセルされた場合の処理

Folder.selectDialog()がキャンセルされるとnullが返ってくるので、そこでスクリプトを終了させたり関数を抜けたりというのが正攻法。ただInDesignだとexit()という便利なグローバルメソッドがあるのですが、ご質問いただいたのはIllustratorでした。
なので全体を関数で囲って、nullが返ってきたらreturnして関数を抜けるのがいいと思います。

!(function() {
  // ....
  var inputFolder = Folder.selectDialog( "フォルダを選んでください");
  if (inputFolder == null) {
    return; // ここで関数を抜ける->スクリプト終了
  }
})();

最後に

ここしばらくオンライン開催なもくもく会ですが、やっぱりリアルでやりたい〜! って気持ちになっています。いずれオンオフ並行開催で、いろんな方に楽しんでもらえるようなもくもく会にしていきたいです。次回からまた奇数月開催(3月)の予定です。

本当は東京DTPの勉強会ラジオに出演した補足も書こうと思ったのですが、もくもく会の開催報告だけでけっこうなボリュームになってしまったので記事を分けます。

それではまた!

*1:前回(2020年11月22日)試験的に主催陣だけオフラインで集まりオン・オフ並行というやり方で開催しました

*2:スクリプトに設定した使用期限と、実行時の日時を比較して、使用期限が過ぎたら動かなくなるような処理

*3:ESTKと違ってスクリプトエディタ自体はまだ動作する? ので、ライブラリだけスクリプトエディタから参照してコーディングはVSCodeが現実解かもしれない

*4:一応ググったらこちらが見つかった。
AppleScriptのreadを使わずにテキストを文字化けさせずに読み込む or 書き込む 方法: おたくマニアのココロ
やっぱりなー!
AppleScriptで頑張るのは不毛なので、ここにもある通り今回はシェル(bash)でやることにしました。