リンクをクリップボードにコピー
コピー完了
皆様、こんにちは。
ただいまVSCを用いてIllustrator用のJavascriptを制作しております。
内容としましては、
・スクリプトを起動
・ウィンドウが表示される
・ウィンドウの「選択」というボタンを押す
・aiファイルを選択する
・ウィンドウの「実行」ボタンを押す
・先ほど選択したaiファイルが開かれる←ここまで制作
・開いたaiファイルに画像を貼っていく
というようなものを制作しているのですが、
開いたaiファイルを操作することができません。
指定できず困っております。
どなたかわかる方ご教授いただけますと幸いです。
環境は
OSはCaralinaでIllustrator 2022です。
以下現状のコードです。何卒よろしくお願いいたします。
-----------------------------------------------------------------------------
遅くなりまして…
いろいろ見落としておりました。
まずはコード貼ります
#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
...
>イラレが開いても何も起きない状況です
「指定のaiドキュメントは開かれたが、それから何も起こらない(アラートが出ない)」で認識は合っているでしょうか?
また、きょへさんは、どのように実行されているのでしょうか。
VSCodeからのデバッグ実行ですか? Illustratorのスクリプトフォルダに入れてメニューから実行ですか?
両方とも同じ挙動ですか?
あとは、一度アプリケーション(Illustrator)またはOSを再起動してみるとすんなり正常動作することもあります(過去にありました…)。
リンクをクリップボードにコピー
コピー完了
あー、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;
}
リンクをクリップボードにコピー
コピー完了
ajabon grinsmith様
返信ありがとうございます!
varのタイミングが大事なのですね!勉強になります。
基本的な事がわかっておらずお恥ずかしい>_<
こちら試してみたのですが
actObjを取得できませんでした、、、
[Documents]
と返ってきます。
原因わかりますでしょうか、、、
リンクをクリップボードにコピー
コピー完了
追記ありがとうございます。
とても助かります。
他にも問題があったらお教えいただけますと幸いです。
リンクをクリップボードにコピー
コピー完了
あら、直ってなかったですか申し訳ないです…外に出てしまったのでのちほど精査します。
>actObj =app.documents;
これは、documentsコレクションを捕まえているだけなのでアラート結果としては正しいです。
actObj.length を出力すると 0なり1なりが出るかと…
リンクをクリップボードにコピー
コピー完了
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タイプは使えなかったということですね。
リンクをクリップボードにコピー
コピー完了
ajabon grinsmith様
コード見直しありがとうございます!
OKボタンがdialogだけだったのは知りませんでした、、、
自分なりに色々と調べてるつもりでしたが
ただのつぎはぎで終わっていました、、、
知らないことばかりです、、、
CEP、UXPも自分なりに調べてみます!
やはりこの流れでai開いて操作するのは
厳しいのでしょうか、、?
リンクをクリップボードにコピー
コピー完了
>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ボタンも効きますし。
リンクをクリップボードにコピー
コピー完了
ajabon grinsmith様
>えぇー… と、当方環境では問題ありません…
検証ありがとうございます!
また、エラー内容記載しておらず申し訳ございません。
今一度試してみたところエラーはなぜか出なかったのですが
イラレが開いても何も起きない状況です。
恐らくalert(actObj);が出るはずだと思うのですが、、、
ちなみに先ほどはopenAndAlert() 内の
別案の件も試してみたいと思います。
わからないことがあったら
またご質問させていただけたらと思います。
リンクをクリップボードにコピー
コピー完了
>イラレが開いても何も起きない状況です
「指定のaiドキュメントは開かれたが、それから何も起こらない(アラートが出ない)」で認識は合っているでしょうか?
また、きょへさんは、どのように実行されているのでしょうか。
VSCodeからのデバッグ実行ですか? Illustratorのスクリプトフォルダに入れてメニューから実行ですか?
両方とも同じ挙動ですか?
あとは、一度アプリケーション(Illustrator)またはOSを再起動してみるとすんなり正常動作することもあります(過去にありました…)。
リンクをクリップボードにコピー
コピー完了
その認識で合っております。
私はSPAiというフリーのアプリケーションから実行しています。
イラストレーターにはアプリケーションのウィンドウがないためこちらを使用しております。
また、実際にアプリケーションに入れてメニューから実行しても同じ結果でした、、、
なるほどですね!
一度パソコンを再起動するところからやり直してみます。
ありがとうございます。
リンクをクリップボードにコピー
コピー完了
遅くなりました。
再起動かけてから起動したところ
無事にalertが出ました!!
ありがとうございます。
ajabon grinsmith様のおかげで
めちゃくちゃ助かりました(;_;)
自分の知識の無さを痛感しました、、、
こちらを元に制作していきたいと思います!
またわからないことがあったら質問させていただけたらと思います。
本当にありがとうございました。
リンクをクリップボードにコピー
コピー完了
やはり再起動w
これ変数の宣言が雑だったりすると尚更、動かなかった時の状態を引っ張って、きちんと書けたのにうまく動かなかったりするので。
今回のポイントは宣言位置ですね。あとvarつけるの大事ですね。