CADの拡張子の一つであるDXFを扱えるezdxfというpythonライブラリを使って、dxfの自動作図を研究します。
自分のプログラミングノートを兼ねて、シリーズでまとめていきます。
この章ではまず簡単なdxfデータを作成し、初期設定の確認をします。
- ezdxfのインストール
- 自動作図は最短5行!
- エディター内でdxfを即確認できる
- 便利なsetupを設定
- setupの中身を確認
開発環境
windows 10(64bit)
Python 3.8.10
ezdxf 0.17.2
ezdxfのインストール
pip install ezdxf
Excelに記録した座標を読み込んでの作図や、dxfを読み込んでExcelにまとめるなどをするには、openpyxlやpandasなどのライブラリを用いるようになっていきます。
自動作図は最短5行!
線を一本作図した図面を作成します。(図形の書き方の詳細は次章:#2~図面描画編~でまとめています)
import ezdxf
#新規のdxfを作成してバージョンを定義する
doc = ezdxf.new('R2010')
#モデルスペースを変数に定義する
msp = doc.modelspace()
#モデルスペースに線を挿入
msp.add_line((0, 0), (10, 0))
#dxfを現在のディレクトリに保存
doc.saveas('図面1.dxf')
線が一本入ったdxfが作られました。これがezdxfの作図の基本形になります。
参考:公式ドキュメント
エディター内でdxfを即確認できる
pythonで生成したdxfを毎回CADで読み込んで確認していては時間がかかります。
ezdxfのアドオンを利用してエディター上で即確認できるようにしましょう。
ライブラリのインポート部分と最下層の#追記部分を貼り付けるだけです。上の線一本コードを例に記載します。
アドオンはmatplotlibというグラフなどを作成するライブラリでdxfを画像化データを生成する仕組みです。
この記事でアップする画像はこの画像データを主とします。
#追記部分
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データのグラフ化を画像化したような感じなので、うまく表現されない部分もあります(寸法線など)参考:公式ドキュメント
便利なsetupを設定
通常ezdxfで文字列のフォントや線種を選択するには、まず個別にフォントなどを登録する作業が発生します。これを毎回やるのは非常に面倒ですし、コードの煩雑化を招きます。
ezdxfデフォルトのフォント・線種・寸法線の規格をプリセットすることにより、それらの作業の省力化を図れます。
新規のdxf作成時のコードに下記のように引数に"setup=True"を渡します。setupの中身は下記の通りで、リストで個別指定も可能です。
- linetypes(線種)
- styles(フォント)
- dimstyles(寸法線)
- visualstyles(表示スタイル(3D))
doc = ezdxf.new("R2010", setup=True)#全部指定
doc = ezdxf.new("R2010", setup=['linetypes', 'styles'])#個別指定
setupの中身を確認
上記の作図基本形コードをもとに、pythonらしく各要素をリストに格納しforループで回して作図してみます。
linetypes 線種は21種類
linetypes一覧
・ByBlock(ブロックの設定に従う) ・ByLayer(レイヤーの設定に従う) ・Continuous ・CENTER ・CENTERX2 ・CENTER2 ・DASHED ・DASHEDX2 ・DASHED2 ・PHANTOM ・PHANTOMX2 PHANTOM2 ・DASHDOT ・DASHDOTX2 ・DASHDOT2 ・DOT ・DOTX2 ・DOT2 ・DIVIDE ・DIVIDEX2 ・DIVIDE2linetypes =['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})
自動作図っぽくなってきましたね!なお線種はご使用のCADソフトに依存する場合があります。参考:公式ドキュメント
styles フォントは26種類(※日本語は別途追加の必要あり)
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-Italicstyles =['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))
参考:公式ドキュメント
なお、フォントの追加方法はこちら#3:フォントの追加
dimstyles 寸法線は12種類
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_CURVEDdimstyles =['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()
visualstyles 表示スタイルは25種類
visualstyles一覧
・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※当方3D-CAD非所持のため確認不可です。紹介まで…。
#1まとめ
今章は図面データの作成と、setupの設定をまとめました。
次章は図形描画をまとめたいと思います。