LoginSignup
8
7

More than 5 years have passed since last update.

DXFことはじめ #3

Posted at

 以前の投稿で、DXFはコンス・セルの集まりであることと、もっとも大きなデータのくくりがセクションであることを説明しました。

 ここでは、DXF2番目のセクション(CLASSESセクション)について説明します。

 DXFの2行で一つのペアになっていて、それをコンス・セルと呼ぶ(他の呼び方もあるけど、筆者はこれが好み)ことを踏まえて、ここでは、

 0 
SECTION
 2 
HEADER

を、

(  0 . SECTION)
(  2 . HEADER)

と表記して説明します。

CLASSESセクション

 HEADERセクションの後には、CLASSESセクションが続きます。中身は、こんな感じです。

(  0 . SECTION)
(  2 . CLASSES)
(  0 . CLASS)
(  1 . ACDBDICTIONARYWDFLT)
(  2 . AcDbDictionaryWithDefault)
(  3 . ObjectDBX Classes)
( 90 .         0)
(280 .      0)
(281 .      0)
(  0 . CLASS)
(  1 . ACDBPLACEHOLDER)
(  2 . AcDbPlaceHolder)
(  3 . ObjectDBX Classes)
( 90 .         0)
(280 .      0)
(281 .      0)
(  0 . CLASS)
(  1 . LAYOUT)
(  2 . AcDbLayout)
(  3 . ObjectDBX Classes)
( 90 .         0)
(280 .      0)
(281 .      0)
  ;
(  0 . ENDSEC)

 例によって、最初の2つは、セクションのはじめを表すマーカーとセクションの名前なので、無視すると、それ以降のグループコードの並びに、規則性があることに気づきます。1組の規則性のあるパターンをまとめて、横に並べるようにしてみると、こんな風にして見ることができます。

((0 . CLASS) (1 . ACDBDICTIONARYWDFLT) (2 . AcDbDictionaryWithDefault) (3 . ObjectDBX Classes) (90 . 0) (280 . 0) (281 . 0))
((0 . CLASS) (1 . ACDBPLACEHOLDER)     (2 . AcDbPlaceHolder)           (3 . ObjectDBX Classes) (90 . 0) (280 . 0) (281 . 0))
((0 . CLASS) (1 . LAYOUT)              (2 . AcDbLayout)                (3 . ObjectDBX Classes) (90 . 0) (280 . 0) (281 . 0))
  ;

 行が折り返されて見づらいかもしれませんが、総じてこんな感じになっています。

(
  (0 . CLASS)
  (1 . 識別子)
  (2 . 識別子)
  (3 . 文字列)
  (90 .  数値)
  (280 . 数値)
  (281 . 数値)
)

あるいは、グループコード91の値を含む場合もあります。

(
  (0 . CLASS)
  (1 . 識別子)
  (2 . 識別子)
  (3 . 文字列)
  (90 .  数値)
  (91 .  数値)
  (280 . 数値)
  (281 . 数値)
)

 最初のグループコード(0 . CLASS)は、これがCLASSを表すレコードの先頭であることを、表します。(0 . SECTION)と同じ感じですが、これには、レコードの終端を表すマーカーはなく、次の(0 . CLASS)を区切りとしています。

 (0 . CLASS)の後のコンスセルが何を表しているかというと、ずばり、

(
  (0 . CLASS)
  (1 . DXF内でのクラスの名前)
  (2 . C++のクラス名)
  (3 . アプリケーション名)
  (90 .  フラグ)
  (91 .  カスタムクラスのインスタンス数)
  (280 . フラグ)
  (281 . フラグ)
)

です。「なんでここで、C++???」「アプリケーション名???」ってなると思います。筆者もなりました。

 まず、アプリケーション名ですが、これは、AutoCADがいくつものアプリケーション・モジュールの集合体だと考えるとわかりやすいと思います。アプリケーション名は、そのモジュールを表す名前ということです。
 プラグインみたいなものがあって、そのプラグインの名前だと思ってください。C++のクラス名というのは、そのアプリケーション・モジュール内で、どのクラスでデータを扱うかを決めるのに使用される識別子です(と思います)。
 いずれも、AutoCAD内部で必要なものなので、図面を描画するという観点からは、まったく必要ありません。グループコード91のインスタンス数についても同様、おそらくAutoCAD内部で使っているもの(多分、モジュールがアンロードできるかどうかをこれで判別している)で、普通のひとには、関係ないものです。

 では、このセクションに記載されているCLASSの使い途はあるのかというと、前述のように図形の描画に関しては、まったくもって不要です。
 後にでてくるOBJECTSセクションに含まれる、図面のデータの内部に関連づけられた拡張データなどを使った二次利用の場合、そのデータが何の役割をもっているのかを特定するために使用することがあるかもしれません。
 その場合でも、(1 . DXF内でのクラスの名前)といくつかあるフラグ(詳細は、リファレンスマニュアルを参照のこと)を調べれば、十分だと思います。

 ということで、このセクションも、あまり重要ではないのでした。(^-^;)

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7