前回は図形の描画とレイヤー・色・日本語フォントまでを解説しました。今回は寸法線の描画だけに絞って、じっくり解説します。
寸法線は直線・半径・直径・角度・弧の長さで使うメソッドが全く異なり、それぞれに専用の書き方があります。1つずつ丁寧に見ていきましょう。

寸法線を描く前の注意点
寸法線は他の図形と違い、作成しただけでは表示されません。必ず作成後に.render()を呼ぶ必要があります。
寸法の文字や矢印の大きさ・位置・種類は、第1回で紹介したdimstylesで定義されています。独自の寸法スタイルを作ることもできます。
doc.dimstyles.add("my_radiusdim",
dxfattribs={"dimtxt": 20, "dimtad": 1, "dimtmove": 2, "dimatfit": 1, "dimfxl": 10})
直線の寸法:Linear と Aligned
直線の距離を測る寸法線には、LinearとAlignedの2つのメソッドがあります。
Linear Dimension
angleで寸法線の向きを指定します。水平・垂直・斜めの3パターンを並べてみます。
# 水平な寸法線
dim1 = msp.add_linear_dim(
base=(1, 2), # 寸法線の位置
p1=(0, 0), # 1点目
p2=(3, 1), # 2点目
angle=0, # 角度
dimstyle="EZDXF",
).render()
# 垂直な寸法線
dim2 = msp.add_linear_dim(
base=(4, 4),
p1=(3, 0),
p2=(3, 4),
angle=90,
dimstyle="EZDXF",
).render()
# 45度斜めの寸法線
dim3 = msp.add_linear_dim(
base=(6, 6),
p1=(2, 0),
p2=(5, 4),
angle=45,
dimstyle="EZDXF",
).render()
標準的な水平・垂直の寸法線は、このメソッドだけで十分です。ただし次の3点に注意してください。
Linearの留意点
- baseは絶対座標です。水平・垂直以外の角度ではコントロールしづらく、量産する場合は座標計算が必要になります(例:
angle=0で水平な寸法線を描くとき、baseに(1, 2)を指定してもy軸の2だけが採用されます) - 計測対象の角度変更に追随しません。水平・垂直以外では、対象の角度を毎回正確に
angleへ入力する必要があります - 斜辺を測りたい場合、斜辺の角度を計算してangleに渡す必要があります。32.5°の直線に対して文字をどう配置するか、といった計算が発生するため、この用途には次のAlignedの方が向いています
Aligned Dimension
dim = msp.add_aligned_dim(
p1=(0, 5), # 1点目
p2=(2, 3), # 2点目
distance=2, # 寸法線の離れ
dimstyle="EZDXF",
).render()

Linearとの違いは、p1とp2を結ぶ線に平行な寸法線を自動で描画する点です。この特徴により、次のような違いが生まれます。
- 角度の変更に追随できるので、斜辺長の計測が容易(Linearは斜辺の角度を取得しないと正確に計測できず、変更にも追随できません)
- 斜線に対してAlignedは斜辺長のみを計測します(Linearなら同一の2点でも、angleの指定次第で底辺・高さ・斜辺長のいずれも計測できます)
- Linearのように足の長さが異なる寸法線は描画できません
文字列や固定値を表示する
dim = msp.add_aligned_dim(
p1=(0, 5), p2=(2, 3), distance=2, dimstyle="EZDXF",
text="Hello ezdxf 123m", # 表示したい文字列
).render()

直線の寸法まとめ
| Linear Dimension | Aligned Dimension | |
|---|---|---|
| 位置指定 | baseに絶対座標を指定 | distanceで計測線からの離れを指定 |
| 角度変更への追随 | しない(angleを再入力する必要あり) | する(2点を結ぶ線に自動で平行になる) |
| 向いている場面 | 水平・垂直な寸法 | 斜辺長など、角度が定まらない寸法 |
半径・直径の寸法
円の半径・直径を測る寸法線です。書き方はほとんど同じで、メソッド名だけが変わります。
半径(Radius Dimension)
msp.add_circle((0, 0), radius=3) # 比較用の円を描画
msp.add_radius_dim(
center=(0, 0),
radius=3,
angle=45, # 寸法線を表示する方向
dimstyle="EZ_RADIUS",
).render()

円の描き方(add_circle)とほぼ同じ考え方で書けます。angleで寸法線をどの向きに表示するかを指定します。
直径(Diameter Dimension)
msp.add_circle((0, 0), radius=3)
msp.add_diameter_dim(
center=(0, 0),
radius=3,
angle=45,
dimstyle="EZ_RADIUS",
).render()

