DXFとunicode | かに太郎、ただいま開発中

かに太郎、ただいま開発中

Windowsアプリ作ってます。

C++とMFCから、C#とXAMLにのんびり移行中。

忘れっぽいので、健忘録。

unicode文字を使った図面を、DXFファイルに出力してみる。



AutoCADから出力されたDXFファイルの

HEADER の $ACADVER が、AC1024、AC1024なら、文字コードは、utf-8。


0

SECTION

  2

HEADER

9

$ACADVER

1

AC1021   ★ここ


$ACADVERをAC1021にして、utf-8で出力すれば、OKなはず!


しかし、それだけではダメだった。


●BOM!

何気に出力したら、unicodeファイル識別用のBOMが付いていた。

BOMがあると、Autodesk TrueView 2012では読めない。確認してないけど、AutoCADでも同じだと思う。


ついでに、

$ACADVERが無い、または、AC1021より小さい場合、utf-8だと読めない。


$ACADVERがAC1021なのに、sjisでも読めない。


●$HANDSEED

DXFのいくつかのグループコードは、オプションとなっていて、省略可能。

$ACADVERをAC1021にしたことによって、省略不可・必須項目が増えている。


DXFリファレンスは、こちら。ここで、"optional"と書いてないものは、必須である。

http://usa.autodesk.com/adsk/servlet/item?linkID=10809853&id=12272454&siteID=123112


- Next available handle

9
$HANDSEED
5
100   ★数値は16進。


これが無いと、TrueView 2012は「フェイタルエラー」と言って、居なくなります。

後で書きますが、各図形のハンドル番号が必須になります。図形などに20個ハンドルを使ってたとしたら、次の番号は、21、16進で、15を書きます。

ファイルのはじめの方にある、HEADER SECTION に書くので、

あらかじめ、ハンドルがいくつまでいくか、カウントしてから書くか、

最後まで書いた後で、seekで戻って書き込みます。


●グループ5 ハンドル

グループ5のハンドルは、図形だけでなく、TABLE, LTYPE, などHEADER以外のものには全部付くみたい。ハンドルということで、図面中はユニークな値でなければダメ。

POLYLINEは、POLYLINE, VERTEX, SEQENDのそれぞれにハンドルが必要。事前にカウントするときは、頂点数 +2 を忘れるな!

ENDBLKにもハンドルが付く。これも忘れがち。BLOCKの数 * 2にする。


●グループ100 サブクラス名。

グループ100は、サブクラス名。オブジェクト毎に何を書くか決まっている。

LTYPEなら、"AcDbLinetypeTableRecord"。LAYER なら、"AcDbLayerTableRecord"。


決まっているなら省略されてくれーっ


しかも、ものによっては、2つ書く必要がある。

例えば、TEXTは、グループ10より前と、11より後。

0
TEXT
5
399
100
AcDbEntity
8
部屋名1階
62
7
100
AcDbText    ★1個目
10
1672.500000
20
-910.000000
30
0.000000
11
1672.500000
21
-910.000000
31
0.000000
40
300.000000
1
11.0畳
100
AcDbText       ★2個目


●グループ330  Soft-pointer ID/handle to owner object

テーブルの項目に、グループ330 が必須。

0
LTYPE
5
11
330
1 ★

0
LAYER
5
2B
330
2   ★


グループ5のハンドルと違って、適当な値で重複しててもエラーにはならない。


レイヤテーブルには、グループ390, 347が必要。これも、適当な値で大丈夫だった。


●LAYER "0" が必要。

LAYER TABLE に、名前"0" のレイヤが必要。



●必須テーブルが増えている。

VIEW, UCS, APPID, BLOCK_RECORD, VPORT, DIMSTYLE の各テーブルが必要。


●テーブルによって、ハンドル番号が決まっている。

違う番号をつけると、そのハンドルは使用済み、というようなエラーが出る。

LTYPE = 5, LAYER = 2, STYLE = 3, VIEW = 6, UCS= 7, APPID = 9, BLOCK_RECORD = 1, VPORT = 8, DIMSTYLE = A,


●BLOCK "*Model_Space", "*Paper_Space"が必要。

0
BLOCK
5
40
330
1F
100
AcDbEntity
8
0
100
AcDbBlockBegin
2
*Model_Space
70
0
71
0
10
0.0
20
0.0
30
0.0
3
*Model_Space
1

0
ENDBLK
5
3F
330
1F
100
AcDbEntity
8
0
100
AcDbBlockEnd
0
BLOCK
5
42
330
1B
100
AcDbEntity
8
0
100
AcDbBlockBegin
2
*Paper_Space
70
0
71
0
10
0.0
20
0.0
30
0.0
3
*Paper_Space
1

0
ENDBLK
5
41
330
1B
100
AcDbEntity
8
0
100
AcDbBlockEnd


0,0,0 でいいなら、省略でえーやん、と思うのですが...


●OBJECTS SECTION が必須

最低限、これだけ必要みたい。


0
SECTION
2
OBJECTS
0
DICTIONARY
5
C
100
AcDbDictionary
3
ACAD_GROUP
350
D
3
ACAD_MLINESTYLE
350
E
0
DICTIONARY
5
D
102
{ACAD_REACTORS
330
C
102
}
100
AcDbDictionary
0
DICTIONARY
5
E
102
{ACAD_REACTORS
330
C
102
}
100
AcDbDictionary
3
STANDARD
350
13
0
ENDSEC


●bigfont.shx は文字が足りない。

日本語を文字として使ってるときは、フォントスタイルのグループ4に bigfont.shx を指定しておけば、ちゃんと出てたが、

sjisになくて、unicodeにある文字は出ない。

MS ゴシックにすれば OK


0
STYLE
5
3B
100
AcDbSymbolTableRecord
100
AcDbTextStyleTableRecord
2
STANDARD
70
0
40
0.0
41
1.0
50
0.0
71
0
42
0.2
3
MSGOTHIC.TTC ★sjisのときは、txt.shx
4

            ★sjisのときは、bigfont.shx, extfont.shx だったけど、カラにしておく。

1001
ACAD
1000
MS Gothic



ココまで来れば、エラーが出ずに読み込める。(なんか書き忘れてるかもしれないけど)

もし、なんかエラーが出ても、TrueView や AutoCAD なら、あれが足りない、これがない、xxx行目でエラー、とか言ってくれるので、なんとかなる。