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

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

プログラミングについて
ホームページについて
キャドについて
電子カタログについて
書籍・雑誌
イベント
リンク集
CADを考える:レイヤ
「SXF仕様書」の「図面情報」の次は「図面構造」ですが、図面構造フィーチャには以下のようなものがあります。
・用紙フィーチャ
・レイヤフィーチャ
・既定義線種フィーチャ、ユーザ定義線種フィーチャ
・既定義色フィーチャ、ユーザ定義色フィーチャ
・線幅フィーチャ
・文字フォントフィーチャ
前頁では「用紙」でしたので、ここでは「レイヤ」について見てみます。
 
SXFでのレイヤは、レイヤコード1から256までの最大256個まで、となっています。国内製CADの場合はレイヤ数256個までというのはよく聞きますね。例外的なのは Autodesk社のAutoCADでしょうか。このCADではレイヤを「画層」と呼んでいますが、レイヤを利用者が無制限に定義する事が出来ます。稀に、レイヤ数256では少ないという話は聞きますが、レイヤ無制限CADからレイヤ256のCADへデータ変換を行った場合、257以降のレイヤの図形は、例えば、レイヤ1やレイヤ256に一緒にまとめられたりする事が多いようです。(レイヤ番号 mod 256)+1 のような場合もあるかもしれません。
 
また、レイヤを階層化したい、という話も稀に聞きます。例えば、Jw_cadやM7等のように、レイヤグループ→レイヤ、という2階層のCADもありますが、もっと自由に出来るようにならないか?といったケースですが、こういった階層化をしたい場合には、このレイヤ定義で出来るようにするのが通例でしょう。SXFにそういったレイヤの階層化の記述は無いと思われますが、データ変換時に欠落すると思われますが、例えば、親レイヤ番号を登録出来るようにして、インターフェイス部でそれを解釈しツリー構造で表現出来るようにすればいいと思われます。親番号は自番号よりも小さい、というルールは必要でしょう。ここでは実装しませんけれども。
 
レイヤ
パラメータ説明範囲
name[257]Charレイヤ名 レベル1:
0<文字列長≦32バイト
レベル2:
0<文字列長≦256バイト
LflagInt表示/非表示フラグ(0:非表示、1:表示) 
備考
・レイヤフィーチャは幾何/表記要素、構造化要素のパラメータとして指定し、その値はレイヤ定義テーブルへの登録順であるレイヤコード(1から始まるシーケンシャル番号)を使用する。
・幾何/表記要素や構造化要素から参照されないレイヤフィーチャを定義してはならない。
 
Jw_cadでは、レイヤグループのデータの中に、縮尺というものがありますが、尺度については部品図で実装しますので、レイヤデータ項目には入れません。また、表示・非表示以外に、表示のみ(編集不可)というデータ項目もありますが、基本的には、表示のみレイヤの色=グレー色を定義しておき、それと区別する、という利用をされるのが普通で、”表示のみ”という割には、表示のみレイヤの点・要素を取得する設定にする場合が多いように思われますし、初心者にはこの区別が不明という場合も多いように思われます。
 
AutoCADでは、画層データ項目に、色、線種、線幅、というものがあり、各要素データで色・線種・線幅を指定する際に「ByLayer」を指定すれば、この画層データ項目で指定してある色・線種・線幅で表示を行う、というシステムになっており、画層管理で色・線種・線幅を指定することによって一元管理を行う事が出来る、という風になっています。これが現実、よく利用されていますし、Jw_cad利用者もこの機能が欲しいという話もよく聞きます。ですのでその機能は是非とも利用したいです。勿論、SXFでデータ変換を行う場合には、その情報は欠落します。
 
その他、Jw_cad では、プロテクトレイヤ状態、AutoCADではロック状態、等があります。一時的に、そのレイヤには書き込み出来ないようにしてレイヤの保護をしたい、という事ですが、ここでは実装しません。
他者へデータを受け渡す場合に、その設定が邪魔になる、という話が多い事や、CAD初心者がよく混乱する原因の1つだったりするからですが、逆に、データを受け渡した相手にデータを編集されたら困る、とか、データを再利用されたら困る、という簡単に外せない「プロテクト」を望む話は何度か目にしています。その場合は、データの複写(コピー)やDXF・SXF等で保存出来ないようにしたり、パスワード入力で設定・解除を出来るようにしたり、というような事が必要になるでしょう。 勿論、図面を作成した本人が自分で指定したパスワードを忘れてしまい、プロテクトを掛けた状態で図面を上書き保存してしまうと後で編集出来なくなってしまう、という事になってしまいますが・・・これもここでは実装しませんが、必要な方は自分で実装してしまっても良いと思います。
 
