Skip to main content
Participating Frequently
June 6, 2023
해결됨

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

  • June 6, 2023
  • 1 답변
  • 3536 조회

皆様、こんにちは。

ただいま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が空?
}
}
------------------------------------------------
以上になります。
経験が浅くお粗末なコードで申し訳ないのですが、
アドバイスいただけたらと思います。
何卒よろしくお願いいたします。
이 주제는 답변이 닫혔습니다.
최고의 답변: ajabon grinsmith

ajabon grinsmith様

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

 

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

 

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

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

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

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

 

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

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

 

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

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

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


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

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

 

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

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

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

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

1 답변

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;
}

 

きょへ작성자
Participating Frequently
June 6, 2023

ajabon grinsmith様

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

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

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

 

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

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

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

[Documents]

と返ってきます。

 

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

ajabon grinsmith
Community Expert
Community Expert
June 7, 2023

ajabon grinsmith様

こちらこそこんなコードで申し訳ないです。

 

なるほどですね!

actObj.lengthは1になります。

openでaiファイルを開いているからだと思うのですが

開いているのにapp.activeDocumentで

取得できないのが理解できず、、、

 

お時間がある時で構いませんので、何卒よろしくお願い申し上げます。

もしかしたら朝まで返信できないかもしれません、、、

ご了承ください>_<


遅くなりまして…

いろいろ見落としておりました。

まずはコード貼ります

#target illustrator
#targetengine "hoge"

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], '実行'); //okボタンが機能するのはdialogだけ
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.text = decodeURI(aifile);
        //aifile = text1.text; //用途がない
    }
};

submitBtn2.onClick = function (){
    if((text1.text == "")){
        alert("aiファイルを選択してください");
    }else{
        dlg.close(); //閉じる
        var aifiledateObj = new File(text1.text);
        app.open(aifiledateObj);
        var bt = new BridgeTalk();
        bt.target = "illustrator";
        bt.body = uneval(openAndAlert) + "()";
        bt.onResult = function(res){
            alert(res.body);
        }
        bt.send();
    }
}

function openAndAlert(){
    try{
        var actObj = app.activeDocument;
        alert(actObj);
        /*ここにほんとうにやりたいことをかく*/
        return "おわ";
    }catch(e){
        return e;
    }
}

 

えー、冒頭に # ではじまる2行。

VSCodeからのデバッグなら元のでも動くんですが、Illustrator上のスクリプトメニューからの実行は、これがないと動きません。

ScriptUIの種類がpaletteだから(dialogではないから)です。

詳しくは詳しいところを探してみてください。

 

実行ボタンのプロパティ {name: 'ok'} を削除しました。上記同様 dialogタイプ専用のものとなります。

ファイル選択ダイアログを開く都合、今回dialogタイプは使えなかったということですね。

 

aifile = text1.text;
変数 aifile をデコードしてUI上に出して、またそれを変数aifileに入れ直していましたが、
 
その値をどこも参照していないためコメントアウトしました。
 
最後に大事なことなんですが、
実はIllustratorに限り、ScriptUIでdialog以外のタイプを使う場合(targetengineを指定した場合)は
アプリを直接制御できません(驚愕)。
なので処理部分はBridgeTalkを経由してあらためてIllustratorに送ります。
とてもすごくめんどくさいです。。忘れてました。
ExtendScriptはもう未来がない上にこういう面倒ごとも少なくないので、UIをやるならCEPも覚えるといいと思います。
ぼちぼちUXPの波も来ていますが。
 
どなたかクリティカルな訂正や補足があればお願いしますー…