以下の内容はhttps://end0tknr.hateblo.jp/entry/20250106/1736111417より取得しました。


ezdxf for python によるdxf作成のお試し

dxfに対して様々な操作はできますが、 「寸法線矢印を片側のみ」にするなど、「なんでもできる」という訳ではないようです

参考url

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
import time

def main():
    doc = ezdxf.new('R2004',
                    #setup=True # Trueにするとなぜか寸法値が100倍に...
                    )
    doc.encoding = 'utf-8'
    
    # 一点鎖線のスタイル
    # https://ezdxf.readthedocs.io/en/stable/tutorials/linetypes.html
    doc.linetypes.new(name="MY_DASHDOT",
                      dxfattribs={'pattern': [100, 70, -10, 10, -10] })
    
    msp = doc.modelspace()
    add_base_frame(msp)         #図形
    add_base_frame_dim(msp)     #寸法

    doc.saveas('draw.dxf')
    
    # 以下はdebug用の matplotlib.pyplot での画面表示
    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)
    plt.show()


def add_base_frame_dim(msp):
    dim_override = {'dimtxt': 30,       # 寸法値のsize
                    "dimasz": 30,       # 矢印のsize
                    "dimblk": "OPEN30", # 矢印の形
                    "dimdsep":ord('.'), # 小数点
                    "dimtad": 1,        # 寸法値の表示位置
                    }
    # 縦枠の寸法
    dim = msp.add_aligned_dim( p1=(0,0), p2=(0,2615), distance=300,
                               override=dim_override)
    dim.shift_text(dh=0, dv=10) # 寸法値の表示位置のずらし
    #dim.set_tolerance(0.1, hfactor=0.8, dec=1) # 寸法公差(公差, 表示size, 有効桁数)
    dim.render()
    
    dim = msp.add_aligned_dim( p1=(0,0), p2=(0,516), distance=200,
                               override=dim_override)
    dim.shift_text(dh=0, dv=10) # 寸法値の表示位置のずらし
    dim.render()
    
    dim = msp.add_aligned_dim( p1=(0,516), p2=(0,516+730), distance=200,
                               override=dim_override)
    dim.shift_text(dh=0, dv=10) # 寸法値の表示位置のずらし
    dim.render()
    
    dim = msp.add_aligned_dim( p1=(0,516+730), p2=(0,516+730+633), distance=200,
                               override=dim_override)
    dim.shift_text(dh=0, dv=10) # 寸法値の表示位置のずらし
    dim.render()

    dim = msp.add_aligned_dim( p1=(0,516+730+633), p2=(0,2615), distance=200,
                               override=dim_override)
    dim.shift_text(dh=0, dv=10) # 寸法値の表示位置のずらし
    dim.render()

    dim = msp.add_aligned_dim( p1=(0,0), p2=(0,32), distance=100,
                               override=dim_override)
    dim.shift_text(dh=20, dv=10) # 寸法値の表示位置のずらし
    dim.render()

    dim = msp.add_aligned_dim( p1=(0,2615-0.5), p2=(0,2615), distance=100,
                               override=dim_override)
    dim.shift_text(dh=-40, dv=10) # 寸法値の表示位置のずらし
    dim.render()

    dim = msp.add_aligned_dim( p1=(891,0), p2=(891,135), distance=-200,
                               text='(135)',
                               override=dim_override)
    dim.shift_text(dh=0, dv=10) # 寸法値の表示位置のずらし
    dim.render()


    dim_override["dimtoh"] = 1 # 寸法値の表示を水平化
    dim = msp.add_radius_dim(
        center=(891-2-16, 135), radius=7.5, angle=45,
        override=dim_override,
        text="12-○7.5" )
    dim.render()


def add_base_frame(msp):
    # 脚
    pipe_len = 32
    for pos in [[2,0],[891-2-32,0]]:
        msp.add_polyline2d( points_pipe_v(pipe_len,pos),
                            close=True, dxfattribs={'layer':'frame'})
    # 縦枠
    pipe_len = 2615-32-0.5
    for pos in [[2,32],[891-2-32,32]]:
        msp.add_polyline2d( points_pipe_v(pipe_len,pos),
                            close=True, dxfattribs={'layer':'frame'})

    # 縦枠の穴
    r = 7.5/2
    hole_x = 2+16
    for hole_x in [2+16,891-2-16]:
        for hole_y in [135,635,1010,1235,1735,2335]:
            msp.add_circle([hole_x,hole_y],radius=r,dxfattribs={'layer':'frame'})

    
    # 横枠
    pipe_len = 891-32*2-2*2
    for pos in [[2+32,32],
                [2+32,516-16],
                [2+32,516+730-16],
                [2+32,516+730+633-16],
                [2+32,516+730+633+736-32-0.5],
                ]:
        msp.add_polyline2d( points_pipe_h(pipe_len,pos),
                            close=True, dxfattribs={'layer':'frame'})
        
    msp.add_line( start=(0, 516), end=(891,516),
                  dxfattribs={'linetype':'MY_DASHDOT'})

    
def points_pipe_v(l,pos):
    w = 32
    points = [(pos[0],  pos[1]),  (pos[0]+w,pos[1]),
              (pos[0]+w,pos[1]+l),(pos[0],  pos[1]+l),(pos[0],  pos[1])]
    return points

def points_pipe_h(l,pos):
    w = 32
    points = [(pos[0],  pos[1]),  (pos[0]+l,pos[1]),
              (pos[0]+l,pos[1]+w),(pos[0],  pos[1]+w),(pos[0],  pos[1])]
    return points

if __name__ == '__main__':
    main()



以上の内容はhttps://end0tknr.hateblo.jp/entry/20250106/1736111417より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14