イラストレーター用スクリプトの謎

イラストレーターでドキュメント内のオブジェクトを操作したいのですが。

まずは、ドキュメント全て、要は開いているファイル全て取得。どちらでも良い(結果は同じ)模様。

$.writeln(documents);
$.writeln(app.documents);

で、appって何。色々検索したけど、日本語の説明を見つけられない。なお、英語では見つけたけど、読んでもよくわからない。

次に、アクティブドキュメント、要は今操作しているファイルの取得。どちらでも良い(結果は同じ)模様。

$.writeln(activeDocument);
$.writeln(app.activeDocument);

で、app(以下略

ここからが本題。動かない理由がわからなくて、ちょっと気持ち悪い。コードを一気に書きます。

// ローカル(グローバル)
$.writeln(documents);
$.writeln(app.documents);	
$.writeln(activeDocument);
$.writeln(app.activeDocument);

// 関数
function hoge() {
	$.writeln(documents);
	$.writeln(app.documents);	
	$.writeln(activeDocument);
	$.writeln(app.activeDocument);	
}
hoge();

// ウィンドウからのイベント
var win = new Window('palette', '窓');
var btn = win.add('button', undefined, '釦');
btn.onClick = function() {
	$.writeln(documents);
	$.writeln(app.documents);
	$.writeln(activeDocument); // ここでコケる
	$.writeln(app.activeDocument);
}
win.show();

明確な答えが見つからないけど、イラストレーターは自分を呼ぶ出すのにBridgeTalkクラス経由で実行する必要があるとのこと。なるほど…って、なんでやねん?!

var win = new Window('palette', '窓');
var btn = win.add('button',undefined,'釦');
btn.onClick = function() {
	var bt = new BridgeTalk();
	bt.target="illustrator";
	bt.body = 'hoge();';
	bt.send();
};
function hoge() {
	$.writeln(documents);
	$.writeln(app.documents);
	$.writeln(activeDocument);
	$.writeln(app.activeDocument);
}
win.show();

これで動くのはわかったけど、正直なところ気持ち悪い。Windowクラスがローカルを汚染、ここではactiveDocumentを削除してしまうのか?しかしdefined関数がないので定義判定が出来ないため確認できず。そもそもBridgeTalkクラスを呼ぶとactiveDocumentが復活するのは、BridgeTalkクラスがグローバルを汚染していることになるのでは?

activeDocuemtを使うためだけにBridgeTalkクラスを呼ぶのは気持ちが悪いから、activeDocumentを再定義すれば良いのかもしれない。と思ってactiveDocuent関数を書いたら、そこでイラストレータがフリーズする。これはダメみたい。

それならばgetActiveDocument関数を書けばいいと思ったけど、documentがアクティブかどうかの判定方法がわからない。document(s)のプロパティ一覧を調べても、アクティブかどうかを取得する方法がない感じ。そもそもアクティブかどうかはアプリケーションの状態なので判定できないのだろう。なるほど、それでBridgeTalkクラスが必要なのか。って思ったけど、だったらWindowクラスからのイベントで呼ばれない場合に動くのが説明つかない。やはりグローバルかどうかが鍵なのか?

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です