DWFの構造(その1)




 
DWFOUT
 

 AutoCADLT98でDWFファイルを作るのは、簡単だった。ファイル書き出しDWFで終わり。DWFはバイナリーファイルと思い込んでいたが、基本はテキストファイルだった。


 ダイアログの右下にオプションがあり、ASCIIフォーマットを選択することが出来る。こうしてテキストファイルに保存すれば、ファイル構造をしらべられる。

 
簡単な実験
 

 

  ゼロからスタートでline、0、0 100、100の簡単な図面を作りDWFで保存する。
(DWF V00.36) (Created 1072355421 '02/12/25 21:30:21') (Modified 1072355421 '02/12/25 21:30:21') (SourceFilename Drawing.dwg) (SourceCreated 1072354539 '02/12/25 21:15:39') (SourceModified 1072354539 '02/12/25 21:15:39') (NamedView 4684358,3100566 6212227,3649571 INITIAL) (Units '' ((5240.79 0 0 0) (0 5240.79 0 0) (0 0 1 0) (5.18622e+006 3.11303e+006 0 1))) (Embed '"FF72FF92FF70FF7CFF9E"/vnd.dwg;' 'AutoCAD-r14' 'Drawing.dwg' '') (View 4684358,3100566 6212227,3649571) (ColorMap 256 0,0,0,255 128,0,0,255 0,128,0,255 128,128,0,255 0,0,128,255 128,0,128,255 0,128,128,255 192,192,192,255 192,220,192,255 166,202,240,255 0,0,0,255 0,0,51,255 0,0,102,255 0,0,153,255 0,0,204,255 0,0,255,255 0,51,0,255 0,51,51,255 0,51,102,255 0,51,153,255 0,51,204,255 0,51,255,255 0,102,0,255 0,102,51,255 0,102,102,255 0,102,153,255 0,102,204,255 0,102,255,255 0,153,0,255 0,153,51,255 0,153,102,255 0,153,153,255 0,153,204,255 0,153,255,255 0,204,0,255 0,204,51,255 0,204,102,255 0,204,153,255 0,204,204,255 0,204,255,255 0,255,0,255 0,255,51,255 0,255,102,255 0,255,153,255 0,255,204,255 0,255,255,255 51,0,0,255 51,0,51,255 51,0,102,255 51,0,153,255 51,0,204,255 51,0,255,255 51,51,0,255 51,51,51,255 51,51,102,255 51,51,153,255 51,51,204,255 51,51,255,255 51,102,0,255 51,102,51,255 51,102,102,255 51,102,153,255 51,102,204,255 51,102,255,255 51,153,0,255 51,153,51,255 51,153,102,255 51,153,153,255 51,153,204,255 51,153,255,255 51,204,0,255 51,204,51,255 51,204,102,255 51,204,153,255 51,204,204,255 51,204,255,255 51,255,0,255 51,255,51,255 51,255,102,255 51,255,153,255 51,255,204,255 51,255,255,255 102,0,0,255 102,0,51,255 102,0,102,255 102,0,153,255 102,0,204,255 102,0,255,255 102,51,0,255 102,51,51,255 102,51,102,255 102,51,153,255 102,51,204,255 102,51,255,255 102,102,0,255 102,102,51,255 102,102,102,255 102,102,153,255 102,102,204,255 102,102,255,255 102,153,0,255 102,153,51,255 102,153,102,255 102,153,153,255 102,153,204,255 102,153,255,255 102,204,0,255 102,204,51,255 102,204,102,255 102,204,153,255 102,204,204,255 102,204,255,255 102,255,0,255 102,255,51,255 102,255,102,255 102,255,153,255 102,255,204,255 102,255,255,255 153,0,0,255 153,0,51,255 153,0,102,255 153,0,153,255 153,0,204,255 153,0,255,255 153,51,0,255 153,51,51,255 153,51,102,255 153,51,153,255 153,51,204,255 153,51,255,255 153,102,0,255 153,102,51,255 153,102,102,255 153,102,153,255 153,102,204,255 153,102,255,255 153,153,0,255 153,153,51,255 153,153,102,255 153,153,153,255 153,153,204,255 153,153,255,255 153,204,0,255 153,204,51,255 153,204,102,255 153,204,153,255 153,204,204,255 153,204,255,255 153,255,0,255 153,255,51,255 153,255,102,255 153,255,153,255 153,255,204,255 153,255,255,255 204,0,0,255 204,0,51,255 204,0,102,255 204,0,153,255 204,0,204,255 204,0,255,255 204,51,0,255 204,51,51,255 204,51,102,255 204,51,153,255 204,51,204,255 204,51,255,255 204,102,0,255 204,102,51,255 204,102,102,255 204,102,153,255 204,102,204,255 204,102,255,255 204,153,0,255 204,153,51,255 204,153,102,255 204,153,153,255 204,153,204,255 204,153,255,255 204,204,0,255 204,204,51,255 204,204,102,255 204,204,153,255 204,204,204,255 204,204,255,255 204,255,0,255 204,255,51,255 204,255,102,255 204,255,153,255 204,255,204,255 204,255,255,255 255,0,0,255 255,0,51,255 255,0,102,255 255,0,153,255 255,0,204,255 255,0,255,255 255,51,0,255 255,51,51,255 255,51,102,255 255,51,153,255 255,51,204,255 255,51,255,255 255,102,0,255 255,102,51,255 255,102,102,255 255,102,153,255 255,102,204,255 255,102,255,255 255,153,0,255 255,153,51,255 255,153,102,255 255,153,153,255 255,153,204,255 255,153,255,255 255,204,0,255 255,204,51,255 255,204,102,255 255,204,153,255 255,204,204,255 255,204,255,255 255,255,0,255 255,255,51,255 255,255,102,255 255,255,153,255 255,255,204,255 255,255,255,255 0,0,0,255 13,13,13,255 26,26,26,255 40,40,40,255 53,53,53,255 67,67,67,255 80,80,80,255 93,93,93,255 107,107,107,255 120,120,120,255 134,134,134,255 147,147,147,255 161,161,161,255 174,174,174,255 187,187,187,255 201,201,201,255 214,214,214,255 228,228,228,255 241,241,241,255 255,255,255,255 255,251,240,255 160,160,164,255 128,128,128,255 255,0,0,255 0,255,0,255 255,255,0,255 0,0,255,255 255,0,255,255 0,255,255,255 255,255,255,255) (Background 225) C 0 (Layer 1 0) L 5186216,3113029 5710295,3637108 (EndOfDWF)
  これが、DWFの構造。

 
