イラストレーターでドキュメント内のオブジェクトを操作したいのですが。
まずは、ドキュメント全て、要は開いているファイル全て取得。どちらでも良い(結果は同じ)模様。
$.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クラスからのイベントで呼ばれない場合に動くのが説明つかない。やはりグローバルかどうかが鍵なのか?