1 返信 最新の回答 日時: Feb 17, 2012 3:59 AM ユーザー:Ogu.ixa

    InDesignのJavaScriptにて選択しているレイヤーを取得したい

    Ogu.ixa

      Mac OS X バージョン10.5.8

      InDesignCS3を使っています。

       

      仕事の中でレイヤー数が50を超える事があるのですが

      必要なレイヤーだけを表示・非表示にするのに手作業ですると

      誤ったレイヤーを表示してしまったり手間になったりするので

      作業中にレイヤーパネルの中で選択しているレイヤーだけを

      表示・非表示させたいと考えています。

       

      ・手動で必要なレイヤーのみを選択

      ・選択されているレイヤーのみ表示・非表示

      の手順で動く簡単なスクリプトを書きました。

       

      そこでつまずいてしまったのが

      「レイヤーパネルの中で選択しているレイヤーを取得」です。

       

      InDesign上で何かしらのアイテムを選択した状態なら

      app.activeDocument.selection

      の値からさかのぼって選択しているレイヤーを取得する事ができたのですが

      これだとアイテムは選択していないけど手動で必要なレイヤーだけを

      選択した場合に対応できませんでした。

       

      次に

      app.activeDocument.activeLayer

      でレイヤーを取得しようとしたのですが

      ペンマークが付いているレイヤーしか取得できませんでした。

       

      レイヤーパネルの中で選択しているレイヤーのみを取得する事は可能でしょうか?

      取得する方法をご存じの方がいましたらご教授ください。

        • 1. Re: InDesignのJavaScriptにて選択しているレイヤーを取得したい
          Ogu.ixa Level 1

          自己解決です。

          きれいな形ではないですがもがきにもがき

          何とか自分の求めていた物が取得できました。

           

          選択しているレイヤーの名前を取得するスクリプトです。

          書いたままを転記いたしますので

          おかしな所があれば添削をよろしくお願いいたします。

           

           

          //---------- 基本設定 ----------//

          var myDoc = app.activeDocument;

          var layer = myDoc.layers;

           

          //---------- 統合前のレイヤー名をリストに収める ----------//

          BeforeLayerNameArray = new Array;

          for(laylen=0 ; laylen<layer.length ; laylen++){

              BeforeLayerNameArray.push(layer[laylen].name);

          }

           

          //---------- レイヤー統合 ----------//

          //※1・・・なぜか"invoke()"がエラーになってしまうので"try"で逃げる。

          var KeyString = app.menuActions.item('$ID/Merge Layers');

          try{

              KeyString.invoke();

          }catch(e1){

          }

           

          //---------- 統合後のレイヤー名をリストに収める ----------//

          AfterLayerNameArray = new Array;

          for(laylen=0 ; laylen<layer.length ; laylen++){

              AfterLayerNameArray.push(layer[laylen].name);

          }

           

          //---------- 統合前と統合後のリストを比べて選択されていたレイヤーを特定する ----------//

          getMyLayerText = "あなたが選択しているレイヤーは "

          getSelLayerIndex = new Array  //選択していたレイヤーの"index"リスト  //後で表示,非表示の時に使うリスト

          if(BeforeLayerNameArray.length == AfterLayerNameArray.length){

              //変化なし。選択されていたのはアクティブレイヤーのみ

              getMyLayerText += myDoc.activeLayer.name + " です。"

              getSelLayerIndex.push(myDoc.activeLayer.index)

          }else{

              //変化あり。統合前のリストから消えているレイヤーが選択されていた物

              getActiveLayerName = myDoc.activeLayer.name  //統合後のアクティブレイヤーも実行前に選択されていた物

              getMyLayerText += "\n"

              for(blnlen=0 ; blnlen<BeforeLayerNameArray.length ; blnlen++){

                  BeforeLayerName = BeforeLayerNameArray[blnlen]

                  if(includesCheck(AfterLayerNameArray,BeforeLayerName) || getActiveLayerName == BeforeLayerName){

                      getMyLayerText += BeforeLayerName+","

                      getSelLayerIndex.push(blnlen)

                  }

              }

              getMyLayerText = getMyLayerText.replace(/,$/,"\nです。")

              myDoc.undo();  //統合前の状態に戻す

          }

           

          alert(getMyLayerText);

           

          //*****************************************************************

          //リストと要素のチェック  //listの中にwordが含まれていたらfalseを返す

          //*****************************************************************

          function includesCheck(list,word){

              for(lislen=0 ; lislen<list.length ; lislen++){

                  if(word == list[lislen]){

                      return false;

                  }

              }

              return true;

          }