Skip to main content
Participating Frequently
June 6, 2023
Answered

Illustrator Javascriptでaiファイルを開いて操作したい

  • June 6, 2023
  • 1 reply
  • 3509 views

皆様、こんにちは。

ただいまVSCを用いてIllustrator用のJavascriptを制作しております。

内容としましては、

・スクリプトを起動

・ウィンドウが表示される

・ウィンドウの「選択」というボタンを押す

・aiファイルを選択する

・ウィンドウの「実行」ボタンを押す

・先ほど選択したaiファイルが開かれる←ここまで制作

・開いたaiファイルに画像を貼っていく

というようなものを制作しているのですが、

開いたaiファイルを操作することができません。

ファイルが開いていてもapp.activeDocumentで

指定できず困っております。

どなたかわかる方ご教授いただけますと幸いです。

 

環境は

OSはCaralinaでIllustrator 2022です。

以下現状のコードです。何卒よろしくお願いいたします。

-----------------------------------------------------------------------------

aifile = "";
var dlg = new Window("palette", "タイトル", [0,0,210,75]);
submitBtn1 = dlg.add('button', [10,10,100,30], '選択…');
submitBtn2 = dlg.add('button', [10,40,100,65], '実行', {name:'ok'});
text1 = dlg.add("edittext",[110,10,200,30],"");
text1.enabled = false;
dlg.center();
dlg.show();

submitBtn1.onClick = function (){
var aifile = File.openDialog("aiファイルを選択してください", Shiteiai, false);
function Shiteiai (H) {
var hi = /\.(ai)$/i;
return (H instanceof Folder || hi.test(H.fsName));
}
if(aifile == null){
var aifile = "";
}else{
text1 = dlg.add("edittext",[110,10,200,30],decodeURI(aifile));
text1.enabled = false;
var aifile = text1.text;

}
};

submitBtn2.onClick = function (){
if((text1.text == "")){
alert("aiファイルを選択してください")
}else{
dlg.close(); //実行後に閉じる
aifiledateObj = new File(text1.text);
open(aifiledateObj);
var actObj = app.activeDocument;
alert(actObj) //ここが出ない。一つ上のapp.activeDocumentが空?
}
}
------------------------------------------------
以上になります。
経験が浅くお粗末なコードで申し訳ないのですが、
アドバイスいただけたらと思います。
何卒よろしくお願いいたします。
This topic has been closed for replies.
Correct answer ajabon grinsmith

ajabon grinsmith様

>えぇー… と、当方環境では問題ありません…

 

検証ありがとうございます!

 

また、エラー内容記載しておらず申し訳ございません。

今一度試してみたところエラーはなぜか出なかったのですが

イラレが開いても何も起きない状況です。

恐らくalert(actObj);が出るはずだと思うのですが、、、

 

ちなみに先ほどはopenAndAlert() 内の

tryによるエラーだと思われます。

 

別案の件も試してみたいと思います。

わからないことがあったら

またご質問させていただけたらと思います。


>イラレが開いても何も起きない状況です

「指定のaiドキュメントは開かれたが、それから何も起こらない(アラートが出ない)」で認識は合っているでしょうか?

 

また、きょへさんは、どのように実行されているのでしょうか。

VSCodeからのデバッグ実行ですか? Illustratorのスクリプトフォルダに入れてメニューから実行ですか?

両方とも同じ挙動ですか?

あとは、一度アプリケーション(Illustrator)またはOSを再起動してみるとすんなり正常動作することもあります(過去にありました…)。

1 reply

ajabon grinsmith
Community Expert
Community Expert
June 6, 2023

あー、2回実行すると2回目は出ますね。1回目は出ませんでした。

 

眺めてみたかんじ、変数の宣言が関数の内外でとっちらかっているので、

関数外でも使う変数はグローバル宣言しましょう。

要は var をつけるタイミングというか位置ですね。

すこし手直しさせてもらいました。

 

var aifile = "";
var actObj;
var dlg = new Window("palette", "タイトル", [0,0,210,75]);
var submitBtn1 = dlg.add('button', [10,10,100,30], '選択…');
var submitBtn2 = dlg.add('button', [10,40,100,65], '実行', {name:'ok'});
var text1 = dlg.add("edittext",[110,10,200,30],"");
text1.enabled = false;
dlg.center();
dlg.show();

submitBtn1.onClick = function (){
aifile = File.openDialog("aiファイルを選択してください", Shiteiai, false);
function Shiteiai (H) {
var hi = /\.(ai)$/i;
return (H instanceof Folder || hi.test(H.fsName));
}
if(aifile == null){
aifile = "";
}else{
text1 = dlg.add("edittext",[110,10,200,30],decodeURI(aifile));
text1.enabled = false;
aifile = text1.text;

}
};

submitBtn2.onClick = function (){
if((text1.text == "")){
alert("aiファイルを選択してください")
}else{
dlg.close(); //実行後に閉じる
var aifiledateObj = new File(text1.text);
open(aifiledateObj);
actObj = app.activeDocument;
alert(actObj); //ここが出ない。一つ上のapp.activeDocumentが空?
}
}

 

 

オリジナルとの比較(difff.jp)……を貼れなかったので、添付します。参考にどうぞ。

 

(追記)もうひとつ問題みつけました。

選択ボタンによるファイル選択を何度も実行すると、コントロール"text1" が延々とダイアログ上の同一座標に重なって作成される形になっています。

ここはEditTextのtextを定義するだけで済みます。こんなかんじでいいです。

if(aifile == null){
    aifile = "";
}else{
    text1.text = decodeURI(aifile);
    aifile = text1.text;
}

 

きょへAuthor
Participating Frequently
June 6, 2023

ajabon grinsmith様

返信ありがとうございます!

varのタイミングが大事なのですね!勉強になります。

基本的な事がわかっておらずお恥ずかしい>_<

 

こちら試してみたのですが

actObjを取得できませんでした、、、

ちなみに最後から4行目をactObj = app.documents;とすると

[Documents]

と返ってきます。

 

原因わかりますでしょうか、、、

きょへAuthor
Participating Frequently
June 6, 2023

追記ありがとうございます。

とても助かります。

他にも問題があったらお教えいただけますと幸いです。