生産技術者サラリーマンの日々

社畜サラリーマンが生産技術やお金の悩みを徒然と書くブログです。私の備忘録が共有できるとうれしいです

【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ファイル)

入力データ(DXFファイル)
入力データ(DXFファイル)

出力結果

出力結果
出力結果
https://blog.hatena.ne.jp/inusan0424/inusan0424.hatenablog.com/config/design/detail