DWFの書き出し
 

 

  今度は、3polyline、0,0,0 100,100,100 200,50,50のポリラインを書き,DWFで保存する。
(DWF V00.36) (Created 1072356349 '02/12/25 21:45:49') (Modified 1072356349 '02/12/25 21:45:49') (SourceFilename Drawing.dwg) (SourceCreated 1072354539 '02/12/25 21:15:39') (SourceModified 1072354539 '02/12/25 21:15:39') (NamedView 917958,474418 1727455,892782 INITIAL) (Units '' ((2621.43 0 0 0) (0 2621.43 0 0) (0 0 1 0) (1.06056e+006 552529 0 1))) (Embed '"FF72FF92FF70FF7CFF9E"/vnd.dwg;' 'AutoCAD-r14' 'Drawing.dwg' '') (View 917958,474418 1727455,892782) (ColorMap 256 0,0,0,255 128,0,0,255 0,128,0,255 128,128,0,255 0,0,128,255 128,0,128,255 0,128,128,255 192,192,192,255 192,220,192,255 166,202,240,255 0,0,0,255 0,0,51,255 0,0,102,255 0,0,153,255 0,0,204,255 0,0,255,255 0,51,0,255 0,51,51,255 0,51,102,255 0,51,153,255 0,51,204,255 0,51,255,255 0,102,0,255 0,102,51,255 0,102,102,255 0,102,153,255 0,102,204,255 0,102,255,255 0,153,0,255 0,153,51,255 0,153,102,255 0,153,153,255 0,153,204,255 0,153,255,255 0,204,0,255 0,204,51,255 0,204,102,255 0,204,153,255 0,204,204,255 0,204,255,255 0,255,0,255 0,255,51,255 0,255,102,255 0,255,153,255 0,255,204,255 0,255,255,255 51,0,0,255 51,0,51,255 51,0,102,255 51,0,153,255 51,0,204,255 51,0,255,255 51,51,0,255 51,51,51,255 51,51,102,255 51,51,153,255 51,51,204,255 51,51,255,255 51,102,0,255 51,102,51,255 51,102,102,255 51,102,153,255 51,102,204,255 51,102,255,255 51,153,0,255 51,153,51,255 51,153,102,255 51,153,153,255 51,153,204,255 51,153,255,255 51,204,0,255 51,204,51,255 51,204,102,255 51,204,153,255 51,204,204,255 51,204,255,255 51,255,0,255 51,255,51,255 51,255,102,255 51,255,153,255 51,255,204,255 51,255,255,255 102,0,0,255 102,0,51,255 102,0,102,255 102,0,153,255 102,0,204,255 102,0,255,255 102,51,0,255 102,51,51,255 102,51,102,255 102,51,153,255 102,51,204,255 102,51,255,255 102,102,0,255 102,102,51,255 102,102,102,255 102,102,153,255 102,102,204,255 102,102,255,255 102,153,0,255 102,153,51,255 102,153,102,255 102,153,153,255 102,153,204,255 102,153,255,255 102,204,0,255 102,204,51,255 102,204,102,255 102,204,153,255 102,204,204,255 102,204,255,255 102,255,0,255 102,255,51,255 102,255,102,255 102,255,153,255 102,255,204,255 102,255,255,255 153,0,0,255 153,0,51,255 153,0,102,255 153,0,153,255 153,0,204,255 153,0,255,255 153,51,0,255 153,51,51,255 153,51,102,255 153,51,153,255 153,51,204,255 153,51,255,255 153,102,0,255 153,102,51,255 153,102,102,255 153,102,153,255 153,102,204,255 153,102,255,255 153,153,0,255 153,153,51,255 153,153,102,255 153,153,153,255 153,153,204,255 153,153,255,255 153,204,0,255 153,204,51,255 153,204,102,255 153,204,153,255 153,204,204,255 153,204,255,255 153,255,0,255 153,255,51,255 153,255,102,255 153,255,153,255 153,255,204,255 153,255,255,255 204,0,0,255 204,0,51,255 204,0,102,255 204,0,153,255 204,0,204,255 204,0,255,255 204,51,0,255 204,51,51,255 204,51,102,255 204,51,153,255 204,51,204,255 204,51,255,255 204,102,0,255 204,102,51,255 204,102,102,255 204,102,153,255 204,102,204,255 204,102,255,255 204,153,0,255 204,153,51,255 204,153,102,255 204,153,153,255 204,153,204,255 204,153,255,255 204,204,0,255 204,204,51,255 204,204,102,255 204,204,153,255 204,204,204,255 204,204,255,255 204,255,0,255 204,255,51,255 204,255,102,255 204,255,153,255 204,255,204,255 204,255,255,255 255,0,0,255 255,0,51,255 255,0,102,255 255,0,153,255 255,0,204,255 255,0,255,255 255,51,0,255 255,51,51,255 255,51,102,255 255,51,153,255 255,51,204,255 255,51,255,255 255,102,0,255 255,102,51,255 255,102,102,255 255,102,153,255 255,102,204,255 255,102,255,255 255,153,0,255 255,153,51,255 255,153,102,255 255,153,153,255 255,153,204,255 255,153,255,255 255,204,0,255 255,204,51,255 255,204,102,255 255,204,153,255 255,204,204,255 255,204,255,255 255,255,0,255 255,255,51,255 255,255,102,255 255,255,153,255 255,255,204,255 255,255,255,255 0,0,0,255 13,13,13,255 26,26,26,255 40,40,40,255 53,53,53,255 67,67,67,255 80,80,80,255 93,93,93,255 107,107,107,255 120,120,120,255 134,134,134,255 147,147,147,255 161,161,161,255 174,174,174,255 187,187,187,255 201,201,201,255 214,214,214,255 228,228,228,255 241,241,241,255 255,255,255,255 255,251,240,255 160,160,164,255 128,128,128,255 255,0,0,255 0,255,0,255 255,255,0,255 0,0,255,255 255,0,255,255 0,255,255,255 255,255,255,255) (Background 0) C 225 (Layer 1 0) P 3 1060563,552529 1322706,814672 1584850,683600 (EndOfDWF)
 このふたつのファイルを比較すると、大体のDWFファイル構造は推定できる。

 (DWF V00.36)からヘッダーが始まる。(Units)の数字の部分に何か意味がありそうだ。
