/*THK Analytics用解析タグ*/

【Python】サンプルプログラム dxfファイルのリード

2022年8月12日

python学習の一環としてdxfファイルのリードプログラムを作成します。
学習プログラムなので簡易的な機能になりますが、参考にしてください。

dxfファイルとは

dxfファイルとはCAD図面のファイルフォーマットです。
元々はAutoCADのフォーマットでしたが広く利用されているフォーマットです。
中身はテキストファイルですのでエディタで開くことが可能です。

dxfファイルの基本フォーマット

ここではサンプルプログラムを理解する為に必要な情報のみを提供します。
詳細は書籍などのマニュアルを参考にしてください

セクション

セクションと言う単位で構成され以下のように並んでいます

ヘッダセクション
テーブルセクション
ブロックセクション
エンティティセクション

セクションは"SECTION"キーワードで始まり、"ENDSEC"キーワードで終了します。

ヘッダセクション

バージョン情報などDXFファイルの情報が格納されています。
今回のサンプルプログラムでは不要なので読み飛ばしています。

テーブルセクション

線種情報、レイヤー情報などが記述されています。
描画する際に、本情報を参照しますが今回は対応していません。

ブロック図形セクション

ブロック図形の記述セクションですが、今回は不要なので読み飛ばしています

エンティティセクション

図形データを記述するセクションです。
図形データには線を示す"LINE"や円を示す"CIRCLE"などがあります。
本サンプルではLINEの取り出しのみを行っています

LINEデータ

LINEデータにはレイヤー名や、線種などが記載されていますが今回は無視します。
参考にLINEデータの構成を示します。

—————————————
0
LINE
8
_0-0_
6
CONTINUOUS
62
7
10
24.714049079754602
20
45.900858895705525
11
44.714049079754602
21
45.900858895705525
————————————–

DXFは2行毎に意味を持っています。
上記のデータを2行毎に解説します

———–
0
LINE
———–
線データの開始を示します

———–
8
_0-0_
———–
レイヤーを示します

———–
6
CONTINUOUS
———–
線種(実線)を定義しています

———–
62
7
———–
線の色を示します。7は白です。

———–
10
24.714049079754602
———–
描画開始X座標を示します(x = 24.714049079754602)

———–
20
45.900858895705525
———–
描画開始y座標を示します(y = 45.900858895705525)

———–
11
44.714049079754602
———–
描画終了X座標を示します(x = 44.714049079754602)

———–
21
45.900858895705525
———–
描画終了Y座標を示します(x = 45.900858895705525)

サンプルプログラム


学習用のコードなので簡単な機能しか搭載していません。
具体的にはLINEデータの座標のみを取得し、他のデータは一切無視しています。

クラスの説明

LINEクラス

LINE1本の情報を格納するクラスです。
線の始点と終点のXY座標を格納します。

関数の説明

forward

指定した文字が出現するまでファイルを読み進めます。
read_data = readline()でファイル1行をリードしreadに格納します。
次のwhile文ではread_dataにデータが入っている限り内部を実行します。
while文内部ではread_dataが引数で指定された文字列strと同じか確認し同じならresultを1にしてループから抜けます
違えば再度fileから1行リードします。
最後にresultの結果を関数の戻り値にして終了します。
あらかじめresult=0にしてあるので、strと同じ文字が見つからなかった場合は0で返ります。

read_entitie_section

エンティティの内容(LINEのみ)をリードします。
エンティティセクションは"ENTITIES"から始まりますので、先ほどのforward関数を使いそこまで進めます。
次に先ほど確認したforward関数と同様にしてLINEキーワードを見つけます。
forward関数を使わないのは、例えばTEXTなどLINE以外のキーワードに対応する際に、forward関数では読み飛ばしてしまうためです。
(forward関数はキーワード一つしか対応できない)
LINEを見つけるとそれぞれの座標を示すコード、" 10″, " 20″, " 11″, " 21″を見つけ値をクラス保存します。
本関数はデータは、" 10″, " 20″, " 11″, " 21″の順で並ぶ前提で設計しています。
" 21″が来るとデータをリストに追記しています。line_data.append(line)

メインプログラム

line_data = [] LINEデータを格納するリストを定義しています。
対応するファイル名をキーボードから受け取る場合は、コメントアウトされたfile_name = input(“DXFファイル名を入れていください\n")を利用します。
今回はsample.dxf固定としています。
次にリードモードでdxfファイルを開いています
先ほど準備したread_entitie_section関数を使いLINEを読み取ります。
読んだ結果は引数で指定したリストline_dataに格納されます。
リードしたデータをprint関数で表示して終了します。

最後に

今まで学習してきたpythonの知識を利用してdxfリードのプログラムを作成しました。
学習用のプログラムなのでかなり簡易になっていますが基本的な機能は準備しました。
参考にしていただけると幸いです。

Python教室

Posted by taka