[AppleScript]選択されているtext frameのみに処理させたい

[2311][AppleScript]選択されているtext frameのみに処理させたい | 投稿者:shinji | 投稿日:2009/01/27(Tue) 17:03:18
MacOSX10.4.11 CS5.0.4です

通常 set Sel to selection で選択されいてるものが取得できますが
このなかで、text frame のみに処理させたいとき
class を見てひとつづつって考え方でよいのでしょうか。
グループ化されているときはgroupなので、それを取り出して
repeatで処理させるってことでしょうか。
1回のグループ化だと set Sel to text frames of selection で取り出せたり
するのですが、一緒に選択している他のtext frameが反応してくれません。
このへんの考え方がいまいちよくわかっていないのですが…
よろしくお願いいたします。
» 1
>class を見てひとつづつって考え方でよいのでしょうか。
そうですね。
ちょっと冗長な感じですが、こんな感じ。
#whoseが使えるともっとラクなんだけどなぁ。

tell application "Adobe InDesign CS4"
   tell document 1
       repeat with i in selection
           if class of i = text frame then
               my do_it(i)
           else if class of i = group then
               set my_textFrame to my get_textFrame(i)
               repeat with ii in my_textFrame
                   my do_it(ii)
               end repeat
           end if
           
       end repeat
   end tell
end tell

--やりたいこと
to do_it(obj)
   tell application "Adobe InDesign CS4"
       tell document 1
           set fill color of obj to swatch "aka"
       end tell
   end tell
end do_it

--group中のテキストフレームを返す
to get_textFrame(group_obj)
   set tmp_lilst to {}
   tell application "Adobe InDesign CS4"
       repeat with i in page items of group_obj
           if class of i = group then
               repeat with ii in all page items of i
                   if class of ii = text frame then set tmp_lilst to tmp_lilst & ii
               end repeat
           else if class of i = text frame then
               set tmp_lilst to tmp_lilst & object reference of i
           end if
       end repeat
       return tmp_lilst
   end tell
end get_textFrame
» 2
[2315]Re: [AppleScript]選択されているtext frameのみに処理させたい | 投稿者:shinji | 投稿日:2009/01/27(Tue) 22:17:56
せうぞーさん、ありがとうございます。
ブログもいつも拝見させていただいてます。

無事、text frameが取り出せました。
それで理解できない部分があるのですが、
サブのget_textFrameでrepeatが2回まわってますが
1回目がpage itemsで、2回目がall page itemsとなっていますが
これで、なぜ何重にもグループ化されていても処理できるのでしようか
よろしくお願いいたします。
» 3
あ、この場合、
all page items of group_obj
のループだけでもいいみたい。ちょっと混乱していました。すいません。

to get_textFrame(group_obj)
   set tmp_lilst to {}
   tell application "Adobe InDesign CS4"
       repeat with i in all page items of group_obj
           if class of i = text frame then
               set tmp_lilst to tmp_lilst & object reference of i
           end if
       end repeat
       return tmp_lilst
   end tell
end get_textFrame
» 4
そもそも、最初は再帰的にグループを処理しようとしていたんです。
ループが簡易になるなら、こんな感じで組み込んだ方がいいですね。
たびたびすいません。

tell application "Adobe InDesign CS4"
   tell document 1
       repeat with i in selection
           if class of i = text frame then
               my do_it(i)
           else if class of i = group then
               repeat with ii in all page items of i
                   if class of ii = text frame then
                       my do_it(ii)
                   end if
               end repeat
           end if
           
       end repeat
   end tell
end tell

--やりたいこと
to do_it(obj)
   tell application "Adobe InDesign CS4"
       tell document 1
           set fill color of obj to swatch "aka"
       end tell
   end tell
end do_it
» 5
[2318]Re: [AppleScript]選択されているtext frameのみに処理させたい | 投稿者:shinji | 投稿日:2009/01/27(Tue) 23:13:47
せうぞーさん、簡易版ありがとうございます。

all page itemsってグループ化が何重になっていても
関係なく返すのですね…便利です
でもなんだか、それでいいのかなとか考えたりしますが
まぁ、いいか
indesignって用語の数が多いので探すのがたいへんです
特にAppleScriptに関する資料とか、なかなかないですね
どこかに詳しいリファレンスがないものでしょうか
…もちろん日本語での解説がついたもの
» 6
all page items はグループ化やインラインフレームが入れ子の状態で何階層にも重なっていてもページアイテムがゲットできて便利ですね。

ところで、特定のプロパティを持つページアイテムの参照を得るにはフィルター参照するととても早いのですが、every page item でしか使えません。 all page items ではフィルター参照が効かないようです。repeat構文を使って順に深く潜っていくしかないようです。

