備忘録 JWW-CADからNC座標の抽出
ファイル名はxz.txtで固定
先ほど保存したxz.txtから作図座標を取得するpythonをつくる。
csvファイルとして保存
エクセルでX座標=0 に砥石外形の変数を与えてcsvを参照に座標の変換を行うマクロを作る
以下コード
PYTHON
from collections import defaultdict
INFILE = r"C:\jww\xz.txt"
ROUND_N = 4
def key(p):
return (round(p[0], ROUND_N), round(p[1], ROUND_N))
# ---- 線分読み込み ----
segments = []
with open(INFILE, "r") as f:
for line in f:
nums = line.strip().split()
if len(nums) == 4:
x1, z1, x2, z2 = map(float, nums)
segments.append(((x1, z1), (x2, z2)))
# ---- 隣接関係作成 ----
adj = defaultdict(list)
points_set = set()
for p1, p2 in segments:
k1, k2 = key(p1), key(p2)
adj[k1].append(k2)
adj[k2].append(k1)
points_set.add(k1)
points_set.add(k2)
# ---- 始点決定 ----
endpoints = [p for p in points_set if len(adj[p]) == 1]
if endpoints:
start = endpoints[0]
else:
start = max(points_set, key=lambda p: (p[0], p[1]))
# ---- つながり順に並べる ----
ordered = [start]
prev = None
cur = start
while True:
next_candidates = [p for p in adj[cur] if p != prev]
if not next_candidates:
break
nxt = next_candidates[0]
ordered.append(nxt)
prev, cur = cur, nxt
# ---- 原点計算 ----
xmax = max(p[0] for p in ordered)
zmax = max(p[1] for p in ordered)
# ---- 原点変換 ----
converted = []
for x, z in ordered:
x0 = round(x - xmax, 4)
z0 = round(z - zmax, 4)
converted.append((x0, z0))
# ---- Z降順(上から下) ----
converted.sort(key=lambda p: p[1], reverse=True)
# ---- (0,0)除外 ----
converted = [p for p in converted if not (p[0] == 0.0 and p[1] == 0.0)]
# ---- 表示 ----
print("=== 最終結果(0,0除外) ===")
for x, z in converted:
print(f"{x: .4f} {z: .4f}")
# converted は「最終的に画面に出している値」のリストに合わせてね
# 例:converted = [(503.0718,0.0), (510.0,-2.0), ...]
with open(r"C:\jww\result.csv", "w", encoding="utf-8") as f:
for x, z in converted:
f.write(f"{x:.4f},{z:.4f}\n")
VBA
Sub ボタン1_Click()
Dim ws As Worksheet
Set ws = ActiveSheet ' ←ボタンがあるシートに出す
Dim XBASE As Double
XBASE = CDbl(ws.Range("B1").Value) ' 基準直径(例 510)
' 出力先クリア
ws.Range("D1:G1000").ClearContents
' 見出し
ws.Range("D1").Value = "X0"
ws.Range("E1").Value = "Z0"
ws.Range("F1").Value = "X(dia)"
ws.Range("G1").Value = "Z"
Dim csvPath As String
csvPath = "C:\jww\result.csv"
' ★古いCSVを消す(ゴミ防止)
If Dir(csvPath) <> "" Then Kill csvPath
' ★Python実行(convert.py が result.csv を作る前提)
Dim cmd As String
cmd = "cmd /c python C:\jww\convert.py"
Dim wsh As Object
Set wsh = CreateObject("WScript.Shell")
wsh.Run cmd, 0, True ' True=完了まで待つ
' ★CSVができたか確認
If Dir(csvPath) = "" Then
MsgBox "result.csv が作成されていません。convert.py がCSVを書いているか確認してください。"
Exit Sub
End If
' ★CSV読み込み
Dim lineText As String, arr
Dim r As Long: r = 2
Open csvPath For Input As #1
Do Until EOF(1)
Line Input #1, lineText
lineText = Trim(lineText)
If Len(lineText) = 0 Then GoTo ContinueLoop
' カンマ区切り想定:x0,z0
arr = Split(lineText, ",")
' 万一スペース区切りだったら救済
If UBound(arr) < 1 Then arr = Split(lineText)
' ヘッダ行スキップ
If UCase$(arr(0)) Like "*X*" Then GoTo ContinueLoop
Dim x0 As Double, z0 As Double
x0 = CDbl(arr(0))
z0 = CDbl(arr(1))
' (0,0)は不要なら除外(必要に応じて)
If (x0 = 0# And z0 = 0#) Then GoTo ContinueLoop
' 確認用:Python結果
ws.Cells(r, "D").Value = x0
ws.Cells(r, "E").Value = z0
' ★最終:直径表示(あなたの正解式)
' X(dia) = B1 + 2*X0
ws.Cells(r, "F").Value = XBASE + (2# * x0)
ws.Cells(r, "G").Value = z0
r = r + 1
ContinueLoop:
Loop
Close #1
' 表示形式
ws.Range("D2:G" & r - 1).NumberFormat = "0.0000"
MsgBox "表示完了(直径変換まで)"
End Sub
三和精機用とワシノ用の座標それぞれを表示
直線と円弧は目視で指示
課題
円弧の時の座標の場合、色を付けて表示できるようにできるか? (直線との間違い防止)
