偶数頁のオブジェクトだけを180度回転させるスクリプト

[12376]偶数頁のオブジェクトだけを180度回転させるスクリプト 投稿者:もう四十路 投稿日:2007/10/08(Mon) 00:16

いつも参考にさせていただいています。
Mac OS X 10.4.10 CS2を使用しています。

タイトルの通り偶数頁のみ、各頁にあるオブジェクトを全て
グループ化し、グループ化したオブジェクトの中心で180度回転
させたいのですが、スクリプトで可能なのでしょうか?
(回転させたいファイルが複数あり、頁数は各ファイル毎に異なります。)

現在は180度回転にショートカットを割り当て、
ちまちまやっています。

CS2 CD 内のスクリプティングガイドも読んでみましたが、正直何がなにやら…

ご助力お願いしたく、よろしくお願いいたします。

» 1

とりあえず、こんなのではどうでしょう。
//アクティブなドキュメントの左ページのページアイテムを180度回転
for (var i=0;i<app.activeDocument.pages.length;i++){
    //左ページのページアイテムを選択しグループ化して180度回転
    if (app.activeDocument.pages[i].side == PageSideOptions.leftHand){
        app.selection = app.activeDocument.pages[i].pageItems;
        var obj = app.activeDocument.pages[i].groups.add(app.selection);
        obj.rotate(180,1095656308);
        //グループ解除
        obj.ungroup();
    }
}

» 2

梅花藻さん、ありがとうございます。
あっさり作業が終了し、びっくりしました。

>PageSideOptions.leftHand

もしやと思い、.rightHand に書き換えたら、右ページが
きれいに回転してくれました。本当にありがとうございました。

また、書いていただいたコードで質問があるのですが、

>obj.rotate(180,1095656308);

ここで回転させていると思うのですが、「1095656308」が
オブジェクトの中心、ということなのでしょうか?
また、見開きが設定されていないファイルの場合、当然「右左」では
スクリプトが動きませんでした。
「1ページおきに」という事は可能でしょうか?

お時間のある時で構いませんので、ご教授いただきたく、
お願いいたします。

» 3

「1095656308」
CDの中に入っている「スクリプトリファレンス」を検索すると、オブジェクトもしくはアンカーオブジェクトの中央中心参照点を示すデシマルコードだということが……なんとなく……わかります。

» 4

いきさん、ありがとうございます。
「スクリプトリファレンス」の方ですか……
すみません、PDFのしおりを見た瞬間読むのをやめました…

「スクリプティングガイド」の方も、読んでみる→理解できない言葉が
多い→流し読み→結局何も理解できず。
という感じでした。

エクセルのVBEなどは記録したマクロのコードを見て、書き換えたりも
できるのですが、スクリプトは難しいというイメージがどうしても
抜けません。

PhotoShopのアクションパレットみたいなものがあって、さらに記録した
アクションのコードを書き出せたら良いのになぁと思ったりしています。

» 5

>CDの中に入っている「スクリプトリファレンス」を検索すると、

おっと、私検索して調べてませんでした。
そっか、ちゃんと書いてあったんですね。(確かLi氏のenumリストから持ってきてたと思います)

>「1ページおきに」という事は可能でしょうか?

ifの( )の中の条件式を i%2==1(iが2で割った余りが1)または i%2==0 (iが2で割った余りが0)とすれば可能だと思います。

» 6

梅花藻さん、度々ありがとうございます。

