ezdxfを使ってみよう#6～DXF読込基本編～

CADの拡張子の一つDXFを扱う**ezdxfによるDXFの読み込み**についてまとめます。
ここでは図形情報をエクセルに収集する方法をまとめます。
本章も冗長に行きます。

[前章はこちら：#5～実践！自動作図編～](https://qiita.com/Rai-see/items/51dcea8f496b58c41989)

> [**1.前提確認**](#前提確認)
> [**2.ライブラリのインポート**](#ライブラリのインポート)
> [**3.DXFの読み込み**](#DXFの読み込み)
> [**4.図形のデータ取得**](#図形のデータ取得)
> [**5.Pandasでデータフレーム化**](#pandasでデータフレーム化)
> [**6.Excelに保存・内容の確認**](#excelに保存・内容の確認)
> [**7.まとめ**](#まとめ)

# 前提確認

今回DXFはこちらのフリーの図枠を使用します。
採用理由は直線・円弧・文字列があるためです。
**DXFからこれらの図形の属性情報（長さ・レイヤー・色など）をタイプ別で取得し、エクセルに整理する**ことを本章の目標とします。
![frame.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/6fab4c74-4c6b-6908-bfd3-9c8034b2dcc9.jpeg)
●DXFダウンロード先
[AutoCAD操作説明書　 ［ 初心者のためのAutoCAD（オートキャド）使い方情報サイト］様](https://www.cadlt.net/tumiandaunrod.html)
## ライブラリのインポート
まずはライブラリのインポートから。
データ分析ライブラリのpandasが必要となります、pandasの詳細は後述します。
```Python
import ezdxf
import pandas as pd #"as pd" が一般的
```

# DXFの読み込み
DXFの内容を変数dxfに格納します
```Python
dxf = ezdxf.readfile('R12-A3ap100.dxf') #読込dxfのpath
```
# 図形のデータ取得
各要素をリストで変数に格納します、こちらが基本形になります。
```Python
lines = doc.query("LINE") #docから線要素を全て取り出す
lines = [entity.dxfattribs() for entity in lines]  #内包表記でリスト化しつつ、図形の属性を抽出します。

#以下リスト内包表記に組み込んで上記を１行で表現します
circles = [entity.dxfattribs() for entity in doc.query('CIRCLE')] 
arcs = [entity.dxfattribs() for entity in doc.query('ARC')] 
texts = [entity.dxfattribs() for entity in doc.query('TEXT')]
```
参考：要素の抽出方法について→[公式ドキュメント（英語）](
https://ezdxf.readthedocs.io/en/stable/usage_for_beginners.html#query-dxf-entities)

なお、公式ドキュメントに、
>All DXF names have to be uppercase.

とありますので、**query内の図形タイプは全て大文字**で記載します。（線＝"LINE",円弧＝"ARC"など）
このqueryの詳細な機能は次章に紹介します。
参考：queryの書き方→[公式ドキュメント（英語）](https://ezdxf.readthedocs.io/en/stable/query.html#entity-query)


# Pandasでデータフレーム化
データ分析ライブラリ**Pandas(=pd)** で取得したentity情報のリストをデータフレーム化して、エクセル保存の前準備をします。

私はデータ収集なども行っておりますのでPandasに馴染みがありますが、ここでは「**エクセルに変換するライブラリ**」 と割り切って問題ありません。
```Python
#データフレーム変数 = pd.DataFrame(要素リスト)
df_line = pd.DataFrame(lines) 
df_circle = pd.DataFrame(circles)
df_arc = pd.DataFrame(arcs)
df_text = pd.DataFrame(texts)
```
下記のように一連の作業を１行にしてしまっても良いと思います。
ちょっと何やってるかわからない感じになりますが、図形１種に１変数のみ使用という感じなので、アリだと思います。

```Python
df_text = pd.DataFrame([entity.dxfattribs() for entity in doc.query('TEXT')]) 
```
なお、私はやりません(;^ω^)
データ収集の時と使い方を統一しておきたいだけで、可読性以外の問題はありません。

# Excelに保存・内容の確認
Pandas.ExcelWriterで１つのブックへ、各要素をシート別に保存します。
```Python
with pd.ExcelWriter('dxf_excel.xlsx') as writer: #保存するブック名を指定
    df_line.to_excel(writer, sheet_name='line') #データフレームとシート名をそれぞれ指定
    df_text.to_excel(writer, sheet_name='text')
    df_circle.to_excel(writer, sheet_name='circle')
    df_arc.to_excel(writer, sheet_name='arc')
```
これでExcelのエクスポートは完了です。
早速Excelを開いてみましょう。各要素がシートごとに整理されているのがわかると思います。
**■線：lineシート**
![01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/04605212-8844-3a2b-4c5d-d79785f72d0b.jpeg)
**■文字列：textシート**
![02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/35281c7d-58b1-3e5b-72e3-99f196772f0d.jpeg)
**■円弧：arcシート**
![03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/17dd43f3-0039-bb63-a84b-01214c69e629.jpeg)
**※円は要素がないので割愛（対照実験として）**
シートが作成され、データは無しです。

整然とした様に荘厳な美を感じます（？）
DXFをExcelで直開いた時の絶望と言ったら…。

# まとめ

今回作成されたエクセルは以後「エクセルの表を読み込ませてezdxfで自動作図する」ステップで**重要なフォーマット**になります。
このフォーマット作図編で紹介したコードに対応させれば、Excelから可読的にDXFを作図することができるようになります。

また、この章のコードだけでも**DXFをExcelに変換するソフトウェアの作成が可能**です。Google colaboratoryに入れておくと便利です。

更に冗長になりそうなので、今回はここまでにします。
次回は他の要素やレイヤーなどの詳細な情報の取得についてまとめます。

https://qiita.com/Rai-see/items/aebf4587f7a9b30e3ab1

https://qiita.com/Rai-see/items/eb74fcbac53f6a749355

https://qiita.com/Rai-see/items/294a36b84ae13eb1077f

https://qiita.com/Rai-see/items/04a5733e77f791cdaa09

https://qiita.com/Rai-see/items/51dcea8f496b58c41989

https://qiita.com/Rai-see/items/713b106a058da50d7d43