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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です