Files
create/src/Mod/Path/PathScripts/nc/cad_read.py
sliptonic 940f52db90 Extensive Path Workbench improvements.
Implement libarea improvements for profile
Implement libarea pocketing.
consolidate occ and libarea pocketing operation into one with algorithm
switch
consolidate occ aand libarea profile op into one with algorithm switch
add basic engraving operation.
Add rough UI for profile holding tags
implement holding tags for libarea profile.
implement basic defaults for depth settings.
First move in Drilling is rapid to clearance height.

UI needs lots of work but is usable.
2016-05-23 13:04:58 -03:00

276 lines
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
"""
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])