Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2010-07-24

[][][]InDesign CS5では、PageItemの親はPageではなくSpread

上記ブログにもちょっとコメントさせていただいて、すっかり「書いた気」になっていたのですが、一応ここにも書いておきます。

InDesignのスクリプトを長く書いていて、DOMがある程度染み付いている方は「PageItemの親はPageだよね」と何の疑いもなく信じています。しかし、InDesign CS5では、PageItem.parentはSpreadを返します(spreadの親はapplication。Pageを通貨しましせん。)。ですから気がつきにくく、Adobe流儀(驚き最大の法則)に振り回されてしまうかもしれません。


PageItemからPageオブジェクトを得たい場合は、InDesign CS5からPageItemオブジェクトに新しく追加された「parentPage」プロパティを使ってください。

var my_sel = app.documents[0].selection[0];//なにかページアイテムを選択している
var my_page = my_sel.parentPage;
alert (my_page.name);

「parentPage」プロパティについてはディザInDesignブログさんの記事で知りました。ありがとうございました。

なかとじなかとじ 2010/07/24 21:27 >PageItemの親はPageではなくSpread

途中で変更されるのは困るわけですが……
しかし、これはこれで正しいメタファへ変更されたと思います。

実際、スプレッドにはページ外領域(ペーストボード)があるわけで、pageItemはページという名前がついていますが、本来、スプレッドの下にページと同列に扱われてしかりのものです。つまり、ページに内包されているわけではなく、「ページ(紙)というオブジェクトの上に配置されたオブジェクト」という解釈です。

まぁ、"たいていの場合は" 内包されているほうがプログラミングしやすいと思うのですが、オブジェクトを水平移動しただけでオブジェクトの管理体系が変更される(場合がある)というのもおかしな話です。例えば、フレーム内に配置されたオブジェクトは位置を移動しても管理体系は変更されません。

いやはや、私も再回帰処理を行っているので困ってしまうわけですが……

逆に、何でそういった処理が必要だったかといえば、オブジェクトが「どのページのものなのか」が知りたかったからです。従来は「parentPage」といった属性がなかったので、グループ化されているオブジェクトやペーストボードに置かれているオブジェクトに対して再回帰処理を行っていたのです。

そういった処理の無駄な必要性が減ったということなので、とりあえず歓迎すべき変更としておきましょう。うぅ〜さらに面倒を背負い込んでしまったな。仕上げ屋……

>気がつきにくく

CS4からの変更点というドキュメントはないんですか? あ、私はCS5のテストインストールがまだなんです……

seuzoseuzo 2010/07/24 21:59 個々のPageItemからPageを知るには再帰処理しかなかったので、parentPageプロパティが実装されたことは歓迎します。
けれど、parentPageプロパティを持ってるのはpageItemとImageくらいしかないので、PageItemまで行き着くまではオブジェクトの種類によって書き方が変わります。コードも使い回ししにくくなります。
parentで再帰すればかならずPageを通る性質を利用した方がおそらく短く書けるでしょう。

そしてなにより、おっしゃるとおり、いままでのスクリプトのいくつかは動きません。

>CS4からの変更点というドキュメントはないんですか?

公式なものはないように思います。先に示した
「Adobe Forums: With CS5, some things have changed」
http://forums.adobe.com/thread/615381
を知っているだけです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/seuzo/20100724/1279906199