リンクをクリップボードにコピー
コピー完了
お世話になっております。
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();
全てのレイヤーを取得するのと、ダイアログやチェックボックスを表示させることは出来たのですが、ファイルごとにレイヤーの数も名前も違うので決まったチェックボックスの名前をつけても意味はないですよね。
取得したレイヤーの数だけチェックボックス生成を繰り返すんだと思うんですが、どうやって調べたらいいのかも分かりませんでした(汗)というかそもそもこれって可能なのでしょうか?
よろしくお願いいたします。
ミニマルな構成だとこうですね。
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を見れはチェックボックスのステートは確認できます。
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
...
リンクをクリップボードにコピー
コピー完了
automatic layoutで行ける範囲ならforループでチェックボックスを生成してOKボタンクリック時に各チェックボックスの状態を調べれば良いかな?
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
やってみたんですが、何を選択しても生成された一番最後のチェックボックスだけ結果に表示されてしまいました・・・。
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();
リンクをクリップボードにコピー
コピー完了
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]);
}
};
}
で妥当かと思います。
処理がこんがらがらないよう、自身でわかりやすくコメントを書いて整理していくといいです。
これは今回のように人にコードを見せる時にも大変有用なのでぜひやってください。
リンクをクリップボードにコピー
コピー完了
ありがとうございます。
上書きする度に次のレイヤーが処理対象になってたんですね・・。
教えていただいたコードでやってみたらちゃんと動きました。
これからはコメント書いて整理しながら進めるようにします!
リンクをクリップボードにコピー
コピー完了
ミニマルな構成だとこうですね。
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を見れはチェックボックスのステートは確認できます。
リンクをクリップボードにコピー
コピー完了
配列を配列にしてたんですね(汗)
教えていただいたのを利用しながら作ってみます。
ありがとうございました。