InDesign:「フレーム調整オプション」のイベントハンドラ修正

 

前回の修正になります。
うっかり、フレーム調整オプションをいじりきらないまま出してしまいました。
座標だけじゃダメに決まっている。反転、回転、スケールも影響を受けているに決まっている
すごいうかつでした。
※そしてスケール比、シアーの影響も当然ある。オメガ様よりご指摘あり。

とゆうわけで修正を加えつつ、CS4だけ腫れ物扱いするよう変更しました。
バージョンをチェック
・CS4なら「空のフレームにペースト:なし」にしつつ、反転、回転、をオリジナルから反映、座標を移動して終了
・CS5以降ならフレーム調整オプションを消去、そのまま次の処理へ
・(残るCS3、及びCS5以降の継続処理)再度、選択ハニー内へペーストして終了

ダウンロード先は前回のリンクからお願いします。上書きしてあります。


※2012.03.27_ところが91行目に凡ミスがありCS4以外ではまともに動かなくてすごくごめんなさい直しました
ver_e をご利用下さい。

でーす。

 

Facebooktwittergoogle_plus

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

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

Facebooktwittergoogle_plus

InDesign:せっかくだから俺はこの文字列を選ぶぜ

赤字訂正や部分流し込みなどの軽作業時、対象の文字列を何度も何度も同じパターンで選択するのに疲れたので、ちょっと作ってみました。

findingGREPforPOT2.jsx
InDesign CS3、CS4で動作確認(Mac)
たぶんCS5以降やWindowsでも動くと思います。

「検索と置換」ウィンドウ内のGREP検索設定を使って、検索結果の選択ハニーを作成するスクリプトです。
「検索と置換」ウィンドウ内の「検索」ボタンでも同様と言えますが、でかくて邪魔なんだよあんた。。
  あと検索範囲がころころ変わりやがるし。

一例として、このように。
 検索文字列、大文字小文字、半角全角、マスターページアイテム、ロックされたレイヤー、非表示レイヤー、検索形式など全て反映されます。
  ただ一点、検索範囲(すべてのドキュメント、ドキュメント、すべてのストーリー、ストーリー、選択範囲、など)だけ反映されません。ここだけスクリプトのパレット内で制御します。

パレット側の検索範囲は4パターン用意してあります。

でPleaseボタンをカチ。選択ハニー(テキストフレーム)内の検索結果が選択されます。
 元の選択ハニーが文字列だった場合、それに「噛む」検索結果が選択されます。

検索範囲が「選択範囲」以外の時は「選択文字列を含まない場合も有効」チェックが操作可能になります。「ストーリー」の場合、選択されていない連結フレーム内のテキストを指します。
この例の場合も上の図と同じ検索結果が選択される事となります。

やれカッコの中身を全部とか、
やれ任意の文字スタイルの部分全部とか、
やれ行頭ビュレットと「ここまでインデント」以降全部とか、
 そういうのをささっと選択できればいいと思うんです。

で、スクリプト名が「forPOT2」とありますが、
 しばらく忘れててもらっていいです。
ではでは

Facebooktwittergoogle_plus