Skip to main content
Participant
September 16, 2024
解決済み

特定の名称が入ったレイヤーのみを表示して書き出すスクリプトをネスト少な目で作成したい

  • September 16, 2024
  • 返信数 1.
  • 420 ビュー
特定の名称が入ったレイヤーのみを表示して書き出すスクリプトを制作中なのですが、どうしてもループが2重、3重になってしまいます。
うまい解決方法はございますでしょうか?


レイヤーセットが「レイヤーセット→レイヤー」のように1層ならなんとか作れたのですが、「レイヤーセット→レイヤーセット→レイヤー」のように2層となると
可読性が著しく悪く素人目にもよくないものになってしまって……。

具体的には線画と影色を分けて書き出したいと考えております。

ご教示いただけると助かります。

【レイヤーセット1層の例】
レイヤーセット「人物」→レイヤー「影」

【レイヤーセット2層の例】
レイヤーセット「人物」→レイヤーセット「太郎くん」→レイヤー「影」


下記は1層の場合のコード例です。
 

 

//レイヤーセット名がキー、レイヤー名がバリューとなる連想配列を作成する
function get_asso_layersets_list(){
    var layersets_list = [];
    var tmp_list = [];
    var associative_list = {};
    var layer_name = "";
    for(var i=0; i < document.layerSets.length; i++){
        layersets_list.push(document.layerSets[i].name);
        for(var j=0; j < document.layerSets[i].artLayers.length;j++){
            layer_name = document.layerSets[i].artLayers[j].name;
            tmp_list.push(layer_name);
        }
        associative_list[layersets_list[i]] = tmp_list;
        tmp_list = [];
    }
    return associative_list;
}

//get_asso_layersets_listで取得した配列から「影」レイヤーを含まないレイヤーセットを削除する
function get_shadow_layersets_list(){
    var asso_list = get_asso_layersets_list();
    var layer_name = "";
    for(key in asso_list){
        layer_name = asso_list[key].toString();   
        if(layer_name.indexOf("影") == -1){
            delete asso_list[key];
        }
    }
    return asso_list;
}

//「影」レイヤーを書き出す
function save_shadow_files(){
    var layerset_list = get_shadow_layersets_list();
    var raw_filename = get_filename(); //psdファイル名を取得する関数
    var l_file_name = get_layersets_filename_list(); // 影をshadowのようにファイル名用の名前に変える関数
    var save_file_name = "";
    //一回すべてのレイヤーを非表示にする
    for(key in layerset_list){
        document.layerSets[key].visible = false;
        for(var i =0; i < layerset_list[key].length;i++){
            document.layerSets[key].artLayers[layerset_list[key][i]].visible = false;
        }
    }
    //書き出す
    for(key in layerset_list){
         for(var i =0; i < layerset_list[key].length;i++){
             document.layerSets[key].visible = true;
             document.layerSets[key].artLayers[layerset_list[key][i]].visible = true;
             save_file_name = raw_filename +"_" + key + (i+1) + "_"+ l_file_name[key][i];
             save_tga(save_file_name); //tga ファイルで書き出す関数
             document.layerSets[key].artLayers[layerset_list[key][i]].visible = false;
        }
        document.layerSets[key].visible = false;
    }
}

 

解決に役立った回答 ajabon grinsmith

斜め読みですが、関数 

get_asso_layersets_list()

に再帰的要素が見当たらないのが原因かな、という所見です。

 スマホからなので適当コードですが

function hoge(レイヤー配列){
  for(i in レイヤー配列){
    if(レイヤー配列[i].種類==レイヤーセット){
      hoge(レイヤー配列[i].layers);
    }
  }
}

みたいな仕組みが必要かと思います。

きれいにcallee()を使ってもいいし、上記のようにしてもどっちでも。

返信数 1

ajabon grinsmith
Community Expert
Community Expert
September 16, 2024

斜め読みですが、関数 

get_asso_layersets_list()

に再帰的要素が見当たらないのが原因かな、という所見です。

 スマホからなので適当コードですが

function hoge(レイヤー配列){
  for(i in レイヤー配列){
    if(レイヤー配列[i].種類==レイヤーセット){
      hoge(レイヤー配列[i].layers);
    }
  }
}

みたいな仕組みが必要かと思います。

きれいにcallee()を使ってもいいし、上記のようにしてもどっちでも。

Sakky0206作成者
Participant
September 18, 2024

返信ありがとうございます。再帰的というのは思いつかなかったので早速試してみます。