printrun-src/printrun/laser.py

Tue, 19 Jan 2021 20:25:47 +0100

author
mdd
date
Tue, 19 Jan 2021 20:25:47 +0100
changeset 43
f7e9bd735ce1
parent 42
ea4c43494a19
permissions
-rw-r--r--

NeoCube laser cutting improvements

16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
1 """
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
2 Lasercutter library
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
3 2015-2019 by NeoSoft, Malte Di Donato
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
4 Intended to use standalone or implemented in Pronterface/Printrun
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
5 """
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
6
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
7 """
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
8 LASERCUT SETTINGS
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
9 Will be overridden from pronterface settings
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
10 """
19
234037fbca4b Bugfixing, Added M400 magic
mbayer
parents: 18
diff changeset
11 E_FACTOR = 0.5
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
12
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
13 from PIL import Image
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
14 import sys
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
15 import math
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
17
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
18 # GENERAL HEADER AND FOOTER GCODE
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
19 GCODE_HEAD = """
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
20 ; GCode generated by laser.py pronterface library (marlin code flavour)
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
21 ; 2015-2019 by NeoSoft - Malte Di Donato
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
22
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
23 G21 ; Metric
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
24 ; We assume Z is in focus height and laser head is focus at bottom left of image!
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
25 G92 X0 Y0 E0; set zero position - new origin
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
26 G90 ; absolute positioning
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
27 M201 X1000 Y1000 ; Set acceleration
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
28 M203 X1000 Y1000 ; Set max feedrate
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
29 M209 S0 ; disable firmware retraction, we dont want to burn holes...
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
30 ;M85 S0 ; Disable idle hold timeout (BUG!)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
31 M84 ; enable motors
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
32
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
33 """
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
34
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
35 GCODE_FOOT = """
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
36 M400 ; Wait for all moves to finish
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
37 M5 ; Force laser off!
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
38 G0 X0 Y0 F%.4f ; Move back to origin
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
39 ; M501 ; undo all settings made
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
40 """ % (100*60)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
41
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
42
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
43 GCODE_HEAD_MELZI = """
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
44 ; GCode generated by laser.py pronterface library (marlin code flavour)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
45 ; 2015-2019 by NeoSoft - Malte Di Donato
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
46
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
47 G21 ; Metric
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
48 ; We assume Z is in focus height and laser head is focus at bottom left of image!
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
49 G92 X0 Y0 E0; set zero position - new origin
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
50 G90 ; absolute positioning
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
51 M82 ; Set extruder (laser) to absolute positioning
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
52 M201 X1000 Y1000 E1000 ; Set acceleration
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
53 M203 X1000 Y1000 Z4 E1000 ; Set max feedrate
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
54 M209 S0 ; disable firmware retraction, we dont want to burn holes...
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
55 M302 ; Allow cold extrudes - doesnt matter because we hack the extruder physically off with the M571 E mod
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
56 M571 S1 E1 ; Activate Laser output on extrusion, but block real motor movement!
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
57 ;M85 S0 ; Disable idle hold timeout (BUG!)
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
58 M84 ; enable motors
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
59
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
60 """
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
61
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
62 GCODE_FOOT_MELZI = """
33
eee51ca7cbe7 Added support for multiple cutting passes with automatic Z refocusing
mdd
parents: 32
diff changeset
63 M400 ; Wait for all moves to finish
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
64 M42 P28 S0 ; Force laser off!
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
65 ;M85 S30 ; re-enable idle hold timeout (BUG!)
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
66 G0 X0 Y0 F%.4f ; Move back to origin
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
67 M571 S0 E0 ; disable extruder firmware hack
33
eee51ca7cbe7 Added support for multiple cutting passes with automatic Z refocusing
mdd
parents: 32
diff changeset
68 ; M501 ; undo all settings made
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
69 """ % (100*60)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
70
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
71
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
72 class LasercutterSettings:
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
73 """
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
74 Default settings object
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
75 """
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
76 def __init__(self):
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
77 self.lc_engrave_speed = 10
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
78 # 30mm/sec works for wood (regulate the output power to something between 10-30%)
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
79 # 30mm/sec for black anodized aluminum to get a light engraving @ 100% power
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
80 # 10mm/sec for black anodized aluminum to get maximum possible engraving! @ 100% power
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
81 self.lc_travel_speed = 120
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
82
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
83 # insert config option to enable the Melzi Marlin FW Hack (M571)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
84 self.lc_melzi_hack = False
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
85
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
86 # BITMAP:
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
87 self.lc_bitmap_speed_factor = 1.0
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
88 self.lc_dpi = 300
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
89 self.lc_grey_threshold = 0
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
90 self.lc_change_dir = True
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
91 self.lc_invert_cut = True
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
92
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
93 # HPGL:
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
94 self.lc_hpgl_speed_factor = 1.0
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
95
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
96 # SVG:
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
97 self.lc_svg_speed_factor = 1.0
25
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
98 self.lc_svg_smoothness = 0.2
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
99 self.lc_svg_width = 50
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
100 self.lc_svg_height = 50
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
101 self.lc_svg_scalemode = "scale"
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
102
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
103
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
104 class Lasercutter:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
105 """
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
106 Lasercutter methods
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
107 parameters: log = logger function (fuction has to accept a string)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
108 """
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
109 def __init__(self, pronterwindow = None):
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
110 if pronterwindow:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
111 self.pronterwindow = pronterwindow
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
112 self.settings = pronterwindow.settings
21
8551b89bd05e more fixes before trying to finish svg compiler
mbayer
parents: 20
diff changeset
113 #self.log = pronterwindow.log
8551b89bd05e more fixes before trying to finish svg compiler
mbayer
parents: 20
diff changeset
114 self.log = self.log_print
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
115 self.pronterwindow.clear_log(None)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
116 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
117 self.pronterwindow = None
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
118 self.settings = LasercutterSettings()
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
119 self.log = lambda : None
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
120
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
121 # STATIC DEFINITIONS, DO NOT CHANGE WORLD's RULES!
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
122 self.INCH = 25.4 # mm
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
123 self.MM_PIXEL = round(self.INCH / self.settings.lc_dpi, 4)
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
124 self.STEPS_PIXEL = self.MM_PIXEL * 80 # mine is 80 steps/mm on XY
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
125
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
126 self.log("Lasercutter library initialized\n%d DPI (%f mm/pixel)" % (
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
127 self.settings.lc_dpi, self.MM_PIXEL))
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
128 if self.STEPS_PIXEL <= 5:
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
129 self.log("WARNING: STEPS PER PIXEL NEEDS TO BE > 5 (otherwise marlin joins lines): %f" % (
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
130 self.STEPS_PIXEL))
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
131 self.log("Travel/Engrave speed: %d mm/sec, %d mm/sec" % (
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
132 self.settings.lc_travel_speed, self.settings.lc_engrave_speed) )
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
133 self.log("")
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
134
21
8551b89bd05e more fixes before trying to finish svg compiler
mbayer
parents: 20
diff changeset
135 def log_print(self, msg):
8551b89bd05e more fixes before trying to finish svg compiler
mbayer
parents: 20
diff changeset
136 print(msg)
8551b89bd05e more fixes before trying to finish svg compiler
mbayer
parents: 20
diff changeset
137
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
138
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
139 def pixel2bit(self, pixel):
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
140 """Convert the pixel value to a bit."""
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
141 # some really weird stuff here ;-P
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
142
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
143 # RGB to greyscale
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
144 #print pixel
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
145 #print type(pixel)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
146 if isinstance(pixel, tuple):
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
147 #rgb
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
148 pixel = pixel[0]*0.2989 + pixel[1]*0.5870 + pixel[2]*0.1140
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
149 if pixel > self.settings.lc_grey_threshold:
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
150 return 1
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
151 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
152 return 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
153
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
154 # color palette
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
155 # TODO: get the grey value of the palette index instead of using pixel which is the palette index?
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
156 if pixel <= self.settings.lc_grey_threshold:
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
157 return 1
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
158 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
159 return 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
160
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
161 def image2gcode(self, filename):
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
162 """
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
163 Open a image file and get the basic information about it.
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
164 Then convert it to gcode (replacing the existing gcode buffer contents)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
165 """
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
166 try:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
167 im = Image.open(filename)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
168 except:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
169 self.log("Unable to open %s" % filename)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
170 return False
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
171
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
172 self.log("Converting Image for lasercut:")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
173 self.log("File: %s" % filename)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
174 self.log("format: %s, mode: %s" % (im.format, im.mode))
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
175 width,height = im.size
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
176 self.log("size: %d x %d pixels" % im.size)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
177
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
178 pix = im.load()
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
179
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
180 fo = open(filename + ".g", "w")
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
181 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
182 fo.write("; Filename: %s\n%s" % (filename, GCODE_HEAD_MELZI))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
183 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
184 fo.write("; Filename: %s\n%s" % (filename, GCODE_HEAD))
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
185
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
186 fo.write(";Start engraving the raster image: %dx%d points @ %d DPI = %.0fx%.0f mm\n\n" % (
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
187 im.size[0], im.size[1], self.settings.lc_dpi,
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
188 im.size[0] * self.MM_PIXEL, im.size[1] * self.MM_PIXEL) )
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
189
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
190 INVERT_Y = self.MM_PIXEL * (im.size[1] -1) * (-1)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
191 DIR = 1
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
192 travel_speed = self.settings.lc_travel_speed * 60
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
193 engrave_speed = self.settings.lc_engrave_speed * 60 * self.settings.lc_bitmap_speed_factor
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
194 for X in range(im.size[0]):
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
195 gcode_col = ""
42
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
196 first_ymm = None
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
197 first_xmm = None
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
198 E = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
199 last_bit = 1 # we engrave on black pixel = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
200 START_Y = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
201 if DIR > 0:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
202 range_start = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
203 range_stop = im.size[1]
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
204 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
205 range_start = im.size[1] -1
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
206 range_stop = -1
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
207
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
208 for Y in range(range_start, range_stop, DIR):
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
209 YMM = abs((Y * self.MM_PIXEL) + INVERT_Y)
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
210 XMM = X * self.MM_PIXEL
42
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
211
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
212 #print "X %d Y %d" % (X, Y)
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
213 bit = self.pixel2bit(pix[X, Y])
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
214 if self.settings.lc_invert_cut:
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
215 if bit == 0:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
216 bit = 1
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
217 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
218 bit = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
219 if last_bit == bit:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
220 if bit == 1:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
221 # nothing to do,
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
222 continue
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
223 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
224 # are we at the end of Y range?
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
225 #print Y
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
226 if (Y == (im.size[1] - 1)) or (Y == 0):
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
227 # draw line
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
228 if DIR > 0:
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
229 E = E + self.MM_PIXEL * (Y - START_Y)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
230 else:
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
231 E = E + self.MM_PIXEL * (START_Y - Y)
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
232 gcode_col += "G1 X%.4f Y%.4f E%.4f F%.4f\n" % (
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
233 XMM, YMM, E * E_FACTOR, engrave_speed)
42
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
234 if not first_xmm:
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
235 first_xmm = XMM + 0.1 # little offset needed!
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
236 first_ymm = YMM * 1
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
237 else:
42
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
238 if not first_xmm:
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
239 first_xmm = XMM + 0.1 # little offset needed!
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
240 first_ymm = YMM * 1
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
241 # bit value has changed!
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
242 if bit == 0:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
243 # jump to start of line to write
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
244 START_Y = Y
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
245 gcode_col += "G0 X%.4f Y%.4f F%.4f\n" % (
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
246 XMM, YMM, travel_speed)
42
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
247 last_xmm = None
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
248 last_ymm = None
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
249 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
250 # end of line to write
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
251 if DIR > 0:
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
252 E = E + (self.MM_PIXEL * (Y - START_Y))
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
253 else:
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
254 E = E + (self.MM_PIXEL * (START_Y - Y))
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
255 gcode_col += "G1 X%.4f Y%.4f E%.4f F%.4f\n" % (
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
256 XMM, YMM, E * E_FACTOR, engrave_speed)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
257 last_bit = bit
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
258 if gcode_col <> "":
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
259 # we skip empty columns
42
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
260 # place last position as G0 to be sure to switch off laser immediately at finish of the line!
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
261 if first_xmm:
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
262 fo.write("G0 X%.4f Y%.4f F%.4f ; force laser off\n" % (
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
263 first_xmm, first_ymm, travel_speed))
ea4c43494a19 bugfixes on rastered image column endings, force laser off with G0 + little offset
mdd
parents: 37
diff changeset
264
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
265 fo.write("M400 ; X=%d printing row: direction %i\nG92 E0\n%s" % (
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
266 X, DIR, gcode_col))
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
267 if self.settings.lc_change_dir:
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
268 DIR = DIR * (-1) # change y direction on every X
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
269
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
270 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
271 fo.write(GCODE_FOOT_MELZI)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
272 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
273 fo.write(GCODE_FOOT)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
274 fo.close()
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
275
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
276 if self.pronterwindow:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
277 self.log("")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
278 self.pronterwindow.load_gcode_async(filename + '.g')
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
279
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
280 def hpgl2gcode(self, filename):
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
281 # FOR HPGL:
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
282 SCALE_FACTOR = 1.0 / 40.0 # 40 plotter units
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
283 OFFSET_X = 0.0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
284 OFFSET_Y = 0.0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
285
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
286 self.log("Converting HPGL plot for lasercut:")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
287 self.log("File: %s" % filename)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
288
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
289 fi = open(filename, "r")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
290 fo = open(filename + ".g", "w")
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
291 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
292 fo.write("; Filename: %s\n%s" % (filename, GCODE_HEAD_MELZI))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
293 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
294 fo.write("; Filename: %s\n%s" % (filename, GCODE_HEAD))
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
295
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
296 G = "0"
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
297 LASER_STATE = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
298 last_coord = [0.0,0.0]
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
299 last_cmd = ""
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
300
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
301 travel_speed = self.settings.lc_travel_speed * 60
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
302 engrave_speed = self.settings.lc_engrave_speed * 60 * self.settings.lc_hpgl_speed_factor
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
303
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
304
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
305 for line in fi.readlines():
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
306 for action in line.split(";"):
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
307 action = action.strip()
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
308 if action != "":
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
309 cmd = action[:2]
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
310 if cmd == "PD":
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
311 LASER_STATE = 1
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
312 elif cmd == "PU":
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
313 LASER_STATE = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
314 if last_cmd == "PD":
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
315 OFFSET_X = coord[0] * -1
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
316 OFFSET_Y = coord[1] * -1
23
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
317 fo.write("; PD PU detected, set coord offset %.4f x %.4f mm\n" % (
e18b2a4ef561 Remove empty lines output on bitmap plotter
mbayer
parents: 22
diff changeset
318 OFFSET_X, OFFSET_Y))
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
319 elif cmd == "PA" or cmd == "PR":
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
320 # TODO: convert relative coordinates to absolute here!
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
321 coord = action[2:].split(",")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
322 coord[0] = (float(coord[0]) + OFFSET_X) * SCALE_FACTOR
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
323 coord[1] = (float(coord[1]) + OFFSET_Y) * SCALE_FACTOR
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
324 if LASER_STATE:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
325 EN = " E%.4f F%.4f" % (
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
326 E_FACTOR * math.hypot(coord[0] - last_coord[0], coord[1] - last_coord[1]),
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
327 engrave_speed)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
328 else:
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
329 EN = " F%.4f" % travel_speed
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
330
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
331 fo.write("G%d X%.4f Y%.4f%s\n" % (
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
332 LASER_STATE, coord[0], coord[1], EN) )
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
333 last_coord = coord
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
334 elif cmd == "IN":
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
335 pass
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
336 elif cmd == "PT":
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
337 print "Ignoring pen thickness"
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
338 else:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
339 print "UNKNOWN: %s" % action
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
340 last_cmd = cmd
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
341
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
342 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
343 fo.write(GCODE_FOOT_MELZI)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
344 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
345 fo.write(GCODE_FOOT)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
346 fi.close()
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
347 fo.close()
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
348
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
349 if self.pronterwindow:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
350 self.log("")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
351 self.pronterwindow.load_gcode_async(filename + '.g')
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
352
25
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
353 def svg2gcode(self, filename):
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
354 # Imports for SVG
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
355 import xml.etree.ElementTree as ET
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
356 from svg2gcode import shapes as shapes_pkg
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
357 from svg2gcode.shapes import point_generator
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
358 from svg2gcode import simplepath, cspsubdiv, cubicsuperpath, simpletransform
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
359
36
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
360 bed_max_x = float(self.settings.lc_svg_width)
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
361 bed_max_y = float(self.settings.lc_svg_height)
18
11f6d97f83b0 forgot svg preamble & postamble
mbayer
parents: 16
diff changeset
362
25
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
363 self.log("Generating paths from SVG (outlines only)...")
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
364 svg_shapes = set(['rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path'])
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
365 tree = ET.parse(filename)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
366 root = tree.getroot()
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
367
28
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
368 # Todo: force viewbox values configurable?
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
369 #width = root.get('width')
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
370 #height = root.get('height')
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
371 # if width == None or height == None:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
372 viewbox = root.get('viewBox')
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
373 if viewbox:
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
374 _, _, width, height = viewbox.split()
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
375 else:
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
376 # no viewbox element, try to get from svg root element
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
377 try:
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
378 width = root.attrib["width"]
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
379 height = root.attrib["height"]
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
380 self.log("No ViewBox, got dimensions from root element)")
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
381 except:
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
382 width = None
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
383 height = None
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
384
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
385 if width == None or height == None:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
386 self.log("Unable to get width and height for the svg!")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
387 return False
28
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
388 else:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
389 self.log("SVG Dimensions are %s x %s" % (width, height))
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
390
27
c82c30811edd svg crowbar fixes
mbayer
parents: 25
diff changeset
391 # TODO: use cm or mm as absolute dimensions!
c82c30811edd svg crowbar fixes
mbayer
parents: 25
diff changeset
392 width = float(width.replace("px", "").replace("pt", "").replace("mm", ""))
c82c30811edd svg crowbar fixes
mbayer
parents: 25
diff changeset
393 height = float(height.replace("px", "").replace("pt", "").replace("mm", ""))
28
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
394
25
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
395 smoothness = self.settings.lc_svg_smoothness
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
396 if smoothness < 0.1: smoothness = 0.1
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
397
28
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
398 # get the minimum x and y values to get an offset to 0,0
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
399 ofs_x = 99999999999.0
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
400 ofs_y = 99999999999.0
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
401 max_x = -99999999999.0
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
402 max_y = -99999999999.0
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
403 for elem in root.iter():
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
404 try:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
405 _, tag_suffix = elem.tag.split('}')
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
406 except ValueError:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
407 continue
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
408 if tag_suffix in svg_shapes:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
409 shape_class = getattr(shapes_pkg, tag_suffix)
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
410 shape_obj = shape_class(elem)
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
411 d = shape_obj.d_path()
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
412 m = shape_obj.transformation_matrix()
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
413
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
414 if d:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
415 p = point_generator(d, m, smoothness)
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
416 start = True
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
417 for x,y,pen in p:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
418 if x < ofs_x:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
419 ofs_x = x
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
420 if y < ofs_y:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
421 ofs_y = y
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
422 if x > max_x:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
423 max_x = x
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
424 if y > max_y:
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
425 max_y = y
36
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
426
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
427 if self.settings.lc_svg_offset:
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
428 ofs_x *= -1
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
429 ofs_y *= -1
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
430 max_x += ofs_x
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
431 max_y += ofs_y
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
432 self.log("Calculated Offset to 0,0 is %f,%f" % (ofs_x, ofs_y))
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
433 else:
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
434 ofs_x = 0
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
435 ofs_y = 0
28
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
436
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
437 """
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
438 self.log("Calculated Dimension is %f,%f" % (max_x, max_y))
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
439 width = max_x
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
440 height = max_y
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
441 """
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
442
36
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
443 if self.settings.lc_svg_scalemode == "original":
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
444 scale_x = 1.0
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
445 scale_y = 1.0
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
446 elif self.settings.lc_svg_scalemode == "scale":
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
447 scale_x = bed_max_x / width
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
448 scale_y = bed_max_y / height
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
449 if (scale_x * height) > bed_max_y:
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
450 # use y scale
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
451 scale_x = scale_y
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
452 elif (scale_y * width) > bed_max_x:
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
453 # use x scale
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
454 scale_y = scale_x
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
455 # double-check
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
456 if (scale_x * width > bed_max_x) or (scale_y * height > bed_max_y):
f4730ef55ca8 SVG options: offset, original scale
mdd
parents: 35
diff changeset
457 scale_x = scale_y = min(bed_max_x, bed_max_y) / max(width, height)
25
0e3e7fbf0bc6 Added more svg options to settings
mbayer
parents: 23
diff changeset
458 else:
28
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
459 scale_x = bed_max_x / width
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
460 scale_y = bed_max_y / height
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
461
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
462 self.log("Scaling factor: %.2f, %.2f" % (scale_x,scale_y))
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
463
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
464 fo = open(filename + ".g", "w")
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
465 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
466 fo.write("; Filename: %s\n%s" % (filename, GCODE_HEAD_MELZI))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
467 fo.write("M571 S0 E1 ; On SVG we control the laser by ourself\n")
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
468 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
469 fo.write("; Filename: %s\n%s" % (filename, GCODE_HEAD))
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
470
22
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
471 travel_speed = self.settings.lc_travel_speed * 60
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
472 engrave_speed = self.settings.lc_engrave_speed * 60 * self.settings.lc_svg_speed_factor
4c9bb8f93ae8 Added the Lasercut settings to the pronterface options dialog
mbayer
parents: 21
diff changeset
473
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
474 errors = 0
37
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
475 elemidx = 0
28
23efe2c53872 Bugfix SVG offset correction
mdd
parents: 27
diff changeset
476
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
477 for elem in root.iter():
37
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
478 elemidx += 1
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
479 try:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
480 _, tag_suffix = elem.tag.split('}')
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
481 except ValueError:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
482 continue
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
483
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
484 if tag_suffix in svg_shapes:
37
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
485 try:
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
486 styles = elem.attrib['style'].split(';')
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
487 except KeyError:
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
488 styles = []
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
489 skip = False
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
490 for style in styles:
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
491 style = style.split(':')
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
492 if style[0] == 'stroke':
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
493 # ignore all stroke colors which are not #000000
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
494 if style[1] != "#000000":
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
495 self.log("Ignoring shape %s (%i) by stroke color" % (tag_suffix, elemidx))
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
496 skip = True
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
497 break
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
498 # TODO: do a config option to enter the CUT color or something
37
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
499 if skip:
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
500 continue
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
501
926424f97c8e SVG gcode generator: interpret color style if present
mdd
parents: 36
diff changeset
502 self.log("Parsing shape: %s (%i)" % (tag_suffix, elemidx))
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
503 shape_class = getattr(shapes_pkg, tag_suffix)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
504 shape_obj = shape_class(elem)
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
505 d = shape_obj.d_path()
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
506 mat = shape_obj.transformation_matrix()
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
507
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
508 if d:
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
509 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
510 fo.write("M400 ; start %s\n" % (tag_suffix))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
511 fo.write("G92 E0\n")
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
512 E = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
513 xo = 0
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
514 yo = 0
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
515 idxo = None
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
516 #p = point_generator(d, mat, smoothness)
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
517
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
518 simple_path = simplepath.parsePath(d)
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
519 if len(simple_path) == 0:
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
520 self.log("Path length zero!")
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
521 continue
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
522
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
523 p = cubicsuperpath.parsePath(d)
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
524
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
525 if mat:
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
526 simpletransform.applyTransformToPath(mat, p)
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
527
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
528 for sp in p:
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
529 cspsubdiv.subdiv( sp, smoothness)
33
eee51ca7cbe7 Added support for multiple cutting passes with automatic Z refocusing
mdd
parents: 32
diff changeset
530 #self.log("Laser ON at: " + repr(sp[0][0]))
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
531 x = sp[0][0][0] + ofs_x
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
532 y = sp[0][0][1] + ofs_y
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
533 y = height - y # invert the bed
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
534 xs = scale_x * x
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
535 ys = scale_y * y
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
536 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
537 fo.write("M400 ; Wait for all moves to finish\n")
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
538 fo.write("M42 P28 S0 ; Turn off laser\n")
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
539 fo.write("G0 X%0.4f Y%0.4f F%.4f ; Move to start of shape\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
540 xs, ys, travel_speed))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
541 fo.write("M400 ; Wait for all moves to finish\n")
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
542 fo.write("M42 P28 S255 ; Turn on laser\n")
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
543 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
544 fo.write("M5 ; Turn off laser\n")
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
545 fo.write("G0 X%0.4f Y%0.4f F%.4f ; Move to start of shape\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
546 xs, ys, travel_speed))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
547 # todo: laser power as parameter?
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
548 fo.write("M3 S100 ; Turn on laser\n")
19
234037fbca4b Bugfixing, Added M400 magic
mbayer
parents: 18
diff changeset
549
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
550 xo = xs
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
551 yo = ys
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
552 object_xs = xs
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
553 object_ys = ys
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
554
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
555 for csp in sp:
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
556 ctrl_pt1 = csp[0]
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
557 ctrl_pt2 = csp[1]
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
558 end_pt = csp[2]
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
559
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
560 x = end_pt[0] + ofs_x
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
561 y = end_pt[1] + ofs_y
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
562
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
563 y = height - y # invert the bed
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
564 xs = round(scale_x * x, 4)
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
565 ys = round(scale_y * y, 4)
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
566 if xo == xs and yo == ys: continue
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
567
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
568 #self.log(" Point " + repr(end_pt))
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
569 e_distance = math.hypot(xs - xo, ys - yo)
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
570 xo = xs
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
571 yo = ys
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
572 E = E + (e_distance)
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
573
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
574 if xs >= 0 and xs <= bed_max_x+0.1 and ys >= 0 and ys <= bed_max_y+0.1:
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
575 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
576 fo.write("G1 X%0.4f Y%0.4f E%.4f F%.4f\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
577 xs, ys, E * E_FACTOR, engrave_speed))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
578 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
579 fo.write("G1 X%0.4f Y%0.4f F%.4f\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
580 xs, ys, engrave_speed))
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
581 else:
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
582 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
583 fo.write("G0 X%0.4f Y%0.4f F%.4f\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
584 xs, ys, travel_speed))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
585 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
586 fo.write("M5 ; Turn off laser\n")
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
587 fo.write("G0 X%0.4f Y%0.4f F%.4f\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
588 xs, ys, travel_speed))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
589 # todo: laser power as parameter?
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
590 fo.write("M3 S100 ; Turn on laser\n")
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
591 errors += 1
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
592 if errors < 10:
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
593 self.log("Position outside print dimension: %d, %d" % (xs, ys))
32
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
594
0abfa4642776 SVG bugfix: first shape line not drawn
mdd
parents: 28
diff changeset
595 #print " Point: ", end_pt[0], end_pt[1], pen
33
eee51ca7cbe7 Added support for multiple cutting passes with automatic Z refocusing
mdd
parents: 32
diff changeset
596 #self.log("Laser OFF at: " + repr(sp[-1][-1]))
27
c82c30811edd svg crowbar fixes
mbayer
parents: 25
diff changeset
597
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
598 #if shape_obj.xml_node.get('fill'):
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
599 if tag_suffix == "polygon":
21
8551b89bd05e more fixes before trying to finish svg compiler
mbayer
parents: 20
diff changeset
600 # Close the polygon
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
601 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
602 e_distance = math.hypot(object_xs - xo, object_ys - yo)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
603 E = E + (e_distance)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
604 fo.write("G1 X%0.4f Y%0.4f E%.4f F%.4f ; Close the object polygon\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
605 object_xs, object_ys, E * E_FACTOR, engrave_speed))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
606 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
607 fo.write("G1 X%0.4f Y%0.4f F%.4f ; Close the object polygon\n" % (
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
608 object_xs, object_ys, engrave_speed))
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
609 print "connecting filled polygon path end to start"
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
610
43
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
611 if self.settings.lc_melzi_hack:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
612 fo.write(GCODE_FOOT_MELZI)
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
613 else:
f7e9bd735ce1 NeoCube laser cutting improvements
mdd
parents: 42
diff changeset
614 fo.write(GCODE_FOOT)
20
03b34402d405 Code cleanup
mbayer
parents: 19
diff changeset
615 fo.close()
35
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
616
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
617 if errors > 0:
72c4cbf64211 Final bugfixes, SVG working like a charm now
mdd
parents: 33
diff changeset
618 self.log("%i errors while generating gcode" % errors)
16
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
619
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
620 if self.pronterwindow:
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
621 self.log("")
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
622 self.pronterwindow.load_gcode_async(filename + '.g')
36d478bde840 Implemented svg, png and hpgl compilers to pronterface
mbayer
parents:
diff changeset
623

mercurial