終了

【JavaScript】ダイアログを表示させ、存在する全てのレイヤーをチェックボックスの選択肢にしたい

積極的な参加者 ,
Jun 08, 2022 Jun 08, 2022

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

コピー完了

お世話になっております。

 

var layer = app.activeDocument.layers;
var layerArray = [] ;

for(i=0;i<layer.length;i++){
    layerArray.push(layer[i]);
}

layerArray = layerArray;


var dialog = new Window ('dialog','レイヤー',undefined);
var num = dialog.add('checkbox',undefined,layerArray[0]);

dialog.center();
dialog.show();

 

全てのレイヤーを取得するのと、ダイアログやチェックボックスを表示させることは出来たのですが、ファイルごとにレイヤーの数も名前も違うので決まったチェックボックスの名前をつけても意味はないですよね。

 

取得したレイヤーの数だけチェックボックス生成を繰り返すんだと思うんですが、どうやって調べたらいいのかも分かりませんでした(汗)というかそもそもこれって可能なのでしょうか?

 

よろしくお願いいたします。

キーワード
スクリプティング

表示

955

翻訳

翻訳

レポート

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

correct answers 2 件の正解

Community Expert , Jun 08, 2022 Jun 08, 2022

ミニマルな構成だとこうですね。

layerオブジェクトはnameプロパティを参照しないとだめです。また、layers自体がlayerコレクションですから元々配列です。

 

var lyrs = app.activeDocument.layers;
var ck = [];
var w = new Window("palette");
for (var i=lyrs.length-1;i>=0;i--) ck[i] = w.add('checkbox', undefined, lyrs[i].name);
w.show();

 

ボタンを付けてませんが、submitボタンを配置したとして、クリックしたときのonClickイベントでck配列を参照して各要素のvalueを見れはチェックボックスのステートは確認できます。

投票

翻訳

翻訳
Community Expert , Jun 08, 2022 Jun 08, 2022

Ten Aさんと別進行で添削しますが、
ボタンのとこ

for(j = 0; j < checkboxes.length; j++) {
    (function (j) {
        dialog.okBtn.onClick = function () {
            if(checkboxes[j].checked = true){
                alert(chkNames[j]);
            }
        };
    })(j);
}

 だとボタンクリックイベントを何回も上書き定義してしまうことになるので、

変数 j のループで最後に定義したもの(一番最後のチェックボックス)だけ処理対象となる、

という理屈です。

 

OKボタンを押したらチェックのついたレイヤー名を順々にアラートする、だと

dialog.okBtn.onClick = function () {
    for(j = 0; j < checkboxes.length; j++) {
       if(checkboxes[j].checked = tr
...

投票

翻訳

翻訳
Community Expert ,
Jun 08, 2022 Jun 08, 2022

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

コピー完了

automatic layoutで行ける範囲ならforループでチェックボックスを生成してOKボタンクリック時に各チェックボックスの状態を調べれば良いかな?

投票

翻訳

翻訳

レポート

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

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

コピー完了

ありがとうございます。

 

やってみたんですが、何を選択しても生成された一番最後のチェックボックスだけ結果に表示されてしまいました・・・。

 

var layer = app.activeDocument.layers;
var layerArray = [] ;
var checkboxes = [] ;
var chkNames = [] ;

for(i=0;i<layer.length;i++){
    layerArray.push(layer[i]);
}

layerArray = layerArray;


var dialog = new Window ('dialog','レイヤー',undefined);


for(n=0;n<layerArray.length;n++){
    chkNames[n] = layerArray[n];
    checkboxes[n] = dialog.add('checkbox',undefined,layerArray[n]);
}

dialog.okBtn = dialog.add('button', undefined, 'OK');

for(j = 0; j < checkboxes.length; j++) {
    (function (j) {
        dialog.okBtn.onClick = function () {
            if(checkboxes[j].checked = true){
                alert(chkNames[j]);
            }
        };
    })(j);
}

dialog.center();
dialog.show();

 

 

投票

翻訳

翻訳

レポート

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

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

コピー完了

Ten Aさんと別進行で添削しますが、
ボタンのとこ

for(j = 0; j < checkboxes.length; j++) {
    (function (j) {
        dialog.okBtn.onClick = function () {
            if(checkboxes[j].checked = true){
                alert(chkNames[j]);
            }
        };
    })(j);
}

 だとボタンクリックイベントを何回も上書き定義してしまうことになるので、

変数 j のループで最後に定義したもの(一番最後のチェックボックス)だけ処理対象となる、

という理屈です。

 

OKボタンを押したらチェックのついたレイヤー名を順々にアラートする、だと

dialog.okBtn.onClick = function () {
    for(j = 0; j < checkboxes.length; j++) {
       if(checkboxes[j].checked = true){
           alert(chkNames[j]);
       }
    };
}

 で妥当かと思います。

 

処理がこんがらがらないよう、自身でわかりやすくコメントを書いて整理していくといいです。

これは今回のように人にコードを見せる時にも大変有用なのでぜひやってください。

投票

翻訳

翻訳

レポート

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

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

コピー完了

ありがとうございます。

上書きする度に次のレイヤーが処理対象になってたんですね・・。

教えていただいたコードでやってみたらちゃんと動きました。

 

これからはコメント書いて整理しながら進めるようにします!

投票

翻訳

翻訳

レポート

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

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

コピー完了

ミニマルな構成だとこうですね。

layerオブジェクトはnameプロパティを参照しないとだめです。また、layers自体がlayerコレクションですから元々配列です。

 

var lyrs = app.activeDocument.layers;
var ck = [];
var w = new Window("palette");
for (var i=lyrs.length-1;i>=0;i--) ck[i] = w.add('checkbox', undefined, lyrs[i].name);
w.show();

 

ボタンを付けてませんが、submitボタンを配置したとして、クリックしたときのonClickイベントでck配列を参照して各要素のvalueを見れはチェックボックスのステートは確認できます。

投票

翻訳

翻訳

レポート

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

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

コピー完了

最新

配列を配列にしてたんですね(汗)

 

教えていただいたのを利用しながら作ってみます。

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

投票

翻訳

翻訳

レポート

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