|
「SXF仕様書」の「図面情報」の次は「図面構造」ですが、図面構造フィーチャには以下のようなものがあります。
・用紙フィーチャ
・レイヤフィーチャ
・既定義線種フィーチャ、ユーザ定義線種フィーチャ
・既定義色フィーチャ、ユーザ定義色フィーチャ
・線幅フィーチャ
・文字フォントフィーチャ |
前頁では「レイヤ」でしたので、ここでは「線種」について見てみますが、その前に、前頁でレイヤの削除用関数やレイヤのデータ項目の存在フラグは今回より取り止めますので御注意下さい。
NEC PC-9801・DOS時代では、線等の描画を行うにはグラフLIO・グラフBIOSというものがよく利用されていました。前者は少し高機能な分、やや遅い、後者は速い分、機能が少ない、という長所・短所があり、CADの場合は高速性を問われる事が多かったためグラフBIOSを利用する事が多かったようです。PC98ハイレゾの場合は、グラフLIOがなく、グラフBIOSがPC-9801ノーマルのグラフLIOに近く、PC-9801のグラフBIOSに相当するものが提供されていませんでした。その為、PC-98ハイレゾでは GDC(グラフィックのチップ)を直接アクセスするようなプログラムを作る場合が多かったようです。その後、DOSでグラフィックドライバ GRAPH.SYS、PC-98マルチでAVグラフィックスドライバが提供されるようになりましたが、若干遅かったようで、これを利用するCADはそんなには無かったようです。
そういった時代、線種はどのように扱っていたのかというと、16bit(16ドット)でドットパターンで表現をしていました。例えば破線の場合、
1111000011110000 → ── ──
1100110011001100 → ─ ─ ─ ─
1010101010101010 → - - - - - - - -
という具合です。
これらは16進数にすると、F0F0h、CCCCh、AAAAh、となり、線分や円弧の描画に利用されたりしました。なお、PC-9801ノーマルでのグラフLIO、PC-98ハイレゾでのグラフBIOSが余り利用されなかったのは、円弧に線種を指定する事が出来なかったという事も1つの理由かもしれません。
プロッタの方は、というと、CADソフトでの線種ドット表現をそのまま利用するのではなく、プロッタ言語(HP-GL)の方で線種の指定というのがありまして、CADソフトからはプロッタの線種指定を行うようになっていました。プロッタで線種ピッチの指定もあり、長さ調整は出来るようになっていました。EPSON社やCanon社のレーザープリンタではそれぞれ、ESC/Page言語、LIPS言語というものを搭載し、状況は多少異なるのですが、それぞれ線種指定命令はありました。
そして Windowsになると、Windowsでの描画は WindowsGDIを利用するのが通例ですが(後に、GAMEAPIと呼ばれるWinGや、その発展系のDirectDrawが登場しますが)、そこでは
psSolid | 実線 |
psDash | 破線 |
psDot | 点線 |
psDashDot | 一点鎖線 |
psDashDotDot | 二点鎖線 |
psUserStyle | ユーザー線種 |
が使えるようになっています。しかし、線幅指定を行うと使えない場合があったり、ピッチ長さを指定出来なかったり、プリンタ出力のほうはプリンタのドット(解像度)次第、という事で画面描画のほうはDOS時代と余り変わっていませんが、印刷のほうはプロッタ言語での出力というよりも、プリンタドライバ経由での印刷が主流となり、それに対しては、画面描画と同様の方式で作図するようになっています。その為、印刷時のピッチ長さの調整というのはかなりやりにくくなってしまい、結果、1本の線分を、線種を構成する短い線分の集まりとして印刷されることを余儀なくされてしまいました。しかしPCの性能が上がっている為、たとえ Windowsそのものが重くても、それなりに高速な処理は出来るようではあります。WindowsGDIでの描画はそんなに速くない、かもしれませんが・・・
Windows上でのゲームソフトを作成する場合、WindowsGDIが遅いという事と、あと、画面のスクロールなどのラスタオペレーションや、キャラクタ描画のスプライト機能などを実現するのが現実的に不可能(ソフトウェア的に行うとゲームどころの話ではなくなるほど超遅い)という事で、WinG や DirectDraw(DirectX) は、開発されました。Windows3.1時代はPCもWindowsも重かったのでWinGもほとんど使用されなかったかもしれません。PCやグラフィックボードの性能アップとDirectX技術によって、DirectX対応のゲームソフトはどんどん開発されました。
WindowsVista/7の登場により、WindowsGDIは古いものとされ、グラフィックボード・ネイティブで動作されなくなり、CPUのエミュレーション動作が行われるようになって、一気に WindowsGDIでの描画は遅くなりました。WindowsVista/7での画面描画は、DirectX、Direct2D、で行うよう推奨されているようです。DirectXプログラミングは DirectX SDKを利用し、動作するにはDirectXランタイムライブラリをPCにインストールする必要があります。しかもDirectXには多くのバージョンがあります。ですので要注意。Microsoft社のVisual C++ や Visual BASICで作成する分には、様々な本なども出ていてプログラミングしやすいのですが、Delphi を使う場合には、参考書は非常に少なく、壁は高いです。Delphi 2010〜で Direct2Dを利用するプログラムを作成する方が簡単だし、DirectXランタイムライブラリをインストールする必要もありません。但し、WindowsVista/7用となります。Direct2Dでも、線種の表現は、GDI同様となりますが、若干拡張はされているようです。
SXFでの線種は、名前・セグメント数・各ピッチが決まっていて変える事が出来ない「既定義線種」16種(うち1つは現在未使用)と、利用者が名前・セグメント数・各ピッチを自由に変える事が出来る「ユーザ定義線種」最大16種の合計最大32種を扱う事が出来るようになっています。
既定義線種 |
線種コード | 線種名 |
1 | continuous |
2 | dashed |
3 | dashed spaced |
4 | long dashed dotted |
5 | long dashed double-dotted |
6 | long dashed triplicate-dotted |
7 | dotted |
8 | chain |
9 | chain double dash |
10 | dashed dotted |
11 | Double-dashed dotted |
12 | dashed double-dotted |
13 | double-dashed double-dotted |
14 | dashed triplicate-dotted |
15 | double-dashed triplicate-dotted |
16 | 未使用(予備) |
|
パラメータ | 型 | 説明 | 範囲 |
name[257] | Char | 線種名 | 0<文字列長≦256バイト |
備考
・既定義線種フィーチャは幾何/表記要素、構造化要素のパラメータとして指定し、上図の通りに定義されている線種コードを指定する。
・既定義線種フィーチャで指定できる線種は「フィーチャ仕様 別冊」を参照のこと。
・幾何/表記要素、構造化要素のパラメータとして一度も指定されない既定義線種フィーチャを使用してはならない。 |
ユーザ定義線種 |
線種コード | 線種名 |
17 | 1番目に定義したユーザ定義線種名 |
〜 | 〜 |
32 | 16番目に定義したユーザ定義線種名 |
|
パラメータ | 型 | 説明 | 範囲 |
name[257] | Char | 線種名 | 0<文字列長≦256バイト |
Segment | Int | セグメント数(2の倍数) | 2≦数≦8 |
pitch[8] | double | 〔線分長さ+空白長さ〕を繰り返し指定する(上図指定例参照) |
0<長さ<1.0×1015
用紙座標系で指定 |
備考
・線種名は任意の名称を付与することができるが、既定義線種・ユーザ定義線種を通してユニークである必要がある。
・以下の命名規約に従って線種名を付与すると、レベル1へのダウンコンバート時に、指定した既定義線種でダウンコンバートされる。
【命名規約】 既定義線種名_任意の文字列
例:chain_12 (既定義線種 chain にダウンコンバートされる)
・ユーザ定義線種フィーチャは幾何/表記要素、構造化要素のパラメータとして指定し、その値は線種定義テーブルへの登録順である線種コード(17から始まるシーケンシャル番号)を使用する。
・幾何/表記要素、構造化要素のパラメータとして一度も指定されないユーザ定義線種フィーチャを使用してはならない。 |
既定義線種15種については以下のようになっています。
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 |
という訳で、線種番号15の三点二短鎖線は、セグメント数=10となっており、ユーザ定義線種の最大8と矛盾してしまいます。ですので、データ項目の最大は10としながらも、ユーザ定義線種のセグメント数は最大8まで、というような事になってしまいますので注意は必要でしょう。また、線種番号16は「未使用」となっていますので、これは使用しないように注意する必要があります。
なお、AutoCADの場合は、画層(レイヤ)と同様、線種も利用者が自由に好きなだけ登録設定することが出来るようになっています。また、ジグザグ線や文字込みの線種を使う事も出来ます。Jw_cadの場合は、標準線種8+補助線種+ランダム線種5+倍長線種4+SXF線種31 が使えます。JIS規格でもジグザグ線や波線などの記述があります。さて、どうするか? なのですが、仮にそういった種々の線種が使える場合には、線分や円弧等を作図する際に線種を指定するだけで使えますから扱いは簡単になるでしょう。しかし、複数の線分や円弧等の集まりで作図すると、後の編集が大変・不可?となるでしょうしデータ量も増えてしまうでしょう。ですので本質的には、そういった線種定義も出来るようにしておくのがベターだと思われます。しかしその場合に、線種定義でどのように行うのか?線分と線分のつなぎ目をどう補完しどのように表現するのか?という問題は早速出てきます。これはかなり難しい問題ですのでここではパスします。
それでは実装してみます。線種項目は record で定義して、動的配列として登録するものとします。
type
・・・
TZumenLtype = record // 図面構造|線種
name : string; // 線種名
Segment : Integer ; // セグメント数
Pitch : array[0..9] of double; // 各ピッチ長
cnt : Integer ; // 線種内要素数
end;
TDataClass = class
public
{ Public 宣言 }
zt : TZumenTitle; // 図面情報|図面表題欄
zp : TZumenPaper; // 図面構造|用紙
zLay : array of TZumenLayer; // 図面構造|レイヤ
zLayN: Integer ; // レイヤ数
zColN: Integer ; // 色数
zLtp : array of TZumenLtype; // 図面構造|線種
zLtpN: Integer ; // 線種数
zWidN: Integer ; // 線幅数
constructor Create;
・・・
function LtypeNameCheck(n:integer;s:string) : Integer;
function AddLtype(s:string;seg:integer;pit:array of double) : Boolean;
function EditLtype(n:integer;s:string;seg:integer;pit:array of double) : Boolean;
private
{ Private 宣言 }
end; |
それでは簡単なテストプログラムです。実行型ファイルは、サイズが大きくなるので含めていません。ソースだけです。
|
|
CAD装置(1)
CAD装置(2)
メディア
AutoCADの
DIESELマクロ
CSV
DXF
PCES
IGES
STEP
数学とCAD
CAD作ろ!
CADを考える
▲PREV
▼NEXT
M7
Jw_cad
|