終了

new Windowで作ったウインドウを閉じずに関数を動かしたい

New Here ,
Aug 28, 2023 Aug 28, 2023

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

コピー完了

初めて投稿します。
illustrator スクリプトも独学で初めて日が浅く、知識不足でお見苦しい点があったら申し訳ありません。
こちらしか頼れる場所がなく、投稿させていただきます。
 
【環境】
OS→Mac OS 13.4.1
実行するソフト→Adobe Illustartor 2023(27.8.1)
言語→JSX
 
【困っていること】
new Windowで作ったウインドウ内のボタンから、ウインドウを閉じずに関数を動かしたいです。
 
【現状】
◯new Window("dialog" を指定した場合→
ボタン1を押すと、alert( "ロック解除が終わりました" );が先に出て、ウインドウを閉じないとfunction allnolock()の処理が始まらない
 
new Window("palette"か"window" を指定した場合→
ボタン1を押しても何も動かない。(アラートも出ない)
 
【現状のコード】
//ターゲットエンジン指定(←を入れないとdialog以外のウインドウが開かない?)
#target "illustrator"
#targetengine 'nyuko'

// ダイアログ作成
var objDlg = new Window("window", "入稿チェックリスト", [0,0,400,600]);
 
// 固定テキスト
var objStText01 = objDlg.add("statictext", [20,20,300,40], "上から順にチェックする");
 
//ボタン
var button1= objDlg.add("button", [20, 40, 350, 55], "ボタン1");
var button2= objDlg.add("button", [20, 60, 350, 80], "ボタン2");

//イベント
button1.onClick = function allnolock()
{var allLayer= app.activeDocument.layers;
//全てのレイヤーをロック解除
try{
for(var i=0; i<allLayer.length; i++){
if(allLayer[i].locked=false)
{allLayer[i].locked=true;}
}}
catch(e){;}
 
//すべてのアイテムをロック解除
var pitems = app.activeDocument.pageItems;
for(var i=0; i<pitems.length; i++)
{if(pitems[i].locked=false)
{pitems[i].locked=true;}}

alert( "ロック解除が終わりました" );
}
 
//目視チェック項目(塗り足しや情報の正誤など)
var Chkbox01= objDlg.add("checkbox", [20, 90, 350, 110], "目視チェック項目1");
var Chkbox02= objDlg.add("checkbox", [20, 120, 350, 140], "目視チェック項目2");
var Chkbox03= objDlg.add("checkbox", [20, 150, 350, 170], "目視チェック項目3");
//チェックボックスが10個ほど並ぶ

objDlg.add("button", [350, 450, 400, 480], "閉じる", {name:"cancel"});

// ダイアログ表示
objDlg.show();
objDlg.center();
 
 
以上です。
お知恵をおかりできますと幸いです。
 

【やろうとしていること(補足)】
◯Illustrator内で使える入稿データ制作補助スクリプトを作ろうと考えています。
◯様々な習熟度のデザイナーが使用するので、極力シンプルに、上から順にチェックするだけで、時間のない中でも比較的ミスの少ない入稿データを制作することを目的としています。
◯入稿データ制作に役立つ関数が、ボタンで起動できる。
◯関数の内容は全てのロック解除や不要なスウォッチや特色の破棄、塗り足しを見やすくするオブジェクト自動生成などの、さまざまな自動処理。(アクションやショートカットへの理解が浅いオペレーターの使用も視野に入れているため)
◯目視でしかチェックできない項目はチェックボックスを置きます。
◯添付スクショのようなイメージです
◯全ての項目をチェックし終わったら、手動でウインドウを閉じる流れにしたいです。
 
キーワード
スクリプティング

表示

214

翻訳

翻訳

レポート

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

correct answers 3 件の正解

Community Expert , Aug 29, 2023 Aug 29, 2023
new Windowの第一引数をpaletteに変更するとフローティングパレットしてパネルを表示可能ですが、Illustratorから関数呼び出しにはBridgeTalkを使わないとだめかも知れません。
パネルとして操作したいのであればExtendScriptだけでなくCEPのドッカブルなパネルを作成するのがスマートかと思います。

投票

翻訳

翻訳
Community Expert , Aug 29, 2023 Aug 29, 2023

//ターゲットエンジン指定(←を入れないとdialog以外のウインドウが開かない?)

ですです。

Ten Aさんの言われている通りです。ハンドラ関数をBridgeTalk経由でIllustratorに送らないと動きません。

自分も相当だるい思いをした経験あります。

 

var bt = new BridgeTalk();
bt.target = "illustrator";
bt.body = "alert('hoge');";
bt.send();

 

 というのがシンプルな例ですが、bodyは文字列で送る必要があり、メンテナンス性がよくないです。

そこで関数全体をuneval()で括る手段にみんなで飛びつきました。

 

var bt = new BridgeTalk();
bt.target = "illustrator";
bt.body = uneval(alertFunc) + "(" + "hoge".toSource() + ");";
bt.send();

function alertFunc(mes){
    alert(mes);
}

 

完了アラートは上記

...

投票

翻訳

翻訳
参加者 , Aug 29, 2023 Aug 29, 2023

いろいろ書き方はあると思うのですが、
個人的なおすすめの、palette使ったスクリプトの書き方です。
・ターゲットエンジンはmain
・1つだけ、ユニークな名前のグローバル変数でオブジェクト作る
・そのオブジェクトの中に関数とかパラメータを埋め込む
・メインの処理は(function (){…})();で囲む
・BridgeTalkのbodyは"オブジェクト名.関数名();"だけにする
・BridgeTalkのtargetは"illustrator"じゃなくBridgeTalk.appSpecifier

 

#targetengine "main"
var nankaKakkoiiNamae={};
(function (){
    var w1=new Window("palette");
    var b1=w1.add("button",undefined,"ボタン1");
    b1.onClick=function(){
        var bt=new BridgeTalk;
        bt.target = BridgeTalk.appSpecifier;
       
...

投票

翻訳

翻訳
Community Expert ,
Aug 29, 2023 Aug 29, 2023

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

コピー完了

new Windowの第一引数をpaletteに変更するとフローティングパレットしてパネルを表示可能ですが、Illustratorから関数呼び出しにはBridgeTalkを使わないとだめかも知れません。
パネルとして操作したいのであればExtendScriptだけでなくCEPのドッカブルなパネルを作成するのがスマートかと思います。

投票

翻訳

翻訳

レポート

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

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

コピー完了

ご回答ありがとうございます!

BridgeTalkを使って、無事解決いたしました。

CEPというものもあるのですね。カスタマイズ性が高そうでとても便利そうです...!勉強してみます。

投票

翻訳

翻訳

レポート

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

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

コピー完了

//ターゲットエンジン指定(←を入れないとdialog以外のウインドウが開かない?)

ですです。

Ten Aさんの言われている通りです。ハンドラ関数をBridgeTalk経由でIllustratorに送らないと動きません。

自分も相当だるい思いをした経験あります。

 

var bt = new BridgeTalk();
bt.target = "illustrator";
bt.body = "alert('hoge');";
bt.send();

 

 というのがシンプルな例ですが、bodyは文字列で送る必要があり、メンテナンス性がよくないです。

そこで関数全体をuneval()で括る手段にみんなで飛びつきました。

 

var bt = new BridgeTalk();
bt.target = "illustrator";
bt.body = uneval(alertFunc) + "(" + "hoge".toSource() + ");";
bt.send();

function alertFunc(mes){
    alert(mes);
}

 

完了アラートは上記の関数内に入れてしまえば処理後に普通に出るですが、

アラート後さらに何かしたい場合は、BridgeTalkの戻りをつかまえる必要があります。

 

var bt = new BridgeTalk();
bt.target = "illustrator";
bt.body = uneval(alertFunc) + "(" + "hoge".toSource() + ");";
bt.onResult = function(res){
    button1.text = res.body;
}
bt.send();

function alertFunc(mes){
    alert(mes);
    return "おわった".toSource();
}

 

CEPは本当におすすめなんですが、証明書の発行などを的確にやらないとユーザーにデバッグモードでの使用を強いることになったりと、それなりにハードルはあります。CC2014以前では動かないなども(それはもういいか…)。

投票

翻訳

翻訳

レポート

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

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

コピー完了

ご回答ありがとうございます!

コードの見本まで付けてくださり助かります。参考にさせていただきます。

BridgeTalkもunevalも使ったことがなかったのですが、IllustratorでIllustratorに関数を送る(?)には少し込み入った手順を踏む必要があるのですね。

CEPも便利そうなので勉強してみます...!!(まずはWebの知識から...)

投票

翻訳

翻訳

レポート

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

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

コピー完了

いろいろ書き方はあると思うのですが、
個人的なおすすめの、palette使ったスクリプトの書き方です。
・ターゲットエンジンはmain
・1つだけ、ユニークな名前のグローバル変数でオブジェクト作る
・そのオブジェクトの中に関数とかパラメータを埋め込む
・メインの処理は(function (){…})();で囲む
・BridgeTalkのbodyは"オブジェクト名.関数名();"だけにする
・BridgeTalkのtargetは"illustrator"じゃなくBridgeTalk.appSpecifier

 

#targetengine "main"
var nankaKakkoiiNamae={};
(function (){
    var w1=new Window("palette");
    var b1=w1.add("button",undefined,"ボタン1");
    b1.onClick=function(){
        var bt=new BridgeTalk;
        bt.target = BridgeTalk.appSpecifier;
        bt.body = "nankaKakkoiiNamae.func1();", 
        bt.send();
    }
    var cb1=w1.add("checkbox",undefined, "チェック項目1");
    cb1.value=nankaKakkoiiNamae.check1=false;
    cb1.onClick=function(){
        nankaKakkoiiNamae.check1=cb1.value;
    }
    nankaKakkoiiNamae.func1=function(){
        alert("チェック項目1は"+(nankaKakkoiiNamae.check1?"ON":"OFF")+"です");
    }
    w1.show();
})();

投票

翻訳

翻訳

レポート

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

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

コピー完了

ご回答ありがとうございます!

見本で貼ってくださったコードを参考にさせていただいて、

シンプルに記述でき、目的の関数も動かすことができました。

 

投票

翻訳

翻訳

レポート

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

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

コピー完了

最新

自分のブログに解説を少し書いてみましたので、ご参考にしていただければ幸いです。

https://sppy.stars.ne.jp/blog/924

投票

翻訳

翻訳

レポート

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