AFsoft WebSite(エーエフソフト・ウェブサイト)
 

オペレーティング・システムについて

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:図形描画(2)
前頁の続きで図形を画面に描画する手法について考えてみます。
 
前頁で GDI、GDI+、Direct2Dで線をドット指定で描画する簡単なサンプルを作成しました。ですがCADの場合は、線分をドット値で描画するのではなく、mm値で描画するのが通例です。その為、mm値をドット値に変換する必要がありますが、これは単純に係数を掛けるだけと考えます。
ドット値 = mm値 × 変換係数
この変換係数を使えば逆に
mm値 = ドット値 ÷ 変換係数
としても利用出来ます。これについては既に、「CAD作ろ!」コーナーの「ドットとmm」以降でも記述していますが、PaintBox1の横幅ドット数をA3用紙(横)の横幅とちょうどの大きさにしたいとします。A3用紙(横)の横幅は420mmですから、変換係数は、PaintBox1.Width÷420 となります。これを変数 mm_dot に入れるとします。
例えば、420mmの水平線を描きたい場合、
 420×mm_dot=420×PaintBox1.Width÷420=PaintBox1.Width=横幅一杯
となりますから、辻褄が合っているのが分かります。
 
また、PaintBox1の縦を A3用紙(横)の縦幅とちょうどの大きさにしたいとします。この場合は、mm_dot=PaintBox1.Height÷297 とすれば良いです。こうすることで、横フィット表示、縦フィット表示、のような事が出来ます。ただ、一杯一杯の状態だと、用紙枠を表示する場合にその線が見えなくなる事もありますので、やや小さめにします。例えば、上下左右2ドット分あけるとすれば、(PaintBox1.Width-4)÷420、(PaintBox1.Height-4)÷297 のようにすれば良いでしょう。用紙全体を表示させたい、という場合は、この2値のうち小さい方を採用すればいいでしょう。
 
このmm_dot値を変更することで、画面の拡大・縮小も出来るようになります。例えばこの値を2倍にする事によって、現在の画面描画を2倍で拡大表示する事になります。逆に1/2倍にする事によって、縮小表示する事が出来るようになります。画面移動は、得られる値に移動量をプラスマイナスします。
 
さて、mm値をドット値にするだけでは図形描画は出来ません。図形をどこに表示するのかを確定しなければならないからですが、そのためには、座標系を考えないといけません。座標系を考えるにはまず原点をどこにするか、という事です。
 
従来のCADソフトの場合、特に機械系の場合には、原点を中央としているものが多かったようです。これは、用紙サイズや尺度を変更する場合、中心を固定点として変化させたい、というのがあったというのが1つ。画面中央を基準をする場合が多いというのが1つ。また、グリッドタイプ(ペーパームーブ型)のプロッタの原点が中央だった、というのも1つの理由かもしれません。
ですが、建築・土木系CADソフトの場合、原点を左下としているものが多いようです。こうすることによって各図形の座標を全てプラス値として扱えるという事や、用紙左下隅のほうが<固定>という感じがする(中央だと浮いている感じがする)という事だったかもしれませんし、また、フラットベッドタイプのプロッタの原点が左下だった、という事も1つの理由かもしれません。
 
SXF仕様はどちらかというと機械系というよりは建築・土木系という感じなので、原点も左下ですから、これに合わせたいと思います。そして、X軸プラス方向は右方向、Y軸プラス方向は上方向、となります。
 
しかしドット指定な画面描画では、原点は左上、X軸プラス方向は右方向ですがY軸プラス方向は下方向となっています。ですのでこれを考慮した座標変換を行わなければなりません。
用紙mm座標系
(Y+)
 

│(0,0)
+─→ (X+) 
   画面ドット座標系
+─→ (X+) 
│(0,0)

 
(Y+)
 
機械系CAD的な原点中央パターンでは、
ox := PaintBox1.Width div 2;  // 画面中央
oy := PaintBox1.Height div 2;
x1 := ox + (mm座標X)*mm_dot ;
y1 := oy - (mm座標Y)*mm_dot ;
のようになり、画面操作も中心を基準として描画されます。

 
それでは原点左下パターンではどうなるかというと
ox := 2 ;  // 画面左下
oy := PaintBox1.Height - 2 ;
x1 := ox + (mm座標X)*mm_dot ;
y1 := oy - (mm座標Y)*mm_dot ;
のようになり、画面操作も左下を基準として描画されます。

 

 
いや、画面描画はやはり中央合わせにはしたい、という事であれば、表示位置を補正する必要がありますが多少ややこしくなってきます。それよりは、座標中央パターンを操作するほうが簡単です。
ox := PaintBox1.Width div 2;  // 画面中央
oy := PaintBox1.Height div 2;
x1 := ox + (mm座標X - CData.zp.x/2.0)*mm_dot ;
y1 := oy - (mm座標Y - CData.zp.y/2.0)*mm_dot ;
(※CData.zp.x:用紙横長さ、CData.zp.y:用紙縦長さ)
 
画面(PaintBox1)に用紙を表示させたい場合は、下記のようになります。
mx := (PaintBox1.Width - 4)/CData.zp.x ;
my := (PaintBox1.Height- 4)/CData.zp.y ;
if (mx < my) then
 mm_dot := mx
else
 mm_dot := my ;
 
ox := PaintBox1.Width div 2;  // 画面中央
oy := PaintBox1.Height div 2;
x1 := ox + (0.0 - CData.zp.x/2.0)*mm_dot ;
y1 := oy - (0.0 - CData.zp.y/2.0)*mm_dot ;
x2 := ox + (CData.zp.x - CData.zp.x/2.0)*mm_dot ;
y2 := oy - (CData.zp.y - CData.zp.y/2.0)*mm_dot ;
 
線分(x1,y1)〜(x2,y1) の作図
線分(x2,y1)〜(x2,y2) の作図
線分(x2,y2)〜(x1,y2) の作図
線分(x1,y2)〜(x1,y1) の作図
 
実際の線分の描画では、画面からはみ出す線のことを考慮しないといけません。GDI+とDirect2Dの場合には座標値に実数値を指定出来ますのでまだ良いのですが、GDIの場合には座標値は整数=-32768〜32767の範囲内の値、となりますので、クリッピング処理が必要となります。クリッピング処理は、はみ出した線をカットしたり、完全に画面領域外のものは描画しない、というような処理です(「CAD作ろ!」コーナーの「クリッピング」等で既に記載済み)。
 
 
それではここまでのテストプログラムです。実行型ファイルは、サイズが大きくなるので含めていません。ソースだけです。前回含めた gdipフォルダ内のプログラムは追加修正していませんのでここには含めていません。
 
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
 ▲PREV
 ▼NEXT
M7
Jw_cad
 
お問い合わせ 
本サイトはリンクフリーです
リンクバナー
(C)Copyright 1999-2015 By AFsoft All Rights Reserved.