この章では寸法線の描画についてまとめます。
前章はこちら:#3~レイヤー・dxfattribs 図形の属性・描画の補足編~
次章はこちら:#5~実践!自動作図編~
- 寸法の注意点
- 直線の寸法
- 半径・直径の寸法
- 角度の寸法
- 弧の長さの寸法
寸法の注意点
寸法の文字や矢印の大きさ・位置・種類は下記の様にdimstylesで定義されます。
doc.dimstyles.add("my_radiusdim", dxfattribs={"dimtxt":20, "dimtad":1, "dimtmove":2, "dimatfit":1, "dimfxl":10})
属性は
とても種類が多い上、寸法は環境により再現が左右されるので、各リンクを参照していただきたいです。
matplotlibで寸法線を確認するためには .render() が必要になります。他の図形とは異なりますね。
直線の寸法
Liner Dimension
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()
dim3 = msp.add_linear_dim(
base=(6, 6),
p1=(2, 0),
p2=(5, 4),
angle=45,
dimstyle="EZDXF",
).render()
標準的な寸法線ができましたね、水平垂直部はこのメソッドで十分かと思われます。
しかし、以下の留意点があるため部分的に次のメソッドadd_aligned_dimを用いるのが良いかなと考えられます。
Linerの留意点
- 寸法線の位置を指定するbaseは絶対座標です。水平垂直以外ではコントロールしにくい難点がありますし、def関数などで量産する場合は、変数を交える必要があります。
- baseに表現不可能な座標値が与えられ場合は可能な範囲で表示される
(例えば水平な寸法線のbaseに(1,2)を設定してもy軸の2のみしか採用されません※angle=0の場合) - Linerは対象の角度の変更に追随できない上、水平垂直以外は計測対象の角度を正確にangleに入力する必要があります。 それに加えて正確な絶対座標にbaseを設定する必要があります。例えば32.5°の直線に対して文字をオフセットできる(x,y)は?という計算が発生してしまいます。
(そこに手計算や計算用コードを書いて対応するよりも、CADで書いた方が正直早い場合もあるかと)
なお、寸法線のスタイルについては#1:dimstyles 寸法線は12種類を参照ください。
Aligned Dimension
dim = msp.add_aligned_dim(
p1=(0, 5), # 1点目
p2=(2, 3), # 2点目t
distance=2, #寸法線の離れ
dimstyle="EZDXF", # 寸法線のスタイル
).render()
Liner Dimensionとの違いは、p1とp2を結ぶ線に平行な寸法線を描画する点です。
その特徴により以下の点において異なる部分がでてきます。
- 角度の変更に追随できるので、斜辺長の計測が容易である(Linerは斜辺の角度を取得しないと正確に計測できない上に変更に追随できない)
- 斜線に対してAlignedは斜辺長のみを計測する(Linerは同一の2点を抑えて寸法線を描画した場合、angleによって底辺・高さ・斜辺長を計測できる)
- Linerの様に足の長さの異なる寸法線は描画できない
文字列や固定値の表示
寸法線に文字列や固定した数値の表示などもできます。正確な寸法を表示できない大人の事情にも対応できます。
dim = msp.add_aligned_dim(
p1=(0, 5), # 1点目
p2=(2, 3), # 2点目t
distance=2, #寸法線の離れ
dimstyle="EZDXF", # 寸法線のスタイル
text="Hello ezdxf 123m" #表示したい文字列
).render()
直線の寸法まとめ
Liner Aligned双方の特徴として、形状が複雑になると寸法線同士を揃えづらくなることがあげられます。
仕様上仕方がないのですが、それぞれのメソッドで描画される寸法線の高さを全て計算して揃えるくらいなら、
大量生産しない限り最後にCADで手動で寸法線を調整した方がいいかなと思います。
なお、グリッド的に連続的な寸法線を作れるメソッドがありますが、あまり実用性が感じられないので、リンクだけ張っておきます。
チュートリアル:Tutorial for Ordinate Dimensions
寸法線は他にも微細な設定が可能ですが、手作業で最終調整が必要だったりCADによって設定が吹き飛んだりする寸法では、あまり出番がなさそうなので割愛しますの。こちらもリンクをご覧ください。
チュートリアル:Tutorial for Linear Dimensions
半径・直径の寸法
半径
msp.add_circle((0, 0), radius=3) #比較用の円を描画
msp.add_radius_dim(
center=(0, 0),
radius=3,
angle=45,
dimstyle="EZ_RADIUS"
).render()
円の書き方とほとんど一緒の考えですね。angleで寸法の表示位置を指定します。
同様に微細な設定についてはチュートリアル:Tutorial for Radius Dimensionsをご覧ください。
直径
msp.add_circle((0, 0), radius=3) #比較用の円を描画
msp.add_diameter_dim(
center=(0, 0),
radius=3,
angle=45,
dimstyle="EZ_RADIUS"
).render()
半径とメソッド以外は同じですが、寸法値の描画されるところに違いがあるようです。45°が起点で対極の終点に寸法値が来るイメージでしょうか。
同様に微細な設定についてはチュートリアル:Tutorial for Diameter Dimensionsをご覧ください。
角度の寸法
CRA:中心点・半径・起点角・終点角を指定する
msp.add_angular_dim_cra(
center=(5, 5), # center point of the angle
radius= 7, # distance from center point to the start of the extension lines
start_angle=60, # start angle in degrees
end_angle=120, # end angle in degrees
distance=3, # distance from start of the extension lines to the dimension line
dimstyle="EZ_CURVED", # default angular dimension style
).render()
2線内角Angle by 2 Lines
base = (5.8833, -6.3408) # location of the dimension line
p1 = (2.0101, -7.5156) # start point of 1st leg
p2 = (2.7865, -10.4133) # end point of 1st leg
p3 = (6.7054, -7.5156) # start point of 2nd leg
p4 = (5.9289, -10.4133) # end point of 2nd leg
dim = msp.add_angular_dim_2l(
base=base, # defines the location of the dimension line
line1=(p1, p2), # start leg of the angle
line2=(p3, p4), # end leg of the angle
dimstyle="EZ_CURVED", # default angular dimension style
)
3点内角Angle by 3 Points
msp.add_angular_dim_3p(
base=(0, 7), # location of the dimension line
center=(0, 0), # center point
p1=(-3, 5), # end point of 1st leg = start angle
p2=(3, 5), # end point of 2nd leg = end angle
).render()
Auto-CADでは正常に表現されますが、別のCADやmatplotlibでは意図しない寸法になることもあるようです。
既存の弧の角度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()
既存の弧から寸法が作れるとコーディングが楽ですね。
角度寸法まとめ
どれも状況に応じて使い分けできるのですが、
強いて違いを書くなら、2線内角と3点内角にはbase(面倒くさい)が採用されています。
可能な限りCRAかAngle from ConstructionArcを選んで、寸法の離れをdistanceで指定できれば作業しやすいと思います。
うまく作図されない現象もbaseが関わっている感じがあります。
チュートリアル:Tutorial for Angular Dimensions
弧の長さの寸法
CRA:中心点・半径・起点角・終点角を指定する
msp.add_arc_dim_cra(
center=(5, 5), # center point of the angle
radius=5, # distance from center point to the start of the extension lines
start_angle=60, # start angle in degrees
end_angle=120, # end angle in degrees
distance=2, # distance from start of the extension lines to the dimension line
dimstyle="EZ_CURVED", # default angular dimension style
).render()
3点:中心点と弧の起終点を指定する
msp.add_arc_dim_3p(
base=(0, 7), # location of the dimension line
center=(0, 0), # center point
p1=(2.5, 4.330127018922193), # 1st point of arc defines start angle and radius
p2=(-2.5, 4.330127018922194), # 2nd point defines the end angle
).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で指定できれば作業しやすいと思います。
寸法まとめ
寸法の特徴として、何もないところにはあまり寸法線は生まれないと考えると、既存の図形や座標の有効活用するコーディングがスムーズさのカギとなりそうです。
次章では作図編のまとめとして、規格の異なる構造物を連続で作図して、寸法線を配置するコードを作成してみます。