Skip to content

Commit 3273809

Browse files
committed
v0.42; make pyinstaller the default
1 parent 3a83496 commit 3273809

File tree

7 files changed

+98
-44
lines changed

7 files changed

+98
-44
lines changed

Change_Log.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,3 +226,9 @@ Version 0.40:
226226
Version 0.41:
227227
- Fixed more minor issues reading certain SVG files.
228228

229+
Version 0.42:
230+
- Minor update to DXF reading to include color by layer
231+
- Fix for Inkscape Executable location button. Auto generated text made bu the button did not work for some version of Python
232+
- Fixed trace boundary when X and Y scaling is used
233+
- Limited minimum speed entries to prevent unexpected laser movements.
234+
- Fixed trace boundary space so that it scales with units change.

build_macOS.sh

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@ VERBOSE=false
99
MAKE_DISK=false
1010
KEEP_VENV=false
1111
SETUP_ENVIRONMENT=false
12-
PYINSTALLER=false
12+
PYINSTALLER=true
1313
while getopts "hvdesp" OPTION; do
1414
case "$OPTION" in
1515
h) echo "Options:"
1616
echo "\t-h Print help (this)"
1717
echo "\t-v Verbose output"
1818
echo "\t-e Keep Python virtual environment (don't delete)"
19-
echo "\t-p Use PyInstaller to build instead of py2app"
19+
echo "\t-p Use py2app to build instead of PyInstaller"
2020
echo "\t-s Setup dev environment"
2121
echo "\t-d Make disk image (.dmg)"
2222
exit 0
@@ -27,7 +27,7 @@ while getopts "hvdesp" OPTION; do
2727
;;
2828
e) KEEP_VENV=true
2929
;;
30-
p) PYINSTALLER=true
30+
p) PYINSTALLER=false
3131
;;
3232
s) SETUP_ENVIRONMENT=true
3333
;;
@@ -162,7 +162,7 @@ then
162162
fi
163163

164164
rm ${VOLNAME}.dmg
165-
hdiutil create -fs HFS+ -volname ${VOLNAME} -srcfolder ./dist ./K40-Whisperer-${VERSION}.dmg
165+
hdiutil create -fs HFS+ -volname ${VOLNAME} -srcfolder ./dist ./${VOLNAME}.dmg
166166
fi
167167

168168
echo "Done."

dxf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ def add_coords(self,line,offset,scale,rotate,color=None,layer=None):
548548
# Now test for Hidden layer IE Color < 0
549549
if ( slcolor != None) and (slcolor < 0):
550550
return
551-
if color == None:
551+
if (color == None) or (color == 256): # 256 is ColorByLayer
552552
# default to layer color
553553
color = slcolor
554554
if ( color != None) and (color < 0):

k40_whisperer.py