半径とメソッド名(add_diameter_dim)以外はまったく同じ書き方です。違うのは寸法値の描かれる位置で、angleで指定した起点から、その対極の終点にかけて寸法線が引かれます。
角度の寸法
角度を測る寸法線には4つの指定方式があります。どれも「角度」を測る点は同じですが、必要な情報の渡し方が異なります。
方式①:CRA(中心点・半径・起点角・終点角)
msp.add_angular_dim_cra(
center=(5, 5), # 中心点
radius=7, # 中心点から延長線の開始位置までの距離
start_angle=60, # 開始角度
end_angle=120, # 終了角度
distance=3, # 延長線の開始位置から寸法線までの距離
dimstyle="EZ_CURVED",
).render()

方式②:2線内角(Angle by 2 Lines)
base = (5.8833, -6.3408) # 寸法線の位置
p1 = (2.0101, -7.5156) # 1本目の線の開始点
p2 = (2.7865, -10.4133) # 1本目の線の終了点
p3 = (6.7054, -7.5156) # 2本目の線の開始点
p4 = (5.9289, -10.4133) # 2本目の線の終了点
dim = msp.add_angular_dim_2l(
base=base,
line1=(p1, p2), # 1本目の辺
line2=(p3, p4), # 2本目の辺
dimstyle="EZ_CURVED",
)
dim.render()

方式③:3点内角(Angle by 3 Points)
msp.add_angular_dim_3p(
base=(0, 7), # 寸法線の位置
center=(0, 0), # 中心点
p1=(-3, 5), # 1本目の辺の終点(=開始角度)
p2=(3, 5), # 2本目の辺の終点(=終了角度)
).render()

方式④:既存の弧から(Angle from ConstructionArc)
# 参照用の弧を描画
arc = msp.add_arc(
center=(0, 0),
radius=5,
start_angle=60,
end_angle=120,
)
# 弧を読み込んで角度寸法を描画
msp.add_angular_dim_arc(
arc.construction_tool(),
distance=2,
).render()

すでに描いた弧のconstruction_tool()を渡すだけで寸法線が作れます。中心点や角度を自分で計算し直す必要がなく、4方式の中でもっとも手間がかかりません。
角度寸法まとめ
4方式とも用途に応じて使い分けられますが、あえて違いを言うなら2線内角・3点内角はbase(寸法線位置の絶対座標)の指定が面倒という共通点があります。うまく作図されない現象も、多くはこのbaseの指定に関わっています。
弧の長さの寸法
角度ではなく、弧そのものの長さを測る寸法線です。指定方式は角度寸法と似ていますが、3つに絞られます。
方式①:CRA(中心点・半径・起点角・終点角)
msp.add_arc_dim_cra(
center=(5, 5),
radius=5,
start_angle=60,
end_angle=120,
distance=2,
dimstyle="EZ_CURVED",
).render()

方式②:3点(中心点と弧の起終点を指定)
msp.add_arc_dim_3p(
base=(0, 7), # 寸法線の位置
center=(0, 0), # 中心点
p1=(2.5, 4.330127018922193), # 弧の開始点(=開始角度と半径を決める)
p2=(-2.5, 4.330127018922194), # 弧の終了点
).render()

方式③:既存の弧から
arc = msp.add_arc(
center=(0, 0), radius=5, start_angle=60, end_angle=120,
dxfattribs={'color': 2},
)
msp.add_arc_dim_arc(
arc.construction_tool(),
distance=2,
).render()

弧の長さ寸法まとめ
角度寸法ととても似た構造です。同様に寸法の離れをdistanceで指定できる「既存の弧から」がもっとも作業しやすい方式です。
まとめ
寸法線は図形によって書き方がまったく異なるので、最初は戸惑いやすいポイントです。それぞれの型を整理しておきます。
- 寸法線は作成後に必ず
.render()を呼ぶ - 直線は水平・垂直はLinear、斜辺はAlignedで使い分ける
- 半径・直径はメソッド名以外ほぼ同じ書き方
- 角度・弧長は「既存の弧から」が一番手間がかからない
- 「2線内角」「3点内角」はbaseの絶対座標指定が面倒、可能ならCRA系を優先する
- 何もないところに寸法線は生まれない。既存の図形の座標をそのまま使うのがコードを煩雑にしないコツ

シリーズ記事一覧
「ezdxfを使ってみよう」シリーズの全記事です。




コメントお待ちしてます!