トロコイドパスマクロその3 データ変換用プログラム
GコードのG01,G02,G03をトロコイドパス用データに変換するために書いたPythonプログラムはこれ。
# GcodeCalc_trochoid_0.1.1
# 2021.01.05 KUBOTA ENGINNERING 久保田敏也
# 実行してクリップボードにGコードをコピーするとTrochoidパス用フォーマットに変換してクリップボードに書き込む
# G00,G01,G02,G03以外、及び(、%のある行は変換しない。(データ後の()は動作未検証なので注意
# Trochoidパス用サブルーチンは別途trochoid.txtをコピーして使用する
import re
import pyperclip
import math
while 1 :
Gin=[]
Gout=[]
yn=input('変換元データをクリップボードにコピーしてEnter')
clip_str = pyperclip.paste()
print(clip_str)
Gin = clip_str.split('\r\n')
#X,Y座標を全て表記する
for i in range(len(Gin)):
if re.search('\(%',Gin[i]):#注記スキップ
continue
if not re.search("G[0]?[0-3]",Gin[i]):#G00~G03以外スキップ
continue
if not re.search('X',Gin[i]): #X座標がないとき
Xprev=[]
for j in range(i+1):
if re.search('X',Gin[i-j]):
Xprev=re.search("X[\s]*[-0-9.]+",Gin[i-j]).group()
Gep=re.search("G[0]?[0-3]",Gin[i]).end()
Gin[i]=Gin[i][:Gep]+Xprev+Gin[i][Gep:]
break
if not re.search('Y',Gin[i]):
Yprev=[]
for j in range(i+1):
if re.search('Y',Gin[i-j]):
Yprev=re.search("Y[\s]*[-0-9.]+",Gin[i-j]).group()
Xep=re.search("X[\s]*[-0-9.]+",Gin[i]).end()
Gin[i]=Gin[i][:Xep]+Yprev+Gin[i][Xep:]
break
for i, line in enumerate(Gin):
print('Gin-all',i,Gin[i])
#Trochoid-Path用フォーマットに変換して出力
print()
print('(Trochoid start)')
for i in range(len(Gin)-1):
if not re.search("G[0]?[0-3]",Gin[i]): #G00~G03以外はそのまま
print(Gin[i])
Gout.append(Gin[i])
continue
if re.search('\(%',Gin[i]):#注記スキップ
print(Gin[i])
Gout.append(Gin[i])
continue
X0=float(re.search("X[\s]*[-0-9.]+",Gin[i]).group().strip('X'))
Y0=float(re.search("Y[\s]*[-0-9.]+",Gin[i]).group().strip('Y'))
if re.search ("G[0]?1" , Gin[i+1]):
X1=float(re.search("X[\s]*[-0-9.]+",Gin[i+1]).group().strip('X'))
Y1=float(re.search("Y[\s]*[-0-9.]+",Gin[i+1]).group().strip('Y'))
print(f'#3101={X0:>8,.3f}(Xa) #3102={Y0:>8,.3f}(Ya) #3103={X1:>8,.3f}(Xb) #3104={Y1:>8,.3f}(Yb) M98P5')
Gout.append(f'#3101={X0:>8,.3f}(Xa) #3102={Y0:>8,.3f}(Ya) #3103={X1:>8,.3f}(Xb) #3104={Y1:>8,.3f}(Yb) M98P5')
continue
if re.search ("G[0]?2", Gin[i+1]):
X1=float(re.search("X[\s]*[-0-9.]+",Gin[i+1]).group().strip('X'))
Y1=float(re.search("Y[\s]*[-0-9.]+",Gin[i+1]).group().strip('Y'))
if re.search ('I' , Gin[i+1]):
I=float(re.search("I[\s]*[-0-9.]+",Gin[i+1]).group().strip('I'))
else:
I=0
if re.search ('J' , Gin[i+1]):
J=float(re.search("J[\s]*[-0-9.]+",Gin[i+1]).group().strip('J'))
else:
J=0
print(f'#3101={X0:>8,.3f}(Xa) #3102={Y0:>8,.3f}(Ya) #3103={X1:>8,.3f}(Xb) #3104={Y1:>8,.3f}(Xb) #3105={I:>8,.3f}(I) #3106={J:>8,.3f}(J) #3107=-1(G02:- G03:+) M98P7')
Gout.append(f'#3101={X0:>8,.3f}(Xa) #3102={Y0:>8,.3f}(Ya) #3103={X1:>8,.3f}(Xb) #3104={Y1:>8,.3f}(Xb) #3105={I:>8,.3f}(I) #3106={J:>8,.3f}(J) #3107=-1(G02:- G03:+) M98P7')
continue
if re.search ("G[0]?3", Gin[i+1]):
X1=float(re.search("X[\s]*[-0-9.]+",Gin[i+1]).group().strip('X'))
Y1=float(re.search("Y[\s]*[-0-9.]+",Gin[i+1]).group().strip('Y'))
if re.search ('I' , Gin[i+1]):
I=float(re.search("I[\s]*[-0-9.]+",Gin[i+1]).group().strip('I'))
else:
I=0
if re.search ('J' , Gin[i+1]):
J=float(re.search("J[\s]*[-0-9.]+",Gin[i+1]).group().strip('J'))
else:
J=0
print(f'#3101={X0:>8,.3f}(Xa) #3102={Y0:>8,.3f}(Ya) #3103={X1:>8,.3f}(Xb) #3104={Y1:>8,.3f}(Yb) #3105={I:>8,.3f}(I) #3106={J:>8,.3f}(J) #3107= 1 M98P7')
Gout.append(f'#3101={X0:>8,.3f}(Xa) #3102={Y0:>8,.3f}(Ya) #3103={X1:>8,.3f}(Xb) #3104={Y1:>8,.3f}(Yb) #3105={I:>8,.3f}(I) #3106={J:>8,.3f}(J) #3107= 1 M98P7')
continue
print('(Trochoid end)')
print()
pyperclip.copy('\n'.join(Gout))#複数要素はpyperclip.copyできないので改行を区切りに入れてjoinで一つにまとめる。
r=input('next?(yes:enter no:0)>')
if r not in '':
break
今回のプログラムを実行してGコードの変換したい部分をCtrl+CでクリップボードにコピーしてEnterを押すと変換後のデータがクリップボードに書き込まれるので、Ctrl+VでGコードに貼付ける仕組み。プログラムは動作を十分に検証しているわけではないので、(イレギュラーなデータを入力してみる等)バグはあるかも。例えばこんなデータを読み込むと、
G01 X10.914 Y-2.000 F200. G02 X0.807 Y20.352 I0.086 J13.500 G03 X15.102 Y42.319 I-72.982 J63.127 G02 X27.792 Y50.371 I12.674 J-5.949 G01 X83.695

