トロコイドパスマクロその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が吐き出したデータはそれを通すことにしている。ポストポストプロセッサ、という感じ。