InDesign:イベントハンドラで「フレーム調整オプション」を粛正する

InDesignの勉強部屋BBSにも質問を投げた件ですが、
 まずウチら底辺作業者は「画像の差し替え」というのをよくやり(やらされ)ます。
各自の作業手順で画像を重ねたら、必ず最後は「選択ハニー内へペースト」をして差し替え作業終了となります。
 …ならない人はたぶんモグリのオペレータです。

その「選択ハニー内へペースト」ですが、対象のフレームに「フレーム調整オプション」が設定してあった場合、ペーストされたオブジェクトはコピー元オブジェクトの座標を保持せず、用意された基準点やトリミング量に配置位置を左右されてしまいます。これが困る。とっても困る。ものすごく困る。ほんとにほんとに困りすぎる。

いちおうわざとらしくCS3でテスト。CS3以降で共通の挙動です。
 CS2以前の物は仕様が大きく違うのでまた別の話で、というかモハヤ古すぎるのでやりません。
最背面にいる画像、これをコピーしておき(注:CS3でのテストは親フレームはコピーしないこと)、
画像に重ねるようにして適当に空のグラフィックフレームを2個置きます。
 わかりやすくするため、全てのフレームに塗り&線を設定してあります。

で、片方にだけ、フレーム調整オプションを設定します。
 といっても特にどこかいじるでもなく、開いてそのままOKしてみる。
  もちろんいじり倒しても構わないのですが

そして各々に「選択ハニー内へペースト」してみると。
   まぁ!
 フレーム調整オプションを触ってしまった側はそれに準じた位置に配置されてしまいます。
そして、CS3とCS4はこれを元の素直な空フレームに戻せない。
※CS5は「フレーム調整オプションを消去」というメニューコマンドがあります

とはいえCS3であれば、そのままもう一度「選択ハニー内へペースト」してやるだけで嫌がらせ属性は消えます。
 グラフィックフレームが空ではなく配置済みの場合、そこに上書きペーストする分にはフレーム調整オプションは効きません。
元の素直な子には戻りませんが、この特性を把握していればとりゃえずは回避できます。
 ※ここ掲示板で大ウソ書きましたすいませんw

ではCS4は、というと。
 …手がない。
ペースト後にコピー元画像の座標値をXYそれぞれペーストしてやるとか整列してやるとか…
 うそんいやんばかん。
フレームの入れ子でも構わなければ、
・適当な空フレームをコピー
・ペースト先フレームに「選択ハニー内へペースト」
・「内容をフレームに合わせる」
とした上で入れ子のフレーム内に画像を「選択ハニー内へペースト」してやればOKです。
 訂正作業時、ちょっとややこしくなりますが。

…ということで、現在のところ
「メニューコマンドなどの正攻法はおろかスクリプトでも、元の素直な空フレームに戻す手はない。糸冬 了」
 という結論なのですが、ペーストしてみて吠え面かいてから上記の方法を適用して、
…いや、そんなヒマな人いません。いたら今すぐ給料下げてやるよ!
 作業点数が多い場合あまりにもあんまりなので、スクリプトを書きました。
いちいちカチカチするのではなく、「選択ハニー内へペースト」に呼応して動いてくれる、いわゆるイベントハンドラというやつです。
 …いわゆらなくても、まあイベントハンドラそのものです。



id_pasteIntoPointSupport.jsx
InDesignCS3以降で動作します。
Macでのみ動作確認。Windowsでもたぶん動く気がします。
必要に応じて実行する種類の物ではなく常駐型として使うのを目的としているので、
 スクリプトの置き場所はアプリケーションフォルダ > Scripts > Startup Scripts フォルダ内となります。



インストールして再起動後、「選択ハニー内へペースト」に反応して自動で動作します。
・元の位置にペースト
・取り消し
・取り消し
・選択ハニー内へペースト
を一瞬でやり、その後、
・ダイアログ(返答待ち)
・移動
という流れになります。
「取り消し」が入っているのは処理後にドキュメントのヒストリーが汚れるのを避けての事ですが、体感的には遅延は生じない…はずです。研ぎ澄まされた人やマシンが超遅い人はどうだろう。。

他のスクリプトで「選択ハニー内へペースト」を使用した場合の兼ね合いについては、実行中の他のスクリプトに負けて何もできず泣いて帰ってきます。自前のスクリプト内で独自にうまいことやってくださいませ。

