■default ---■fontsize --70% --80% --100% --120% --140% --- --■scroll_switch

illustrator javascript 選択が遅い問題

illustrator javascript 選択が遅い問題

illustrator をjavascriptで動かす上で一番ネックなのが、グループ化された中のオブジェクトの扱いです。
色とか変えようとしても、pageItemsは一階層目のオブジェクトしか指定できないので、グループ化の中のオブジェクトを指定するには回帰的な関数呼び出しで深く掘っていかないといけません。
でもこれはやればできるので、そうします。
グループ化を制するものはイラストレーターscriptを制します。
あと、バグってわけではないと思いますが、ひっかかり安い点が
・グループ化は100ネストするとそれ以降の子階層は消滅する。エラーとか出ない。
・オブジェクトネームが長すぎると消滅する。エラーとか出ない。
(オブジェクトネームなんて普段付けないですが、script上で付けたりなんかすると勝手に長くなってる場合がある。たぶん255文字とかだと思う。)
----------------
あんまりマニュアルみたいなのが無いし、ブログとかで説明してくれている人もいません。
マイナーなのでしょうか。超便利だと思うんですがillustrator javascript 。

そいで、これも探しても出てこなかったので、記録しておきます。
なんか前にも同じこと書いた記憶があるのですが、検索しても見つからないんで。
たくさん選択しようとすると、すげー時間がかかる問題。
プログラム上の選択ではなくて「選択状態」にする選択です。
例えば、パスアイテムだけ選択しようとすると
var ar = [].slice.call(activeDocument.pathItems);
for (var i in ar){ar[i].selected = true;}
こんな感じだと思います。

この時パスアイテムが1万個くらいあると、マジフリーズしたんじゃないかってくらい時間がかかります。
まあ、休憩だからタバコでも吸ってこよう、っつて10分位して戻ってくると選択はされてます。
で、間違えてクリックして選択解除されて、パソコンがかわいそうになります。

同じような処理で1万個のパスの色を変えるとかはなぜか速いです。
大きさ変えたり、少しくらい複雑な処理例えばpoint一個だけ動かすとかも割りと早いです。
ところが選択だけ恐ろしく遅い。
選択されるとハイライトされるのでその描写に時間がかかっているのかと思うのですが、
色変え処理をリドローしても全然時間かかんないし。
app.activeDocument.selection;とかに登録するのに時間がかかっているのでしょうか、知りませんけど。

解決法は
■一回グループ化してから選択する。してからグループ解除する。
(ただし、Z軸が前面になってしまう)
ソースを載せたいのですが、なんか余計なもんがいっぱい付いてるのしかないので、一部分だけ。

object_ar = 選択したいやつら;
var self = activeDocument.activeLayer.groupItems.add();// 臨時の器
var parent_homes= [];//故郷の場所をめもっておくところ;
//グルーパー 元いた場所の情報を取りつつ
for(var i in object_ar ){
parent_homes [i] = object_ar[i].parent ;
object_ar[i].move(self ,ElementPlacement.PLACEATEND);
}
self.selected = true;
/////////////////////////////////////////////////////////////
//group解除
for(var i in object_ar ){object_ar[i].move(parent_homes[i] ,ElementPlacement.PLACEATBEGINNING );}
self .remove();//↑本当はcollectionの順番をひっくり返す必要有り
/////////////////////////////////////////////////////////////
こんな感じです。
グループ解除しても選択解除されません。
これだと1万個くらいあっても3秒くらいで選択できます。
ただ問題は、(ただし、Z軸が前面になってしまう)ってところで、破壊的なので使えない場合も有ります。
肝は
var parent_homes = []; 故郷の場所をめもっておくところ;
で、これによって、グループ解除した時に元いた場所に戻す事ができます。
自分自身に独自のpropertyをつくって埋め込んでもいいのですが、途中でなんか処理とかしたり、集計処理とか入れようとする場合は分離させておいたほうが良いと思います。
ただし、イラストレーターの場合、オブジェクトの上下の順番のインデックスがはっきり書いてないので、故郷は分かるのですが、前の地位が分かりません。
なので戻した時に上から順番に並べられてしまいます。
やろうと思えば、グループ内の地位をメモッてから移動もできるのですが、そうするとおそくなるのであんましいみありません。

オブジェクトのレイヤー間の移動や、document間の移動も一度グループ化させることによって1000倍くらい早くなります。
スポンサーサイト
ブログ内検索ワード
マジック / フラリッシュ / デザイン / ~のコツ / プログラム関連 /