KoMaDo   VISIO SQUARE : ShapeSheet  ■ Headline ■ HOME    

ShapeSheetトップへ ▼カッ飛び最後 

  シェイプの大きさにぴったりなフォントサイズ

01: 名前:りゅん投稿日:2006/02/11(土) 21:08
この掲示板を参考にさせていただいたり試行錯誤した結果、
TEXTWIDTH とフォントサイズの関係は、こんな関係なのかなと推測してやってみました。

TEXTWIDTH(TheText) = Size("text") * Char.Size + Offset("text")
Size(): 単位フォントサイズのときの text の幅
Offset(): フォントサイズによらない、text だけから求まるオフセット

で、以下のようにやって、それなりの動作をするものが出来たのですが、
この方法では、ダミーのシェイプを2つ使って、実際に書かないとテキストの幅が求められません。
もっと、スマートなやり方はないでしょうか?

Sheet.1
Scratch.A1 (線の幅)
: LineWeight*(LinePattern<>0)*(Geometry1.NoLine=False)
Scratch.X1 (描画領域の幅)
: Width-LeftMargin-RightMargin-Scratch.A1
Scratch.Y1 (描画領域の高さ)
: Height-TopMargin-BottomMargin-Scratch.A1
Scratch.X2 (テキストのオフセットの幅)
: Sheet.2!TxtWidth*2 - Sheet.3!TxtWidth
Scratch.Y2 (テキストのオフセットの高さ)
: Sheet.2!TxtHeight*2 - Sheet.3!TxtHeight
Scratch.X3 (Sheet.2!Char.Size でのテキストのオフセット抜きの幅)
: Sheet.2!TxtWidth - Scratch.X2
Scratch.Y3 (Sheet.2!Char.Size でのテキストのオフセット抜きの高さ)
: Sheet.2!TxtHeight - Scratch.Y2
Scratch.A3 (描画領域の幅とテキストの幅の比)
: Scratch.X1 / Scratch.X3
Scratch.B3 (描画領域の高さとテキストの高さの比)
: Scratch.Y1 / Scratch.Y3
Scratch.C3 (幅の比と高さの比の小さい方)
: MIN(Scratch.A3, Scratch.B3)
Char.Size (描画領域いっぱいになるテキストのフォントサイズ)
: Sheet.2!Char.Size * Scratch.C3

Sheet.2
テキスト: SHAPETEXT(Sheet.1!TheText)
Char.Size: 12 pt
LeftMargin, RightMargin, TopMargin, BottomMargin: 0 pt
TxtWidth: TEXTWIDTH(TheText)
TxtHeight: TEXTHEIGHT(TheText, TxtWidth)

Sheet.3
テキスト: SHAPETEXT(Sheet.1!TheText)
Char.Size: Sheet.2!Char.Size * 2
LeftMargin, RightMargin, TopMargin, BottomMargin: 0 pt
TxtWidth: TEXTWIDTH(TheText)
TxtHeight: TEXTHEIGHT(TheText, TxtWidth)

02: 名前:yoda投稿日:2006/02/12(日) 06:17
こんなに書かれたのでは、読むのもめんどうですし、テストするのも
大変です。作品を、upload bbs にアップロードしてください。

03: 名前:りゅん投稿日:2006/02/19(日) 18:14
遅くなりまして申し訳ありません。
編集可能なファイルは社外に出しにくい環境なので、長文になってしまいました。

Sheet.1 の Char.Size を一つにまとめるとこのようになります。
#このBBSの仕様が分からなかったので、適宜改行を入れています。
Sheet.2!Char.Size
*MIN((Width-LeftMargin-RightMargin-(LineWeight*(LinePattern<>0)*(Geometry1.NoLine=FALSE)))
/(Sheet.2!TxtWidth-(Sheet.2!TxtWidth*2-Sheet.3!TxtWidth))
,(Height-TopMargin-BottomMargin-(LineWeight*(LinePattern<>0)*(Geometry1.NoLine=FALSE)))
/(Sheet.2!TxtHeight-(Sheet.2!TxtHeight*2-Sheet.3!TxtHeight)))

究極的に聞きたいことは、
シェイプの大きさにあわせてフォントサイズを変えるにはどうすればいいでしょうか?
です。

自分なりに試行錯誤した結果、問題をブレイクダウンして以下2点の疑問が出てきました。
1.TEXTWIDTHには実際の文字の幅と指定したマージン以外に、文字列固有の謎のオフセットがあるように感じました。
オフセットがあるとしたら、そのオフセットは何らかの方法で求められませんか?
2.実際にダミーを2つ書いて、連立方程式を解く感じでオフセットを求める方法しか思いつきませんでした。
他にないでしょうか?

私に思いつかない別のアプローチもあるかと思って、こちらに質問させてもらいました。

04: 名前:yoda投稿日:2006/02/19(日) 20:21
CharacterセクションのSizeセルに、次のような関数を入れると、
一応、シェイプの幅に合わせて、フォントサイズが変わります。
GUARD(Width/LEN(SHAPETEXT(TheText))*1.3) この、1.3 は、
これで良いのかどうか、自信がありません。

05: 名前:りゅん投稿日:2006/02/25(土) 22:15
またまた遅くなりまして申し訳ありません。
どの文字も同じ大きさと仮定する方法ですね。すっきりしてきれいですね。
改行文字をうまく探して、行数、最長行を求めればできますね。
ちょっとすぐには思いつかないですけど、考えてみます。
ありがとうございました。


ShapeSheetトップへ ▲カッ飛び先頭