kopia lustrzana https://github.com/vilemduha/blendercam
317 wiersze
12 KiB
Python
317 wiersze
12 KiB
Python
# -*- coding: utf-8 -*-
|
|
################################################################################
|
|
# iso_.py
|
|
#
|
|
|
|
import nc_read as nc
|
|
import re
|
|
import sys
|
|
import math
|
|
|
|
################################################################################
|
|
|
|
|
|
class Parser(nc.Parser):
|
|
def __init__(self, writer):
|
|
nc.Parser.__init__(self, writer)
|
|
|
|
# self.pattern_main = re.compile('(\s+|\w(?:[+])?\d*(?:\.\d*)?|\w\#\d+|\(.*?\)|\#\d+\=(?:[+])?\d*(?:\.\d*)?)')
|
|
|
|
# rada
|
|
self.pattern_main = re.compile(
|
|
r"(\s+|,|-?\w\+?\d*(?:\.\d*)?|\w#\d+|\(.*?\)|#\d+=\+?\d*(?:\.\d*)?)"
|
|
)
|
|
# self.pattern_main = re.compile('\s+\w')
|
|
# self.pattern_main = re.compile('(\s+|\w(?:[+])?[+-\w]\d*(?:\.\d*)?|\w\#[+-\w]\d+|\(.*?\)|[\#[+-\w]\d+\=(?:[+])?[+-\w]\d*(?:\.\d*)?)')
|
|
# self.pattern_main = re.compile('\s\w[\S]\w,\w[+-\w]\d*\w,\w[+-\w]\d*\w,\w[+-\w]\d*')
|
|
# self.pattern_main = re.compile('(\s|\w(?:)?\d*(?:\.\d*)?|\w\#\d+|\(.*?\)|\#\d+\=(?:)?\d*(?:\.\d*)?)')
|
|
# self.pattern_main = re.compile(' ')
|
|
|
|
self.a = 0
|
|
self.b = 0
|
|
self.c = 0
|
|
self.f = 0
|
|
self.i = 0
|
|
self.j = 0
|
|
self.k = 0
|
|
self.p = 0
|
|
self.q = 0
|
|
self.r = 0
|
|
self.s = 0
|
|
self.x = 0
|
|
self.y = 0
|
|
self.z = 500
|
|
self.FS = 1
|
|
self.endx = 0
|
|
self.endy = 0
|
|
self.startx = 0
|
|
self.starty = 0
|
|
self.x1 = 0
|
|
self.y1 = 0
|
|
self.dy = 0
|
|
self.dx = 0
|
|
self.angle = 0
|
|
self.SPACE = " "
|
|
|
|
def add_text(self, s, col=None):
|
|
s.replace("&", "&")
|
|
s.replace('"', """)
|
|
s.replace("<", "<")
|
|
s.replace(">", ">")
|
|
s += self.SPACE + "\n"
|
|
if col != None:
|
|
self.file_out.write('\t\t<text col="' + col + '">' + s + " </text>\n")
|
|
else:
|
|
self.file_out.write("\t\t<text>" + s + " </text>\n")
|
|
|
|
# def add_text(self, s, col=None):
|
|
# if (col != None) : self.file_out.write('\t\t<text col="'+col+'">'+s+'</text>\n')
|
|
# else : self.file_out.write('\t\t<text>'+s+'</text>\n')
|
|
|
|
def Parse(self, name, oname=None):
|
|
self.files_open(name, oname)
|
|
|
|
while self.readline():
|
|
self.begin_ncblock()
|
|
|
|
move = False
|
|
arc = 0
|
|
path_col = None
|
|
col = None
|
|
if self.line[0] == "C":
|
|
col = "axis"
|
|
if self.line[0] == "M" and self.line[1] == "A":
|
|
col = "feed"
|
|
if self.line[0] == "/" and self.line[1] == "/":
|
|
col = "comment"
|
|
|
|
if self.FS == 1 and not (self.line[0] == "S" and self.line[1] == "S") and col == "feed":
|
|
col = "rapid"
|
|
self.add_text(self.line, col)
|
|
# words = self.pattern_main.findall(self.line)
|
|
words = self.line.split()
|
|
# print self.line
|
|
# print ' AAAA '
|
|
words[0] = words[0] + self.SPACE
|
|
print(words)
|
|
for word in words:
|
|
col = None
|
|
# if (word[0] == 'A' or word[0] == 'a'):
|
|
# col = "axis"
|
|
# self.a = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'B' or word[0] == 'b'):
|
|
# col = "axis"
|
|
# self.b = eval(word[1:])
|
|
|
|
# move = True
|
|
if word == ("C" + self.SPACE):
|
|
# print words
|
|
col = "axis"
|
|
self.startx = self.x
|
|
self.starty = self.y
|
|
words[0] = words[0] + self.SPACE
|
|
words[2] = self.SPACE + words[2] + self.SPACE
|
|
words[4] = self.SPACE + words[4] + self.SPACE
|
|
|
|
# print 'x,y'
|
|
# print self.x
|
|
# print self.y
|
|
# self.x1=self.x-eval(words[1])
|
|
self.x1 = self.x - eval(words[1])
|
|
# j=self.y-eval(words[5])
|
|
# self.y1=self.y-eval(words[3])
|
|
self.y1 = self.y - eval(words[3])
|
|
# self.c = eval(word[1:])
|
|
# print 'self x,y'
|
|
# print self.x1
|
|
# print self.y1
|
|
self.dx = (self.x1) * 1
|
|
self.dy = (self.y1) * 0
|
|
# print 'x1'
|
|
# print self.x1
|
|
# print 'y1'
|
|
# print self.y1
|
|
ssucin = self.dx + self.dy
|
|
r = math.sqrt(((self.x1) * (self.x1)) + ((self.y1) * (self.y1)))
|
|
# print 'skalarny sucin'
|
|
# print ssucin
|
|
# print 'r'
|
|
# print r
|
|
if ssucin != 0:
|
|
ratio = ssucin / (r * 1)
|
|
# print 'ratio'
|
|
# print ratio
|
|
angle = math.acos(ratio) * 180 / math.pi
|
|
if self.y1 < 0:
|
|
angle = 360 - angle
|
|
elif self.y1 > 0:
|
|
angle = +90
|
|
elif self.y1 < 0:
|
|
angle = -90
|
|
else:
|
|
angle = 0
|
|
# print words[8]
|
|
# print 'angles'
|
|
# print angle
|
|
# if (i<0 and j<0): angle=180+angle
|
|
# if (i<0 and j>0): angle=180-angle
|
|
# if (j>0): angle=-angle
|
|
# print ('reverzacia')
|
|
# angle= angle+ eval(words[8])
|
|
# print angle
|
|
self.angle = +angle + eval(words[5])
|
|
# print self.angle
|
|
# if(angle>180): angle=360-angle
|
|
angle = self.angle * math.pi / 180
|
|
# print eval(words[8])
|
|
self.endx = eval(words[1]) + (r * math.cos(angle))
|
|
# j=eval(words[5])+(r*math.sin(angle))
|
|
self.endy = eval(words[3]) + (r * math.sin(angle))
|
|
self.x = self.endx
|
|
self.y = self.endy
|
|
path_col = "feed"
|
|
# arc=-eval(words[8])/math.fabs(eval(words[8]))
|
|
arc = eval(words[5]) / math.fabs(eval(words[5]))
|
|
# if(arc==-1): arc=0
|
|
# arc=-1
|
|
# col = "feed"
|
|
move = True
|
|
|
|
elif word == "P" and words[1] == "L" and words[4] == "F":
|
|
self.FS = 1
|
|
elif word == "P" and words[1] == "L" and words[4] == "N":
|
|
self.FS = 0
|
|
elif word == ("FS" + self.SPACE):
|
|
self.FS = 1
|
|
elif word == ("SS" + self.SPACE):
|
|
self.FS = 0
|
|
elif word == ("MA" + self.SPACE):
|
|
words[2] = self.SPACE + words[2] + self.SPACE
|
|
if self.FS == 1:
|
|
path_col = "rapid"
|
|
col = "rapid"
|
|
else:
|
|
path_col = "feed"
|
|
col = "feed"
|
|
self.x = eval(words[1])
|
|
# self.y=eval(words[6])
|
|
self.y = eval(words[3])
|
|
move = True
|
|
# elif (word == 'G1' or word == 'G01' or word == 'g1' or word == 'g01'):
|
|
# path_col = "feed"
|
|
# col = "feed"
|
|
# elif (word == 'G2' or word == 'G02' or word == 'g2' or word == 'g02' or word == 'G12' or word == 'g12'):
|
|
# 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'):
|
|
# path_col = "feed"
|
|
# col = "feed"
|
|
# arc = +1
|
|
# elif (word == 'G10' or word == 'g10'):
|
|
# move = False
|
|
# elif (word == 'L1' or word == 'l1'):
|
|
# move = False
|
|
# elif (word == 'G20'):
|
|
# col = "prep"
|
|
# self.set_mode(units=25.4)
|
|
# elif (word == 'G21'):
|
|
# col = "prep"
|
|
# self.set_mode(units=1.0)
|
|
# elif (word == 'G81' or word == 'g81'):
|
|
# path_col = "feed"
|
|
# col = "feed"
|
|
# elif (word == 'G82' or word == 'g82'):
|
|
# path_col = "feed"
|
|
# col = "feed"
|
|
# elif (word == 'G83' or word == 'g83'):
|
|
# path_col = "feed"
|
|
# col = "feed"
|
|
# elif (word[0] == 'G') : col = "prep"
|
|
# elif (word[0] == 'I' or word[0] == 'i'):
|
|
# col = "axis"
|
|
# self.i = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'J' or word[0] == 'j'):
|
|
# col = "axis"
|
|
# self.j = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'K' or word[0] == 'k'):
|
|
# col = "axis"
|
|
# self.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"
|
|
# self.p = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'Q' or word[0] == 'q'):
|
|
# col = "axis"
|
|
# self.q = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'R' or word[0] == 'r'):
|
|
# col = "axis"
|
|
# self.r = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'S' or word[0zypp] == 's'):
|
|
# col = "axis"
|
|
# self.s = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'T') : col = "tool"
|
|
# elif (word[0] == 'X' or word[0] == 'x'):
|
|
# col = "axis"
|
|
# = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'Y' or word[0] == 'y'):
|
|
# col = "axis"
|
|
# self.y = eval(word[1:])
|
|
# move = True
|
|
# elif (word[0] == 'Z' or word[0] == 'z'):
|
|
# col = "axis"
|
|
# self.z = eval(word[1:])
|
|
# move = True
|
|
elif word[0] == "(":
|
|
col = "comment"
|
|
elif word[0] == "#":
|
|
col = "variable"
|
|
elif words[0] == ("//" + self.SPACE):
|
|
col = "comment"
|
|
elif words[0] == ("/*" + self.SPACE):
|
|
col = "comment"
|
|
# self.add_text(word, col)
|
|
|
|
if move:
|
|
self.begin_path(path_col)
|
|
if arc:
|
|
# self.add_arc(self.x, self.y, 0.0000, self.i, self.j, 0.0000, arc)
|
|
# self.add_arc(self.i, self.j, 0.0000, eval(words[2])-self.x, eval(words[5])-self.y, 0.0000, arc)
|
|
# print ''
|
|
# print eval(words[2])-self.startx
|
|
# print eval(words[6])-self.starty
|
|
# self.add_arc(self.endx, self.endy, 0.0000, eval(words[1])-self.startx, eval(words[3])-self.starty, 0.0000, arc)
|
|
print(arc)
|
|
self.add_arc(
|
|
self.endx,
|
|
self.endy,
|
|
0.0000,
|
|
eval(words[1]) - self.startx,
|
|
eval(words[3]) - self.starty,
|
|
0.0000,
|
|
0.0000,
|
|
arc,
|
|
)
|
|
|
|
# self.add_arc(self.x, self.y, 0.0000, self.i, self.j, 0.0000, arc)
|
|
# self.x=self.i
|
|
# self.y=self.j
|
|
else:
|
|
self.add_line(self.x, self.y)
|
|
self.end_path()
|
|
|
|
self.end_ncblock()
|
|
|
|
self.files_close()
|