覚書その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}' を生成しました。")







人気の投稿