InDesignでオブジェクトを移動するにはmove()を使いますよね。使うんですよ。
Illustratorだと left だの top だの使えば左や上を基準にした座標値で指定できるんですが。
それの代用として、geometricBoundsを書き換えた配列に置き換えたりしていると、いつか痛い目を見ます(見てます)。
が、move()には魔物が棲むという噂が絶えないのであります。バグだバギーだバギーちゃんだ、言われてます。
なんかしっくりこなくて、オブジェクトモデルビューアで説明を見直した。
こう書いてある。
PageItem.move (to:any, by:Array of number)
Moves the ^Object to a new location. Note: Either the ‘to’ or ‘by’ parameter is required; if both parameters are defined, only the to value is used.
to: Data Type: any
The new location of the ^Object,in the format (x, y). Can accept: Array of 2 Units, Spread, Page or Layer. (Optional)
by: Data Type: Array of number
The amount (in measurement units) to move the ^Object relative to its current position, in the format (x, y). (Optional)
ま、↑それはどうでもいいとして(よくないが)
上記の流し読み、及びmove()メソッドの用法間違い、書式間違いによるエラーメッセージにより、
こういう使い方↓だと思ってたんですが
pageItem.move(e1, e2);
第一引数 e1には“to”か“by”が入る。“to”だとe2で指定した座標に移動。“by”だとe2で指定した距離を移動
第二引数 e2には[x, y]で移動値を入れる
で、“by”は思ったとおりに動くけど“to”を入れても“by”と同じ挙動になるなあ、
試しにe1を省略したら“to”っぽく動いたからヨッシャこれでいこう
↑これ、まるっきりの思い違いでした。違うんです。いやとっくに知ってたらすいませんけど。そう思ってたんだからしょうがない。
あっちこっち覗いてきた中、同じ思考の方を散見したので、現状自分でわかったぶんだけここにまとめておきます。
まだ思い違いがあったら指摘して頂ければ結婚してください。
とりゃえずモノグサせずに、ちゃんとビューアの説明を読み解く。たぐいまれな英語力で。
PageItem.move (to:any, by:Array of number)
俺訳:(to:てきとう, by:数値の配列)
Moves the ^Object to a new location. Note: Either the ‘to’ or ‘by’ parameter is required; if both parameters are defined, only the to value is used.
俺訳:オブジェクトを新たな位置に移動する。 のて:”to”か”by”が必要となる(←だまされポイント)。
もし両方とも指定されていたら、”to”の分だけ使われる(←おかしいかもポイント)
to: Data Type: any
The new location of the ^Object,in the format (x, y). Can accept: Array of 2 Units, Spread, Page or Layer. (Optional)
俺訳:データ型:なんでも
(x, y)形式で、オブジェクトを新たな位置に移動する。 入れられる物:2つの単位の配列、スプレッド、ページまたはレイヤー(たこ)
by: Data Type: Array of number
The amount (in measurement units) to move the ^Object relative to its current position, in the format (x, y). (Optional)
俺訳:データ型:数値の配列
(x, y)形式で、オブジェクトの元の位置から定規の単位に即して移動する(たこ)
‥というわけです。
単にpageItem.move([10, 10]); とした時は、[10, 10]は第一引数として扱われるので上記の俺訳の通り、ドキュメント上の[10, 10]の位置にドビッと移動する。
pageItem.move(“by”, [10, 10]); とした時は、第一引数“by”は何の意味もなくなり「なんじゃそらペッペッ」と無視され、第二引数の[10, 10]は上記の俺訳の通り、現在地から[10, 10]ぶんプリッと移動する。
つまり、一所懸命“to”とか“by”とか入れてもぜんぜん意味がなかったわけです。あー恥ずかしい。
同じ事を思っていた方は、“to”と “by” 以外の何か、なんでも入れてみるといいです。
pageItem.move(“Google”, [10, 10]); とか。なんでもいいです。“by”だと思ってた挙動をするはずです。
ここまでのまとめ:
配列[x, y]を
オブジェクトの座標指定に使いたいなら第一引数に、
オブジェクトの移動量に使いたいなら第二引数に入れればよい
で、俺訳を振り返る。
if both parameters are defined, only the to value is used.
もし両方とも指定されていたら、“to”の分だけ使われる(←おかしいかもポイント)
試すべく、pageItem.move(activeDocument.layers[0], [10, 10]); としてみた。
額面通りならレイヤー移動だけして座標は据え置くはずが、レイヤーは移動せず座標が移動した。
矛盾してるじゃんすかよう。
ここが先様の書き間違いなのか、ウチの思い違いの思い違いなのか、どっちか。
たぶん前者だけどここは謙虚に卑屈に。嫌味に。
次。
第一引数と第二引数、配列の説明が少しちがうこと
to: Array of 2 Units
by: Array of number
toの方は単位つき文字列なんかオッケーでbyの方は数値の配列限定なの?
という事で以下の2つ試したんです。記憶だけで書いてるから単位ちがうかも。
pageItem.move([“10mile”, “10yard”]);
pageItem.move(“Google”, [“10mile”, “10yard”]);
結果、どちらも指定分だけ指定単位の座標および距離で動いてくれました。
これは気にしなくてよかったようだ。
pageItem.move() 大まとめ
以下、duplicate()もまったく同様です。お〜まちさんよりご指摘いただきまし
た
・第一引数には「移動先」を、第二引数には「移動量」を渡す。
・第一引数に用事がある時は、渡す引数は1つにしなければならない
・第二引数に用事がある時は、第一引数になんでもいいから入れておけ
・よく見る「pageItem.move(“by”, [10, 10]);」の“by”は、リファレンスの文中にある“to”, “by”とはまったくの無縁。
たぶん、File.open(“r”); 的な物との混同による誤用なのだと思う。
ただ、何を入れといてもよい第一引数への埋め草としてわかりよく、という意図で“by”と入れておくのはアリかも。
・“to”を入れても指定座標に行かないんですー、は論外。問題外。対象タト。マイトガイ。
ここまでで、思い違いがあったら指摘して頂ければあなたの子を産むわ。
とりゃえず、スクリプシャン各位よりも、5000円以上もするリッパな本を出している先生には特に認識して欲しいところではありますが。買ってないくせにこういう事言ってすみませんけど。。