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

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

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

座標を入れ替えよう

それでは前回の続きを。

フレームの座標を取得する方法が分かったところで、選択した2つのフレームの中身を入れ替える(厳密には中身が入れ替わったように見える)処理を説明していきます。
まずはそれぞれの選択フレームを、下記のように変数に代入します。

var obj = app.selection; //選択したフレームに対し処理
var posi_0 = obj[0].visibleBounds; //1個めのフレームの座標を取得
var posi_1 = obj[1].visibleBounds; //2個めのフレームの座標を取得

これで変数posi_0には1個めのフレームの座標情報が入り、変数posi_1には2個めのフレームの座標情報が入りました。
どちらが1個めのフレームでどちらが2個めのフレームかは、InDesignが勝手に決めてるのであまり気にしないでください。

問題は、これからどうやってこの2つの情報を入れ替えるか、です。「replace」とか「change」とか探してしまいがちですが、あるかどうか分からないメソッドを探して嫌になるくらいなら、まずは「ありあわせの知識を使ってどうにかできないか」を考えるのも大切です。本筋のやり方を知らないだけでは? とか言わないように。

なので、シンプルにこんなふうに書き足してみてはどうでしょう。

var obj = app.selection; //選択したフレームに対し処理
var posi_0 = obj[0].visibleBounds; //1個めのフレームの座標を取得
var posi_1 = obj[1].visibleBounds; //2個めのフレームの座標を取得
//↓ここからが入れ替えを指示している部分
  obj[0].visibleBounds = posi_1;
  obj[1].visibleBounds = posi_0;

1つめの選択フレームに「おまえの座標は2個めの座標が入った変数の値だ」と教え、
2つめの選択フレームに「おまえの座標は1個めの座標が入った変数の値だ」と教えているわけですね。

!!!

なんと、これだけで入れ替えが上手くいってしまいます。
変数と前回登場したvisibleBoundsしか使っていません。

「嘘だ!」と思う方は、白紙のInDesignドキュメント上に適当に色違いのフレームを2つ作って、両方選択して上のスクリプトを実行してみてください。配置はそのままに中の色が入れ替わって(いるように見え)ますね。
スクリプトって面白いですね。
「色が変わってるだけじゃん」ですって? いえ、中身が入れ替わっているのです!!
これが画像フレームだと中の写真が入れ替わるのですが、画像で試すためにはスクリプトを少し付け足す必要があります。「どうしても画像でやってみたい!」という方は↓を試してください(付け足した命令文の説明は次回以降します)

var obj = app.selection; //選択したフレームに対し処理
var posi_0 = obj[0].visibleBounds; //1個めのフレームの座標を取得
var posi_1 = obj[1].visibleBounds; //2個めのフレームの座標を取得

obj[0].visibleBounds = posi_1; //2個めの座標を1個めに
obj[1].visibleBounds = posi_0; //1個めの座標を2個めに

//↓ここから付け足し部分(説明は次回以降)  
obj[0].fit(FitOptions.PROPORTIONALLY); 
obj[0].fit(FitOptions.CENTER_CONTENT); 
obj[1].fit(FitOptions.PROPORTIONALLY); 
obj[1].fit(FitOptions.CENTER_CONTENT); 


入れ替えに関しては以上、……と言いたいところですが、「ちょっと待った、サイズの指定をしてないよ!
という声が聞こえてきそうですね。いえ、もうしているのです

幅と高さの指定はいつどこでするのか?

結論から言ってしまうと、
右上のx座標と右下のx座標を指定した時点で幅が、
右上のy座標と右下のy座標を指定した時点で高さが、それぞれおのずと決定しているのです。

仮にあるフレームのそれぞれの座標が[例]のとおりだとすると…

[例]
f:id:rokuyaN:20170813233321p:plain

右下のx座標100mm から 左上のx座標15mm を引くとx座標の左から右までの長さが算出されます。
=85mm

次に
右下のy座標150mm から 左上のy座標10mm を引くとy座標の上から下までの長さが算出されます。
=140mm

つまりこの「あるフレーム」は幅85mm、高さ140mmの寸法なのです。
理屈の説明なので、図の見た目は気にしないでください。

実際にこの方法で幅や高さを求めるととてつもない小数点が出てきたりします。
その扱いや詳しい説明はまたの機会にします。

とりあえずこれで選択した2つのフレームの中身を入れ替えるスクリプトが書けました。
実用にはまだ手を入れる必要がありそうです。

(次回に続きます)