Lines changed: 82 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
along with this program. If not, see <http://www.gnu.org/licenses/>.
1818
1919
"""
20-
version = '0.41'
20+
version = '0.42'
2121
title_text = "K40 Whisperer V"+version
2222

2323
import sys
@@ -456,6 +456,9 @@ def createWidgets(self):
456456
self.Veng_time.set("0")
457457
self.Vcut_time.set("0")
458458
self.Gcde_time.set("0")
459+
460+
self.min_vector_speed = 1.1 #in/min
461+
self.min_raster_speed = 12 #in/min
459462

460463
##########################################################################
461464
### END INITILIZING VARIABLES ###
@@ -1258,11 +1261,8 @@ def Close_Current_Window_Click(self,event=None):
12581261
def Entry_Reng_feed_Check(self):
12591262
try:
12601263
value = float(self.Reng_feed.get())
1261-
if self.units.get() == 'mm':
1262-
vfactor = 25.4/60.0
1263-
else:
1264-
vfactor = 1.0
1265-
low_limit = 12*vfactor
1264+
vfactor=(25.4/60.0)/self.feed_factor()
1265+
low_limit = self.min_raster_speed*vfactor
12661266
if value < low_limit:
12671267
self.statusMessage.set(" Feed Rate should be greater than or equal to %f " %(low_limit))
12681268
return 2 # Value is invalid number
@@ -1276,8 +1276,10 @@ def Entry_Reng_feed_Callback(self, varName, index, mode):
12761276
def Entry_Veng_feed_Check(self):
12771277
try:
12781278
value = float(self.Veng_feed.get())
1279-
if value <= 0.0:
1280-
self.statusMessage.set(" Feed Rate should be greater than 0.0 ")
1279+
vfactor=(25.4/60.0)/self.feed_factor()
1280+
low_limit = self.min_vector_speed*vfactor
1281+
if value < low_limit:
1282+
self.statusMessage.set(" Feed Rate should be greater than or equal to %f " %(low_limit))
12811283
return 2 # Value is invalid number
12821284
except:
12831285
return 3 # Value not a number
@@ -1289,8 +1291,10 @@ def Entry_Veng_feed_Callback(self, varName, index, mode):
12891291
def Entry_Vcut_feed_Check(self):
12901292
try:
12911293
value = float(self.Vcut_feed.get())
1292-
if value <= 0.0:
1293-
self.statusMessage.set(" Feed Rate should be greater than 0.0 ")
1294+
vfactor=(25.4/60.0)/self.feed_factor()
1295+
low_limit = self.min_vector_speed*vfactor
1296+
if value < low_limit:
1297+
self.statusMessage.set(" Feed Rate should be greater than or equal to %f " %(low_limit))
12941298
return 2 # Value is invalid number
12951299
except:
12961300
return 3 # Value not a number
@@ -1555,8 +1559,10 @@ def Entry_Laser_R_Scale_Callback(self, varName, index, mode):
15551559
def Entry_Laser_Rapid_Feed_Check(self):
15561560
try:
15571561
value = float(self.rapid_feed.get())
1558-
if value < 0.0:
1559-
self.statusMessage.set(" Rapid feed should be greater than 0 (or 0 for default speed) ")
1562+
vfactor=(25.4/60.0)/self.feed_factor()
1563+
low_limit = 1.0*vfactor
1564+
if value !=0 and value < low_limit:
1565+
self.statusMessage.set(" Rapid feed should be greater than or equal to %f (or 0 for default speed) " %(low_limit))
15601566
return 2 # Value is invalid number
15611567
except:
15621568
return 3 # Value not a number
@@ -1636,6 +1642,11 @@ def Entry_Trace_Gap_Callback(self, varName, index, mode):
16361642
def Entry_Trace_Speed_Check(self):
16371643
try:
16381644
value = float(self.trace_speed.get())
1645+
vfactor=(25.4/60.0)/self.feed_factor()
1646+
low_limit = self.min_vector_speed*vfactor
1647+
if value < low_limit:
1648+
self.statusMessage.set(" Feed Rate should be greater than or equal to %f " %(low_limit))
1649+
return 2 # Value is invalid number
16391650
except:
16401651
return 3 # Value not a number
16411652
self.refreshTime()
@@ -1651,7 +1662,10 @@ def Inkscape_Path_Click(self, event):
16511662
("All Files","*")],\
16521663
initialdir=self.inkscape_path.get())
16531664
if newfontdir != "" and newfontdir != ():
1654-
self.inkscape_path.set(newfontdir.encode("utf-8"))
1665+
if type(newfontdir) is not str:
1666+
newfontdir = newfontdir.encode("utf-8")
1667+
self.inkscape_path.set(newfontdir)
1668+
16551669
try:
16561670
win_id.withdraw()
16571671
win_id.deiconify()
@@ -1686,15 +1700,16 @@ def Scale_Linear_Inputs(self, new_units=None):
16861700
self.units_scale = 25.4
16871701
else:
16881702
return
1689-
self.LaserXsize.set( self.Scale_Text_Value('%.2f',self.LaserXsize.get(),factor) )
1690-
self.LaserYsize.set( self.Scale_Text_Value('%.2f',self.LaserYsize.get(),factor) )
1691-
self.jog_step.set ( self.Scale_Text_Value('%.3f',self.jog_step.get() ,factor) )
1692-
self.gotoX.set ( self.Scale_Text_Value('%.3f',self.gotoX.get() ,factor) )
1693-
self.gotoY.set ( self.Scale_Text_Value('%.3f',self.gotoY.get() ,factor) )
1694-
self.Reng_feed.set ( self.Scale_Text_Value('%.1f',self.Reng_feed.get() ,vfactor) )
1695-
self.Veng_feed.set ( self.Scale_Text_Value('%.1f',self.Veng_feed.get() ,vfactor) )
1696-
self.Vcut_feed.set ( self.Scale_Text_Value('%.1f',self.Vcut_feed.get() ,vfactor) )
1697-
self.trace_speed.set ( self.Scale_Text_Value('%.1f',self.trace_speed.get() ,vfactor) )
1703+
self.LaserXsize.set ( self.Scale_Text_Value('%.2f',self.LaserXsize.get() ,factor ) )
1704+
self.LaserYsize.set ( self.Scale_Text_Value('%.2f',self.LaserYsize.get() ,factor ) )
1705+
self.jog_step.set ( self.Scale_Text_Value('%.3f',self.jog_step.get() ,factor ) )
1706+
self.gotoX.set ( self.Scale_Text_Value('%.3f',self.gotoX.get() ,factor ) )
1707+
self.gotoY.set ( self.Scale_Text_Value('%.3f',self.gotoY.get() ,factor ) )
1708+
self.Reng_feed.set ( self.Scale_Text_Value('%.1f',self.Reng_feed.get() ,vfactor) )
1709+
self.Veng_feed.set ( self.Scale_Text_Value('%.1f',self.Veng_feed.get() ,vfactor) )
1710+
self.Vcut_feed.set ( self.Scale_Text_Value('%.1f',self.Vcut_feed.get() ,vfactor) )
1711+
self.trace_speed.set( self.Scale_Text_Value('%.1f',self.trace_speed.get() ,vfactor) )
1712+
self.rapid_feed.set ( self.Scale_Text_Value('%.1f',self.rapid_feed.get() ,vfactor) )
16981713

16991714
def Scale_Text_Value(self,format_txt,Text_Value,factor):
17001715
try:
@@ -2806,7 +2821,8 @@ def slow_jog(self,dxmils,dymils):
28062821
self.stop[0]=False
28072822
Rapid_data=[]
28082823
Rapid_inst = egv(target=lambda s:Rapid_data.append(s))
2809-
Rapid_inst.make_egv_rapid(dxmils,dymils,Feed=float(self.rapid_feed.get()),board_name=self.board_name.get())
2824+
Rapid_feed = float(self.rapid_feed.get())*self.feed_factor()
2825+
Rapid_inst.make_egv_rapid(dxmils,dymils,Feed=Rapid_feed,board_name=self.board_name.get())
28102826
self.send_egv_data(Rapid_data, 1, None)
28112827
self.stop[0]=True
28122828

@@ -3053,9 +3069,6 @@ def make_trace_path(self):
30533069
Veng_coords = self.mirror_rotate_vector_coords(Veng_coords)
30543070
Gcode_coords= self.mirror_rotate_vector_coords(Gcode_coords)
30553071

3056-
Vcut_coords,startx,starty = self.scale_vector_coords(Vcut_coords,startx,starty)
3057-
Veng_coords,startx,starty = self.scale_vector_coords(Veng_coords,startx,starty)
3058-
Gcode_coords,startx,starty= self.scale_vector_coords(Gcode_coords,startx,starty)
30593072
#######################################
30603073
if self.RengData.ecoords==[]:
30613074
if self.stop[0] == True:
@@ -3086,6 +3099,8 @@ def make_trace_path(self):
30863099
trace_coords = my_hull.convexHullecoords(all_coords)
30873100
gap = float(self.trace_gap.get())/self.units_scale
30883101
trace_coords = self.offset_eccords(trace_coords,gap)
3102+
3103+
trace_coords,startx,starty = self.scale_vector_coords(trace_coords,startx,starty)
30893104
return trace_coords
30903105

30913106

@@ -3187,7 +3202,7 @@ def point_inside_polygon(self,x,y,poly):
31873202
return inside
31883203

31893204
def optimize_paths(self,ecoords,inside_check=True):
3190-
order_out = self.Sort_Paths(ecoords)
3205+
order_out = self.Sort_Paths(ecoords)
31913206
lastx=-999
31923207
lasty=-999
31933208
Acc=0.004
@@ -3337,6 +3352,14 @@ def scale_vector_coords(self,coords,startx,starty):
33373352
scaled_starty = starty
33383353

33393354
return coords_scale,scaled_startx,scaled_starty
3355+
3356+
3357+
def feed_factor(self):
3358+
if self.units.get()=='in':
3359+
feed_factor = 25.4/60.0
3360+
else:
3361+
feed_factor = 1.0
3362+
return feed_factor
33403363

33413364
def send_data(self,operation_type=None, output_filename=None):
33423365
num_passes=0
@@ -3345,11 +3368,8 @@ def send_data(self,operation_type=None, output_filename=None):
33453368
self.statusbar.configure( bg = 'red' )
33463369
return
33473370
try:
3348-
if self.units.get()=='in':
3349-
feed_factor = 25.4/60.0
3350-
else:
3351-
feed_factor = 1.0
3352-
3371+
feed_factor=self.feed_factor()
3372+
33533373
if self.inputCSYS.get() and self.RengData.image == None:
33543374
xmin,xmax,ymin,ymax = 0.0,0.0,0.0,0.0
33553375
else:
@@ -3384,6 +3404,30 @@ def send_data(self,operation_type=None, output_filename=None):
33843404
self.master.update()
33853405
if not self.VcutData.sorted and self.inside_first.get():
33863406
self.VcutData.set_ecoords(self.optimize_paths(self.VcutData.ecoords),data_sorted=True)
3407+
3408+
3409+
## DEBUG_PLOT=False
3410+
## test_ecoords=self.VcutData.ecoords
3411+
## if DEBUG_PLOT:
3412+
## import matplotlib.pyplot as plt
3413+
## plt.ion()
3414+
## plt.clf()
3415+
## X=[]
3416+
## Y=[]
3417+
## LOOP_OLD = test_ecoords[0][2]
3418+
## for i in range(len(test_ecoords)):
3419+
## LOOP = test_ecoords[i][2]
3420+
## if LOOP != LOOP_OLD:
3421+
## plt.plot(X,Y)
3422+
## plt.pause(.5)
3423+
## X=[]
3424+
## Y=[]
3425+
## LOOP_OLD=LOOP
3426+
## X.append(test_ecoords[i][0])
3427+
## Y.append(test_ecoords[i][1])
3428+
## plt.plot(X,Y)
3429+
3430+
33873431
self.statusMessage.set("Generating EGV data...")
33883432
self.master.update()
33893433

@@ -3806,16 +3850,17 @@ def menu_Calc_Raster_Time(self,event=None):
38063850

38073851
def menu_Help_About(self):
38083852

3809-
about = "K40 Whisperer by Scorch.\n"
3853+
about = "K40 Whisperer Version %s\n\n" %(version)
3854+
about = about + "By Scorch.\n"
38103855
about = about + "\163\143\157\162\143\150\100\163\143\157\162"
38113856
about = about + "\143\150\167\157\162\153\163\056\143\157\155\n"
38123857
about = about + "https://www.scorchworks.com/\n\n"
38133858
try:
3814-
version = "%d.%d.%d" %(sys.version_info.major,sys.version_info.minor,sys.version_info.micro)
3859+
python_version = "%d.%d.%d" %(sys.version_info.major,sys.version_info.minor,sys.version_info.micro)
38153860
except:
3816-
version = ""
3817-
about = about + "Python "+version+" (%d bit)" %(struct.calcsize("P") * 8)
3818-
message_box("About k40_whisperer",about)
3861+
python_version = ""
3862+
about = about + "Python "+python_version+" (%d bit)" %(struct.calcsize("P") * 8)
3863+
message_box("About k40 Whisperer",about)
38193864

38203865
def menu_Help_Web(self):
38213866
webbrowser.open_new(r"https://www.scorchworks.com/K40whisperer/k40whisperer.html")

py2app_setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from setuptools import setup
1111

1212
app_name = 'K40 Whisperer'
13-
app_version = "0.41"
13+
app_version = "0.42"
1414
app_copyright = u'Copyright © 2017-2019, Scorch Works, GNU General Public License'
1515
main_script = 'k40_whisperer.py'
1616
url = 'https://github.com/stephenhouser/k40-whisperer'

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
lxml
22
pyusb
33
pillow
4-
pyinstaller

svg_reader.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ def __init__(self):
135135
self.inkscape_exe_list.append("/usr/bin/inkscape")
136136
self.inkscape_exe_list.append("/usr/local/bin/inkscape")
137137
self.inkscape_exe_list.append("/Applications/Inkscape.app/Contents/Resources/bin/inkscape")
138+
self.inkscape_exe_list.append("/Applications/Inkscape.app/Contents/MacOS/Inkscape")
138139
self.inkscape_exe = None
139140
self.lines =[]
140141
self.Cut_Type = {}
@@ -503,11 +504,13 @@ def process_clone(self, node):
503504
self.groupmat.append(simpletransform.composeTransform(self.groupmat[-1], mat))
504505
# get referenced node
505506
refid = node.get(inkex.addNS('href','xlink'))
507+
#print(refid,node.get('id'),node.get('layer'))
506508
refnode = self.getElementById(refid[1:])
507509
if refnode is not None:
508510
if refnode.tag == inkex.addNS('g','svg') or refnode.tag == inkex.addNS('switch','svg'):
509511
self.process_group(refnode)
510512
elif refnode.tag == inkex.addNS('use', 'svg'):
513+
#print(refnode,'1')
511514
self.process_clone(refnode)
512515
else:
513516
self.process_shape(refnode, self.groupmat[-1])
@@ -556,6 +559,7 @@ def process_group(self, group):
556559
if node.tag == inkex.addNS('g','svg') or node.tag == inkex.addNS('switch','svg'):
557560
self.process_group(node)
558561
elif node.tag == inkex.addNS('use', 'svg'):
562+
#print(node.get('id'),'2',node.get('href'))
559563
self.process_clone(node)
560564

561565
elif node.tag == inkex.addNS('style', 'svg'):

0 commit comments

Comments
 (0)