「選択ハニー内へペースト」した画像と「元の位置にペースト」した画像との座標値を評価して、違っていればダイアログメッセージでハイイエかイイエスか逐一お伺いを立てます。

そして「はい」の時は差分を移動します。

いつでも「はい」で「いいえ」の余地がない場合は、スクリプト冒頭で宣言してある
var ask=true;

var ask=false;
に書き換えれば、無言で修正してくれます。

ちなみにCS5/5.5ではダイアログのメッセージ内容がCS3/CS4と異なります。
その後の処理も「移動」ではなく「フレーム調整オプションを消去して再ペースト」になります。

「元の位置にペースト」した画像が「選択ハニー内へペースト」したフレームと重なっていない場合は通常の仕様にのっとり、お伺いも修正もしません。

これについては以下で条件をまとめておきます。
 スクリプトの仕様、ではなく、アプリケーションの仕様、をです。

スクリプト説明ここまで。



「選択ハニー内へペースト」の挙動について
今回紹介したスクリプトの事ではなく、アプリケーションの仕様として
 コピー元の座標を保持する/しない の位置関係についてまとめました。
…なにこのカオスっぷり。。

「選択ハニー内へペースト」した際、コピー元とペースト先フレームが離れているとペースト結果はフレームの中央となります
まあ当然です。見えないと困りまするし。これは周知と思います。

レイアウト上でクリッピングパスを指定した画像の場合は、クリッピング範囲ではなく画像サイズ自体で判定が行われます。

 で、ここからが問題。
この「離れていない」の判別は双方のvisibleBoundsで行われているようなのです。

つまり、フレームが楕円だったりして、「長方形に変換すれば重なるだろうけど角がないから重なってないんだもん」という位置関係だった場合でも、ペースト後の座標は保持されます。
 当然、見えていませんが。。

長方形でも、コピー元を回転して角を空けてやれば、また同様になります。
 ペースト先を変形させるとやっと中身が見える始末。

逆に、ペースト先を回転させて角をスカらせた場合は「重なってません」になります。
 スクリプトでtransform()をいじった方ならわかると思いますが、
座標値の評価はCoodinateSpaces.PARENT_COODINATES を使用していると思われます。
※ここだけ対応がメンドイので、スクリプトでは修正条件に含んでいます

最後に、フレーム枠同士はくっついていなくてもフレームの線がかぶっていれば、またこれも座標保持コースです。
 それにしても、なぜgeometricBoundsじゃないんだろう。。意味わからん。

というわけです。でーす。

…忘れるとこだった。今回、こちらを参考にさせて頂きました。感謝してこっそりTB。
手抜きLab@DTPの現場:eventListenerを利用してIndesignの挙動を変える
http://chuwa.iobb.net/mt/hoge-tb.cgi/345

…その後、重篤な見落としに気づき、修正してあります。
詳細はこちら

5 thoughts on “InDesign:イベントハンドラで「フレーム調整オプション」を粛正する

  1. 手抜きLabからやってきましたTenです。cgiいじり忘れてました。エラーが帰ってしまった事と思います。この場を借りてお詫び申し上げます。
    ごめんなさ〜い♥

  2. あ、どうも、このたびは大変助かりました。そんけーしてます!
     そして図星ww エラーでしたー。
    SDKさわろう →んじゃC++ですか →その前にCですか →よしひととおり基本おさえたからC++ →イミフ →でもでも、Cでも書けるんでしょ →SDK超イミフ
    という流れで結局Extendscriptしかさわってません。

  3. あ、どうも、このたびは大変助かりました。そんけーしてます!
     そして図星ww エラーでしたー。
    SDKさわろう →んじゃC++ですか →その前にCですか →よしひととおり基本おさえたからC++ →イミフ →でもでも、Cでも書けるんでしょ →SDK超イミフ
    という流れで結局Extendscriptしかさわってません。

  4. 大事な事なので、二回言いまry
    そんなあなたは、わたしと一緒にCS-SDKでAction Script使ってパネルづくりにはげめば良いのだと思います。
    詳しくは「Creative Suite SDK」もしくは、「CreativeSuite Extension Builder」でぐぐると幸せになれます。そうなんです、みなさんきっと幸せになれるんですw

  5. ぬぉお‥ ちょう大事なことだから3回ゆったつもりが(ry
    ActionScriptはMacに取っ手が付いた頃、LiveMotionでちびっとだけかじりましたよ。
    そう、世の中パネル8割ですよねー(言い切ったw)

(z-) へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

*