Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード Twitter

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2008-09-23

[][][]cellのoverflowsは実行中に再評価されない

勉強部屋へ書き込んだのでメモ。「セル内のオーバーフローを解消するスクリプト」

http://www2.rocketbbs.com/11/bbs.cgi?id=thats&mode=pickup&no=1784

たしかに、こんな感じに書いたとしても、長体10%まで処理が止まりません。

var sel = app.activeDocument.selection[0];
for (var i = 0; i < sel.cells.length; i++) {
	var txtObj = sel.cells[i];
	var danraku = txtObj.paragraphs[-1];
	for (var w=danraku.horizontalScale; w >= 10; w--){
		if (txtObj.overflows == false) {break}
		danraku.horizontalScale = w;
	}	
}

ためしにこのスクリプトの一番最後に

eval ("app.activeDocument.selection[0].cells[0].overflows;");

とか

app.doScript("app.activeDocument.selection[0].cells[0].overflows;", ScriptLanguage.JAVASCRIPT);

または

app.doScript("overflows of item 1 of selection of application \"Adobe InDesign CS3\"", ScriptLanguage.APPLESCRIPT_LANGUAGE);

なんて書いて、強制的に再評価したとしてもやはりtrueが返ってきます。スクリプトの実行が終わるまで再描画がされないってことでしょうか。ふつうのtextFrameがターゲットならうまく動作するのに。


ほぼ同じことをAppleScriptで書いてみます。

tell application "Adobe InDesign CS3"
	tell document 1
		repeat with i in every cell of selection
			set w to horizontal scale of paragraph -1 of i
			repeat while overflows of i
				set w to w - 1
				if w < 10 then exit repeat
				set horizontal scale of paragraph -1 of i to w
			end repeat
		end repeat
	end tell
end tell

こちらは問題なく動作します。若干遅いですけれど。

回避方法としては、overflowsを評価する前に当該オブジェクトをrecompose()するとよいようです。コンポーザを再評価(再計算)するってことかな。

var sel = app.activeDocument.selection[0];
for (var i = 0; i < sel.cells.length; i++) {
	var txtObj = sel.cells[i];
	var danraku = txtObj.paragraphs[-1];
	for (var w=danraku.horizontalScale; w >= 10; w--){
		txtObj.recompose();//★ここ
		if (txtObj.overflows == false) {break}
		danraku.horizontalScale = w;
	}	
}

多用すると速度低下を招くかもしれませんけれど、このrecompose()は結構応用範囲が広いような気がします。

fourfour 2008/09/23 09:30 実は...... Intel Mac で使うようになってから cellのoverflowsの再評価の件は悩んでいました。
ターゲットは相変わらず SC2ですが。

せうぞーさんは AppleScriptの場合は問題ないと書かれていますが、AppleScriptでも再評価されない時がありました。ほとんど正しく再評価してくれるのですが、少ない確率でオーバーフローしていないにも関わらず、していると判断されてしまうのです。しかも、実行するたびにそれが発生する場所が違います。作業者からエラー報告があっても、再現性がなく困っていました。少ない確率と言っても700ページほどあると無視できない数が発生します。

recompose 試してみます。recompose 見覚えがありますが、CS2で使えたかな? 半月ほどで報告できると思います。

seuzoseuzo 2008/09/23 11:01 わたしもIntel Macです。
そうですか、再現がまちまちってのはイヤですねえ。たちわるい。
こういう報告をいただけると、嬉しいですね。

seuzoseuzo 2008/09/23 11:16 あ、recomposeはCS2にもあります。
いわゆる「ストーリーの再計算」だと思うんですよ。スクリプトからだと、オブジェクト単位で再計算できるってことではないですかね。だから、再計算の副作用としてcellのoverflowsが再評価んじゃないでしょうか。

最近、fourさんの露出が少なくて寂しく思っております。

chatachata 2009/06/03 15:52 どっかでみたことあるソースだと思ったら、師匠(人はそう呼ぶ)のでしたか。
同僚が「空のセルがあると止まるぅ〜」とか悶絶してたので、悩んだあげく4 if ( txtObj.contents == "" ) { continue; } とかつっこんだ思い出が…。

seuzoseuzo 2009/06/03 16:35 御意。
すべてのセルが文字を持ってると思ったら大間違いだってことですね。
ご指摘ありがとうございます。

chatachata 2009/06/03 19:02 あ、ごめんなさい。言い方(書き方)がまずかったです。
指摘ではなく、ただの“カスタマイズ”デス。

当時「recompose」ってなんぞ?ってなって、印象深いスクリプトでした。
「どっから拾ってきたの?」て聞いたら、どっかの掲示板つってたんで、ここだとは思わなかったッス。
勉強させて頂きました。ありがとうございました。

seuzoseuzo 2009/06/04 02:42 いえいえ。
わたしは大雑把な上に怠惰をまぶしたようなところがあります。
どんなことにせよ、ご指摘をいただくのは、たいへんありがたく思っています。
これからもどうぞよろしくお願いいたします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証