それでは実装してみます。レイヤ項目は record で定義して、動的配列として登録するものとします。
 
type
 ・・・
 TZumenLayer = record // 図面構造|レイヤ
  exf : Boolean ;  // 存在フラグ True:有 False:無
  name : string ;  // 図面名
  Lflag : Integer ;  // 0:非表示 1:表示
  Color : Integer ;   / レイヤ色
  Ltype : Integer ;  // レイヤ線種
  Width : Integer ;  // レイヤ線幅
  cnt : Integer ;  // レイヤ内要素数
 end;
 
 TDataClass = class
  public
   { Public 宣言 }
   zt : TZumenTitle; // 図面情報|図面表題欄
   zp : TZumenPaper; // 図面構造|用紙
   zLay : array of TZumenLayer; // 図面構造|レイヤ
   zLayN: Integer ; // レイヤ数
   zColN: Integer ; // 色数
   zLtpN: Integer ; // 線種数
   zWidN: Integer ; // 線幅数
   constructor Create;
   destructor Free;
   procedure DataInit;
   function StrCheck(s:string) : Boolean;
   procedure PaperSet(t,o,x,y:integer);
   function LayerNameCheck(s:string) : Integer;
   function AddLayer(s:string;fla,col,ltp,wid:integer) : Boolean;
   function EditLayer(n:integer;s:string;fla,col,ltp,wid:integer) : Boolean;
   function DeleteLayer(n:integer) : Boolean;
  private
   { Private 宣言 }
 end;
レイヤデータ項目内で色・線種・線幅を扱いますので、前後逆になってしまいますがチェック用で必要になりますので、先に 色数・線種数・線幅数の変数の定義をしています。
 
取り合えずレイヤ関連メソッドとして、レイヤの追加・編集・削除の関数を追加しています。レイヤ名のチェックは、レベル1の場合を考慮して、先頭32バイトでのチェックを行っています。このプログラムでは文字列は Unicodeで扱いますが、SXF仕様上、文字列長のチェックはシフトJISとして算出しないといけないため、AnsiString型でキャスト(型変換)してからチェックしています。そういった事は SXF変換時に行えばいい、というケースもありますが。
 
レイヤの削除は、レイヤデータ項目に存在フラグを設けて、それをオフ(False)にする、という事にしています。動的配列の場合、途中のデータを削除する、という場合、後続のデータを1つずつ上へ詰め込み直す、という無駄な作業が掛かります=処理時間が掛かります。そのため、こういったフラグを設けていますが、レイヤ数と配列数が異なってしまいますので、それには注意が必要となってきます。 これはレイヤだけの話ではなく、線分などのデータ要素でも同じことが言えます。なお、削除したレイヤで線分などを登録するとおかしくなりますので、そうならないようすることと、インターフェイス部をどのようにするかを考える必要はあります。従って、一応レイヤ削除の関数は作成しましたが、レイヤ削除は行わないようにするという事を前提とします。
 
ここでは、レイヤの場合は関係ないとしていますが、削除をフラグ処理で行う事によって、データそのものは残るのでその分のメモリは消費しますが、アンドゥ(やり直し)を実現しやすくなります。データ詰め込み処理による削除をするとデータが完全に消える為、アンドゥを実現させたい場合には、アンドゥ専用のメモリを別に設けて、そこへ削除したデータをコピーさせる必要があります。そうなるとどのみちメモリは消費しますし、詰め込み作業&コピー作業の処理時間が必要になってしまいます。なお、アンドゥ・リドゥを行うためには、データ変更(データ編集)という事をしてはいけません。変更前のデータ内容が消えてしまうからです。データ変更を行う場合は、変更前のデータの存在フラグをオフにして、変更後のデータを追加(データの一部は変更前データからコピー)しなければなりません。
レイヤ作業もアンドゥ・リドゥの対象にしたい場合は、レイヤ動的配列の最大256個の制限をなくし、存在フラグをチェックしてレイヤ数を取得する関数を作成し、レイヤ編集の関数内を削除&追加で書き直し、レイヤ番号での直接指示は出来ないようにすれば(レイヤ番号は変動してしまうため直接扱えなくなる=レイヤ名での操作になると思われます)可能になると思われます。そういう意味では、今回のコーディングはやや中途半端かもしれません(次回に修正するかもしれません)。
 
 
それでは簡単なテストプログラムです。実行型ファイルは、サイズが大きくなるので含めていません。ソースだけです。
 
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.