終了

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

Community Beginner ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

皆様、こんにちは。

ただいま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が空?
}
}
------------------------------------------------
以上になります。
経験が浅くお粗末なコードで申し訳ないのですが、
アドバイスいただけたらと思います。
何卒よろしくお願いいたします。
キーワード
スクリプティング

表示

1.0K

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 2 件の正解

Community Expert , Jun 06, 2023 Jun 06, 2023

遅くなりまして…

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

まずはコード貼ります

#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, fals
...

投票

翻訳

翻訳
Community Expert , Jun 07, 2023 Jun 07, 2023

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

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

 

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

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

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

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

投票

翻訳

翻訳
Community Expert ,
Jun 06, 2023 Jun 06, 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;
}

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

ajabon grinsmith様

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

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

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

 

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

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

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

[Documents]

と返ってきます。

 

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

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

とても助かります。

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

 

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

あら、直ってなかったですか申し訳ないです…外に出てしまったのでのちほど精査します。

 

>actObj =app.documents;

これは、documentsコレクションを捕まえているだけなのでアラート結果としては正しいです。

actObj.length を出力すると 0なり1なりが出るかと…

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

ajabon grinsmith様

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

 

なるほどですね!

actObj.lengthは1になります。

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

開いているのにapp.activeDocumentで

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

 

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

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

ご了承ください>_<

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

遅くなりまして…

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

まずはコード貼ります

#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の波も来ていますが。
 
どなたかクリティカルな訂正や補足があればお願いしますー…

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

ajabon grinsmith様

コード見直しありがとうございます!

OKボタンがdialogだけだったのは知りませんでした、、、

自分なりに色々と調べてるつもりでしたが

ただのつぎはぎで終わっていました、、、

 

知らないことばかりです、、、

CEP、UXPも自分なりに調べてみます!

 

ちなみになのですが
function openAndAlert()内の
var actObj = app.activeDocument
エラーになってしまいました(;_;)
 

やはりこの流れでai開いて操作するのは

厳しいのでしょうか、、?

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

>var actObj = app.activeDocumentエラー

 

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

MacPro(黒いやつ: Intel)macOS 11.7.4 Illustrator2021(25.4.8)と2022(26.5.3)2023(27.5.0)3バージョンで確認。

 

VSCodeからの実行に加え、各スクリプトフォルダに入れてメニューからも実行してみて、問題ありませんでした。

 

ちなみに、「エラー出ました」だけだとほぼ伝わらないので。。

そこは開発者の視点で、どのタイミングで、どのようなエラーが出て、こういうエラーメッセージで、処理結果はこうなっていた、など詳しく書いてもらったほうがいいですね。

 

別案ですが、dlgはdialogに変更、

ファイル選択ボタンを押したらdlgをいったん閉じてファイル選択ダイアログを表示、

選択し終わったら再度dlgをshow、とすれば、以降の処理もBridgeTalkなんか(なんかってひどいw)使わずそのまま書くことができますよ。

OKボタンも効きますし。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jun 06, 2023 Jun 06, 2023

リンクをクリップボードにコピー

コピー完了

ajabon grinsmith様

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

 

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

 

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

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

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

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

 

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

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

 

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

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

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 07, 2023 Jun 07, 2023

リンクをクリップボードにコピー

コピー完了

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

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

 

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

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

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

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

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jun 07, 2023 Jun 07, 2023

リンクをクリップボードにコピー

コピー完了

その認識で合っております。

私はSPAiというフリーのアプリケーションから実行しています。

イラストレーターにはアプリケーションのウィンドウがないためこちらを使用しております。

また、実際にアプリケーションに入れてメニューから実行しても同じ結果でした、、、

 

なるほどですね!

一度パソコンを再起動するところからやり直してみます。

ありがとうございます。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Jun 07, 2023 Jun 07, 2023

リンクをクリップボードにコピー

コピー完了

遅くなりました。

再起動かけてから起動したところ

無事にalertが出ました!!

ありがとうございます。

 

ajabon grinsmith様のおかげで

めちゃくちゃ助かりました(;_;)

自分の知識の無さを痛感しました、、、

 

こちらを元に制作していきたいと思います!

またわからないことがあったら質問させていただけたらと思います。

本当にありがとうございました。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Jun 07, 2023 Jun 07, 2023

リンクをクリップボードにコピー

コピー完了

最新

やはり再起動w

これ変数の宣言が雑だったりすると尚更、動かなかった時の状態を引っ張って、きちんと書けたのにうまく動かなかったりするので。

今回のポイントは宣言位置ですね。あとvarつけるの大事ですね。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines