備忘録 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




三和精機用とワシノ用の座標それぞれを表示
直線と円弧は目視で指示


課題
円弧の時の座標の場合、色を付けて表示できるようにできるか? (直線との間違い防止)








人気の投稿