リンクをクリップボードにコピー
コピー完了
javascriptでイラレのスクリプトを書きたいのですが、
選択されているオブジェクトの中からグループアイテム(入れ子含む)を取得するには、どう書いたらいいでしょうか?
全くの初心者なので教えていただけると幸いです。
処理にもよりますが、多くの場合selectionコレクションを操作するよりdocument配下のgroupItemsコレクションからselectedプロパティがtrueのものを抜き出す方が操作しやすくなるでしょう。
var tg = [];
var gp = app.activeDocument.groupItems;
for (var i=0;i<gp.length;i++) if(gp[i].selected)tg.push(gp[i])
alert(tg)
こんな感じだと入れ子も確実に拾います。
とりあえず初心者向けということであれば、自分がよくやっている書き方がちょうどいいかと…w
再帰処理ともちょっと違う感じですが。
var sel = app.activeDocument.selection; //選択オブジェクト配列
var groups = []; //見つけたグループをためておく空配列を宣言
getGroups(sel); //グループ取得の関数
alert(groups.length + "こ!"); //取得したグループの個数を叫ぶ
function getGroups(obj){ //例の関数
for(var i = 0; i < obj.length; i++){ //ループ
if(obj[i].reflect.name == "GroupItem"){
groups.push(obj[i]); //配列へ追加
getGroups(obj[i].pageItems); //グループの中身でまた関数
}
}
}
上記では、GroupI
...リンクをクリップボードにコピー
コピー完了
処理にもよりますが、多くの場合selectionコレクションを操作するよりdocument配下のgroupItemsコレクションからselectedプロパティがtrueのものを抜き出す方が操作しやすくなるでしょう。
var tg = [];
var gp = app.activeDocument.groupItems;
for (var i=0;i<gp.length;i++) if(gp[i].selected)tg.push(gp[i])
alert(tg)
こんな感じだと入れ子も確実に拾います。
リンクをクリップボードにコピー
コピー完了
思っていた動きになりました。
gp[i].selected だけでtrueになるんですね。
gp[i].selected == true みたいな書き方して出来なかったので困ってました。
ありがとうございます。
リンクをクリップボードにコピー
コピー完了
フラグ系のプロパティというのは値自体が真偽値(boolean)ですから条件判断にそのまま利用可能です。
ドキュメントにグループを1つだけ作って選択した状態で「alert(app.activeDocument.groupItems[0].selected==true)」を実行してみるとどうですか?
また、選択を外して実行するとどうなったか確認してみるとよいでしょう。
リンクをクリップボードにコピー
コピー完了
あれ、今やってみたら出来ました!
ちゃんといろいろ試して確認してみないとだめですね…
すみませんありがとうございます。
リンクをクリップボードにコピー
コピー完了
とりあえず初心者向けということであれば、自分がよくやっている書き方がちょうどいいかと…w
再帰処理ともちょっと違う感じですが。
var sel = app.activeDocument.selection; //選択オブジェクト配列
var groups = []; //見つけたグループをためておく空配列を宣言
getGroups(sel); //グループ取得の関数
alert(groups.length + "こ!"); //取得したグループの個数を叫ぶ
function getGroups(obj){ //例の関数
for(var i = 0; i < obj.length; i++){ //ループ
if(obj[i].reflect.name == "GroupItem"){
groups.push(obj[i]); //配列へ追加
getGroups(obj[i].pageItems); //グループの中身でまた関数
}
}
}
上記では、GroupItemのPageItemsコレクションとSelection配列とを、ひとつの関数を使いまわしてループ処理しています。
実際、Ten A先生の示されるとおりのアプローチのほうがスマートだと思います。(たぶんgroupsではなくgroupItemsコレクションですw)
おすすめしたいのは、初心者なりに、どこまでやってみたかを書いておくことです。
そうすればそのレベルに合わせて、ちょっとだけ上達できるような、わかる範囲でおさまる回答が得られるかと(たぶん…)。
リンクをクリップボードにコピー
コピー完了
すみません、確かに自分で作ったものも書くべきでしたよね。
次回からは気をつけます。
同じ結果になるのに書き方が結構違うんですね!
関数とかも勉強中なのでありがたいです。