DelphiXE3・FireMonkey(FMX)で
俺はCADモドキを作る事が出来るのか?ネタ
線種。
DelphiXE3・FireMonkey(FMX)では、ImageやPaintBoxの
Canvas の Stroke.Dash に値を入れる事で、線種が
表現できる。

破線のすき間は、線幅に比例して大きくなる。まぁ、それはいいんだけれども、
実線・破線をランダムで 10万本描画する例。
線幅:2のとき。

線幅:4のとき。

線幅:10のとき。

太い方が、画面が混み入っていないから速い、って感じ?
2ドット線幅で描画することを考えた場合、単純に、線種指定時の描画がかなり遅くなります。VCLでの WindowsGDIでの描画の場合は、実線描画も破線描画も、それほど速度の差は無かったような気はします。しかし、ここまで違うとやはり考えてしまいます。
簡易描画=Stroke.Dashでの破線指定描画、詳細描画=プログラミングでの破線描画、というような区別はほとんど意味がありません。簡易描画にすれば速い、というメリットがあればいいですが、実質、簡易描画の方が遅い、という結果になりかねません。先に作った「JWV6」でも、簡易描画・詳細描画、という指定がないのは、簡易描画のほうが遅かったからです。
破線の設定は、
← 1ピッチ →
━━━━━ ━ ━━━━━
線分長さ 空白長さ 線分長さ 空白長さ
20mm 5mm 5mm 5mm
という感じで行いますが、
SXF的には、
1 continuous 実線
2 dashed 破線 6,1.5
3 dashed spaced 跳び破線 6,6
4 long dashed-dotted 一点長鎖線 12,1.5,0.25,1.5
5 long dashed double-dotted 二点長鎖線 12,1.5,0.25,1.5,0.25,1.5
6 long dashed triplicate-dotted 三点長鎖線 12,1.5,0.25,1.5,0.25,1.5,0.25,1.5
7 dotted 点線 0.25,1.5
8 chain 一点鎖線 12,1.5,3.5,1.5
9 chain double dash 二点鎖線 12,1.5,3.5,1.5,3.5,1.5
10 dashed dotted 一点短鎖線 6,1.5,0.25,1.5
11 double-dashed dotted 一点二短鎖線 6,1.5,6,1.5,0.25,1.5
12 dashed double-dotted 二点短鎖線 6,1.5,0.25,1.5,0.25,1.5
13 double-dashed double-dotted 二点二短鎖線 6,1.5,6,1.5,0.25,1.5,0.25,1.5
14 dashed triplicate-dotted 三点短鎖線 6,1.5,0.25,1.5,0.25,1.5,0.25,1.5
15 double-dashed triplicate-dotted 三点二短鎖線 6,1.5,6,1.5,0.25,1.5,0.25,1.5,0.25,1.5
16 未使用
17 ユーザー定義線種1
〜
32 ユーザー定義線種16
となっていて、ユーザー定義線種は、
線種名・セグメント数(2,4,6,8)・各長さの指定、
となっています。
線のピッチは、用紙に対する長さ指定です。尺度には関係しません。
で、プログラムでは、各ピッチの長さの実線を画面に順番に描画していく、という感じです。連続線の場合には、前の線から引き継いで、線種が綺麗に見えるようにします。また、クリッピングで途中の部分だけが画面に見える状態も、整合性のあるように描画することにします。
線が
始点●━━━ ━ ━━━ ━ ●終点
となると、終点が見えていないのに、端点をスナップ、っていう事になると、正直、よく分からなくなると思うので線の長さとピッチの長さをあわせみて、
始点●━━━━━━ ━ ━━━━●終点
ピッチの前後にいくらか伸ばした感じで描画するようにして、破線部は、ピッチの途中で終わらない、っていう風にします。なので、短い線の場合(1ピッチ長+α 未満)は、破線で指定していても、実線で見えるって事になります。
円、円弧、楕円、楕円弧、曲線、については、連続する補間円弧状態にして、最終的には連続する補間直線状態にしてしまいます。部分図の状態によっては、円・円弧も変形されて楕円・楕円弧のように描画される場合もありますから、注意が必要かも?という気はします。各種計算は、補間円弧毎に行うようにしようかなと思っています。
俺はCADモドキを作る事が出来るのか?ネタ
線種。
DelphiXE3・FireMonkey(FMX)では、ImageやPaintBoxの
Canvas の Stroke.Dash に値を入れる事で、線種が
表現できる。

