|
さて、それでは簡易2D-CADソフト本体です。
と、その前に、先に作成したマウスポインタの絡みと、後で画面を見ながらコミュニケーションを取る際の情報をやり取りするため、現状の画面情報を登録するためのテーブルを作成する事を考えておきます(※後で変更するかもしれません)。
作業画面テーブル「WORKDISPLAY」(TABLE7)
名前 | 変数名 | 内容 |
作成者 | N | 整数 「MEMBER」の登録番号 |
図面番号 | ZN | 整数 「CADLIST」登録番号 |
画面位置X | PX | 整数 ドット値 |
画面位置Y | PY | 整数 ドット値 |
画面サイズX | SX | 整数 ドット値 |
画面サイズY | SY | 整数 ドット値 |
WindowX1 | WX1 | 倍実数 作図ウインドウ最小X |
WindowY1 | WY1 | 倍実数 作図ウインドウ最小Y |
WindowX2 | WX2 | 倍実数 作図ウインドウ最大X |
WindowY2 | WY2 | 倍実数 作図ウインドウ最大Y |
WindowScale | WSC | 倍実数 作図ウインドウ倍率 |
2D-CADソフトは線分・円・円弧・文字・寸法などを作図・編集してデータの保存・呼出し、印刷をするというのが基本機能となります。線分等には、色・線種(スタイル)・線幅(太さ)があります。作図編集をしやすくするためにレイヤ等があります。他にも種々属性やグループコード等が付けられる場合もありますがそれは除外するとして、
[線分]
・レイヤ
・色
・線種
・線幅
・始点座標X,Y
・終点座標X,Y |
[円]
・レイヤ
・色
・線種
・線幅
・中心座標X,Y
・半径(直径) |
[円弧]
・レイヤ
・色
・線種
・線幅
・中心座標X,Y
・半径(直径)
・開始角度
・終了角度(円弧角度) |
[文字]
・レイヤ
・色
・基点
・位置X,Y
(・第2位置X,Y)
(・傾き角度)
・文字高
・文字幅
(・文字間隔)
・フォント名
・文字内容 |
[寸法線]
・寸法の種類(水平寸法、垂直寸法、
平行寸法、弧長寸法、角度寸法、
並列寸法、累進寸法、直径寸法、
半径寸法、面取寸法、引出線、等)
・レイヤ
・色
・線種
・線幅
・端点関連
・各種設定値
・各種位置X,Y ・寸法値関連 |
のようにデータの種類・内容は様々です。寸法線は除外するとして、線分・円・円弧・文字を最大公約数的にまとめてしまって
・レイヤ
・色
・線種 又は 文字基点
・線幅
・第1位置X,Y
・第2位置X,Y 又は 半径,円弧第1角度
・文字高 又は 円弧第2角度
・文字幅
・文字間隔
・フォント名
・文字内容 |
というデータにするのも有り得ます。1データ1テーブルで済みますので管理し易いというメリットがあります。しかし、線分データの場合には不要な文字高・文字幅・文字間隔・フォント名・文字内容の分の容量が無駄に費やされますし、後々拡張したい場合にも結構困ってしまいます。そうなるとやはり、無理矢理に詰め込むよりも、多少複雑になりますが複数のデータテーブルで扱う方が無難なように思われます。
データベースのテーブルですのでこれまで同様に、要素番号を示すデータと、作成者を示すデータを追加する事と、作図順=描画順を管理するためのテーブルが必要になります。更に、アンドゥ・リドゥに対応するためのテーブルも必要になります(アンドゥ・リドゥ=元に戻す・やり直しが不要な場合には要りませんが)。その際、不要になるデータもずっと残ったままになりますが、どこかのタイミングで消す作業が必要になるかもしれません。
ここでは対応しませんが、ブロック図形(子図形)や外部参照図形に対応する場合には、そのための仕組みを考える必要は出てきます。
レイヤについては、多くのCADの場合、256個まで扱えます。AutoCADの場合は定義した分だけ自由に扱えますが、そのようなCADは、AutoCADカーネルのCADやAutoCAD互換と言われるCAD以外では余り無い様子です。SXF仕様でも256個までです。ですのでここでは最大256個まで=レイヤ値は 0〜255 とします。AutoCADでは「ByLayer」というシステムがありますが、そういったレイヤ依存色・レイヤ依存線種・レイヤ依存線幅、にも対応しようと思います。レイヤ名は、AutoCADのR14までは31文字まで、2000以降は255文字まで、SXFレベル1では32文字まで、レベル2では256文字まで、ですが、正直な話、レイヤ名に 255文字も使う事は無いと思われますが、255文字まで扱えるようにします。一般の ShortStringの場合 255文字までで、256文字だとオーバーしますから255文字までとします(※FirebirdのVARCHARでは256文字も可能です)。尺度はレイヤ毎に指定出来るものとします。線種のピッチ・線幅は尺度を考慮しない値です。座標原点は用紙中央としますので、作図後に尺度を変更した場合には、中央合わせでの変更となります。
色については、旧版のAutoCADの場合は 1〜7の基本7色+グレー+拡張色で 1〜255の値が扱えます。SXF仕様では、1〜16の既定色+17〜256のユーザー定義色の合計256色が扱えます。ここでは、SXFに似せて、1〜255の値を扱えるようにします。なお、背景色は「白」としますが、色値で白色を指定する事も出来ますがその場合、その線分等は背景色と同じとなって画面上見えなくなるかもしれません。白色で塗り潰して線を消すという事も考えられますのでそのままにしていますが、CADによっては白色を黒色で表示するものもあります。
線種については、AutoCADの場合は定義した分だけ自由、となっていますが、そういうタイプは珍しく大抵のCADの場合、数は決まっています。SXF仕様では、既定15+未使用1+ユーザー定義16=32種類、となっていますのでこれに合わせて、1〜32の値を扱えるようにしようと思います。線分の長さが線種ピッチ未満の場合には、実線として表示されます。両端の自動調整は行いません。
線幅については、基本的に自由でいいと思いますが、SXF仕様では既定9+未使用1+ユーザー定義6=16種類となっています。SXF対応を考えるのであればこれと同じようにするのが良いのですが、テーブルが増えすぎるのも何ですし、ここでは、データ量節約のため単整数(SMALLINT)として扱う事とし、100倍値を整数化して登録する事とします。単整数の範囲は -32,768〜32,767 ですがマイナス値は無視するとして線幅に 327.67mmまで扱える事になりますから十分であろうと判断します。なお、仮に印刷機能を実装した場合、0.01mmとしても使用プリンタが対応しておらず(解像度(dpi)が大きい場合)それよりも太く印刷されてしまう、という事にはなると思われます。
以上、レイヤテーブル、色テーブル、線種テーブル、が必要となります。これらのレコード数は固定となります。最初にテーブルを作成してしまい、データ変更によって対応する事とします。線分などの要素データにて、色を「0」、線種を「0」、線幅を「0」指定した場合は、レイヤ依存色/線種/線幅として扱い、レイヤテーブルで定義した色・線種・線幅にて画面表示を行うものとします。
レイヤテーブル「LAYER_〜」(TABLE8)
名前 | 変数名 | 内容 |
登録番号 | N | 単整数 0〜255 他と重複しない |
レイヤ名 | LNAME | 文字(最大半角255文字) |
表示 | VISI | 単整数 0:非表示 1:表示 |
印刷 | PRN |
単整数 0:印刷しない 1:印刷
※印刷時、非表示のレイヤも印刷しない |
レイヤ依存色 | COL | 単整数 1〜255 |
レイヤ依存線種 | LTP | 単整数 1〜32 |
レイヤ依存線幅 | WID | 単整数 1〜30000 100倍値 |
尺度 | SCL | 倍実数 1/100=0.01 |
色テーブル「COLOR_〜」(TABLE9)
名前 | 変数名 | 内容 |
登録番号 | N | 単整数 1〜255 他と重複しない |
色名 | CNAME | 文字(最大半角255文字) |
色値 | COL | 整数 $000000〜$ffffff |
線種テーブル「LTYPE_〜」(TABLE10)
名前 | 変数名 | 内容 |
登録番号 | N | 単整数 1〜32 他と重複しない |
線種名 | SNAME | 文字(最大半角255文字) |
セグメント数 | SN | 単整数 0,2,4,6,8 0:実線 |
線分長さ1 | P1 | 単整数 mm値 100倍値 0:点 |
空白長さ1 | P2 | 単整数 mm値 100倍値 |
線分長さ2 | P3 | 単整数 mm値 100倍値 0:点 |
空白長さ2 | P4 | 単整数 mm値 100倍値 |
線分長さ3 | P5 | 単整数 mm値 100倍値 0:点 |
空白長さ3 | P6 | 単整数 mm値 100倍値 |
線分長さ4 | P7 | 単整数 mm値 100倍値 0:点 |
空白長さ4 | P8 | 単整数 mm値 100倍値 |
線分長さ5 | P9 | 単整数 mm値 100倍値 0:点 |
空白長さ5 | P10 | 単整数 mm値 100倍値 |
点は丸で表示します。四角(※長円状態になります)で表示したい場合には小さい値を指示して下さい。線幅によって大きさは変わります。線幅によっては線種が潰れてしまう場合が出てくるでしょう。線種尺度は線種の管理がしにくくなりますので対応しません。
共通変数用テーブル「VAR_〜」(TABLE11)
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1のみ使用 |
操作番号 | OPN | 整数 操作手順グループ番号 |
各PC間で共通利用する変数のためのテーブルです。特殊なテーブルで、レコードは1つのみとなります。
アンドゥ・リドゥ対応テーブル「HISTORY_〜」(TABLE12)
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
操作番号 | OPN | 整数 操作手順グループ番号 |
モード | MD |
単整数 0:追加 1:削除
(※変更は削除+追加で対応) |
要素番号 | EN | 整数 「ENTITY_〜」の登録番号 |
各要素管理テーブル「ENTITY_〜」(TABLE13)
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
作成者 | MN | 整数 「MEMBER」の登録番号 |
データ状態 | DS | 単整数 0:無効 1:有効 |
データ種類 | DT | 単整数 1:線分 2:円 3:円弧 4:文字 |
データ番号 | DN | 整数 「ENT_〜_〜」の登録番号 |
取りあえずここでは、線分・円・円弧・文字 について考えます。寸法線やその他については考えていませんが拡張についてはさほど難しくないと思われます。
要素−線分テーブル「ENT_LINE_〜」(TABLE14)
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
レイヤ | LAY | 単整数 0〜255 「LAYER_〜」の登録番号 |
色 | COL | 単整数 0:レイヤ依存色 1〜255 |
線種 | LTP | 単整数 0:レイヤ依存線種 1〜32 |
線幅 | WID | 単整数 0:レイヤ依存線幅 1〜30000 |
始点X | X1 | 倍実数 実寸座標値[mm] |
始点Y | Y1 | 倍実数 実寸座標値[mm] |
終点X | X2 | 倍実数 実寸座標値[mm] |
終点Y | Y2 | 倍実数 実寸座標値[mm] |
要素−円テーブル「ENT_CIRCLE_〜」(TABLE15)
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
レイヤ | LAY | 単整数 0〜255 「LAYER_〜」の登録番号 |
色 | COL | 単整数 0:レイヤ依存色 1〜255 |
線種 | LTP | 単整数 0:レイヤ依存線種 1〜32 |
線幅 | WID | 単整数 0:レイヤ依存線幅 1〜30000 |
中心X | CX | 倍実数 実寸座標値[mm] |
中心Y | CY | 倍実数 実寸座標値[mm] |
半径 | CR | 倍実数 実寸座標値[mm] |
要素−円弧テーブル「ENT_ARC_〜」(TABLE16)
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
レイヤ | LAY | 単整数 0〜255 「LAYER_〜」の登録番号 |
色 | COL | 単整数 0:レイヤ依存色 1〜255 |
線種 | LTP | 単整数 0:レイヤ依存線種 1〜32 |
線幅 | WID | 単整数 0:レイヤ依存線幅 1〜30000 |
中心X | CX | 倍実数 実寸座標値[mm] |
中心Y | CY | 倍実数 実寸座標値[mm] |
半径 | CR | 倍実数 実寸座標値[mm] |
開始角度 | SA | 倍実数 [°] 反時計回り+ 0〜359.… |
終了角度 | EA | 倍実数 [°] 同上 開始角度と異値 |
要素−文字テーブル「ENT_TEXT_〜」(TABLE17)
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
レイヤ | LAY | 単整数 0〜255 「LAYER_〜」の登録番号 |
色 | COL | 単整数 0:レイヤ依存色 1〜255 |
スタイル | STL |
単整数 +1:斜体 +2:太字
+4:下線 +8:中線 +16:上線 |
基点 | BAS |
単整数 0:左下 1:中下 2:右下
3:左中 4:中中 5:右中
6:左上 7:中上 8:右上 |
向き | DIR | 単整数 0:横書き 1:縦書き |
位置X | PX | 倍実数 実寸座標値[mm] |
位置Y | PY | 倍実数 実寸座標値[mm] |
文字高 | MH | 倍実数 実寸座標値[mm] |
文字幅 | MW | 倍実数 実寸座標値[mm] |
文字間隔 | MD | 倍実数 実寸座標値[mm] |
文字角度 | ANG | 倍実数 [°] 反時計回り+ 0〜359.… |
フォント | FNT | 文字(最大半角80文字) |
文字内容 | TXT | 文字(最大半角255文字) |
Windowsのフォント指定に文字間隔というのはありませんが、プログラム内部で、フォントを固定ピッチとして指定し、文字を1文字ずつバラバラに表示するようにしてその際に文字間隔を計算するようにします。縦書きの場合には、縦書き用フォント(@〜のフォント)を指定する事とします。指定したフォントがない場合には「MS ゴシック」で描画する事とします。
CADソフトによっては、文字の大きさを尺度を考慮しない値で作図・データ保持する場合もありますが、ここでは実寸値で指定するものとしています。尺度変更の際、文字の大きさが固定される事により寸法線や表などとぶつかってしまったりバランスが悪くなるから、という事にしていますが、印刷時の文字の見やすさを考えて文字の大きさは固定化された方がいいというケースもあります。後者の場合には若干作り方が異なってきますので注意して下さい。
文字の作図では、基点+位置指定のほか、2点指定による手法もあります。AutoCADでの「左右合わせ」「フィット」に相当する機能や、2点指定+左合わせ/中央合わせ/右合わせを行う手法もありますが、ここでは対応していません。もし必要な場合には、その機能とそれ用のデータの実装を行う必要がありますので注意して下さい。
AutoCAD/DXFファイルとの互換性を第一に考えてCADを作成する場合には、データ構造を DXFファイルとよく似せておくのが後々メリットが出てきます。また、SXFレベル2仕様との互換性を第一に考えるならば、データ構造をそれに合わせておくのが良いです。
ここでは行いませんが、後々のスナップや変形のために、各座標点用のテーブルを別に用意しておく、という手法があります。例えば
座標点テーブル「ENT_PNT_〜」
名前 | 変数名 | 内容 |
登録番号 | N | 整数 1,2,3,… 他と重複しない |
レイヤ | LAY | 単整数 0〜255 「LAYER_〜」の登録番号 |
種別 | TYP | 単整数 点の種別を示す値 |
位置X | X | 倍実数 実寸座標値[mm] |
位置Y | Y | 倍実数 実寸座標値[mm] |
等のようなテーブルを作成し、線分の始点・終点、円の中心点、円弧の中心点・開始角度点・終了角度点、文字の配置点、をこの登録番号を参照するようにしたりします。レイヤ状況や参照状況に依る場合もあるでしょうけれども、スナップする際には、各要素のテーブルを参照するのではなくこのテーブルだけを参照すれば良い等というような事が出来るやもしれません。データを登録する時に登録・参照をするのではなく、画面表示の際に、スナップのためだけにテーブルデータを作成して、それを参照してスナップする、という手法も考えられます。そうすればマウスを端点に近づけただけで自動的にマークが表示されて、というようなオートスナップ機能を作りやすくなるかもしれません。などと色々と考えてみるのも面白いと思います。
それでは各テーブルの実装の前に、一覧画面から白紙状態のCAD作図画面を表示する事を考えます。画面の拡大縮小はこれまで「CADつくろ」コーナーや外部変形で既に作成したように、マウスの両ボタンドラッグによる拡大縮小、マウス両ボタンクリックによる画面移動、マウスホイール回転による拡大縮小、マウスホイールボタンドラッグによる画面移動、キーボードによる拡大縮小移動、を実装しています。マウスホイールは画面のフォーカス等の条件やタイミングで反応しなくなる場合がありますが、画面のフォーカスを変更したりしていれば直ります。
一覧表をダブルクリック
又は[CAD]ボタンをクリック
↓
ここまでのソースプログラムを圧縮しています。
各画面やプログラム内容は下記で確認して下さい。
|
|
|
バッチファイル
BASIC
C言語のお勉強
拡張子な話
DOSプログラム
Delphi
シェアウェア
Script!World
データベース
A B C D
E F G H
I J K L
M N O P
Q R S T
U V W X
Y Z
|