(Embed)の数字は何だろう。vnd.dwgはMIMEのファイルタイプimage/vnd.dwg だろう。LT98はAutoCAD-release14ファミリー。

(ColorMap )。ここがベクター画像形式としてのAutoCADのノーハウ部分と見るのだが?

 (Background 0)は背景黒、225は白。C 225は以下の線の色、白を指定している。 (Layer 1 0)は1番目のレーヤは名前”0”を示す。

最初のL 5186216,3113029 5710295,3637108は直線。次のP3は3Dpolyラインなのだろう。LはLineの省略コマンド。
最後は(EndOfDWF)で必ず終わる。

 
レイヤー
 

 レイヤーの扱いを調べよう。

  レイヤー色白の0画層とレイヤー色黄色のbildng画層を設けた。

-------省略------- (Background 0) C 225 (Layer 1 0) P 5 11299795,4861433 10845749,5123576 10391703,4861433 10845749,4599289 11299795,4861433 C 220 (Layer 2 BILDNG) P 5 10520036,4865738 10632068,4930420 10632068,5035277 10520036,4970596 10520036,4865738 P 4 10632068,4930420 10752898,4860659 10752898,4965516 10632068,5035277 P 4 10752898,4860659 10640866,4795977 10640866,4900835 10752898,4965516 P 4 10640866,4795977 10520036,4865738 10520036,4970596 10640866,4900835 C 225 (Layer 1) P 4 10950856,4913545 10938120,4904936 10938120,5429223 10950856,5437832 P 4 10938120,4904936 10927874,4895282 10927874,5419569 10938120,5429223 P 4 10927874,4895282 10920370,4884823 10920370,5409110 10927874,5419569 P 4 10920370,4884823 10915792,4873814 10915792,5398101 10920370,5409110 P 4 10915792,4873814 10914254,4862527 10914254,5386814 10915792,5398101 P 4 10914254,4862527 10915792,4851240 10915792,5375527 10914254,5386814 P 4 10915792,4851240 10920370,4840232 10920370,5364519 10915792,5375527 P 4 10920370,4840232 10927874,4829772 10927874,5354059 10920370,5364519 P 4 10927874,4829772 10938120,4820119 10938120,5344406 10927874,5354059 P 4 10938120,4820119 10950856,4811510 10950856,5335797 10938120,5344406 P 4 10950856,4811510 10965767,4804157 10965767,5328444 10950856,5335797 P 4 10965767,4804157 10982487,4798241 10982487,5322528 10965767,5328444 P 4 10982487,4798241 11000604,4793909 11000604,5318196 10982487,5322528 P 4 11000604,4793909 11019672,4791266 11019672,5315553 11000604,5318196 P 4 11019672,4791266 11039221,4790377 11039221,5314664 11019672,5315553 P 4 11039221,4790377 11058770,4791266 11058770,5315553 11039221,5314664 P 4 11058770,4791266 11077838,4793909 11077838,5318196 11058770,5315553 P 4 11077838,4793909 11095954,4798241 11095954,5322528 11077838,5318196 P 4 11095954,4798241 11112674,4804157 11112674,5328444 11095954,5322528 P 4 11112674,4804157 11127586,4811510 11127586,5335797 11112674,5328444 P 4 11127586,4811510 11140321,4820119 11140321,5344406 11127586,5335797 P 4 11140321,4820119 11150567,4829772 11150567,5354059 11140321,5344406 P 4 11150567,4829772 11158071,4840232 11158071,5364519 11150567,5354059 P 4 11158071,4840232 11162649,4851240 11162649,5375527 11158071,5364519 P 4 11162649,4851240 11164188,4862527 11164188,5386814 11162649,5375527 P 4 11164188,4862527 11162649,4873814 11162649,5398101 11164188,5386814 P 4 11162649,4873814 11158071,4884823 11158071,5409110 11162649,5398101 P 4 11158071,4884823 11150567,4895282 11150567,5419569 11158071,5409110 P 4 11150567,4895282 11140321,4904936 11140321,5429223 11150567,5419569 P 4 11140321,4904936 11127586,4913545 11127586,5437832 11140321,5429223 P 4 11127586,4913545 11112674,4920897 11112674,5445184 11127586,5437832 P 4 11112674,4920897 11095954,4926813 11095954,5451100 11112674,5445184 P 4 11095954,4926813 11077838,4931145 11077838,5455432 11095954,5451100 P 4 11077838,4931145 11058770,4933788 11058770,5458075 11077838,5455432 P 4 11058770,4933788 11039221,4934677 11039221,5458964 11058770,5458075 P 4 11039221,4934677 11019672,4933788 11019672,5458075 11039221,5458964 P 4 11019672,4933788 11000604,4931145 11000604,5455432 11019672,5458075 P 4 11000604,4931145 10982487,4926813 10982487,5451100 11000604,5455432 P 4 10982487,4926813 10965767,4920897 10965767,5445184 10982487,5451100 P 4 10965767,4920897 10950856,4913545 10950856,5437832 10965767,5445184 (EndOfDWF)

 C 220とカラー定義し、(Layer 2 BILDNG)と画層を定義してきた。2番目の画層はBILDNGという名前である。次にこのコードが出てくるまで同一画層ということだろう。画層の定義ルールはこれで分かった。

 ところうで、このデータは四角が二つと円だけで書かれている。黄色の四角には厚み50をつけた。円には厚み100をつけた。DWGでは、厚みを長方形や円筒に展開する。最後のC 225(Layer 1)以下が展開された円筒のデータに対応する。

 ここまでのデータを眺めて、ひとつの仮説を立てよう。

