Reduce PEP 8 warning and remove unused dependecies
This commit is contained in:
464
laser.py
464
laser.py
@@ -25,25 +25,23 @@ You should have received a copy of the GNU General Public License
|
|||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
"""
|
"""
|
||||||
import inkex, simplestyle, simplepath
|
import inkex
|
||||||
import cubicsuperpath, simpletransform, bezmisc
|
import simplestyle
|
||||||
|
import cubicsuperpath
|
||||||
|
import simpletransform
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import math
|
import math
|
||||||
import bezmisc
|
import bezmisc
|
||||||
import re
|
import re
|
||||||
import copy
|
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import cmath
|
|
||||||
import numpy
|
import numpy
|
||||||
import codecs
|
|
||||||
import random
|
|
||||||
import gettext
|
import gettext
|
||||||
|
|
||||||
_ = gettext.gettext
|
_ = gettext.gettext
|
||||||
|
|
||||||
### Check if inkex has errormsg (0.46 version doesnot have one.) Could be removed later.
|
# Check if inkex has error messages. (0.46 version does not have one) Could be removed later.
|
||||||
if "errormsg" not in dir(inkex):
|
if "errormsg" not in dir(inkex):
|
||||||
inkex.errormsg = lambda msg: sys.stderr.write((unicode(msg) + "\n").encode("UTF-8"))
|
inkex.errormsg = lambda msg: sys.stderr.write((unicode(msg) + "\n").encode("UTF-8"))
|
||||||
|
|
||||||
@@ -60,7 +58,7 @@ def bezierslopeatt(((bx0, by0), (bx1, by1), (bx2, by2), (bx3, by3)), t):
|
|||||||
dy = 6 * ay
|
dy = 6 * ay
|
||||||
if dx == dy == 0:
|
if dx == dy == 0:
|
||||||
print_("Slope error x = %s*t^3+%s*t^2+%s*t+%s, y = %s*t^3+%s*t^2+%s*t+%s, t = %s, dx==dy==0" % (
|
print_("Slope error x = %s*t^3+%s*t^2+%s*t+%s, y = %s*t^3+%s*t^2+%s*t+%s, t = %s, dx==dy==0" % (
|
||||||
ax, bx, cx, dx, ay, by, cy, dy, t))
|
ax, bx, cx, dx, ay, by, cy, dy, t))
|
||||||
print_(((bx0, by0), (bx1, by1), (bx2, by2), (bx3, by3)))
|
print_(((bx0, by0), (bx1, by1), (bx2, by2), (bx3, by3)))
|
||||||
dx, dy = 1, 1
|
dx, dy = 1, 1
|
||||||
|
|
||||||
@@ -69,13 +67,10 @@ def bezierslopeatt(((bx0, by0), (bx1, by1), (bx2, by2), (bx3, by3)), t):
|
|||||||
|
|
||||||
bezmisc.bezierslopeatt = bezierslopeatt
|
bezmisc.bezierslopeatt = bezierslopeatt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### Styles and additional parameters
|
# Styles and additional parameters
|
||||||
###
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
math.pi2 = math.pi * 2
|
math.pi2 = math.pi * 2
|
||||||
@@ -189,27 +184,13 @@ styles = {
|
|||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### Cubic Super Path additional functions
|
# Cubic Super Path additional functions
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def csp_segment_to_bez(sp1, sp2):
|
def csp_segment_to_bez(sp1, sp2):
|
||||||
return sp1[1:] + sp2[:2]
|
return sp1[1:] + sp2[:2]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# draw_pointer( list(csp_at_t(csp1[dist[1]][dist[2]-1],csp1[dist[1]][dist[2]],dist[3]))
|
|
||||||
# + list(csp_at_t(csp2[dist[4]][dist[5]-1],csp2[dist[4]][dist[5]],dist[6])), "#507","line")
|
|
||||||
|
|
||||||
|
|
||||||
def csp_split(sp1, sp2, t=.5):
|
def csp_split(sp1, sp2, t=.5):
|
||||||
[x1, y1], [x2, y2], [x3, y3], [x4, y4] = sp1[1], sp1[2], sp2[0], sp2[1]
|
[x1, y1], [x2, y2], [x3, y3], [x4, y4] = sp1[1], sp1[2], sp2[0], sp2[1]
|
||||||
x12 = x1 + (x2 - x1) * t
|
x12 = x1 + (x2 - x1) * t
|
||||||
@@ -227,23 +208,6 @@ def csp_split(sp1, sp2, t=.5):
|
|||||||
return [sp1[0], sp1[1], [x12, y12]], [[x1223, y1223], [x, y], [x2334, y2334]], [[x34, y34], sp2[1], sp2[2]]
|
return [sp1[0], sp1[1], [x12, y12]], [[x1223, y1223], [x, y], [x2334, y2334]], [[x34, y34], sp2[1], sp2[2]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
############################################################################
|
|
||||||
### csp_segments_intersection(sp1,sp2,sp3,sp4)
|
|
||||||
###
|
|
||||||
### Returns array containig all intersections between two segmets of cubic
|
|
||||||
### super path. Results are [ta,tb], or [ta0, ta1, tb0, tb1, "Overlap"]
|
|
||||||
### where ta, tb are values of t for the intersection point.
|
|
||||||
############################################################################
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def csp_curvature_at_t(sp1, sp2, t, depth=3):
|
def csp_curvature_at_t(sp1, sp2, t, depth=3):
|
||||||
ax, ay, bx, by, cx, cy, dx, dy = bezmisc.bezierparameterize(csp_segment_to_bez(sp1, sp2))
|
ax, ay, bx, by, cx, cy, dx, dy = bezmisc.bezierparameterize(csp_segment_to_bez(sp1, sp2))
|
||||||
|
|
||||||
@@ -273,12 +237,6 @@ def csp_curvature_at_t(sp1, sp2, t, depth=3):
|
|||||||
return 1e100
|
return 1e100
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def csp_at_t(sp1, sp2, t):
|
def csp_at_t(sp1, sp2, t):
|
||||||
ax, bx, cx, dx = sp1[1][0], sp1[2][0], sp2[0][0], sp2[1][0]
|
ax, bx, cx, dx = sp1[1][0], sp1[2][0], sp2[0][0], sp2[1][0]
|
||||||
ay, by, cy, dy = sp1[1][1], sp1[2][1], sp2[0][1], sp2[1][1]
|
ay, by, cy, dy = sp1[1][1], sp1[2][1], sp2[0][1], sp2[1][1]
|
||||||
@@ -294,27 +252,13 @@ def csp_at_t(sp1, sp2, t):
|
|||||||
return [x, y]
|
return [x, y]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def cspseglength(sp1, sp2, tolerance=0.001):
|
def cspseglength(sp1, sp2, tolerance=0.001):
|
||||||
bez = (sp1[1][:], sp1[2][:], sp2[0][:], sp2[1][:])
|
bez = (sp1[1][:], sp1[2][:], sp2[0][:], sp2[1][:])
|
||||||
return bezmisc.bezierlength(bez, tolerance)
|
return bezmisc.bezierlength(bez, tolerance)
|
||||||
|
|
||||||
|
|
||||||
|
# Distance calculation from point to arc
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def point_to_arc_distance(p, arc):
|
def point_to_arc_distance(p, arc):
|
||||||
### Distance calculattion from point to arc
|
|
||||||
P0, P2, c, a = arc
|
P0, P2, c, a = arc
|
||||||
dist = None
|
dist = None
|
||||||
p = P(p)
|
p = P(p)
|
||||||
@@ -352,102 +296,10 @@ def csp_to_arc_distance(sp1, sp2, arc1, arc2, tolerance=0.01): # arc = [start,e
|
|||||||
return d1[0]
|
return d1[0]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### Bezier additional functions
|
# Common functions
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
### Some vector functions
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
### Common functions
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def atan2(*arg):
|
def atan2(*arg):
|
||||||
if len(arg) == 1 and (type(arg[0]) == type([0., 0.]) or type(arg[0]) == type((0., 0.))):
|
if len(arg) == 1 and (type(arg[0]) == type([0., 0.]) or type(arg[0]) == type((0., 0.))):
|
||||||
return (math.pi / 2 - math.atan2(arg[0][0], arg[0][1])) % math.pi2
|
return (math.pi / 2 - math.atan2(arg[0][0], arg[0][1])) % math.pi2
|
||||||
@@ -458,26 +310,11 @@ def atan2(*arg):
|
|||||||
raise ValueError, "Bad argumets for atan! (%s)" % arg
|
raise ValueError, "Bad argumets for atan! (%s)" % arg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def between(c, x, y):
|
def between(c, x, y):
|
||||||
return x - straight_tolerance <= c <= y + straight_tolerance or y - straight_tolerance <= c <= x + straight_tolerance
|
return x - straight_tolerance <= c <= y + straight_tolerance or y - straight_tolerance <= c <= x + straight_tolerance
|
||||||
|
|
||||||
|
|
||||||
|
# Print arguments into specified log file
|
||||||
|
|
||||||
################################################################################
|
|
||||||
### print_ prints any arguments into specified log file
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
def print_(*arg):
|
def print_(*arg):
|
||||||
f = open(options.log_filename, "a")
|
f = open(options.log_filename, "a")
|
||||||
for s in arg:
|
for s in arg:
|
||||||
@@ -488,8 +325,9 @@ def print_(*arg):
|
|||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### Point (x,y) operations
|
# Point (x,y) operations
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
class P:
|
class P:
|
||||||
def __init__(self, x, y=None):
|
def __init__(self, x, y=None):
|
||||||
if not y == None:
|
if not y == None:
|
||||||
@@ -526,39 +364,23 @@ class P:
|
|||||||
else:
|
else:
|
||||||
return P(0, 0)
|
return P(0, 0)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def angle(self):
|
def angle(self):
|
||||||
return math.atan2(self.y, self.x)
|
return math.atan2(self.y, self.x)
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
return '%f,%f' % (self.x, self.y)
|
return '%f,%f' % (self.x, self.y)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def l2(self):
|
def l2(self):
|
||||||
return self.x * self.x + self.y * self.y
|
return self.x * self.x + self.y * self.y
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### Offset function
|
# Biarc function
|
||||||
###
|
#
|
||||||
### This function offsets given cubic super path.
|
# Calculates biarc approximation of cubic super path segment
|
||||||
### It's based on src/livarot/PathOutline.cpp from Inkscape's source code.
|
# splits segment if needed or approximates it with straight line
|
||||||
###
|
#
|
||||||
###
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
###
|
|
||||||
### Biarc function
|
|
||||||
###
|
|
||||||
### Calculates biarc approximation of cubic super path segment
|
|
||||||
### splits segment if needed or approximates it with straight line
|
|
||||||
###
|
|
||||||
################################################################################
|
################################################################################
|
||||||
def biarc(sp1, sp2, z1, z2, depth=0):
|
def biarc(sp1, sp2, z1, z2, depth=0):
|
||||||
def biarc_split(sp1, sp2, z1, z2, depth):
|
def biarc_split(sp1, sp2, z1, z2, depth):
|
||||||
@@ -589,7 +411,7 @@ def biarc(sp1, sp2, z1, z2, depth=0):
|
|||||||
r = TS.mag() / TE.mag()
|
r = TS.mag() / TE.mag()
|
||||||
TS, TE = TS.unit(), TE.unit()
|
TS, TE = TS.unit(), TE.unit()
|
||||||
tang_are_parallel = (
|
tang_are_parallel = (
|
||||||
(tsa - tea) % math.pi < straight_tolerance or math.pi - (tsa - tea) % math.pi < straight_tolerance)
|
(tsa - tea) % math.pi < straight_tolerance or math.pi - (tsa - tea) % math.pi < straight_tolerance)
|
||||||
if (tang_are_parallel and
|
if (tang_are_parallel and
|
||||||
((
|
((
|
||||||
v.mag() < straight_distance_tolerance or TE.mag() < straight_distance_tolerance or TS.mag() < straight_distance_tolerance) or
|
v.mag() < straight_distance_tolerance or TE.mag() < straight_distance_tolerance or TS.mag() < straight_distance_tolerance) or
|
||||||
@@ -630,7 +452,7 @@ def biarc(sp1, sp2, z1, z2, depth=0):
|
|||||||
if (D - P1).mag() == 0: return None, None
|
if (D - P1).mag() == 0: return None, None
|
||||||
R = D - ((D - P0).mag() ** 2 / (D - P1).mag()) * (P1 - D).unit()
|
R = D - ((D - P0).mag() ** 2 / (D - P1).mag()) * (P1 - D).unit()
|
||||||
p0a, p1a, p2a = (P0 - R).angle() % (2 * math.pi), (P1 - R).angle() % (2 * math.pi), (P2 - R).angle() % (
|
p0a, p1a, p2a = (P0 - R).angle() % (2 * math.pi), (P1 - R).angle() % (2 * math.pi), (P2 - R).angle() % (
|
||||||
2 * math.pi)
|
2 * math.pi)
|
||||||
alpha = (p2a - p0a) % (2 * math.pi)
|
alpha = (p2a - p0a) % (2 * math.pi)
|
||||||
if (p0a < p2a and (p1a < p0a or p2a < p1a)) or (p2a < p1a < p0a):
|
if (p0a < p2a and (p1a < p0a or p2a < p1a)) or (p2a < p1a < p0a):
|
||||||
alpha = -2 * math.pi + alpha
|
alpha = -2 * math.pi + alpha
|
||||||
@@ -656,34 +478,13 @@ def biarc(sp1, sp2, z1, z2, depth=0):
|
|||||||
[[P2.x, P2.y], 'arc', [R2.x, R2.y], a2, [P4.x, P4.y], [zm, z2]]]
|
[[P2.x, P2.y], 'arc', [R2.x, R2.y], a2, [P4.x, P4.y], [zm, z2]]]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### Polygon class
|
# Polygon class
|
||||||
################################################################################
|
################################################################################
|
||||||
class Polygon:
|
class Polygon:
|
||||||
def __init__(self, polygon=None):
|
def __init__(self, polygon=None):
|
||||||
self.polygon = [] if polygon == None else polygon[:]
|
self.polygon = [] if polygon == None else polygon[:]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def add(self, add):
|
def add(self, add):
|
||||||
if type(add) == type([]):
|
if type(add) == type([]):
|
||||||
self.polygon += add[:]
|
self.polygon += add[:]
|
||||||
@@ -691,11 +492,7 @@ class Polygon:
|
|||||||
self.polygon += add.polygon[:]
|
self.polygon += add.polygon[:]
|
||||||
|
|
||||||
|
|
||||||
|
class ArrangementGenetic:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Arangement_Genetic:
|
|
||||||
# gene = [fittness, order, rotation, xposition]
|
# gene = [fittness, order, rotation, xposition]
|
||||||
# spieces = [gene]*shapes count
|
# spieces = [gene]*shapes count
|
||||||
# population = [spieces]
|
# population = [spieces]
|
||||||
@@ -709,26 +506,13 @@ class Arangement_Genetic:
|
|||||||
self.move_mutate_factor = 1.
|
self.move_mutate_factor = 1.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
###
|
||||||
### Gcodetools class
|
### Gcodetools class
|
||||||
###
|
###
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
class laser_gcode(inkex.Effect):
|
class LaserGcode(inkex.Effect):
|
||||||
|
|
||||||
def export_gcode(self, gcode):
|
def export_gcode(self, gcode):
|
||||||
gcode_pass = gcode
|
gcode_pass = gcode
|
||||||
@@ -736,51 +520,71 @@ class laser_gcode(inkex.Effect):
|
|||||||
gcode += "G91\nG1 Z-" + self.options.pass_depth + "\nG90\n" + gcode_pass
|
gcode += "G91\nG1 Z-" + self.options.pass_depth + "\nG90\n" + gcode_pass
|
||||||
f = open(self.options.directory + self.options.file, "w")
|
f = open(self.options.directory + self.options.file, "w")
|
||||||
f.write(
|
f.write(
|
||||||
self.options.laser_off_command + " S0" + "\n" + self.header + "G1 F" + self.options.travel_speed + "\n" + gcode + self.footer)
|
self.options.laser_off_command + " S0" + "\n" + self.header +
|
||||||
|
"G1 F" + self.options.travel_speed + "\n" + gcode + self.footer)
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
inkex.Effect.__init__(self)
|
inkex.Effect.__init__(self)
|
||||||
self.OptionParser.add_option("-d", "--directory", action="store", type="string", dest="directory", default="",
|
add_option = self.OptionParser.add_option
|
||||||
help="Output directory")
|
|
||||||
self.OptionParser.add_option("-f", "--filename", action="store", type="string", dest="file",
|
add_option("-d", "--directory", action="store", type="string", dest="directory", default="",
|
||||||
default="output.gcode", help="File name")
|
help="Output directory")
|
||||||
self.OptionParser.add_option("", "--add-numeric-suffix-to-filename", action="store", type="inkbool",
|
|
||||||
dest="add_numeric_suffix_to_filename", default=False,
|
add_option("-f", "--filename", action="store", type="string", dest="file",
|
||||||
help="Add numeric suffix to file name")
|
default="output.gcode", help="File name")
|
||||||
self.OptionParser.add_option("", "--laser-command", action="store", type="string", dest="laser_command",
|
|
||||||
default="M03", help="Laser gcode command")
|
add_option("", "--add-numeric-suffix-to-filename", action="store", type="inkbool",
|
||||||
self.OptionParser.add_option("", "--laser-off-command", action="store", type="string", dest="laser_off_command",
|
dest="add_numeric_suffix_to_filename", default=False,
|
||||||
default="M05", help="Laser gcode end command")
|
help="Add numeric suffix to file name")
|
||||||
self.OptionParser.add_option("", "--laser-speed", action="store", type="int", dest="laser_speed", default="750",
|
|
||||||
help="Laser speed (mm/min)")
|
add_option("", "--laser-command", action="store", type="string", dest="laser_command",
|
||||||
self.OptionParser.add_option("", "--travel-speed", action="store", type="string", dest="travel_speed",
|
default="M03", help="Laser gcode command")
|
||||||
default="3000", help="Travel speed (mm/min)")
|
|
||||||
self.OptionParser.add_option("", "--laser-power", action="store", type="int", dest="laser_power", default="255",
|
add_option("", "--laser-off-command", action="store", type="string", dest="laser_off_command",
|
||||||
help="S# is 256 or 10000 for full power")
|
default="M05", help="Laser gcode end command")
|
||||||
self.OptionParser.add_option("", "--passes", action="store", type="int", dest="passes", default="1",
|
|
||||||
help="Quantity of passes")
|
add_option("", "--laser-speed", action="store", type="int", dest="laser_speed", default="750",
|
||||||
self.OptionParser.add_option("", "--pass-depth", action="store", type="string", dest="pass_depth", default="1",
|
help="Laser speed (mm/min)")
|
||||||
help="Depth of laser cut")
|
|
||||||
self.OptionParser.add_option("", "--power-delay", action="store", type="string", dest="power_delay",
|
add_option("", "--travel-speed", action="store", type="string", dest="travel_speed",
|
||||||
default="0", help="Laser power-on delay (ms)")
|
default="3000", help="Travel speed (mm/min)")
|
||||||
self.OptionParser.add_option("", "--suppress-all-messages", action="store", type="inkbool",
|
|
||||||
dest="suppress_all_messages", default=True,
|
add_option("", "--laser-power", action="store", type="int", dest="laser_power", default="255",
|
||||||
help="Hide messages during g-code generation")
|
help="S# is 256 or 10000 for full power")
|
||||||
self.OptionParser.add_option("", "--create-log", action="store", type="inkbool", dest="log_create_log",
|
|
||||||
default=False, help="Create log files")
|
add_option("", "--passes", action="store", type="int", dest="passes", default="1",
|
||||||
self.OptionParser.add_option("", "--log-filename", action="store", type="string", dest="log_filename",
|
help="Quantity of passes")
|
||||||
default='', help="Create log files")
|
|
||||||
self.OptionParser.add_option("", "--engraving-draw-calculation-paths", action="store", type="inkbool",
|
add_option("", "--pass-depth", action="store", type="string", dest="pass_depth", default="1",
|
||||||
dest="engraving_draw_calculation_paths", default=False,
|
help="Depth of laser cut")
|
||||||
help="Draw additional graphics to debug engraving path")
|
|
||||||
self.OptionParser.add_option("", "--unit", action="store", type="string", dest="unit",
|
add_option("", "--power-delay", action="store", type="string", dest="power_delay",
|
||||||
default="G21 (All units in mm)", help="Units either mm or inches")
|
default="0", help="Laser power-on delay (ms)")
|
||||||
self.OptionParser.add_option("", "--active-tab", action="store", type="string", dest="active_tab", default="",
|
|
||||||
help="Defines which tab is active")
|
add_option("", "--suppress-all-messages", action="store", type="inkbool",
|
||||||
self.OptionParser.add_option("", "--biarc-max-split-depth", action="store", type="int",
|
dest="suppress_all_messages", default=True,
|
||||||
dest="biarc_max_split_depth", default="4",
|
help="Hide messages during g-code generation")
|
||||||
help="Defines maximum depth of splitting while approximating using biarcs.")
|
|
||||||
|
add_option("", "--create-log", action="store", type="inkbool", dest="log_create_log",
|
||||||
|
default=False, help="Create log files")
|
||||||
|
|
||||||
|
add_option("", "--log-filename", action="store", type="string", dest="log_filename",
|
||||||
|
default='', help="Create log files")
|
||||||
|
|
||||||
|
add_option("", "--engraving-draw-calculation-paths", action="store", type="inkbool",
|
||||||
|
dest="engraving_draw_calculation_paths", default=False,
|
||||||
|
help="Draw additional graphics to debug engraving path")
|
||||||
|
|
||||||
|
add_option("", "--unit", action="store", type="string", dest="unit",
|
||||||
|
default="G21 (All units in mm)", help="Units either mm or inches")
|
||||||
|
|
||||||
|
add_option("", "--active-tab", action="store", type="string", dest="active_tab", default="",
|
||||||
|
help="Defines which tab is active")
|
||||||
|
|
||||||
|
add_option("", "--biarc-max-split-depth", action="store", type="int",
|
||||||
|
dest="biarc_max_split_depth", default="4",
|
||||||
|
help="Defines maximum depth of splitting while approximating using biarcs.")
|
||||||
|
|
||||||
def parse_curve(self, p, layer, w=None, f=None):
|
def parse_curve(self, p, layer, w=None, f=None):
|
||||||
c = []
|
c = []
|
||||||
@@ -788,7 +592,7 @@ class laser_gcode(inkex.Effect):
|
|||||||
return []
|
return []
|
||||||
p = self.transform_csp(p, layer)
|
p = self.transform_csp(p, layer)
|
||||||
|
|
||||||
### Sort to reduce Rapid distance
|
# Sort to reduce Rapid distance
|
||||||
k = range(1, len(p))
|
k = range(1, len(p))
|
||||||
keys = [0]
|
keys = [0]
|
||||||
while len(k) > 0:
|
while len(k) > 0:
|
||||||
@@ -812,11 +616,10 @@ class laser_gcode(inkex.Effect):
|
|||||||
print_("Curve: " + str(c))
|
print_("Curve: " + str(c))
|
||||||
return c
|
return c
|
||||||
|
|
||||||
|
|
||||||
def draw_curve(self, curve, layer, group=None, style=styles["biarc_style"]):
|
def draw_curve(self, curve, layer, group=None, style=styles["biarc_style"]):
|
||||||
|
|
||||||
self.get_defs()
|
self.get_defs()
|
||||||
# Add marker to defs if it doesnot exists
|
# Add marker to defs if it does not exist
|
||||||
if "DrawCurveMarker" not in self.defs:
|
if "DrawCurveMarker" not in self.defs:
|
||||||
defs = inkex.etree.SubElement(self.document.getroot(), inkex.addNS("defs", "svg"))
|
defs = inkex.etree.SubElement(self.document.getroot(), inkex.addNS("defs", "svg"))
|
||||||
marker = inkex.etree.SubElement(defs, inkex.addNS("marker", "svg"),
|
marker = inkex.etree.SubElement(defs, inkex.addNS("marker", "svg"),
|
||||||
@@ -843,7 +646,7 @@ class laser_gcode(inkex.Effect):
|
|||||||
del (style['biarc%s_r' % i]["marker-end"])
|
del (style['biarc%s_r' % i]["marker-end"])
|
||||||
style['biarc%s_r' % i] = simplestyle.formatStyle(style['biarc%s_r' % i])
|
style['biarc%s_r' % i] = simplestyle.formatStyle(style['biarc%s_r' % i])
|
||||||
|
|
||||||
if group == None:
|
if group is None:
|
||||||
group = inkex.etree.SubElement(self.layers[min(1, len(self.layers) - 1)], inkex.addNS('g', 'svg'),
|
group = inkex.etree.SubElement(self.layers[min(1, len(self.layers) - 1)], inkex.addNS('g', 'svg'),
|
||||||
{"gcodetools": "Preview group"})
|
{"gcodetools": "Preview group"})
|
||||||
s, arcn = '', 0
|
s, arcn = '', 0
|
||||||
@@ -965,13 +768,14 @@ class laser_gcode(inkex.Effect):
|
|||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### Generate Gcode
|
# Generate Gcode
|
||||||
### Generates Gcode on given curve.
|
#
|
||||||
###
|
# Curve definition
|
||||||
### Crve defenitnion [start point, type = {'arc','line','move','end'}, arc center, arc angle, end point, [zstart, zend]]
|
# [start point, type = {'arc','line','move','end'}, arc center, arc angle, end point, [zstart, zend]]
|
||||||
###
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
def generate_gcode(self, curve, layer, depth):
|
def generate_gcode(self, curve, layer, depth):
|
||||||
tool = self.tools
|
tool = self.tools
|
||||||
print_("Tool in g-code generator: " + str(tool))
|
print_("Tool in g-code generator: " + str(tool))
|
||||||
@@ -1114,19 +918,18 @@ class laser_gcode(inkex.Effect):
|
|||||||
else:
|
else:
|
||||||
self.error(_(
|
self.error(_(
|
||||||
"Orientation points are wrong! (if there are two orientation points they sould not be the same. If there are three orientation points they should not be in a straight line.)"),
|
"Orientation points are wrong! (if there are two orientation points they sould not be the same. If there are three orientation points they should not be in a straight line.)"),
|
||||||
"wrong_orientation_points")
|
"wrong_orientation_points")
|
||||||
else:
|
else:
|
||||||
self.error(_(
|
self.error(_(
|
||||||
"Orientation points are wrong! (if there are two orientation points they sould not be the same. If there are three orientation points they should not be in a straight line.)"),
|
"Orientation points are wrong! (if there are two orientation points they sould not be the same. If there are three orientation points they should not be in a straight line.)"),
|
||||||
"wrong_orientation_points")
|
"wrong_orientation_points")
|
||||||
|
|
||||||
self.transform_matrix_reverse[layer] = numpy.linalg.inv(self.transform_matrix[layer]).tolist()
|
self.transform_matrix_reverse[layer] = numpy.linalg.inv(self.transform_matrix[layer]).tolist()
|
||||||
print_("\n Layer '%s' transformation matrixes:" % layer.get(inkex.addNS('label', 'inkscape')))
|
print_("\n Layer '%s' transformation matrixes:" % layer.get(inkex.addNS('label', 'inkscape')))
|
||||||
print_(self.transform_matrix)
|
print_(self.transform_matrix)
|
||||||
print_(self.transform_matrix_reverse)
|
print_(self.transform_matrix_reverse)
|
||||||
|
|
||||||
###self.Zauto_scale[layer] = math.sqrt( (self.transform_matrix[layer][0][0]**2 + self.transform_matrix[layer][1][1]**2)/2 )
|
# Zautoscale is absolute
|
||||||
### Zautoscale is absolete
|
|
||||||
self.Zauto_scale[layer] = 1
|
self.Zauto_scale[layer] = 1
|
||||||
print_("Z automatic scale = %s (computed according orientation points)" % self.Zauto_scale[layer])
|
print_("Z automatic scale = %s (computed according orientation points)" % self.Zauto_scale[layer])
|
||||||
|
|
||||||
@@ -1147,13 +950,12 @@ class laser_gcode(inkex.Effect):
|
|||||||
csp[i][j][k] = self.transform(csp[i][j][k], layer, reverse)
|
csp[i][j][k] = self.transform(csp[i][j][k], layer, reverse)
|
||||||
return csp
|
return csp
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### Errors handling function, notes are just printed into Logfile,
|
# Errors handling function, notes are just printed into Logfile,
|
||||||
### warnings are printed into log file and warning message is displayed but
|
# warnings are printed into log file and warning message is displayed but
|
||||||
### extension continues working, errors causes log and execution is halted
|
# extension continues working, errors causes log and execution is halted
|
||||||
### Notes, warnings adn errors could be assigned to space or comma or dot
|
# Notes, warnings adn errors could be assigned to space or comma or dot
|
||||||
### sepparated strings (case is ignoreg).
|
# sepparated strings (case is ignoreg).
|
||||||
################################################################################
|
################################################################################
|
||||||
def error(self, s, type_="Warning"):
|
def error(self, s, type_="Warning"):
|
||||||
notes = "Note "
|
notes = "Note "
|
||||||
@@ -1192,9 +994,8 @@ class laser_gcode(inkex.Effect):
|
|||||||
inkex.errormsg(s)
|
inkex.errormsg(s)
|
||||||
sys.exit()
|
sys.exit()
|
||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
### Get defs from svg
|
# Get defs from svg
|
||||||
################################################################################
|
################################################################################
|
||||||
def get_defs(self):
|
def get_defs(self):
|
||||||
self.defs = {}
|
self.defs = {}
|
||||||
@@ -1211,9 +1012,9 @@ class laser_gcode(inkex.Effect):
|
|||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### Get Gcodetools info from the svg
|
# Get Gcodetools info from the svg
|
||||||
###
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
def get_info(self):
|
def get_info(self):
|
||||||
self.selected_paths = {}
|
self.selected_paths = {}
|
||||||
@@ -1240,7 +1041,7 @@ class laser_gcode(inkex.Effect):
|
|||||||
self.orientation_points[layer] = self.orientation_points[layer] + [
|
self.orientation_points[layer] = self.orientation_points[layer] + [
|
||||||
points[:]] if layer in self.orientation_points else [points[:]]
|
points[:]] if layer in self.orientation_points else [points[:]]
|
||||||
print_("Found orientation points in '%s' layer: %s" % (
|
print_("Found orientation points in '%s' layer: %s" % (
|
||||||
layer.get(inkex.addNS('label', 'inkscape')), points))
|
layer.get(inkex.addNS('label', 'inkscape')), points))
|
||||||
else:
|
else:
|
||||||
self.error(_(
|
self.error(_(
|
||||||
"Warning! Found bad orientation points in '%s' layer. Resulting Gcode could be corrupt!") % layer.get(
|
"Warning! Found bad orientation points in '%s' layer. Resulting Gcode could be corrupt!") % layer.get(
|
||||||
@@ -1256,12 +1057,11 @@ class laser_gcode(inkex.Effect):
|
|||||||
elif i.get("id") in self.selected:
|
elif i.get("id") in self.selected:
|
||||||
self.error(_(
|
self.error(_(
|
||||||
"This extension works with Paths and Dynamic Offsets and groups of them only! All other objects will be ignored!\nSolution 1: press Path->Object to path or Shift+Ctrl+C.\nSolution 2: Path->Dynamic offset or Ctrl+J.\nSolution 3: export all contours to PostScript level 2 (File->Save As->.ps) and File->Import this file."),
|
"This extension works with Paths and Dynamic Offsets and groups of them only! All other objects will be ignored!\nSolution 1: press Path->Object to path or Shift+Ctrl+C.\nSolution 2: Path->Dynamic offset or Ctrl+J.\nSolution 3: export all contours to PostScript level 2 (File->Save As->.ps) and File->Import this file."),
|
||||||
"selection_contains_objects_that_are_not_paths")
|
"selection_contains_objects_that_are_not_paths")
|
||||||
|
|
||||||
|
|
||||||
recursive_search(self.document.getroot(), self.document.getroot())
|
recursive_search(self.document.getroot(), self.document.getroot())
|
||||||
|
|
||||||
|
|
||||||
def get_orientation_points(self, g):
|
def get_orientation_points(self, g):
|
||||||
items = g.getchildren()
|
items = g.getchildren()
|
||||||
items.reverse()
|
items.reverse()
|
||||||
@@ -1295,15 +1095,15 @@ class laser_gcode(inkex.Effect):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### dxfpoints
|
# dxfpoints
|
||||||
###
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
def dxfpoints(self):
|
def dxfpoints(self):
|
||||||
if self.selected_paths == {}:
|
if self.selected_paths == {}:
|
||||||
self.error(_(
|
self.error(_(
|
||||||
"Noting is selected. Please select something to convert to drill point (dxfpoint) or clear point sign."),
|
"Noting is selected. Please select something to convert to drill point (dxfpoint) or clear point sign."),
|
||||||
"warning")
|
"warning")
|
||||||
for layer in self.layers:
|
for layer in self.layers:
|
||||||
if layer in self.selected_paths:
|
if layer in self.selected_paths:
|
||||||
for path in self.selected_paths[layer]:
|
for path in self.selected_paths[layer]:
|
||||||
@@ -1324,9 +1124,9 @@ class laser_gcode(inkex.Effect):
|
|||||||
path.set("dxfpoint", "0")
|
path.set("dxfpoint", "0")
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### Laser
|
# Laser
|
||||||
###
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
def laser(self):
|
def laser(self):
|
||||||
|
|
||||||
@@ -1435,7 +1235,7 @@ class laser_gcode(inkex.Effect):
|
|||||||
if "d" not in path.keys():
|
if "d" not in path.keys():
|
||||||
self.error(_(
|
self.error(_(
|
||||||
"Warning: One or more paths dont have 'd' parameter, try to Ungroup (Ctrl+Shift+G) and Object to Path (Ctrl+Shift+C)!"),
|
"Warning: One or more paths dont have 'd' parameter, try to Ungroup (Ctrl+Shift+G) and Object to Path (Ctrl+Shift+C)!"),
|
||||||
"selection_contains_objects_that_are_not_paths")
|
"selection_contains_objects_that_are_not_paths")
|
||||||
continue
|
continue
|
||||||
csp = cubicsuperpath.parsePath(path.get("d"))
|
csp = cubicsuperpath.parsePath(path.get("d"))
|
||||||
csp = self.apply_transforms(path, csp)
|
csp = self.apply_transforms(path, csp)
|
||||||
@@ -1455,9 +1255,9 @@ class laser_gcode(inkex.Effect):
|
|||||||
self.export_gcode(gcode)
|
self.export_gcode(gcode)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### Orientation
|
# Orientation
|
||||||
###
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
def orientation(self, layer=None):
|
def orientation(self, layer=None):
|
||||||
print_("entering orientations")
|
print_("entering orientations")
|
||||||
@@ -1509,7 +1309,7 @@ class laser_gcode(inkex.Effect):
|
|||||||
{
|
{
|
||||||
'style': "stroke:none;fill:#000000;",
|
'style': "stroke:none;fill:#000000;",
|
||||||
'd': 'm %s,%s 2.9375,-6.343750000001 0.8125,1.90625 6.843748640396,-6.84374864039 0,0 0.6875,0.6875 -6.84375,6.84375 1.90625,0.812500000001 z z' % (
|
'd': 'm %s,%s 2.9375,-6.343750000001 0.8125,1.90625 6.843748640396,-6.84374864039 0,0 0.6875,0.6875 -6.84375,6.84375 1.90625,0.812500000001 z z' % (
|
||||||
si[0], -si[1] + doc_height),
|
si[0], -si[1] + doc_height),
|
||||||
'gcodetools': "Gcodetools orientation point arrow"
|
'gcodetools': "Gcodetools orientation point arrow"
|
||||||
})
|
})
|
||||||
t = inkex.etree.SubElement(g, inkex.addNS('text', 'svg'),
|
t = inkex.etree.SubElement(g, inkex.addNS('text', 'svg'),
|
||||||
@@ -1524,11 +1324,11 @@ class laser_gcode(inkex.Effect):
|
|||||||
|
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
###
|
#
|
||||||
### Effect
|
# Effect
|
||||||
###
|
#
|
||||||
### Main function of Gcodetools class
|
# Main function of Gcodetools class
|
||||||
###
|
#
|
||||||
################################################################################
|
################################################################################
|
||||||
def effect(self):
|
def effect(self):
|
||||||
global options
|
global options
|
||||||
@@ -1542,7 +1342,7 @@ class laser_gcode(inkex.Effect):
|
|||||||
if os.path.isfile(self.options.log_filename): os.remove(self.options.log_filename)
|
if os.path.isfile(self.options.log_filename): os.remove(self.options.log_filename)
|
||||||
f = open(self.options.log_filename, "a")
|
f = open(self.options.log_filename, "a")
|
||||||
f.write("Gcodetools log file.\nStarted at %s.\n%s\n" % (
|
f.write("Gcodetools log file.\nStarted at %s.\n%s\n" % (
|
||||||
time.strftime("%d.%m.%Y %H:%M:%S"), options.log_filename))
|
time.strftime("%d.%m.%Y %H:%M:%S"), options.log_filename))
|
||||||
f.write("%s tab is active.\n" % self.options.active_tab)
|
f.write("%s tab is active.\n" % self.options.active_tab)
|
||||||
f.close()
|
f.close()
|
||||||
except:
|
except:
|
||||||
@@ -1553,7 +1353,7 @@ class laser_gcode(inkex.Effect):
|
|||||||
if self.orientation_points == {}:
|
if self.orientation_points == {}:
|
||||||
self.error(_(
|
self.error(_(
|
||||||
"Orientation points have not been defined! A default set of orientation points has been automatically added."),
|
"Orientation points have not been defined! A default set of orientation points has been automatically added."),
|
||||||
"warning")
|
"warning")
|
||||||
self.orientation(self.layers[min(0, len(self.layers) - 1)])
|
self.orientation(self.layers[min(0, len(self.layers) - 1)])
|
||||||
self.get_info()
|
self.get_info()
|
||||||
|
|
||||||
@@ -1565,12 +1365,12 @@ class laser_gcode(inkex.Effect):
|
|||||||
"gcode before path": ("G4 P0 \n" + self.options.laser_command + " S" + str(
|
"gcode before path": ("G4 P0 \n" + self.options.laser_command + " S" + str(
|
||||||
int(self.options.laser_power)) + "\nG4 P" + self.options.power_delay),
|
int(self.options.laser_power)) + "\nG4 P" + self.options.power_delay),
|
||||||
"gcode after path": (
|
"gcode after path": (
|
||||||
"G4 P0 \n" + self.options.laser_off_command + " S0" + "\n" + "G1 F" + self.options.travel_speed),
|
"G4 P0 \n" + self.options.laser_off_command + " S0" + "\n" + "G1 F" + self.options.travel_speed),
|
||||||
}
|
}
|
||||||
|
|
||||||
self.get_info()
|
self.get_info()
|
||||||
self.laser()
|
self.laser()
|
||||||
|
|
||||||
|
|
||||||
e = laser_gcode()
|
e = LaserGcode()
|
||||||
e.affect()
|
e.affect()
|
||||||
|
|||||||
Reference in New Issue
Block a user