ExtendScriptを使ってIllustratorにダイアログを表示しようと思ったのですが、#targetengineの設定でおもった以上にハマったので備忘録として。
環境
OS:macOS 10.14
editor:Sublime Text3
application:illustrator CC2018
やりたいこと
ExtendScriptでIllustratorにキャンセルボタンがあるだけのシンプルなダイアログを表示させます。
やったこと
#target "illustrator"
var winObj = new Window('palette', 'sample', undefined);
//ボタンを作成する
var btnCancel = winObj.add("button",[100,70,170,100],"cancel",{name:'cancel'});
winObj.center();
winObj.show();
btnCancel.onClick = function(){winObj.close();}
windowメソッドの第1パラメータは以下の3つから選べるみたいなのでpalleteを選択。
windowメソッドの第1パラメータ |
---|
window |
dialog |
pallete |
が、このコードではスクリプトを実行してもダイアログは表示されず。(エラーも出ない…)
調べてみたら #targetengine を指定しないといけないらしく以下コードに修正。
#target 'illustrator'
#targetengine 'test'
var winObj = new Window('palette', 'sample', undefined);
//ボタンを作成する
var myBtn = winObj.add("button", [50,100,270,120],"押してください");
var btnCancel = winObj.add("button",[100,70,170,100],"cancel",{name:'cancel'});
winObj.center();
winObj.show();
btnCancel.onClick = function(){winObj.close();}
このコードで無事動作しました。
なぜ#targetengineを指定しないといけなかったのか?
以下サイトで詳しく解説されていました。
targetengineについて
直列的に処理をこなして終了するスクリプトは同時に2つ以上実行されることはないので、結果的に排他的な環境で実行されます。adobeのJavaScript環境(ExtendScript)であれば、スクリプトは「main」という空間で実行され、終了後は暗示的にクリアされます。
それに対して常駐するスクリプトは、その実行環境を維持し続けるための「居場所」が必要になります。その場合、同じ居場所で不特定多数のスクリプトが実行されると、変数名の衝突が起こるなどの不都合が生じます。
常駐型スクリプトを走らせる場合、それぞれのスクリプトは変数名の衝突を避けるために固有の名前空間が必要です。
とのことで、今回のスクリプトではwindowにpalletを指定した「常駐型スクリプト」なのでスクリプトを実行する空間を#targetengineで設定してあげないといけなかったみたいです。
わからない点
常駐型スクリプトの場合、変数名の衝突などを防ぐために固有の名前空間をつくってあげないといけないことは理解しました。
しかしなぜ test.jsx のスクリプトで動作をしなかったのかまでは分かりませんでした。