線分データはLとx、y x、yが定義コード。
3点連結線はP3 x、y x、y x、yが定義コード。
  4点連結線はP4 x、y x、y x、y x、yが定義コード。
後は同一ルールだろう。 
 3Dpolyラインで3次元線を書いたのだが、結局2次元のデータになった。3次元データを保持しているAutoCADだが、最終的にはディスプレーに表示するため、平面に投影した2次元データを作る。描画速度で定評のAutoCADのノーハウがこのDWF構造とPlugINのWHIP!で推測できる。

 
仮説の検証
 

 AutoCADのPolygonは頂点数を指定して正多角形を作るコマンド。Polyラインの特殊形。3、4、5、6、7、10の多角形を作ってみた。

-------省略------- (Background 0) C 190 (Layer 2 3POLY) P 4 2299299,1125864 2245902,1218861 2192063,1126120 2299299,1125864 C 220 (Layer 3 4POLY) P 5 2462423,1129594 2461113,1217940 2372767,1216630 2374078,1128284 2462423,1129594 C 40 (Layer 4 5POLY) P 6 2654187,1159435 2639012,1222596 2574254,1227681 2549405,1167664 2598807,1125485 2654187,1159435 C 195 (Layer 5 10POLY) P 11 2520949,990338 2477011,1065882 2397061,1101173 2311637,1082730 2253367,1017599 2244510,930656 2288447,855112 2368397,819821 2453821,838264 2512091,903395 2520949,990338 C 45 (Layer 6 6POLY) P 7 2716350,995526 2689602,1083647 2599912,1104543 2536971,1037318 2563719,949197 2653408,928300 2716350,995526 C 15 (Layer 7 7POLY) P 8 2707130,772496 2702543,847597 2640967,890835 2568769,869652 2540317,799998 2577035,734324 2651274,722084 2707130,772496 (EndOfDWF)

  仮説は正しかった。10個の頂点のPolyラインはP11となる。これは閉合しているので、始点と同じ終点があるだけの話。結論は次のようだろう。

