|
図面の中には、図面枠・図面表題・図形・文章の他に、計算表や部品表などの表を作図する場合があります。通常は、線分データと文字データの集まりであったり、OLE機能等によって貼り付けられた表であったりする場合が多いです。前者のほうは、表を作図したあとの編集作業というのが大変ですし、文字は1つ1つバラバラですから表計算ソフトとのやり取り等も煩雑になってきます。範囲選択をして文字位置の並びを算出して表のセルを割り出す、というような事が必要かもしれません。後者のほうは、WindowsアプリケーションではOLE機能というのはよくある手法なのですが、重くなるという事、データのやり取りを行う際に、お互いに同じOLEサーバーとなるソフトが必要になってくる事、及び、CAD内部データとは切り離された感じがある事、などはあります。本ソフトウェアでは、OLE機能を実装する予定はありませんが、OLE機能を実装しているCADソフトウェアも多くありますので、この記事を御覧の方々は、必要と判断されたら、実装されるのも良いと思います。
ここでは、表データという独自データ要素を導入してみようかと思います。表データを実装するCADソフトウェアというのは余り多くないと思いますが、あれば便利になると思います。但し、機能はシンプルなものとします。
表の例:
| A | B | C | D |
1 | あいう | 1000 | 5 | 5000 |
2 | えお | 100 | 10 | 1000 |
3 | かき | 10 | 100 | 1000 |
表は、列(横;カラム)と行(縦;ロウ)から成り、表内の各枠をセルと呼びます。上記では5列・4行、となり、セルの数は5×4=20個あります。灰色のセルは実行時、入力・編集の出来ない固定(フィックス)セルであり、通常は、項目名や列数・行数等を記入した状態とします。各セル内には通常、文字や数値等を記入します。表計算ソフトの場合は更に細かく細分化されています。そして、セル内は、左寄せ・中央寄せ・右寄せ、の指定があります。更に HTMLや表計算ソフト等では、左右上下のセルとの結合が可能ですが、ここでは複雑になりすぎるので扱いません。
Delphiでは、画面上で「表」を扱うための、TStringGridコンポーネントがあります。表内の入力・編集にはこれをそのまま利用出来ると思われます。
表を構成するグラフィカル部分としては、表の罫線、セルの塗り潰し、セル内の文字、があります。罫線は線分データ、塗り潰しは塗り潰しデータ、セル内文字は文字データ、と同様のデータ項目を持つでしょう。また、表データのデータ項目としては、各列の幅、各行の高さ、各セル内の文字内容、各セル内の文字位置揃え、セルと文字の間隔、等があるでしょう。また、文字がセルの大きさをオーバーする場合にはどうするか?を決めておく必要があります。@そのまま表示、A非表示、B代替文字表示(「***」等)、C文字の大きさを小さくして納まるように表示、等です。これについては、文字データは、文字範囲幅・文字範囲高を扱うようになっていますから、それをそのまま利用するとC状態になるであろうと想定できます。
セル内の文字内容は、列×行の2次元配列の状態となるのは想定できます。文字位置揃えも同様となります。また、表計算を行うような場合は、計算式もデータとして含める必要がありますから、実際に利用するかどうかは別として、これも出来るようにします。列幅は、列毎に指定しますので、列数分の1次元配列となります。同様に、行高さは、行毎に指定しますので、行数分の1次元配列となります。罫線の色等・セル内塗り潰しの色等・セルの文字の間隔は共通とします。
幾何要素/表記要素|独自要素|表 |
パラメータ | 型 | 説明 | 範囲 |
Layer | Int | レイヤコード |
|
start_x | double | 配置点X座標 |
double(64bits)の
範囲(有効桁15桁) |
start_y | double | 配置点Y座標 |
double(64bits)の
範囲(有効桁15桁) |
b_pnt | Int | 配置基点(1:左下,2:中下,3:右下,4:左中,5:中中,6:右中,7:左上,8:中上,9:右上) |
|
Cols | Int | 列数(固定列数含む) | 0<列数 |
Rows | Int | 行数(固定行数含む) | 0<行数 |
FixCols | Int | 固定列数 | 0≦固定列≦列数 |
FixRows | Int | 固定行数 | 0≦固定行≦行数 |
ColWidth |
CArray
<double,double> | 各列の幅(配列) | 0≦幅 |
RowHeight |
CArray
<double,double> | 各行の高さ(配列) | 0≦高さ |
Gap | double | 罫線と文字の間の間隔 | 0≦間隔 |
line_color | Int | 罫線の色コード |
|
line_ltype | Int | 罫線の線種コード |
|
line_width | Int | 罫線の線幅コード |
|
cell_color1 | Int | セルの塗り潰し色 |
|
flg1 | Int | セルの塗り潰しの有無フラグ(0:無、1:有) |
|
cell_color2 | Int | 固定セルの塗り潰し色 |
|
flg2 | Int | 固定セルの塗り潰しの有無フラグ(0:無、1:有) |
|
text_color | Int | 文字の色コード |
|
Font | Int | 文字フォントコード |
|
Spc | double | 文字間隔 | 0≦間隔 |
align |
CArray
<Int,Int> |
セル内の文字位置揃え
(1:左、2:中、3:右)
(列数分の配列) |
|
str[257] |
CArray
<char,char>
<char,char> |
セル内の文字列
(列×行の2次元配列) |
0≦文字列長≦256
バイト |
calc[257] |
CArray
<char,char>
<char,char> |
セル内の計算式の文字列
(列×行の2次元配列) |
0≦文字列長≦256
バイト |
この表データ構造は、下記のようになります。
UnitData.pas |
TDataTable = record // 幾何要素/表記要素|独自要素|表
exf : Boolean ; // 存在フラグ(True:有り False:無し)
Layer : Integer ; // レイヤ(1〜256)
start_x : double ; // 配置基点X座標
start_y : double ; // 配置基点Y座標
b_pnt : Integer ; // 配置基点
Cols : Integer ; // 列数
Rows : Integer ; // 行数
FixCols : Integer ; // 固定列数
FixRows : Integer ; // 固定行数
ColWidth : array of double ; // 列幅
RowHeight : array of double ; // 行高さ
Gap : double ; // 罫線と文字の間の間隔
line_color : Integer ; // 罫線の色 (0:レイヤ色 1〜256)
line_ltype : Integer ; // 罫線の線種(0:レイヤ線種 1〜32)
line_width : Integer ; // 罫線の線幅(0:レイヤ線幅 1〜16)
cell_color1: Integer ; // セル塗潰色(0:レイヤ色 1〜256)
flg1 : Integer ; // セルの塗潰しの有無(0:無、1:有)
cell_color2: Integer ; // 固定セル塗潰色(0:レイヤ色 1〜256)
flg2 : Integer ; // 固定セルの塗潰しの有無(0:無、1:有)
text_color : Integer ; // 文字の色 (0:レイヤ色 1〜256)
Font : Integer ; // フォント (0:レイヤフォント 1〜1024)
Spc : double ; // 文字間隔
align : array of Integer ; // 位置揃え(1:左 2:中 3:右)
str : TStrGrid ; // 文字列 (最大256バイト)
calc: TStrGrid ; // 計算式 (最大256バイト)
end; |
データ登録は下記のようにします。
UnitData.pas |
function TDataClass.AddDataTable(s:string;lay,bp,co1,ro1,co2,ro2,
lco,llt,lwd,cc1,fl1,cc2,fl2,tco,fnt:integer;
px,py,pg,ps:double;cw,rh:array of double;
al:array of Integer; st,ca:TStrGrid) : Boolean; |
なお、二次元動的配列は関数の引数にそのまま利用出来ませんので、UnitFunc.pasにて、TStrGrid型として登録し利用しています。
これまでと同様、データ登録を行った後は、UnitDataGraph.pas内の全データ表示用の手続き DisplayAllData により画面表示を行います。その中で表データの表示は、同じく UnitDataGraph.pas内のDisplayTable手続きにて表示を行います。
UnitDataGraph.pas |
procedure DisplayTable(lay,bp,co1,ro1,co2,ro2,lco,llt,lwd,
cc1,fl1,cc2,fl2,tco,fnt:integer;
px,py,pg,ps:double;cw,rh:array of double;
al:array of Integer; st,ca:TStrGrid;t:TMatrix); |
表データは、部分図内、複合図形内、シンボル図形内にデータ登録出来るようにしています。その際、倍率・傾きにより表が変形状態となって平行四辺形になる場合がありますが、セル内の文字は、これまでの文字データと同様、変形されません。そのため、表とセル内文字が重なってしまう場合があります。そうならないような作図(データ登録)を行うよう注意する必要があります。
それでは、表データの登録・描画のテストです。
Unit1.pas |
var
st,ca:TStrGrid ;
・・・
SetLength(st,3,2);
SetLength(ca,3,2);
st[0,0] := 'あいう'; st[1,0] := 'AB'; st[2,0] := '100';
st[0,1] := 'エオ'; st[1,1] := 'CDE'; st[2,1] := '50';
ca[0,0] := ''; ca[1,0] := ''; ca[2,0] := '';
ca[0,1] := ''; ca[1,1] := ''; ca[2,1] := '';
CData.AddDataTable('' ,1,1, 3,2,1,1, 0,0,0, 15,1,16,1,
0,0, 100.0,50.0,1.0,1.0, [40,30,30],[10,10], [1,2,3], st, ca);
CData.AddDataTable('部分図A',1,1, 3,2,1,1, 0,0,0, 15,1,16,1,
0,0, 100.0,50.0,1.0,1.0, [40,30,30],[10,10], [1,2,3], st, ca);
st := nil ;
ca := nil ;
DisplayAllData ; // 全データ表示
・・・ |
これで描画をすると下記のような感じになります。
通常セルと固定セルは上記のように色で表現させる事が出来ますが、セル内文字としての扱いは同等です。が、例えば TStringGridコンポーネントを利用する場合には、固定セルの指定をして、通常セルのほうでは編集可能状態にする、というような事をすれば、固定セルでは文字入力できず、通常セルでは文字入力が可能、というようなインターフェイスは作成可能です。
セル内文字の文字高さを自由にしたい、文字装飾を行いたい、罫線に二重線や波線等を行いたい、等のような処理には対応していませんが、そのようにしたい場合には、データ項目内容を追加し、それに応じた表示プログラムにする必要があります。しかし、追加すればするほどプログラムは煩雑・複雑化していきますので、ここではなるべくシンプルに表を扱えるようにする、という事にしています。どうしても必要な場合には、それに応じたプログラミングを行ってみてください。
それでは、ここまでのテストプログラムです。実行ファイル、gdiplus.dll、gdipフォルダは入っていません。ソースのみです。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
▲PREV
▼NEXT
M7
Jw_cad
|