kopia lustrzana https://github.com/vilemduha/blendercam
294 wiersze
10 KiB
Python
294 wiersze
10 KiB
Python
# Preliminary backplot support for autocad clone applications
|
|
# This code modified from iso_read.py and emc2_read.py distriuted with HeeksCAD as of Sep 2010
|
|
# Dan Falck 2011/01/06
|
|
#
|
|
|
|
""" use this script to backplot nc files to *.scr file for autocad,bricscad,
|
|
draftsight,progecad,ares commander, etc....
|
|
usage: python cad_read.py temp.nc temp.scr
|
|
"""
|
|
|
|
from . import cad_iso_read as iso
|
|
import sys
|
|
|
|
|
|
# Override some iso parser methods to interpret arc centers as relative to origin, not relative to start of arc.
|
|
|
|
# def write_layer(name,number):
|
|
#FILE.write('-LAYER New %s%s \n' %(name,number))
|
|
#FILE.write('-LAYER Set %s%s \n' %(name,number))
|
|
|
|
|
|
class CAD_backplot(iso.Parser):
|
|
|
|
def __init__(self):
|
|
iso.Parser.__init__(self)
|
|
|
|
def Parse(self, name, oname=None):
|
|
self.files_open(name, oname)
|
|
|
|
# self.begin_ncblock()
|
|
# self.begin_path(None)
|
|
# self.add_line(z=500)
|
|
# self.end_path()
|
|
# self.end_ncblock()
|
|
|
|
path_col = None
|
|
f = None
|
|
arc = 0
|
|
|
|
# Storage for tool position history of last block processed to properly convert absolute arc centers
|
|
|
|
oldx = -1.0
|
|
oldy = 0.0
|
|
oldz = 0.0
|
|
movelist = []
|
|
while (self.readline()):
|
|
# self.readline returns false if the line is empty - the parsing stops if the line is empty.
|
|
a = None
|
|
b = None
|
|
c = None
|
|
#f = None
|
|
i = None
|
|
j = None
|
|
k = None
|
|
p = None
|
|
q = None
|
|
r = None
|
|
s = None
|
|
x = None
|
|
y = None
|
|
z = None
|
|
iout = None
|
|
jout = None
|
|
kout = None
|
|
tool = 0
|
|
# self.begin_ncblock()
|
|
|
|
move = False
|
|
#arc = 0
|
|
#path_col = None
|
|
drill = False
|
|
no_move = False
|
|
|
|
words = self.pattern_main.findall(self.line)
|
|
for word in words:
|
|
col = None
|
|
cdata = False
|
|
if (word[0] == 'A' or word[0] == 'a'):
|
|
col = "axis"
|
|
a = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'B' or word[0] == 'b'):
|
|
col = "axis"
|
|
b = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'C' or word[0] == 'c'):
|
|
col = "axis"
|
|
c = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'F' or word[0] == 'f'):
|
|
col = "axis"
|
|
f = eval(word[1:])
|
|
move = True
|
|
elif (word == 'G0' or word == 'G00' or word == 'g0' or word == 'g00'):
|
|
##FILE.write('-color Magenta\n')
|
|
path_col = "rapid"
|
|
col = "rapid"
|
|
arc = 0
|
|
elif (word == 'G1' or word == 'G01' or word == 'g1' or word == 'g01'):
|
|
##FILE.write('-color Green\n')
|
|
path_col = "feed"
|
|
col = "feed"
|
|
arc = 0
|
|
elif (word == 'G2' or word == 'G02' or word == 'g2' or word == 'g02' or word == 'G12' or word == 'g12'):
|
|
##FILE.write('-color Green\n')
|
|
path_col = "feed"
|
|
col = "feed"
|
|
arc = -1
|
|
elif (word == 'G3' or word == 'G03' or word == 'g3' or word == 'g03' or word == 'G13' or word == 'g13'):
|
|
##FILE.write('-color Green\n')
|
|
path_col = "feed"
|
|
col = "feed"
|
|
arc = +1
|
|
elif (word == 'G10' or word == 'g10'):
|
|
no_move = True
|
|
elif (word == 'L1' or word == 'l1'):
|
|
no_move = True
|
|
elif (word == 'G20' or word == 'G70'):
|
|
col = "prep"
|
|
self.set_mode(units=25.4)
|
|
elif (word == 'G21' or word == 'G71'):
|
|
col = "prep"
|
|
self.set_mode(units=1.0)
|
|
# Note: Anilam has very non standard params for drill cycles. Not Yet implemented!
|
|
elif (word == 'G81' or word == 'g81'):
|
|
drill = True
|
|
no_move = True
|
|
path_col = "feed"
|
|
col = "feed"
|
|
elif (word == 'G82' or word == 'g82'):
|
|
drill = True
|
|
no_move = True
|
|
path_col = "feed"
|
|
col = "feed"
|
|
elif (word == 'G83' or word == 'g83'):
|
|
drill = True
|
|
no_move = True
|
|
path_col = "feed"
|
|
col = "feed"
|
|
elif (word[0] == 'G'):
|
|
col = "prep"
|
|
elif (word[0] == 'I' or word[0] == 'i'):
|
|
col = "axis"
|
|
i = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'J' or word[0] == 'j'):
|
|
col = "axis"
|
|
j = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'K' or word[0] == 'k'):
|
|
col = "axis"
|
|
k = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'M'):
|
|
col = "misc"
|
|
elif (word[0] == 'N'):
|
|
col = "blocknum"
|
|
elif (word[0] == 'O'):
|
|
col = "program"
|
|
elif (word[0] == 'P' or word[0] == 'p'):
|
|
col = "axis"
|
|
p = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'Q' or word[0] == 'q'):
|
|
col = "axis"
|
|
q = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'R' or word[0] == 'r'):
|
|
col = "axis"
|
|
r = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'S' or word[0] == 's'):
|
|
col = "axis"
|
|
s = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'T'):
|
|
col = "tool"
|
|
self.set_tool(eval(word[1:]))
|
|
tool = eval(word[1:])
|
|
|
|
elif (word[0] == 'X' or word[0] == 'x'):
|
|
col = "axis"
|
|
x = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'Y' or word[0] == 'y'):
|
|
col = "axis"
|
|
y = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == 'Z' or word[0] == 'z'):
|
|
col = "axis"
|
|
z = eval(word[1:])
|
|
move = True
|
|
elif (word[0] == '('):
|
|
(col, cdata) = ("comment", True)
|
|
elif (word[0] == '!'):
|
|
(col, cdata) = ("comment", True)
|
|
elif (word[0] == ';'):
|
|
(col, cdata) = ("comment", True)
|
|
elif (word[0] == '#'):
|
|
col = "variable"
|
|
elif (word[0] == ':'):
|
|
col = "blocknum"
|
|
elif (ord(word[0]) <= 32):
|
|
cdata = True
|
|
#self.add_text(word, col, cdata)
|
|
|
|
if (drill):
|
|
self.begin_path("rapid")
|
|
self.add_line(x, y, r)
|
|
self.end_path()
|
|
|
|
self.begin_path("feed")
|
|
self.add_line(x, y, z)
|
|
self.end_path()
|
|
|
|
self.begin_path("feed")
|
|
self.add_line(x, y, r)
|
|
self.end_path()
|
|
# elif (tool):
|
|
# write_layer('T',tool)
|
|
|
|
else:
|
|
if (move and not no_move):
|
|
self.begin_path(path_col)
|
|
# use absolute arc centers for IJK params.
|
|
# Subtract old XYZ off to get relative centers as expected:
|
|
|
|
# if path_col == 'rapid':
|
|
#FILE.write('-color Red\n')
|
|
# else:
|
|
#FILE.write('-color Green\n')
|
|
|
|
if (arc):
|
|
|
|
z = oldz
|
|
if (x != None) and (oldx != None) and (i != None):
|
|
iout = i
|
|
if (y != None) and (oldy != None) and (j != None):
|
|
jout = j
|
|
if (z != None) and (oldz != None) and (k != None):
|
|
kout = k
|
|
self.add_arc(x, y, z, iout, jout, kout, r, arc)
|
|
# if (arc == -1):
|
|
##FILE.write('arc %s,%s,%s\n' %(x,y,z))
|
|
# FILE.write('c\n')
|
|
##FILE.write('%s,%s,%s\n' %(oldx+i,oldy+j,oldz))
|
|
##FILE.write('%s,%s,%s\n' %(oldx,oldy,z))
|
|
|
|
# else:
|
|
##FILE.write('arc %s,%s,%s\n' %(oldx,oldy,z))
|
|
# FILE.write('c\n')
|
|
##FILE.write('%s,%s,%s\n' %(oldx+i,oldy+j,oldz))
|
|
##FILE.write('%s,%s,%s\n' %(x,y,z))
|
|
|
|
else:
|
|
|
|
self.add_line(x, y, z, a, b, c)
|
|
if (x == None):
|
|
x = oldx
|
|
if (y == None):
|
|
y = oldy
|
|
if (z == None):
|
|
z = oldz
|
|
scr_line = ('line %s,%s,%s %s,%s,%s \n' % (oldx, oldy, oldz, x, y, z))
|
|
# print scr_line
|
|
|
|
# FILE.write(scr_line)
|
|
|
|
self.end_path()
|
|
if (x != None):
|
|
oldx = x
|
|
if (y != None):
|
|
oldy = y
|
|
if (z != None):
|
|
oldz = z
|
|
|
|
#oldx = x
|
|
#oldy = y
|
|
#oldz = z
|
|
self.end_ncblock()
|
|
|
|
self.files_close()
|
|
# FILE.write('\n')
|
|
# FILE.close()
|
|
|
|
|
|
################################################################################
|
|
if __name__ == '__main__':
|
|
parser = CAD_backplot()
|
|
if len(sys.argv) > 2:
|
|
parser.Parse(sys.argv[1], sys.argv[2])
|
|
else:
|
|
parser.Parse(sys.argv[1])
|