AutoCADの曲線は最終的にはPolyラインにされ出力ルーチンに吐き出される。 そのコマンドはP(N)。P2はLコマンドが使われる。

 円はR x、y rのコマンド。楕円はP44に展開してきた。

 これで線の構造はつかめた。画層の番号について整理してみる。画層には名前が指定できるが、通し番号がつく。この順番だが、作成した順番のようだ。AutoCADには0画層があり、消したり名前を変更したりできない。これが0番。上のデータでは1番が見当たらない。不思議に思ったのだが、名前を付け間違って消したことを思い出した。これが1番ということだろう。AutoCADでは図面ユーティリテで削除をしないと表示はしないのだが場所が確保されているオブジェクトは多い。


 
AutoCADの色
 

 AutoCADの標準色は名前付きで1〜7の8色と8、9のグレーが用意されている。基本的には256の色番号で識別される。10〜249がパレットで選択でき、250(黒)〜255(白)がグレースケール。
 0番はByBrock。7番は背景により白、黒に変化する。これはAutoCADの特殊事情。
色名色番号パレットで選んだ
色番号
DWF色番号
red110190
yellow250220
green38040
cyan413045
blue516015
magenta6210195
white 7255225

 Webで色を扱う時は、赤・緑・青(RGB)を6桁の16進数で表現する。
#ff0000    #00ff00    #0000ff   
#aa0000    #00aa00    #0000aa   
#110000    #001100    #000011   
 DWFの色番号はこれを10進数で表したもののようだ。

 パソコンの色が8色だった頃から始まるAutoCADの歴史はAutoCAD カラー インデックス( ACI)に刻み込まれている。線画のドロー系では8ビットの256色で十分。

 True Color (24ビット、フルカラー1677万色)、High Color(16ビット、65,536色)などがハード、ソフト両面で問題なくなった現在AutoCAD カラー インデックスを扱うには減色パレットが必要になる。実は、ファイルヘッダの(ColorMap 256)はこのカラーパレットなのだろう。

2003.12.26
by Kon