[ 掲示板に戻る ]

記事No.10713に関するスレッドです

ペースとしたオブジェクトの重なり順について質問です / Chirico
InDesign 2023
macOS 12.7.6

複数レイヤーから構成されているオブジェクトの中から、最背面のオブジェクトのみを選択状態にするには、下記の記述でできました。

var clip = app.activeDocument.selection;
app.activeDocument.selection = null;
clip[0].selected = true;

しかし、ペーストしたオブジェクトに対して実行すると、最背面オブジェクトが選択できません。
どうやら一番上のレイヤー内の最背面オブジェクトが選択されるようです。

app.paste(); //←ペースト追加
var clip = app.activeDocument.selection;
app.activeDocument.selection = null;
clip[0].select();

ペーストしたオブジェクトは重なり順に配列されないのでしょうか。
最背面オブジェクトを選択するには、どうすれば良いでしょうか。
よろしくお願いいたします。

No.10702 2025/07/15(Tue) 15:36:56
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Gecko/20100101 Firefox/128.0

Re: ペースとしたオブジェクトの重なり順について質問です / Uske_S URL
Chiricoさん、こんにちは。

どこまで当てになるかわかりませんが、zOderPositionというプロパティがあり、それを調べると重なり順がわかります。番号が若いほど下にあるオブジェクトになります。

当てになるかわからないというのは、オブジェクトが増えたり減ったりしたときに、zOrderPositionの値がダブることがあって、一意の情報ではないらしいということです。
とはいえ、少なくともペーストするということは大きい番号が増えることなので、選択範囲のzOrderPositionの最小値を調べれば、希望のことは達成できるのではないでしょうか…?

No.10703 2025/07/16(Wed) 09:06:43
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

Re: ペースとしたオブジェクトの重なり順について質問です / Uske_S URL
一部誤字がありました。

zOrderPosition

が正しいです。

No.10704 2025/07/16(Wed) 09:07:26
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

Re: ペースとしたオブジェクトの重なり順について質問です / Chirico
Uske_Sさん

アドバイスありがとうございます。
zOrderPositionを使えばできるような気がします。
早速、試してみます。

No.10705 2025/07/16(Wed) 11:16:14
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Gecko/20100101 Firefox/128.0

Re: ペースとしたオブジェクトの重なり順について質問です / (z-)
>clip[0].selected = true;
および
zOrderPosition
どちらもIllustratorにしかない、と認識していたのですが、どうでしたっけ?

ちょっと要件の確認をしたいのですが、

>複数レイヤーから構成されているオブジェクトの中から、最背面のオブジェクトのみを選択状態にするには

だと、
・初期状態は選択範囲ありきなのか
・選択範囲がない場合、ドキュメント全体を対象とするのか
など、不明点がすこしあります。
先に挙げられたスクリプトの文脈からすると
「ドキュメント上の選択オブジェクト群から最背面の物だけを選択状態に(ほかは選択解除する)」
となりますが、実際どのような運用を想定していますか?
選択オブジェクトだけが対象ならドキュメントよりはスプレッドを限定して処理したほうが軽く済みますね。

取得についてかんたんに確認してみたところ、思った以上に厄介そうですね(添付画像)。
単純めに書くのであればpageItemsをループして、

var doc = app.activeDocument;
var selLen = doc.selection.length;
if(selLen == 0){ // 選択なしなら選択して終了
doc.pageItems[-1].select();
exit();
}
for(var i = doc.pageItems.length - 1; i >= 0; i--){
doc.pageItems[i].select(SelectionOptions.REMOVE_FROM);
if(doc.selection.length == selLen){ // もとから未選択のオブジェクト
continue;
}
doc.pageItems[i].select(SelectionOptions.REPLACE_WITH); // 新規選択する(他は未選択になる)
break;
}

とかでどうでしょう。軽くはないですが。

No.10706 2025/07/16(Wed) 12:53:37
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15

Re: ペースとしたオブジェクトの重なり順について質問です / (z-)
あ、すみません補足。
上記のスクリプト、実行前の選択範囲がテキスト、表、セル、グループ内の一部のページアイテム
などの場合はちゃんと動かないかもです。
採用されたら清書しますw

