Skip to main content
Inspiring
March 9, 2022
Answered

Illustratorスクリプト:グループ解除した後、更に特定のオブジェクトを選択したい

  • March 9, 2022
  • 3 replies
  • 1696 views

いつもお世話になっております。

 

選択したオブジェクトを全てグループ解除・クリッピングマスク解除するスクリプトを作ってみたところ、思っていたような結果になりました。

 

var SEL = activeDocument.selection ;

for(i=0; i < SEL.length ; i++){
    if(SEL[i].constructor.name === 'GroupItem'){
    if(SEL[i].clipped){
            app.executeMenuCommand('releaseMask');
        }
        else {
            app.executeMenuCommand('ungroup');
        }
    }
}

 このスクリプトを実行した後に選択されているオブジェクトの中から、更に特定のオブジェクト(塗りなし・線なし)を削除したいです。

 

しかしこのスクリプトを実行した後に、

alert(SEL);

としてみたら、スクリプト実行前のオブジェクトしか呼び出せませんでした。

 

どのようにすれば良いかご教授お願いいたします。

This topic has been closed for replies.
Correct answer ajabon grinsmith

単純に、グループ解除のループを抜けたあとに app.activeDocument.selection を変数に入れ直し、でよいのでは。

変数SELはselection無関係に、ただの配列になっているため、GroupItem消滅後は使い物にならないと思っていいです。

3 replies

Ten A
Community Expert
Community Expert
March 10, 2022

JavaScriptはオブジェクトベースで操作する言語です。操作する対象を指定するにはいくつかの手段がありますが、選択範囲に対しての操作はその1つです。概念的なことを簡単に説明すると…

以下のような人というかオブジェクトがあると仮定します。

 

このオブジェクトは色々な属性を持ちます。ここでは名前、性別、年齢といった情報が見えていますね。これがいわゆるプロパティってやつで「オブジェクト.名前」という様な書き方で参照できます。そして、このオブジェクトは色々な処理を実行可能です。これがメソッドと呼ばれるもので「オブジェクト.寝る()」といった書き方で実行できます。このかっこの中に色々なパラメータを書いて実行時に渡すことが出来るものがあります。このパラメータが引数と呼ばれるものです。
処理の対象としてはこれらのプロパティの条件次第で処理する/しないを振り分ける事ができますので、必ずしも選択範囲を操作するのにselectionコレクションを操作する必要はなかったりします。選択されているかどうかの判別もselectedというプロパティを参照することで可能です。

ついでに、条件次第なんですけど、スクリプト実行中の選択範囲の状態がredrawしても追いついてこないケースもあります。基本としてオブジェクトツリーを直接操作するのが第一選択でメニューコマンドは手がない場合の最終手段だと考えておくのが良いです。
その最終手段に頼らざるを得ない場合は多いんですけどね。

nekkonekoAuthor
Inspiring
March 10, 2022

理解力不足で・・・噛み砕いて説明してもらって本当に感謝です。

まだ上辺だけかもしれませんが、書いているものと"プロパティ"と"メソッド"という言葉が繋がって理解できました。

 

今回の場合、Ten Aさんからのアドバイスを受けて

groupItems.clipped = false;

クリッピング解除はプロパティで操作してみましたが、選択しているオブジェクトによって出来ないものがありました。

ただ、それがメニューコマンド操作で解決出来たのでとりあえず最終手段に頼っています。もしかしたら他に手があるのかもしれませんが・・・。

 

とりあえずみなさんのおかげで、グループ解除・クリッピング解除→塗りなし・線なしオブジェクトを削除というスクリプトは出来ました。ありがとうございます。

Ten A
Community Expert
Community Expert
March 9, 2022
DOM操作中の選択範囲の更新は注意が必要で、基本的にはターゲットになるコレクションを直接操作するほうが安定します。
という事でグループ解除については直接粛清してしまうのが手っ取り早いでしょう。また、メニューコマンドはお手軽ですが、プロパティ操作やメソッドが有効な場合は安易に使うのを控えたほうが得策です。
以上を勘案するとこうですかねぇ…
 
while(app.activeDocument.groupItems.length>0)
{
app.activeDocument.groupItems[0].selected = true
if(app.activeDocument.groupItems[0].clipped)app.activeDocument.groupItems[0].clipped = false;
app.executeMenuCommand('ungroup')
app.executeMenuCommand('deselectall')
}
nekkonekoAuthor
Inspiring
March 10, 2022

ありがとうございます。

書いていただいたコードでは何故か出来なかったのですが、

頂いたアドバイスを基にまた作り直したいと思います。

 

プロパティ操作やメソッドが有効な場合

っていうのがいまいち分からなかったのですが、具体的にどういう場合のことを指しますか?

ajabon grinsmith
Community Expert
Community Expert
March 10, 2022

メニューコマンドの多くは対象オブジェクトが選択されていることが動作条件なため、

ひとつの処理を済ませたあとにも選択範囲を掌握できていることが必要だったりします。

引き換え、プロパティ操作やメソッドは選択していなくても実行できる利点があるからおすすめ、というニュアンスかと思います。

 

プロパティ操作は

obj.left = 150;

メソッドは

obj.translate(30, 10);

みたいなやつです。

ajabon grinsmith
Community Expert
ajabon grinsmithCommunity ExpertCorrect answer
Community Expert
March 9, 2022

単純に、グループ解除のループを抜けたあとに app.activeDocument.selection を変数に入れ直し、でよいのでは。

変数SELはselection無関係に、ただの配列になっているため、GroupItem消滅後は使い物にならないと思っていいです。

nekkonekoAuthor
Inspiring
March 10, 2022

ありがとうございます。

ループを抜けた後に、

var Obj = activeDocument.selection ;

を入れたら出来ました。