終了

【スクリプト】選択されたオブジェクトの中からグループアイテムだけを取得したい

Community Beginner ,
Mar 10, 2022 Mar 10, 2022

リンクをクリップボードにコピー

コピー完了

javascriptでイラレのスクリプトを書きたいのですが、

選択されているオブジェクトの中からグループアイテム(入れ子含む)を取得するには、どう書いたらいいでしょうか?

 

全くの初心者なので教えていただけると幸いです。

キーワード
スクリプティング

表示

2.4K

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines

correct answers 2 件の正解

Community Expert , Mar 10, 2022 Mar 10, 2022

処理にもよりますが、多くの場合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)

 

 

こんな感じだと入れ子も確実に拾います。

投票

翻訳

翻訳
Community Expert , Mar 10, 2022 Mar 10, 2022

とりあえず初心者向けということであれば、自分がよくやっている書き方がちょうどいいかと…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

...

投票

翻訳

翻訳
Community Expert ,
Mar 10, 2022 Mar 10, 2022

リンクをクリップボードにコピー

コピー完了

処理にもよりますが、多くの場合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)

 

 

こんな感じだと入れ子も確実に拾います。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Mar 10, 2022 Mar 10, 2022

リンクをクリップボードにコピー

コピー完了

思っていた動きになりました。

gp[i].selected だけでtrueになるんですね。

gp[i].selected == true みたいな書き方して出来なかったので困ってました。

ありがとうございます。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Mar 10, 2022 Mar 10, 2022

リンクをクリップボードにコピー

コピー完了

フラグ系のプロパティというのは値自体が真偽値(boolean)ですから条件判断にそのまま利用可能です。
ドキュメントにグループを1つだけ作って選択した状態で「alert(app.activeDocument.groupItems[0].selected==true)」を実行してみるとどうですか?
また、選択を外して実行するとどうなったか確認してみるとよいでしょう。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Mar 10, 2022 Mar 10, 2022

リンクをクリップボードにコピー

コピー完了

最新

あれ、今やってみたら出来ました!

ちゃんといろいろ試して確認してみないとだめですね…

すみませんありがとうございます。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Expert ,
Mar 10, 2022 Mar 10, 2022

リンクをクリップボードにコピー

コピー完了

とりあえず初心者向けということであれば、自分がよくやっている書き方がちょうどいいかと…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)

 

おすすめしたいのは、初心者なりに、どこまでやってみたかを書いておくことです。

そうすればそのレベルに合わせて、ちょっとだけ上達できるような、わかる範囲でおさまる回答が得られるかと(たぶん…)。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines
Community Beginner ,
Mar 10, 2022 Mar 10, 2022

リンクをクリップボードにコピー

コピー完了

すみません、確かに自分で作ったものも書くべきでしたよね。

次回からは気をつけます。

 

同じ結果になるのに書き方が結構違うんですね!

関数とかも勉強中なのでありがたいです。

投票

翻訳

翻訳

レポート

レポート
コミュニティガイドライン
他のユーザーへの思いやりを持ち、敬意を払いましょう。コンテンツの出典を明記し、投稿する前に内容が重複していないか検索してください。 さらに詳しく
community guidelines