No.10707 2025/07/16(Wed) 12:55:24
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15

Re: ペースとしたオブジェクトの重なり順について質問です / Chirico
(z-)さん

返信、ありがとうございます。
ご質問に回答いたします。

>clip[0].selected = true;
はい、Illustratorだけみたいです。
clip[0].select();
実際にはこちらで実行しています。質問文の誤りでした。

>zOrderPosition
これはよくわかりませんが、これから検証してみます。

>・初期状態は選択範囲ありきなのか
はい、そうです。

>・選択範囲がない場合、ドキュメント全体を対象とするのか
選択していない場合は、動作しない想定です。

>実際どのような運用を想定していますか?
ペーストしたオブジェクト群から、最背面のオブジェクトをガイドとして扱い、
全体を指定位置に移動するものです。
よってペースト後に、最背面オブジェクトを見つける必要があります。
ご提案いただいたスクリプトについては、ありがたく参考にします。

なお、ペースト直後は変なところを選択しますが、オブジェクト群をドラッグコピーしたものに下記スクリプトを実行すると、希望通りの最背面オブジェクトが選択されます。

var clip = app.activeDocument.selection;
app.activeDocument.selection = null;
clip[0].select();

これも謎です。
検証の結果については、またご報告いたします。

No.10708 2025/07/16(Wed) 16:17:32
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Gecko/20100101 Firefox/128.0

Re: ペースとしたオブジェクトの重なり順について質問です / Uske_S URL
わ〜、すみません、プログラムだけ見て勝手にIllustratorだと勘違いしました😢

InDesignだとzOrderPositionプロパティなんて存在しないです。ごめんなさい…。

僕も少し調べてみますね(InDesignのスクリプトのほうが得意なので…)

No.10709 2025/07/16(Wed) 17:40:38
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

Re: ペースとしたオブジェクトの重なり順について質問です / (z-)
ペーストしたままの状態だと、どうにも選択範囲中の最上位レイヤーの最背面オブジェクトが[0]要素になりますね。

ちょっと耳寄り情報なんですけど、
A, B, C のオブジェクトを、shiftキー使いながら
B, C, A の順に選択追加してってみてください。
それで
var clip = app.activeDocument.selection;
app.activeDocument.selection = null;
clip[0].select();
が破綻するのが確認できると思います。

何が言いたいかというと、今回の要件でselection要素の並びをあてにしてはいけない、ということです。

Illustratorといえば、PageItem.selected がInDesignでは使えないのも痛いところですね…

No.10710 2025/07/17(Thu) 12:56:43
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/18.5 Safari/605.1.15

Re: ペースとしたオブジェクトの重なり順について質問です / お〜まち URL
まず、同じドキュメント内であればCopy&Pasteを使わずduplicate()メソッドを使った方がよいです(Copy&Pasteはクリップボードを操作するアプリケーションの影響を受けるため)。別ドキュメントの場合はduplicate()が使えないので仕方がないですが。

InDesignのスクリプトでは基本的にオブジェクトの重なり順を調べる方法を持っていないので、一旦グループ化してコピーするのが私のやり方です。その手順を書きますので、この通りにコードを書いてみてください(コードを書かないのは私が面倒くさいだけです)。

■InDesignの設定
1. レイヤーパネルメニュー→[元のレイヤーに戻してグループ解除]にチェック
app.GeneralPreferences.ungroupRemembersLayers = true;
■コピーの操作
2. 選択している中の最背面のオブジェクトにスクリプトラベルを設定
3. 選択しているものをグループ化
4. コピー
5. グループ解除
6. 選択している中の最背面のオブジェクトのスクリプトラベルを削除(残ってていいなら不要)
■ペースト後の操作
7. ペースト
8. グループ解除
9. 選択されているオブジェクトから、スクリプトラベルの付いているものを探す
10. スクリプトラベルを削除(残ってていいなら不要)
11. 必要であれば[元のレイヤーに戻してグループ解除]のチェックを外す(多分不要)

