ezdxfで図面を自動化(Python)
日々の定型業務で図面を頻繁に使うことが多い業務もあると思います。サイズ違いや名称違いなどでAutoCADやIJCADなどを開いては閉じてを繰り返す日々にうんざりしているでしょう。
今回はezdxf APIを使ってそういったdxf作成を自動化するヒントをお届けします。
先に述べておきますがezdxfのAPIは、非常に不親切で分かりにくいです。
まずは最新Ver.をインストール
1 |
pip install ezdxf #Google Colraboratryは先頭に"!" |
そして以下のコードを実行してみてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
import ezdxf from ezdxf.addons.drawing import matplotlib from ezdxf.addons.drawing import RenderContext, Frontend from ezdxf.addons.drawing.matplotlib import MatplotlibBackend import matplotlib.pyplot as plt #ディレクトリパス(例:GoogleColabratry) PATH = '/content/drive/MyDrive/Colab Notebooks/CAD/' name = "test" doc = ezdxf.new("R2018") #dxfのversion指定 doc.encoding = 'utf-8' #画層の定義 doc.styles.new(name='custom_style', dxfattribs={}) doc.layers.new('TEXTLAYER', dxfattribs={'color': 0}) msp = doc.modelspace() #add new entities to the modelspace #X軸 msp.add_line([0, 0], [1600, 0], dxfattribs={'layer': 'FrameLine'}) msp.add_line([0, 1000], [1600, 1000], dxfattribs={'layer': 'FrameLine'}) msp.add_line([0, 0], [0, 1000], dxfattribs={'layer': 'FrameLine'}) msp.add_line([1330, 53], [1600, 53], dxfattribs={'layer': 'FrameLine'}) msp.add_line([1330, 80], [1600, 80], dxfattribs={'layer': 'FrameLine'}) #Y軸 msp.add_line([1600, 0], [1600, 1000], dxfattribs={'layer': 'FrameLine'}) msp.add_line([0, 0], [0, 1000], dxfattribs={'layer': 'FrameLine'}) msp.add_line([1330, 0], [1330, 80], dxfattribs={'layer': 'FrameLine'}) #テキスト msp.add_text('TEXTLAYYER'+'('+'1600'+'×'+'1000'+')', dxfattribs={'layer': 'TEXTLAYER','style': 'custom_style','height':10}).set_pos((1350, 61)) msp.add_text('ONTAKU-AGENT', dxfattribs={'layer': 'TEXTLAYER','style': 'custom_style','height':20}).set_pos((1350, 15)) #図面をdxf形式で保存 doc.saveas(PATH+name+'.dxf', encoding='utf-8') #図面を画像化して出力 fig = plt.figure() ax = fig.add_axes([0,0,3,3]) ctx = RenderContext(doc) out = MatplotlibBackend(ax) Frontend(ctx, out).draw_layout(msp, finalize=True) fig.show() |
下記の図枠と文字が出てくるかと思います。
これで図枠の完成です。
続いて応用です。保存するコードの上に追加してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#円径・サークル doc.layers.new(name="Circle", dxfattribs={'color': 3, 'lineweight':18}) msp.add_circle((800, 500), radius=200, dxfattribs={'layer': 'Circle'}) #半円 a = msp.add_arc(center=(800,500),radius=100,start_angle=30, end_angle=120, dxfattribs={'layer': 'Circle'}).start_point print(a) #始点のXY座標を取得できます #中心線 doc.layers.new(name="Center", dxfattribs={'linetype':'CENTER', 'color': 2, 'lineweight':18}) msp.add_line([400, 500], [1200, 500], dxfattribs={'layer': 'Center','ltscale':6}) #寸法線 doc.dimstyles.new(name='dim_style', dxfattribs={'dimtxt':12,#テキスト大きさ 'dimclrt':6,#カラー 'dimclrd':6,#カラー 'dimclre':6,#カラー 'dimlfac':1,#線形寸法値の倍率 'dimtxsty':'custom_style' ,'dimtad':1,#文字位置 'dimasz':13,#寸法線と矢印のサイズ 'dimgap':2,#寸法線と寸法テキストの間のギャップサイズ 'dimexo':5,#原点から延長線までの距離マージン 'dimdle':2,#寸法補助線を超えた寸法線延長 }) doc.layers.new(name="Dimention", dxfattribs={'color': 6, 'lineweight':18}) msp.add_aligned_dim(p1=(600, 500), p2=(1000, 500),dimstyle='dim_style', dxfattribs={'layer': 'Dimention'}, distance=-300,override={'dimpost':'(<>)'}).render() |
これで最低限の図面が書けそうですね。注意点としてpngで出力しないと日本語が出力されません。
詳細はezdxfのチュートリアルを参照してみてください。styleやdxfattribsの扱いが難しいので、慣れるまでが大変です。
6 のコメント