しかし every page item of all page items とすると対象としているオブジェクトの階層以下、何階層あろうと全てフィルター参照併用でゲットできます。こんな便利な式があるのですが、欠点があります。第一階層のページアイテムが取得できないのです。そこで2段階で取得します。

下のサンプルはセレクトして対象としているのは1つだけです。1つのオブジェクトに内包するテキストフレームに限れば、繰り返し構文を使わず取得することができます。セレクト時に複数アイテムをターゲットにするなら、その部分だけ繰り返せばいいのだと思います。内包するアイテムは繰り返し構文の必要はありません。

tell a_groupを片方ずつコメントアウトして試すと面白いと思います。

=========
set every_textFrames to {}

tell application "Adobe InDesign CS4"
   tell active document
       set a_group to item 1 of selection
       set black_color to swatch "Black"
   end tell
   
   tell a_group
       try
           set every_textFrames to every_textFrames & (every page item whose class of it is text frame)
       end try
   end tell
   
   tell a_group
       try
           set every_textFrames to every_textFrames & (every page item of all page items whose class of it is text frame)
       end try
   end tell
   
   repeat with t in every_textFrames
       select t
       set fill color of t to black_color
       delay 1
   end repeat
   
end tell
=========

助長的で読みにくいと思いますが、http://psychocat.net/scriptNote/article.php?id=36 が参考になればうれしいです。私の昔のブログです。
» 7
[2324]Re: [AppleScript]選択されているtext frameのみに処理させたい | 投稿者:shinji | 投稿日:2009/01/29(Thu) 00:01:05
PsychoCatさん、解説ありがとうございます。

every page item of all page items って曲者ですね。
まだ、はっきり理解できてません
ブログの方も読ませていただきます…って
以前RSSで見ていたはずなんですが
実際、その場に当たらないと覚えられないみたいです
» 8
[2340]Re: [AppleScript]選択されているtext frameのみに処理させたい | 投稿者:iketch | 投稿日:2009/02/02(Mon) 03:10:54
every item をかませると whose が使えるようになるようです。
そうすると、以下のように記述できます。

tell application "Adobe InDesign CS3"
   tell document 1
       try
           set fill color of every item of selection whose class is text frame to swatch id 12
       end try
       try
           set fill color of every item of all page items of selection whose class is text frame to swatch id 12
       end try
   end tell
end tell

(しっかりした検証を取ってないので、うまくいかない場面があったらごめんなさい)

私もここで初めて all page items という便利なものを知りました。
勉強させてもらいました。
» 9
iketchさん、こんにちは。

上にあるiketchさんのサンプルには
set fill color of every item of selection whose class is text frame to swatch id 12
がありますが、every item of all page items 一回で取れますよね?
every page item ではなくて、every itemだけでよかったんですね。
気がつきませんでした。ありがとうございます。
» 10
[2346]Re: [AppleScript]選択されているtext frameのみに処理させたい | 投稿者:shinji | 投稿日:2009/02/02(Mon) 22:23:12
iketchさん、ありがとうございます。

whose 使えますね。
every page item と every item の違いってなんなんでしょうね。

まとめてポンとやりたいときは、whose で取得した方が便利ですね。
ただ、今回取得した text frame に個別に処理をさせるので、
先にせうぞーさんが提示していただいたものでも、速度的には
あまりかわらなさそうですね。
今まで、quark でしかやってこなかったので InDesign は難しいです。
でも、quark より安定しているかもしれませんね。根拠はないですが…
提示していただいたスクリプト、使わせていただきます。
» 11
[2347]Re: [AppleScript]選択されているtext frameのみに処理させたい | 投稿者:iketch | 投稿日:2009/02/03(Tue) 03:23:22
shinjiさん、どういたしまして

私は以下のように理解しています。

“every page item of PageItems_A” は 「PageItems_A の一階層下にある page item すべて」、
“every item of PageItems_A” は 「PageItems_A すべて」という結果を返す。

通常 every item of はなくても同じ結果を返すので省略するが、whose を用いる場合は every ? of が必要となる。
(ここら辺はアプリケーションによって違うかもしれないので注意!!)


PsychoCatさん、こんにちわ(こんばんわ)

all page items of selection は「選択されているオブジェクトに含まれる(内包する) page item すべて」となり
選択されているオブジェクト自身が含まれないので2回に分けることにしました。
(ブログ見てました。!!)
» 12
あー、わかりました。
私は選択するトップ階層をグループオブジェクトで試していたので、テキストフレームだけを選択するテストにおいて誤解してしまったんですね。

Document、もしくは Pageなどをトップエレメントとして、そこに含まれるオブジェクトをターゲットにするなら一度の every item of all page items で操作できるわけです。これでスクリプトがスマートになります! (^^) ほんとありがとう。

> (ブログ見てました。!!)
これって、昔のブログかしら? 今のヘタレ英語ブログかしら? どちらにせよ、うれしいです。
この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)

このページをシェア