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行目でエラー、とか言ってくれるので、なんとかなる。