Skip to main content
Participant
June 29, 2017
Answered

重ね順をjavascriptで制御したい

  • June 29, 2017
  • 2 replies
  • 2803 views

初めて相談させていただきます。

現在Windows 10にてIllustrator CC 2017を使用しています。

表題の通りIllustratorで重ね順をjavascriptで制御したいと考えています。

具体的には「複数個あるオブジェクトをy座標の高い順に重ね順を変更する」ということをしたいです。

オブジェクトの数が20~30個ほどあるのでjavascriptでやるつもりでしたが、もしillustratorの機能で楽にやる方法がありましたらそちらでも構いません。こちらのプログラミング、ないし操作手順などはどのようにすればいいでしょうか。

日本語のサイトや海外のフォーラムも覗いてみましたがやり方がどうしてもわからず...

どうもソートのアルゴリズムが必要らしいことまではわかったのですが...

皆様のお力添えをお願いいたします。

This topic has been closed for replies.
Correct answer monokano

ソートとmoveを分けてみました。どうでしょうか。

(JSは普段あまり書いていないので、変なところがあったらご容赦ください)

#target "Illustrator"

var sel= app.activeDocument.selection;

//selをバブルソートする

for(var i = 0; i < sel.length-1; i++){

   for(var j = sel.length-1; j>i; j-- ){

      if(sel.visibleBounds[3]<sel[j-1].visibleBounds[3]){

         var tmp = sel;

         sel = sel[j-1];

         sel[j-1] =tmp;

      }

   }

}

//ソートしたselでmoveを実行する

for(var k = 0; k<sel.length-1; k++){

    sel[k+1].move(sel, ElementPlacement.PLACEAFTER);

}

----------

追記:

バブルソートはかなり遅いので、Yamonovさんのようにsort関数を使った方がいいですね。

//selを昇順ソートする

sel.sort (function(a,b){

    if(a.visibleBounds[3] < b.visibleBounds[3]) return -1;

    if(a.visibleBounds[3] > b.visibleBounds[3]) return 1;

    return 0;

});

2 replies

Yamonov
Legend
July 2, 2017

こうかな………

myObj=app.activeDocument.pathItems;

myCbj=[];

myObjlength=myObj.length;

for (var i=0;i<myObjlength;i++){

    myCbj.push(myObj);}

myCbj.sort(function(a,b){

    if(a.visibleBounds[3]<b.visibleBounds[3]) return -1;

    if(a.visibleBounds[3] > b.visibleBounds[3]) return 1;

    return 0;

});

activeDocument.selection=null;

for (var i=0;i<myObjlength;i++){

myCbj.move(activeDocument.activeLayer,ElementPlacement.PLACEATEND);

}

--Yamonov
monokano
Community Expert
Community Expert
June 29, 2017

ご自分でいろいろ試しているわけですよね。

そのコードを晒した方が返答が付きやすくなると思いますよ。

Participant
July 2, 2017

ありがとうございます。

それではコードを晒します。

現状としては縦に複数個並べたオブジェクトの順番を一回ずつ入れ替えができるが、並び順がぐちゃぐちゃならその分だけスクリプトを実行する必要がある状態です。

ソートのアルゴリズムはバブルソートを使っています。

#target illustrator

var sel= app.activeDocument.selection;

for(var i = 0; i < sel.length-1; i++){

    for(var j = sel.length-1; j>i ; j-- ){

        if(sel.visibleBounds[3]<sel[j-1].visibleBounds[3]){

             $.writeln(sel.visibleBounds[3]);

           sel.move(app.activeDocument.selection[j-1],ElementPlacement.PLACEBEFORE);

        

        }

    }

}

monokano
Community Expert
monokanoCommunity ExpertCorrect answer
Community Expert
July 2, 2017

ソートとmoveを分けてみました。どうでしょうか。

(JSは普段あまり書いていないので、変なところがあったらご容赦ください)

#target "Illustrator"

var sel= app.activeDocument.selection;

//selをバブルソートする

for(var i = 0; i < sel.length-1; i++){

   for(var j = sel.length-1; j>i; j-- ){

      if(sel.visibleBounds[3]<sel[j-1].visibleBounds[3]){

         var tmp = sel;

         sel = sel[j-1];

         sel[j-1] =tmp;

      }

   }

}

//ソートしたselでmoveを実行する

for(var k = 0; k<sel.length-1; k++){

    sel[k+1].move(sel, ElementPlacement.PLACEAFTER);

}

----------

追記:

バブルソートはかなり遅いので、Yamonovさんのようにsort関数を使った方がいいですね。

//selを昇順ソートする

sel.sort (function(a,b){

    if(a.visibleBounds[3] < b.visibleBounds[3]) return -1;

    if(a.visibleBounds[3] > b.visibleBounds[3]) return 1;

    return 0;

});