LoginSignup
9

posted at

updated at

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

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

次章はこちら:#2~図面描画編~

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

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

ezdxfのインストール

pip install ezdxf
pip install ezdxf 

Excelに記録した座標を読み込んでの作図や、dxfを読み込んでExcelにまとめるなどをするには、openpyxlやpandasなどのライブラリを用いるようになっていきます。

自動作図は最短5行!

線を一本作図した図面を作成します。(図形の書き方の詳細は次章:#2~図面描画編~でまとめています)

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の作図の基本形
参考:公式ドキュメント

エディター内でdxfを即確認できる

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

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データのグラフ化を画像化したような感じなので、うまく表現されない部分もあります(寸法線など)参考:公式ドキュメント

便利なsetupを設定

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

  • linetypes(線種)
  • styles(フォント)
  • dimstyles(寸法線)
  • visualstyles(表示スタイル(3D))
setup
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 ・DIVIDE2
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

自動作図っぽくなってきましたね!なお線種はご使用の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-Italic
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

参考:公式ドキュメント
なお、フォントの追加方法はこちら#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_CURVED
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

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の設定をまとめました。
次章は図形描画をまとめたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
9