覚書その1 python
パソコンを買い替えた時用の覚書
python
jww-cad用 dxf形式図面。
(歯形と工具の干渉をチェックするため自動作図コード)
コードを実行→所定の変数を入力→dxf形式でファイルが作られる
※jww-cad の設定→基本設定→dxfファイルタブ 図面の範囲を読み取る チェックボックスを外す。 (pythonで作図したものの縮尺がおかしくなるための処置)
コードを実行前にインストール
!pip install ezdxf
以下コードでpythonを実行
import math
import ezdxf
def add_tooth_profile(msp, tooth_top_width, tooth_height, pressure_angle, tooth_bottom_width, offset_x, offset_y):
"""
歯形プロファイルを描画します。
Args:
msp: DXFモデルスペース
tooth_top_width (float): 歯先幅
tooth_height (float): 歯丈
pressure_angle (float): 圧力角(度)
tooth_bottom_width (float): 歯元幅
offset_x (float): X方向のオフセット
offset_y (float): Y方向のオフセット
Returns:
list: 描画された図形の点座標リスト
"""
# 圧力角を90度から引いて計算
adjusted_angle = 90 - pressure_angle
adjusted_angle_rad = math.radians(adjusted_angle)
# 歯元幅を2倍にする
tooth_bottom_width *= 2
# 座標の計算
top_left_x = -tooth_top_width / 2 + offset_x
top_right_x = tooth_top_width / 2 + offset_x
top_y = offset_y
bottom_left_x = top_left_x - tooth_height / math.tan(adjusted_angle_rad)
bottom_right_x = top_right_x + tooth_height / math.tan(adjusted_angle_rad)
bottom_y = offset_y - tooth_height
tooth_bottom_right_x = bottom_right_x + tooth_bottom_width / 2
# 点の座標
points = [
(top_left_x, top_y),
(top_right_x, top_y),
(bottom_right_x, bottom_y),
(tooth_bottom_right_x, bottom_y),
(bottom_left_x, bottom_y),
(top_left_x, top_y),
]
# 図形の描画
for i in range(len(points) - 1):
msp.add_line(points[i], points[i + 1])
return points
def add_rounded_rectangle(msp, offset_x, offset_y):
"""
丸面取り付きの長方形を描画し、円の中心からの線を追加します。
Args:
msp: DXFモデルスペース
offset_x (float): X方向のオフセット
offset_y (float): Y方向のオフセット
"""
# 長方形の寸法
long_side = 1.6 # 短辺
short_side = 5.0 # 長辺
chamfer_radius = 0.8 # 面取りの半径
angle = 15 # 斜辺の角度(度)
extension_length = 10.0 # 斜辺の長さ
# 角度をラジアンに変換
angle_rad = math.radians(angle)
# 長方形の頂点座標(オフセットを加算)
top_left = (-long_side / 2 + offset_x, short_side / 2 + offset_y)
top_right = (long_side / 2 + offset_x, short_side / 2 + offset_y)
bottom_left = (-long_side / 2 + offset_x, -short_side / 2 + offset_y)
bottom_right = (long_side / 2 + offset_x, -short_side / 2 + offset_y)
# 左下の丸面取りの中心点
chamfer_bottom_left = (bottom_left[0] + chamfer_radius, bottom_left[1] + chamfer_radius)
# 右下の丸面取りの中心点
chamfer_bottom_right = (bottom_right[0] - chamfer_radius, bottom_right[1] + chamfer_radius)
# 図形を描画
msp.add_line(top_left, top_right)
msp.add_line((top_right[0], top_right[1]), (bottom_right[0], chamfer_bottom_right[1]))
msp.add_arc(
center=chamfer_bottom_right,
radius=chamfer_radius,
start_angle=0,
end_angle=-90,
)
msp.add_line((chamfer_bottom_right[0], bottom_right[1]), (chamfer_bottom_left[0], bottom_left[1]))
msp.add_arc(
center=chamfer_bottom_left,
radius=chamfer_radius,
start_angle=-90,
end_angle=-180,
)
msp.add_line((bottom_left[0], chamfer_bottom_left[1]), (top_left[0], top_left[1]))
# 円の中心からの直線を追加
msp.add_line(chamfer_bottom_left, (chamfer_bottom_left[0], chamfer_bottom_left[1] - 10))
msp.add_line(chamfer_bottom_right, (chamfer_bottom_right[0], chamfer_bottom_right[1] - 10))
# 上側の15度斜辺
top_left_extension = (
top_left[0] - extension_length * math.tan(angle_rad),
top_left[1] + extension_length,
)
msp.add_line(top_left, top_left_extension)
top_right_extension = (
top_right[0] + extension_length * math.tan(angle_rad),
top_right[1] + extension_length,
)
msp.add_line(top_right, top_right_extension)
def add_75_degree_shape(msp, x_offset, y_offset):
"""
75度の斜辺を持つ図形を描画します。
Args:
msp: DXFモデルスペース
x_offset (float): X方向のオフセット
y_offset (float): Y方向のオフセット
"""
slant_length = 15.0 # 斜辺の長さ
slant_angle_deg = 75.0 # 斜辺の角度
slant_angle_rad = math.radians(slant_angle_deg) # 角度をラジアンに変換
tip_radius = 0.4 # 丸みの半径
vertical_line_length = 5.0 # 垂直線の長さ
# 座標計算
tip_left_x = x_offset - slant_length * math.cos(slant_angle_rad)
tip_left_y = y_offset + slant_length * math.sin(slant_angle_rad)
tip_right_x = x_offset + slant_length * math.cos(slant_angle_rad)
tip_right_y = y_offset + slant_length * math.sin(slant_angle_rad)
arc_center = (x_offset, y_offset)
# 図形描画
msp.add_line(start=(tip_left_x, tip_left_y), end=(arc_center[0] - tip_radius, arc_center[1]))
msp.add_line(start=(arc_center[0] + tip_radius, arc_center[1]), end=(tip_right_x, tip_right_y))
msp.add_arc(center=arc_center, radius=tip_radius, start_angle=180, end_angle=360)
msp.add_line(
start=(arc_center[0], arc_center[1] - tip_radius),
end=(arc_center[0], arc_center[1] - tip_radius - vertical_line_length),
)
if __name__ == "__main__":
# ユーザー入力
print("DXFファイル生成ツール")
tooth_top_width = float(input("歯先幅を入力してください(例: 10.0): "))
tooth_height = float(input("歯丈を入力してください(例: 15.0): "))
pressure_angle = float(input("圧力角を入力してください(例: 20.0): "))
tooth_bottom_width = float(input("歯元幅を入力してください(例: 5.0): "))
# 出力ファイル名
output_file = "combined_shapes_with_copy_and_lines.dxf"
# DXFドキュメント作成
doc = ezdxf.new()
msp = doc.modelspace()
# 丸面取り付き長方形を左側に配置(基準点: 原点)
add_rounded_rectangle(msp, offset_x=0, offset_y=0)
# 歯形プロファイルを右側に配置(丸面取り図形の右端+10mm)
points = add_tooth_profile(
msp,
tooth_top_width,
tooth_height,
pressure_angle,
tooth_bottom_width,
offset_x=1.6 + 10, # 丸面取り付き長方形の長さ + 10mm
offset_y=0,
)
# 複写する位置を計算(右側のプロファイルをさらに右へ複写)
copy_offset_x = 1.6 + 10 + (tooth_top_width + 10) # 元の歯形の右端+10mm
add_tooth_profile(
msp,
tooth_top_width,
tooth_height,
pressure_angle,
tooth_bottom_width,
offset_x=copy_offset_x,
offset_y=0,
)
# 新しい図形(75度の斜辺を持つ図形)を描画
add_75_degree_shape(msp, x_offset=50, y_offset=0)
# ファイル保存
doc.saveas(output_file)
print(f"DXFファイル '{output_file}' を生成しました。")