破線のすき間は、線幅に比例して大きくなる。まぁ、それはいいんだけれども、
実線・破線をランダムで 10万本描画する例。
線幅:2のとき。

線幅:4のとき。

線幅:10のとき。

太い方が、画面が混み入っていないから速い、って感じ?
2ドット線幅で描画することを考えた場合、単純に、線種指定時の描画がかなり遅くなります。VCLでの WindowsGDIでの描画の場合は、実線描画も破線描画も、それほど速度の差は無かったような気はします。しかし、ここまで違うとやはり考えてしまいます。
簡易描画=Stroke.Dashでの破線指定描画、詳細描画=プログラミングでの破線描画、というような区別はほとんど意味がありません。簡易描画にすれば速い、というメリットがあればいいですが、実質、簡易描画の方が遅い、という結果になりかねません。先に作った「JWV6」でも、簡易描画・詳細描画、という指定がないのは、簡易描画のほうが遅かったからです。
破線の設定は、
← 1ピッチ →
━━━━━ ━ ━━━━━
線分長さ 空白長さ 線分長さ 空白長さ
20mm 5mm 5mm 5mm
という感じで行いますが、
SXF的には、
1 continuous 実線
2 dashed 破線 6,1.5
3 dashed spaced 跳び破線 6,6
4 long dashed-dotted 一点長鎖線 12,1.5,0.25,1.5
5 long dashed double-dotted 二点長鎖線 12,1.5,0.25,1.5,0.25,1.5
6 long dashed triplicate-dotted 三点長鎖線 12,1.5,0.25,1.5,0.25,1.5,0.25,1.5
7 dotted 点線 0.25,1.5
8 chain 一点鎖線 12,1.5,3.5,1.5
9 chain double dash 二点鎖線 12,1.5,3.5,1.5,3.5,1.5
10 dashed dotted 一点短鎖線 6,1.5,0.25,1.5
11 double-dashed dotted 一点二短鎖線 6,1.5,6,1.5,0.25,1.5
12 dashed double-dotted 二点短鎖線 6,1.5,0.25,1.5,0.25,1.5
13 double-dashed double-dotted 二点二短鎖線 6,1.5,6,1.5,0.25,1.5,0.25,1.5
14 dashed triplicate-dotted 三点短鎖線 6,1.5,0.25,1.5,0.25,1.5,0.25,1.5
15 double-dashed triplicate-dotted 三点二短鎖線 6,1.5,6,1.5,0.25,1.5,0.25,1.5,0.25,1.5
16 未使用
17 ユーザー定義線種1
〜
32 ユーザー定義線種16
となっていて、ユーザー定義線種は、
線種名・セグメント数(2,4,6,8)・各長さの指定、
となっています。
線のピッチは、用紙に対する長さ指定です。尺度には関係しません。
で、プログラムでは、各ピッチの長さの実線を画面に順番に描画していく、という感じです。連続線の場合には、前の線から引き継いで、線種が綺麗に見えるようにします。また、クリッピングで途中の部分だけが画面に見える状態も、整合性のあるように描画することにします。
線が
始点●━━━ ━ ━━━ ━ ●終点
となると、終点が見えていないのに、端点をスナップ、っていう事になると、正直、よく分からなくなると思うので線の長さとピッチの長さをあわせみて、
始点●━━━━━━ ━ ━━━━●終点
ピッチの前後にいくらか伸ばした感じで描画するようにして、破線部は、ピッチの途中で終わらない、っていう風にします。なので、短い線の場合(1ピッチ長+α 未満)は、破線で指定していても、実線で見えるって事になります。
円、円弧、楕円、楕円弧、曲線、については、連続する補間円弧状態にして、最終的には連続する補間直線状態にしてしまいます。部分図の状態によっては、円・円弧も変形されて楕円・楕円弧のように描画される場合もありますから、注意が必要かも?という気はします。各種計算は、補間円弧毎に行うようにしようかなと思っています。