ezdxfを使ってみよう#1～図面作成と設定編～

CADの拡張子の一つであるDXFを扱える**ezdxf**というpythonライブラリを使って、**dxfの自動作図**を研究します。
自分のプログラミングノートを兼ねて、シリーズでまとめていきます。
この章ではまず**簡単なdxfデータを作成し、初期設定の確認をします。**

[次章はこちら:#2～図面描画編～](https://qiita.com/Rai-see/items/eb74fcbac53f6a749355)

1. **ezdxfのインストール**
1. **自動作図は最短５行！**
1. **エディター内でdxfを即確認できる**
1. **便利なsetupを設定**
1. **setupの中身を確認**

開発環境
windows 10(64bit)
Python 3.8.10
ezdxf 0.17.2

## ezdxfのインストール
```Python:pip install ezdxf 
pip install ezdxf 
```
Excelに記録した座標を読み込んでの作図や、dxfを読み込んでExcelにまとめるなどをするには、openpyxlやpandasなどのライブラリを用いるようになっていきます。
## 自動作図は最短５行！
**線を一本作図した図面を作成します。**（図形の書き方の詳細は[次章:#2～図面描画編～](https://qiita.com/Rai-see/items/eb74fcbac53f6a749355)でまとめています）
```Python:ezdxf.new
import ezdxf 
#新規のdxfを作成してバージョンを定義する
doc = ezdxf.new('R2010')
#モデルスペースを変数に定義する
msp = doc.modelspace() 
#モデルスペースに線を挿入
msp.add_line((0, 0), (10, 0))
#dxfを現在のディレクトリに保存
doc.saveas('図面1.dxf')
```
線が一本入ったdxfが作られました。これが**ezdxfの作図の基本形になります。**
![ezdxfの作図の基本形](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/0f6d3735-d41f-2ee1-62ec-13fd65e5968c.png)
[参考：公式ドキュメント](https://ezdxf.readthedocs.io/en/stable/tutorials/simple_drawings.html)

## エディター内でdxfを即確認できる
pythonで生成したdxfを**毎回CADで読み込んで確認していては時間がかかります。**
ezdxfのアドオンを利用して**エディター上で即確認できるようにしましょう。**
ライブラリのインポート部分と最下層の#追記部分を貼り付けるだけです。上の線一本コードを例に記載します。
アドオンはmatplotlibというグラフなどを作成するライブラリで**dxfを画像化データを生成する仕組みです。**
この記事でアップする画像はこの画像データを主とします。

```Python:ezdxf.addons.drawing
#追記部分
import matplotlib.pyplot as plt
import ezdxf
from ezdxf import recover
from ezdxf.addons.drawing import RenderContext, Frontend
from ezdxf.addons.drawing.matplotlib import MatplotlibBackend
#作図部分
doc = ezdxf.new('R2010')
msp = doc.modelspace()
msp.add_line((0, 0), (10, 0))
doc.saveas('図面1.dxf') #dxfの保存　確認だけなら不要
#追記部分
fig = plt.figure()
ax = fig.add_axes([0, 0, 1, 1])
ctx = RenderContext(doc)
out = MatplotlibBackend(ax)
Frontend(ctx, out).draw_layout(msp, finalize=True)
fig.show()
```
dxfデータのグラフ化を画像化したような感じなので、うまく表現されない部分もあります（寸法線など）[参考：公式ドキュメント](https://ezdxf.readthedocs.io/en/stable/addons/drawing.html)

## 便利なsetupを設定
通常ezdxfで文字列のフォントや線種を選択するには、まず個別にフォントなどを登録する作業が発生します。これを毎回やるのは非常に面倒ですし、コードの煩雑化を招きます。
**ezdxfデフォルトのフォント・線種・寸法線の規格をプリセット**することにより、それらの作業の省力化を図れます。
新規のdxf作成時のコードに下記のように引数に"**setup=True**"を渡します。setupの中身は下記の通りで、リストで個別指定も可能です。
- linetypes（線種）
- styles（フォント）
- dimstyles（寸法線）
- visualstyles（表示スタイル(3D)）


```Python:setup
doc = ezdxf.new("R2010", setup=True)#全部指定
doc = ezdxf.new("R2010", setup=['linetypes', 'styles'])#個別指定
```
## setupの中身を確認
上記の作図基本形コードをもとに、pythonらしく各要素をリストに格納しforループで回して作図してみます。

### linetypes　線種は21種類
<details><summary>linetypes一覧</summary>
・ByBlock（ブロックの設定に従う）
・ByLayer（レイヤーの設定に従う）
・Continuous
・CENTER
・CENTERX2
・CENTER2
・DASHED
・DASHEDX2
・DASHED2
・PHANTOM
・PHANTOMX2 PHANTOM2
・DASHDOT
・DASHDOTX2
・DASHDOT2
・DOT
・DOTX2
・DOT2
・DIVIDE
・DIVIDEX2
・DIVIDE2
</details>

```Python:linetypes
linetypes =['ByBlock', 'ByLayer', 'Continuous', 'CENTER', 'CENTERX2', 'CENTER2', 'DASHED',
            'DASHEDX2', 'DASHED2', 'PHANTOM', 'PHANTOMX2' 'PHANTOM2', 'DASHDOT', 'DASHDOTX2', 
            'DASHDOT2', 'DOT', 'DOTX2', 'DOT2', 'DIVIDE', 'DIVIDEX2', 'DIVIDE2']

doc = ezdxf.new("R2010", setup=True)
msp = doc.modelspace() 

for i,linetype in enumerate(linetypes):
  msp.add_text(str(i+1)+" " + linetype, dxfattribs={'layer':'TEXTLAYER','style': j,'height':10}).set_pos((0, -20*i))
  msp.add_line(start=[100, -20*i+5], end=[500,-20*i+5], dxfattribs={'layer':'TEXTLAYER','linetype': linetype})
```
![linetype](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/297055f9-7aa2-bf43-531e-f4a2f5cfe614.png)

自動作図っぽくなってきましたね！なお線種はご使用のCADソフトに依存する場合があります。[参考：公式ドキュメント](https://ezdxf.readthedocs.io/en/stable/concepts/linetypes.html?highlight=ezdxf.new(setup%3DTrue#linetypes))

### styles　フォントは26種類（※日本語は別途追加の必要あり）

<details><summary>styles一覧</summary>
・Standard
・OpenSans-Light
・OpenSans-Light-Italic
・OpenSans
・OpenSans-Italic
・OpenSans-SemiBold
・OpenSans-SemiBoldItalic
・OpenSans-Bold
・OpenSans
・BoldItalic		
・OpenSans-ExtraBold
・OpenSans-ExtraBoldItalic
・OpenSansCondensed-Bold
・OpenSansCondensed-Light		
・OpenSansCondensed-Italic
・LiberationSans
・LiberationSans-Bold
・LiberationSans-BoldItalic		
・LiberationSans-Italic
・LiberationSerif
・LiberationSerif-Bold
・LiberationSerif-BoldItalic		
・LiberationSerif-Italic
・LiberationMono
・LiberationMono-Bold
・LiberationMono-BoldItalic
・LiberationMono-Italic	
</details>

```python
styles =['Standard', 'OpenSans-Light', 'OpenSans-Light-Italic', 'OpenSans', 'OpenSans-Italic',
             'OpenSans-SemiBold', 'OpenSans-SemiBoldItalic', 'OpenSans-Bold', 'OpenSans-BoldItalic',
             'OpenSans-ExtraBold', 'OpenSans-ExtraBoldItalic', 'OpenSansCondensed-Bold', 'OpenSansCondensed-Light',
             'OpenSansCondensed-Italic', 'LiberationSans', 'LiberationSans-Bold', 'LiberationSans-BoldItalic',
             'LiberationSans-Italic', 'LiberationSerif', 'LiberationSerif-Bold', 'LiberationSerif-BoldItalic',
             'LiberationSerif-Italic', 'LiberationMono', 'LiberationMono-Bold', 'LiberationMono-BoldItalic', 'LiberationMono-Italic']

doc = ezdxf.new("R2010", setup=True  ,units=True)
msp = doc.modelspace() 

for i,style in enumerate(styles):
  msp.add_text("style "+str(i+1)+" " + style, dxfattribs={'layer': 'TEXTLAYER','style': style,'height':15}).set_pos((0, -20*i))
```
![styles](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/048e002a-1524-86df-ca63-7a4def791c86.png)

[参考：公式ドキュメント](https://ezdxf.readthedocs.io/en/stable/tutorials/text.html?highlight=ezdxf.new(setup%3DTrue#standard-text-styles))
なお、フォントの追加方法はこちら[#3:フォントの追加](https://qiita.com/Rai-see/items/294a36b84ae13eb1077f#%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0)

### dimstyles　寸法線は12種類

<details><summary>dimstyles一覧</summary>
・Standard
・EZDXF
・EZ_M_100_H25_CM
・EZ_M_50_H25_CM
・EZ_M_25_H25_CM
・EZ_M_20_H25_CM
・EZ_M_10_H25_CM
・EZ_M_5_H25_CM
・EZ_M_1_H25_CM
・EZ_RADIUS
・EZ_RADIUS_INSIDE
・EZ_CURVED
</details>


```Python:dimstyles
dimstyles =['Standard', 'EZDXF', 'EZ_M_100_H25_CM', 'EZ_M_50_H25_CM', 'EZ_M_25_H25_CM', 'EZ_M_20_H25_CM', 'EZ_M_10_H25_CM', 'EZ_M_5_H25_CM', 'EZ_M_1_H25_CM', 'EZ_RADIUS', 'EZ_RADIUS_INSIDE', 'EZ_CURVED']

doc = ezdxf.new("R2010", setup=True)
msp = doc.modelspace() 

for i,dimstyle in enumerate(dimstyles):
  msp.add_text(str(i+1)+" " + dimstyle, dxfattribs={'layer':'TEXTLAYER','style': dimstyle,'height':0.1}).set_pos((-2, -0.5*i))
  msp.add_line(start=[0, -0.5*i+0.1], end=[1,-0.5*i+0.1], dxfattribs={'layer':'TEXTLAYER'})

  dim = msp.add_linear_dim(
    base=(1,  -0.5*i+0.1),  # location of the dimension line
    p1=(0,  -0.5*i+0.1),  # 1st measurement point
    p2=(1,  -0.5*i+0.1),  # 2nd measurement point
    dimstyle=dimstyle,  # default dimension style
  )
  dim.render()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/705528/7c99b722-fd68-16c7-be6f-e2ebcda88e3d.png)


### visualstyles　表示スタイルは25種類

<details><summary>visualstyles一覧</summary>
・OpenSans-Light
・OpenSans-Light-Italic
・OpenSans
・OpenSans-Italic
・OpenSans-SemiBold
・OpenSans-SemiBoldItalic
・OpenSans-Bold
・OpenSans-BoldItalic
・OpenSans-ExtraBold
・OpenSans-ExtraBoldItalic
・OpenSansCondensed-Bold
・OpenSansCondensed-Light
・OpenSansCondensed-Italic
・LiberationSans
・LiberationSans-Bold
・LiberationSans-BoldItalic
・LiberationSans-Italic
・LiberationSerif
・LiberationSerif-Bold
・LiberationSerif-BoldItalic
・LiberationSerif-Italic
・LiberationMono
・LiberationMono-Bold
・LiberationMono-BoldItalic
・LiberationMono-Italic
</details>

※当方3D-CAD非所持のため確認不可です。紹介まで…。

## #1まとめ
今章は図面データの作成と、setupの設定をまとめました。
次章は図形描画をまとめたいと思います。

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