こう変換される。先頭のG01は到着位置のみ使って次のG02のスタート位置としている。
#3101= 10.914(Xa) #3102= -2.000(Ya) #3103= 0.807(Xb) #3104= 20.352(Xb) #3105= 0.086(I) #3106= 13.500(J) #3107=-1(G02:- G03:+) M98P7 #3101= 0.807(Xa) #3102= 20.352(Ya) #3103= 15.102(Xb) #3104= 42.319(Yb) #3105= -72.982(I) #3106= 63.127(J) #3107= 1 M98P7 #3101= 15.102(Xa) #3102= 42.319(Ya) #3103= 27.792(Xb) #3104= 50.371(Xb) #3105= 12.674(I) #3106= -5.949(J) #3107=-1(G02:- G03:+) M98P7 #3101= 27.792(Xa) #3102= 50.371(Ya) #3103= 83.695(Xb) #3104= 50.371(Yb) M98P5
後は前回と前々回で書いたGコードのサブルーチンO5、O6、O7、O8がコード中にあればトロコイドパスが生成される。

Gコードを定型フォーマットで変換するのにPytonは便利だ。モデリング、CAMに使っているFreeCADの吐き出すGコードはどうも気に入らないんだけど、手打ちで直すとミスがしょっちゅう起きて悲しい思いをするので、今回のものとは別にコード変換プログラムを育てていて、CAMが吐き出したデータはそれを通すことにしている。ポストポストプロセッサ、という感じ。