No.10711 2025/07/17(Thu) 14:12:33
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

Re: ペースとしたオブジェクトの重なり順について質問です / Chirico
Uske_Sさん
(z-)さん
お〜まちさん

皆様、追加情報ありがとうございます。
お〜まちさんのご提案を元にスクリプトラベルを検索用に使ってみた結果、何とか解決しました。
ペーストしたオブジェクトを選択した状態で実行すると、うまく動作する感じです。

スクリプト本文────────────────────
var doc = app.activeDocument;
var clip = doc.selection;

for(var i=0; i<clip.length; i++){//検索用にラベルを付ける
clip[i].label = "PasteObject";
}
doc.selection = null;//一旦、選択解除

for(var i=0; i<doc.pageItems.length; i++){//ラベルを検索して選択
if (doc.pageItems[i].label == "PasteObject"){
doc.pageItems[i].select();
doc.pageItems[i].label = "";//不要なラベルを削除
}
}

clip = doc.selection;//後で移動するため、選択範囲を保存
doc.selection = null;
clip[0].select();
────────────────────

・スクリプトのざっくりした流れ
1.ペーストしたオブジェクト群にラベル「PasteObject」を付ける
2.一旦選択解除した後
3.ラベルが付いたものだけを再度選択する
4.配列0番目のものが最背面オブジェクトとなる(ような気がします)

テストデータでは希望通りに動作しますが、本当にこれで良いのかはまったく自信がありません。
添削、ツッコミ、よろしくお願いいたします。

No.10712 2025/07/17(Thu) 15:53:59
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Gecko/20100101 Firefox/128.0

Re: ペースとしたオブジェクトの重なり順について質問です / Uske_S URL
Chiricoさん

自分も気になったので、オブジェクトの重なり順と、コレクションオブジェクトの順番を確かめてみました。
添付画像のとおり、3つのレイヤーにそれぞれ3つオブジェクトを置き、allPageItemsの中身を順番に取り出してみました。
結果は、レイヤーは下層が優先。レイヤー内は重なり順の上層から、となりました。
具体的には、3→2→1→6→5→4→9→8→7 という順番で取り出されます。
オブジェクトが減ったり増えたりレイヤーを移動したりしても、このルール(レイヤーは下層が優先、レイヤー内は重なり順の上層から)は変わりませんでした。

No.10713 2025/07/17(Thu) 16:14:15
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

Re: ペースとしたオブジェクトの重なり順について質問です / Uske_S URL
> (z-)さん

ちょっと耳寄り情報なんですけど、のくだり、InDesignはちゃんと選択した順番を覚えてくれますよね。
範囲選択でわーっとやるのと、ひとつひとつ選択範囲に含めていくのとで、コレクションオブジェクトの持ち方がわかるので、おっしゃるように中身の順序を信頼せず、ラベルなどを利用して一意になるものを確認したほうが確実ですね。

No.10714 2025/07/17(Thu) 16:28:46
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36

Re: ペースとしたオブジェクトの重なり順について質問です / Chirico
テストスクリプトにいろいろ間違いがありました。
doc.pageItems[i].select();
これだと最後のオブジェクトしか選択されません。

doc.pageItems[i].select(SelectionOptions.addTo);
これで全て選択されるようです。
しかし、最背面のオブジェクトは配列の端には格納されません。
だめです。「振り出しに戻る」です。

悩んでいたところ、Uske_Sさんが関数「sortByStackingOrder」を作成されていましたので、
これを試したところ、希望通りの動作ができるようになりました。

皆様、ありがとうございました。

No.10715 2025/07/22(Tue) 11:53:35
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Gecko/20100101 Firefox/128.0

Re: ペースとしたオブジェクトの重なり順について質問です / Uske_S URL
Chiricoさん、お役に立てたようで何よりです。
もしご興味あれば自動化についての自主勉強会みたいなイベントもやっておりますので、ぜひ遊びにいらしてください。

https://aaam.connpass.com/

No.10716 2025/07/24(Thu) 13:47:49
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36