【PYTHON】DXFファイルから座標データを取得する
背景
自分の経験ですが、数年前は数値データをセンサから読み取ったデータを取得してPLCなどの制御装置で収集し、そのデータを変換して他の制御装置へ送ったり、他のアクチュエータへの操作量にするなどしてシステムを構築していました。
これらのシステムは、基本的に外部からの観測したデータに基づき制御するので実際に装置がないと検証できなく、実機がないと数値データを構築するためリードタイムが長く、手間が多いことが問題でした。品種が少ない、データ量がすくなければ、手打ちで問題ないですが、データが膨大になると、もうお手上げです
ってことで、DXFファイルなどの図面データから数値データを取得して効率化を図るため、PYTHONでDXFファイルを読み込む方法を実装しました。
1.DXFファイルとは
DXFファイルとは、Autodesk社が開発したファイル形式の1つです。よく、AutoCADというCADソフトを使っていましたが、それを読み書きするときに利用するファイル形式です。DXFは、Drawing Exchange Formatの略称で、図面の変換(交換)が可能な図面形式であることが特徴で、バージョンが異なる場合でもデータ相互が必要となり、DXFが重宝されています。
2.PYTHONでの読み込み方法
DXFファイルから座標データを読み込めないかと探した結果、dxfgrabberというモジュールがあるのでそれをPYTHONでインポートすることで利用できるようです。WHLの設定方法は、割愛しますが、dxfgrabber-1.0.1-py2.py3-none-any.whlをコマンドプロンプトから読み込まるせることで設定できます
3.実装
てなことで、DXFファイルから座標データを取得するプログラムサンプルで作成しました。
import numpy as np def main(): dxf = dxfgrabber.readfile("ファイル名.dxf") i = 0 #インデックスカウンタ d = [] #データをスタックする配列変数の定義 data = [0,0,0,0] #座標データの格納 for entity in dxf.entities: #座標データの数 if entity.dxftype == 'LINE': #ラインを探す x1 = entity.start[0] #開始点X座標 y1 = entity.start[1] #開始点X座標 x2 = entity.end[0] #終点X座標 y2 = entity.end[1] #終点Y座標 d = [x1, y1, x2, y2] #開始終点の座標を格納 data = np.vstack((data,d)) #データをスタック i = i + 1 #カウンタをインクリメント np.savetxt('line.csv',data,delimiter=',') #座標データを出力
入力データ(DXFファイル)
出力結果