教えていただいたコードでうまくいきました。
最初は構文の意味を考えず、
if (app.activeDocument.pages[i]%2==0){
と書いて、動かない~と悩んでしまったのですが、

if (app.activeDocument.pages[i] = [i]%2==0){
と書いたらうまくいきました。

このコードで見開き設定のファイルにも使えます。
ありがとうございました。

スクリプトは難しいと思わずに、基礎からゆっくり
勉強しようと思います。

梅花藻さん、いきさん、本当にありがとうございました。
また何かありましたら、ご助力お願いいたします。

» 7

>もう四十路さん

if (i%2==0){
だけでOKです。

for文でiは0からドキュメントのページ数まで、1ずつ増えて行きますから、(i%2==0)とすれば、1,3,5,……ページ目が、(i%2==1)とすれば、2,4,6,……ページ目が処理されることになります。
(但し、ノンブルをみているわけではないので、偶数ページかどうかは不明。ただ、頭から順番のはず)

[i]だと配列になりますが、[i]%2もi%2と同じ値を返すようです。

==(等号2つ)は比較演算子で等しいかどうか。
=(等号1つ)は代入演算子で左辺に右辺の値を代入。

if (app.activeDocument.pages[i] = [i]%2==0){
だと、

app.activeDocument.pages[i]に([i]%2==0)の値(true(真)かfalse(偽))が代入されることになるので危険です。

まぁ多分、代入ができないのではないかとは思いますけれども。(この辺は未確認)

» 8

梅花藻さん、度々ありがとうございます。

>app.activeDocument.pages[i]に([i]%2==0)の値(true(真)かfalse
>(偽))が代入されることになるので危険です

なるほど、ちゃんと構文の意味を理解してコードを書かないと
いけませんね。

教えていただいた通り、if (i%2==0){ でさっくり動きました。

これは「i」をドキュメントのページ数の変数として宣言しているから、
「i」とだけ記述すればコンピュータはドキュメントのページ数として
処理してくれる、

という理解の仕方で良いでしょうか?
ただ、

if (app.activeDocument.pages[i]%2==0){
と記述すると動かなくなってしまうのは何故でしょうか?
私の様に理解が浅いと、記述は長いけど

if (i%2==0){
と意味は同じなんじゃないかと思ってしまうのですが…

最初に書いていただいた、
if (app.activeDocument.pages[i].side == PageSideOptions.leftHand){
の時は、見開きの左ページか右ページかを指定するために
app.activeDocument.pages
が必要であって、左右がない今回のコードには不要(というか、あっては
いけない?)ということでしょうか?

試しに最初の
if (app.activeDocument.pages[i].side == PageSideOptions.leftHand){
から、
app.activeDocument.pages を消したら動かなくなりました。

質問ばかりのうえに長い文章、初歩の初歩「スクリプト講座」みたいに
してしまってすみません。

またお時間に余裕のあるときにお教えいただきたく、お願いいたします。

» 9

[12376へのレス]Re: 偶数頁のオブジェクトだけを180度回転させるスクリプト 投稿者:偽善者こうちゃん 投稿日:2007/10/10(Wed) 12:47

もう四十路さん、こんにちは。

>これは「i」をドキュメントのページ数の変数として宣言しているから、
>「i」とだけ記述すればコンピュータはドキュメントのページ数として
>処理してくれる、

>for (var i=0;i<app.activeDocument.pages.length;i++){
上記のfor文のiは0~アクティブなドキュメントのページ数まで繰り返すという意味なのは梅花藻さんが書かれている通りです。
この場合のiはただ単純に数字が代入されているだけです。
たとえばページ数が10だったら、iに0~9までの数字が順に代入されて、計10回繰り返す、というような意味合いで使っています。
ですので、

>if (app.activeDocument.pages[i]%2==0){
これだと「アクティブなドキュメントのiページを2で割って余りが0なら」という命令になってしまうので、InDesign側で理解できないからエラーになっているんだと思います。
確かにこれだと意味わかんないですよね(^^;
そこで

>if (i%2==0){
これだと「iに代入されているものを2で割って余りが0なら」なので、iは数字が代入されているのでInDesign側で意味が理解できるのでエラーにならない、と。

ついでに
>if (app.activeDocument.pages[i].side == PageSideOptions.leftHand){
>から、
>app.activeDocument.pages を消したら動かなくなりました。

これはInDesign側で「なにを処理対象にしたらいいのかわかんないよー」とエラーを返してきます。
[i].sideでは「数字のside」という命令でしかないので意味が通りませんよね。

とりあえずこんな感じでしょうか。
InDesignのJavaScript講座でも開こうかな(笑)

» 10

偽善者こうちゃんさん、丁寧に解説していただき、ありがとうございます。

>たとえばページ数が10だったら、iに0~9までの数字が順に代入されて、>計10回繰り返す、というような意味合いで使っています。
for文の意味、よくわかりました。

>これだと「アクティブなドキュメントのiページを2で割って余りが0なら」
>という命令なってしまう

>>app.activeDocument.pages を消したら動かなくなりました。
>これはInDesign側で「なにを処理対象にしたらいいのかわかんないよー」
ちゃんと構文の意味を考えれば解ることでした。理解力の低さを晒してしまいました。恥ずかし…

梅花藻さん、いきさん、偽善者こうちゃんさん、丁寧に教えていただき、
ありがとうございました。
スクリプト書いてもらった~→仕事さっくり終わった~→ありがとう~
では、ちゃんと理解しないで終わったと思います。
情けない質問ばかりでしたが、してよかったと思います。
また何かありましたら、ご助力お願いいたします。

InDesignのJavaScript講座でも開こうかな(笑)
あ、それ是非参加させてください(笑)

この記事の書き込み元へのリンク (コメントや質問などはこちらへどうぞ)