とあるDTPオペレーターのInDesignスクリプト備忘録

デザイナー上がりですがいまはDTP命。InDesign用スクリプトの解説などを綴っています。読者登録して戴けると励みになります。

画像入れ替えスクリプトを作ろう① ~座標の入れ替え その①~

それでは、選択した2つの画像フレームを入れ替えるスクリプトの記事を書いていこうと思います。
処理はこんな感じを想定しています。

 ① 画像が入ったフレームを2つ選択する
 ② スクリプトを実行すると、2つの画像の位置とサイズが入れ替わる
 ③ オブジェクトスタイルは元のフレームに残す
 ④ 処理後、画像をフレームにフィットさせる(縦横比は固定)
 ⑤ 幅が大きい方の画像は背面に送る
 ⑥ 選択しないで実行、もしくは3つ以上選択アイテムがある場合は警告を出す
 ⑦ 画像フレーム以外が選択されている場合にも警告を出す
 ⑧ 元に戻したいときにはアンドゥ一発で直る

①はスクリプト外の操作なので、今回は②の処理を何回かに分けて説明していきます。
「位置とサイズが入れ替わる」とありますが、フレームの中身はそのままに、たがいの位置をそっくり入れ替えるという処理です。
さながら中身が入れ替わったかのように見えるわけですが、実際には「位置」つまり「座標」を入れ替えているだけなので、リンク情報には影響がありません。

前編ではいきなりスクリプトの書き方を紹介し、後編では説明しきれなかった部分を補いつつ、より詳しい説明を書こうと思います。
なので「前編だけで頭がいっぱいだよー」という方は、少し時間を置いてから後編を読んでもいいかもしれません。

まず、InDesignの座標は「visibleBounds」という命令文で取得できます(「geometricBounds」というのもありますが、のちに書きます)。
InDesign上に適当にフレームを作成して選択し「visibleBounds」で次のように選択アイテムを調べると…

var obj = app.selection[0];
var objPosi = obj.visibleBounds;

alert(objPosi[0])・・・参考図の①
alert(objPosi[1])・・・参考図の②
alert(objPosi[2])・・・参考図の③
alert(objPosi[3])・・・参考図の④


「var objPosi = obj.visibleBounds;」とすることで、変数「objPosi」の中に、フレームの四隅の座標が入ります。
「alert(objPosi[数字])」とすることで、数字(インデックス番号)に対応した座標がアラートされます。
InDesignを普通に操作するときは、フレームは9つの座標点を持っていますが、スクリプトの場合は通常4つの座標点で指定するわけです。
visibleBoundsで取り出した座標は、次の順序で並んでいます。

[0]は左上のx座標
[1]は左上のy座標
[2]は右下のx座標
[3]は右下のy座標

※順序が間違ってました。正しくは↓の順序です。
[0]は左上のy座標
[1]は左上のx座標
[2]は右下のy座標
[3]は右下のx座標

[参考図]
f:id:rokuyaN:20170813233724p:plain

スクリプト上でもこんなふうに書いてみました。

var obj = app.selection[0];
var objPosi = obj.visibleBounds;

alert(
    "左上のy座標は"+objPosi[0]+"\r"+
    "左上のx座標は"+objPosi[1]+"\r"+
    "右下のy座標は"+objPosi[2]+"\r"+
    "右下のx座標は"+objPosi[3]+"\r"
    )

小数点以下がすごいことになっていると思いますが(笑)。

~次回に続きます~