覚書 その2 JWW-CAD 外部変形
JWW-CADから自動作図。外部変形コマンドの利用
先日作成したスクリプトだと、ひと手間多いことに気づく。
jww側でスクリプトを動かせばいいのではと調べると外部変形が使えそう。
ということで挑戦。
バッチファイルの作成(jww側からpythonを動かすためのコード)
@歯切り干渉チェック
REM #jww外部変形用バッチファイル
REM hagirichan.pyを実行してDXFファイルを生成
"C:\Users\yamat\AppData\Local\Programs\Python\Python313\python.exe" "C:\jww\hagirichan.py"
REM 作成したDXFファイルのパスを指定
SET DXF_FILE="C:\jww\gear_teeth.dxf"
REM JWWを起動して生成したDXFファイルを開く
START "" """C:\jww\Jw_win.exe" %DXF_FILE%
REM 必要であれば終了を待つ
pause
2行目 「REM#jww」 がないとjww側で認識しないので注意
(REM#JWW←大文字でも認識しない)
あと、ansiで保存しないと文字化け
バッチファイルは
C:\jww\hagrichan.bat(例)
としてjwwフォルダへ格納
pytonのスクリプトとjww用バッチファイルができた、jwwを立ち上げて
その他→外部変形→hagirichan.batを選択
バッチファイルから外部変形が起動するので、変数を入力
歯形自動製図。
工具は図形コマンドから呼び出し。
ただし確認用の図面なので、同じファイル名で都度上書きされる。
補足 jww外部変形用のスクリプト。
import math
import ezdxf
def calculate_slant_length(height, angle):
"""斜辺の長さを計算"""
adjusted_angle = 90 - angle # 斜辺の角度を調整
return height / math.tan(math.radians(adjusted_angle))
def simulate_copied_teeth_with_additional_horizontal(module, tooth_top_width, tooth_height, pressure_angle, num_teeth=2):
"""
b点の下側の左側の点からモジュール×πの水平線を追加しつつ、複数の歯形をコピーして並べるシミュレーション。
"""
all_lines = []
spacing = module * math.pi # 歯形間のスペース(底辺の長さ)
for i in range(num_teeth):
offset_x = i * spacing # 横方向のオフセット
offset_y = 0 # 縦方向は変化なし
# 歯形を1つ描画
a = (0 + offset_x, 0)
b = (tooth_top_width + offset_x, 0)
a_vertical = (a[0], a[1] - tooth_height)
b_vertical = (b[0], b[1] - tooth_height)
slant_length = calculate_slant_length(tooth_height, pressure_angle)
a_slant = (a_vertical[0] - slant_length, a_vertical[1])
b_slant = (b_vertical[0] + slant_length, b_vertical[1])
a_prime = a_slant
b_prime = b_slant
d = (a_prime[0] + module * math.pi, a_prime[1])
# b点から下にモジュール分の垂直線を引く
b_mod_vertical = (b[0], b[1] - module)
# 左側の点(垂直線の下端)から水平線を引く
additional_horizontal_start = b_mod_vertical
additional_horizontal_end = (b_mod_vertical[0] + module * math.pi, b_mod_vertical[1])
# 歯形の全ての線を追加
lines = [
(a, b), # 歯先幅
(a, a_vertical), # a点から下方向の垂直線
(a, a_slant), # a点の斜辺
(b, b_slant), # b点の斜辺
(a_prime, d), # 底辺
(d, b_prime), # b'点からd点
(b_prime, b), # b点への閉じ線
(b, b_mod_vertical), # b点から下方向の垂直線(モジュール分)
(additional_horizontal_start, additional_horizontal_end), # 追加の水平線
]
all_lines.extend(lines)
return all_lines
def save_to_dxf(lines, filename="gear_teeth.dxf"):
doc = ezdxf.new()
msp = doc.modelspace()
for line in lines:
msp.add_line(start=line[0], end=line[1])
doc.saveas(filename)
print(f"DXFファイル '{filename}' を保存しました。")
# 入力を受け付ける部分
print("Pythonスクリプトが開始されました")
module = float(input("モジュールの値を入力してください(例: 4.707): "))
tooth_top_width = float(input("歯先幅の値を入力してください(例: 3.169): "))
tooth_height = float(input("歯丈の値を入力してください(例: 10.159): "))
pressure_angle = float(input("圧力角の値を入力してください(例: 20): "))
# 入力内容を表示
print(f"モジュール: {module}, 歯先幅: {tooth_top_width}, 歯丈: {tooth_height}, 圧力角: {pressure_angle}")
print("図形の計算を開始します...")
# シミュレーション実行
lines = simulate_copied_teeth_with_additional_horizontal(module, tooth_top_width, tooth_height, pressure_angle, num_teeth=2)
print("図形の生成が完了しました")
# DXFファイルとして保存
save_to_dxf(lines)
input("Enterキーを押して終了してください...")