- converted from Python2 code to Python3 code

- in camlib.py, CNCJob class -> generate_from_excellon_by_tool() was
failing in the line to sort the tools due of been unable to compare
between dict's. I replaced that section.
This commit is contained in:
Marius Stanciu 2018-05-26 04:43:40 +03:00
parent bb3b07455c
commit a4bbb98bf1
76 changed files with 394 additions and 389 deletions

View File

@ -8,7 +8,7 @@
import sys import sys
import traceback import traceback
import urllib import urllib.request, urllib.parse, urllib.error
import getopt import getopt
import random import random
import logging import logging
@ -16,7 +16,7 @@ import simplejson as json
import re import re
import webbrowser import webbrowser
import os import os
import Tkinter import tkinter
from PyQt4 import QtCore from PyQt4 import QtCore
import time # Just used for debugging. Double check before removing. import time # Just used for debugging. Double check before removing.
from xml.dom.minidom import parseString as parse_xml_string from xml.dom.minidom import parseString as parse_xml_string
@ -54,11 +54,11 @@ class App(QtCore.QObject):
try: try:
cmd_line_options, args = getopt.getopt(sys.argv[1:], "h:", "shellfile=") cmd_line_options, args = getopt.getopt(sys.argv[1:], "h:", "shellfile=")
except getopt.GetoptError: except getopt.GetoptError:
print cmd_line_help print(cmd_line_help)
sys.exit(2) sys.exit(2)
for opt, arg in cmd_line_options: for opt, arg in cmd_line_options:
if opt == '-h': if opt == '-h':
print cmd_line_help print(cmd_line_help)
sys.exit() sys.exit()
elif opt == '--shellfile': elif opt == '--shellfile':
cmd_line_shellfile = arg cmd_line_shellfile = arg
@ -106,7 +106,7 @@ class App(QtCore.QObject):
# Note: Setting the parameters to unicode does not seem # Note: Setting the parameters to unicode does not seem
# to have an effect. Then are received as Qstring # to have an effect. Then are received as Qstring
# anyway. # anyway.
file_opened = QtCore.pyqtSignal(unicode, unicode) # File type and filename file_opened = QtCore.pyqtSignal(str, str) # File type and filename
progress = QtCore.pyqtSignal(int) # Percentage of progress progress = QtCore.pyqtSignal(int) # Percentage of progress
@ -612,7 +612,7 @@ class App(QtCore.QObject):
cmd_line_shellfile_text = myfile.read() cmd_line_shellfile_text = myfile.read()
self.shell._sysShell.exec_command(cmd_line_shellfile_text) self.shell._sysShell.exec_command(cmd_line_shellfile_text)
except Exception as ext: except Exception as ext:
print "ERROR: ", ext print(("ERROR: ", ext))
sys.exit(2) sys.exit(2)
# Post-GUI initialization: Experimental attempt # Post-GUI initialization: Experimental attempt
@ -630,7 +630,7 @@ class App(QtCore.QObject):
# because tcl was execudted in old instance of TCL # because tcl was execudted in old instance of TCL
pass pass
else: else:
self.tcl = Tkinter.Tcl() self.tcl = tkinter.Tcl()
self.setup_shell() self.setup_shell()
def defaults_read_form(self): def defaults_read_form(self):
@ -849,7 +849,7 @@ class App(QtCore.QObject):
if result != 'None': if result != 'None':
self.shell.append_output(result + '\n') self.shell.append_output(result + '\n')
except Tkinter.TclError, e: except tkinter.TclError as e:
# This will display more precise answer if something in TCL shell fails # This will display more precise answer if something in TCL shell fails
result = self.tcl.eval("set errorInfo") result = self.tcl.eval("set errorInfo")
self.log.error("Exec command Exception: %s" % (result + '\n')) self.log.error("Exec command Exception: %s" % (result + '\n'))
@ -895,7 +895,7 @@ class App(QtCore.QObject):
if retval and retfcn(retval): if retval and retfcn(retval):
self.shell.append_output(retfcn(retval) + "\n") self.shell.append_output(retfcn(retval) + "\n")
except Exception, e: except Exception as e:
#self.shell.append_error(''.join(traceback.format_exc())) #self.shell.append_error(''.join(traceback.format_exc()))
#self.shell.append_error("?\n") #self.shell.append_error("?\n")
self.shell.append_error(str(e) + "\n") self.shell.append_error(str(e) + "\n")
@ -915,14 +915,14 @@ class App(QtCore.QObject):
if match: if match:
level = match.group(1) level = match.group(1)
msg_ = match.group(2) msg_ = match.group(2)
self.ui.fcinfo.set_status(QtCore.QString(msg_), level=level) self.ui.fcinfo.set_status(str(msg_), level=level)
if toshell: if toshell:
error = level == "error" or level == "warning" error = level == "error" or level == "warning"
self.shell_message(msg, error=error, show=True) self.shell_message(msg, error=error, show=True)
else: else:
self.ui.fcinfo.set_status(QtCore.QString(msg), level="info") self.ui.fcinfo.set_status(str(msg), level="info")
if toshell: if toshell:
self.shell_message(msg) self.shell_message(msg)
@ -973,7 +973,7 @@ class App(QtCore.QObject):
self.log.debug(" %s" % kind) self.log.debug(" %s" % kind)
self.log.debug(" %s" % filename) self.log.debug(" %s" % filename)
record = {'kind': unicode(kind), 'filename': unicode(filename)} record = {'kind': str(kind), 'filename': str(filename)}
if record in self.recent: if record in self.recent:
return return
@ -1116,7 +1116,7 @@ class App(QtCore.QObject):
layout1.addLayout(layout2) layout1.addLayout(layout2)
logo = QtGui.QLabel() logo = QtGui.QLabel()
logo.setPixmap(QtGui.QPixmap('share:flatcam_icon256.png')) logo.setPixmap(QtGui.QPixmap('share/flatcam_icon256.png'))
layout2.addWidget(logo, stretch=0) layout2.addWidget(logo, stretch=0)
title = QtGui.QLabel( title = QtGui.QLabel(
@ -1630,7 +1630,7 @@ class App(QtCore.QObject):
self.clipboard.setText(self.defaults["point_clipboard_format"] % (event.xdata, event.ydata)) self.clipboard.setText(self.defaults["point_clipboard_format"] % (event.xdata, event.ydata))
except Exception, e: except Exception as e:
App.log.debug("Outside plot?") App.log.debug("Outside plot?")
App.log.debug(str(e)) App.log.debug(str(e))
@ -1700,7 +1700,7 @@ class App(QtCore.QObject):
# The Qt methods above will return a QString which can cause problems later. # The Qt methods above will return a QString which can cause problems later.
# So far json.dump() will fail to serialize it. # So far json.dump() will fail to serialize it.
# TODO: Improve the serialization methods and remove this fix. # TODO: Improve the serialization methods and remove this fix.
filename = unicode(filename) filename = str(filename)
if filename == "": if filename == "":
self.inform.emit("Open cancelled.") self.inform.emit("Open cancelled.")
@ -1727,7 +1727,7 @@ class App(QtCore.QObject):
# The Qt methods above will return a QString which can cause problems later. # The Qt methods above will return a QString which can cause problems later.
# So far json.dump() will fail to serialize it. # So far json.dump() will fail to serialize it.
# TODO: Improve the serialization methods and remove this fix. # TODO: Improve the serialization methods and remove this fix.
filename = unicode(filename) filename = str(filename)
if filename == "": if filename == "":
self.inform.emit("Open cancelled.") self.inform.emit("Open cancelled.")
@ -1754,7 +1754,7 @@ class App(QtCore.QObject):
# The Qt methods above will return a QString which can cause problems later. # The Qt methods above will return a QString which can cause problems later.
# So far json.dump() will fail to serialize it. # So far json.dump() will fail to serialize it.
# TODO: Improve the serialization methods and remove this fix. # TODO: Improve the serialization methods and remove this fix.
filename = unicode(filename) filename = str(filename)
if filename == "": if filename == "":
self.inform.emit("Open cancelled.") self.inform.emit("Open cancelled.")
@ -1781,7 +1781,7 @@ class App(QtCore.QObject):
# The Qt methods above will return a QString which can cause problems later. # The Qt methods above will return a QString which can cause problems later.
# So far json.dump() will fail to serialize it. # So far json.dump() will fail to serialize it.
# TODO: Improve the serialization methods and remove this fix. # TODO: Improve the serialization methods and remove this fix.
filename = unicode(filename) filename = str(filename)
if filename == "": if filename == "":
self.inform.emit("Open cancelled.") self.inform.emit("Open cancelled.")
@ -1831,7 +1831,7 @@ class App(QtCore.QObject):
except TypeError: except TypeError:
filename = QtGui.QFileDialog.getSaveFileName(caption="Export SVG") filename = QtGui.QFileDialog.getSaveFileName(caption="Export SVG")
filename = unicode(filename) filename = str(filename)
if filename == "": if filename == "":
self.inform.emit("Export SVG cancelled.") self.inform.emit("Export SVG cancelled.")
@ -1854,7 +1854,7 @@ class App(QtCore.QObject):
except TypeError: except TypeError:
filename = QtGui.QFileDialog.getOpenFileName(caption="Import SVG") filename = QtGui.QFileDialog.getOpenFileName(caption="Import SVG")
filename = unicode(filename) filename = str(filename)
if filename == "": if filename == "":
self.inform.emit("Open cancelled.") self.inform.emit("Open cancelled.")
@ -1897,7 +1897,7 @@ class App(QtCore.QObject):
except TypeError: except TypeError:
filename = QtGui.QFileDialog.getSaveFileName(caption="Save Project As ...") filename = QtGui.QFileDialog.getSaveFileName(caption="Save Project As ...")
filename = unicode(filename) filename = str(filename)
try: try:
f = open(filename, 'r') f = open(filename, 'r')
@ -2031,7 +2031,7 @@ class App(QtCore.QObject):
app_obj.progress.emit(0) app_obj.progress.emit(0)
raise IOError('Failed to open file: ' + filename) raise IOError('Failed to open file: ' + filename)
except ParseError, e: except ParseError as e:
app_obj.inform.emit("[error] Failed to parse file: " + filename + ". " + e[0]) app_obj.inform.emit("[error] Failed to parse file: " + filename + ". " + e[0])
app_obj.progress.emit(0) app_obj.progress.emit(0)
self.log.error(str(e)) self.log.error(str(e))
@ -2332,7 +2332,7 @@ class App(QtCore.QObject):
self.worker_task.emit({'fcn': worker_task, 'params': [self]}) self.worker_task.emit({'fcn': worker_task, 'params': [self]})
def register_folder(self, filename): def register_folder(self, filename):
self.defaults["last_folder"] = os.path.split(unicode(filename))[0] self.defaults["last_folder"] = os.path.split(str(filename))[0]
def set_progress_bar(self, percentage, text=""): def set_progress_bar(self, percentage, text=""):
self.ui.progress_bar.setValue(int(percentage)) self.ui.progress_bar.setValue(int(percentage))
@ -3584,7 +3584,7 @@ class App(QtCore.QObject):
output = '' output = ''
import collections import collections
od = collections.OrderedDict(sorted(commands.items())) od = collections.OrderedDict(sorted(commands.items()))
for cmd_, val in od.iteritems(): for cmd_, val in list(od.items()):
#print cmd, '\n', ''.join(['~']*len(cmd)) #print cmd, '\n', ''.join(['~']*len(cmd))
output += cmd_ + ' \n' + ''.join(['~'] * len(cmd_)) + '\n' output += cmd_ + ' \n' + ''.join(['~'] * len(cmd_)) + '\n'
@ -3638,7 +3638,7 @@ class App(QtCore.QObject):
try: try:
obj.follow(**kwa) obj.follow(**kwa)
except Exception, e: except Exception as e:
return "ERROR: %s" % str(e) return "ERROR: %s" % str(e)
# def get_sys(param): # def get_sys(param):
@ -4132,11 +4132,11 @@ class App(QtCore.QObject):
# TODO: Move this to constructor # TODO: Move this to constructor
icons = { icons = {
"gerber": "share:flatcam_icon16.png", "gerber": "share/flatcam_icon16.png",
"excellon": "share:drill16.png", "excellon": "share/drill16.png",
"cncjob": "share:cnc16.png", "cncjob": "share/cnc16.png",
"project": "share:project16.png", "project": "share/project16.png",
"svg": "share:geometry16.png" "svg": "share/geometry16.png"
} }
openers = { openers = {
@ -4225,12 +4225,12 @@ class App(QtCore.QObject):
"?s=" + str(self.defaults['serial']) + \ "?s=" + str(self.defaults['serial']) + \
"&v=" + str(self.version) + \ "&v=" + str(self.version) + \
"&os=" + str(self.os) + \ "&os=" + str(self.os) + \
"&" + urllib.urlencode(self.defaults["stats"]) "&" + urllib.parse.urlencode(self.defaults["stats"])
App.log.debug("Checking for updates @ %s" % full_url) App.log.debug("Checking for updates @ %s" % full_url)
### Get the data ### Get the data
try: try:
f = urllib.urlopen(full_url) f = urllib.request.urlopen(full_url)
except: except:
# App.log.warning("Failed checking for latest version. Could not connect.") # App.log.warning("Failed checking for latest version. Could not connect.")
self.log.warning("Failed checking for latest version. Could not connect.") self.log.warning("Failed checking for latest version. Could not connect.")
@ -4239,7 +4239,7 @@ class App(QtCore.QObject):
try: try:
data = json.load(f) data = json.load(f)
except Exception, e: except Exception as e:
App.log.error("Could not parse information about latest version.") App.log.error("Could not parse information about latest version.")
self.inform.emit("[error] Could not parse information about latest version.") self.inform.emit("[error] Could not parse information about latest version.")
App.log.debug("json.load(): %s" % str(e)) App.log.debug("json.load(): %s" % str(e))
@ -4257,7 +4257,7 @@ class App(QtCore.QObject):
App.log.debug("Newer version available.") App.log.debug("Newer version available.")
self.message.emit( self.message.emit(
"Newer Version Available", "Newer Version Available",
QtCore.QString("There is a newer version of FlatCAM " + str("There is a newer version of FlatCAM " +
"available for download:<br><br>" + "available for download:<br><br>" +
"<B>" + data["name"] + "</b><br>" + "<B>" + data["name"] + "</b><br>" +
data["message"].replace("\n", "<br>")), data["message"].replace("\n", "<br>")),

View File

@ -693,23 +693,23 @@ class FlatCAMDraw(QtCore.QObject):
self.drawing_toolbar = QtGui.QToolBar() self.drawing_toolbar = QtGui.QToolBar()
self.drawing_toolbar.setDisabled(disabled) self.drawing_toolbar.setDisabled(disabled)
self.app.ui.addToolBar(self.drawing_toolbar) self.app.ui.addToolBar(self.drawing_toolbar)
self.select_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:pointer32.png'), "Select 'Esc'") self.select_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select 'Esc'")
self.add_circle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:circle32.png'), 'Add Circle') self.add_circle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/circle32.png'), 'Add Circle')
self.add_arc_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:arc32.png'), 'Add Arc') self.add_arc_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/arc32.png'), 'Add Arc')
self.add_rectangle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:rectangle32.png'), 'Add Rectangle') self.add_rectangle_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/rectangle32.png'), 'Add Rectangle')
self.add_polygon_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:polygon32.png'), 'Add Polygon') self.add_polygon_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), 'Add Polygon')
self.add_path_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:path32.png'), 'Add Path') self.add_path_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/path32.png'), 'Add Path')
self.union_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:union32.png'), 'Polygon Union') self.union_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/union32.png'), 'Polygon Union')
self.intersection_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:intersection32.png'), 'Polygon Intersection') self.intersection_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/intersection32.png'), 'Polygon Intersection')
self.subtract_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:subtract32.png'), 'Polygon Subtraction') self.subtract_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/subtract32.png'), 'Polygon Subtraction')
self.cutpath_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:cutpath32.png'), 'Cut Path') self.cutpath_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), 'Cut Path')
self.move_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:move32.png'), "Move Objects 'm'") self.move_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Objects 'm'")
self.copy_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:copy32.png'), "Copy Objects 'c'") self.copy_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/copy32.png'), "Copy Objects 'c'")
self.delete_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share:deleteshape32.png'), "Delete Shape '-'") self.delete_btn = self.drawing_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), "Delete Shape '-'")
### Snap Toolbar ### ### Snap Toolbar ###
self.snap_toolbar = QtGui.QToolBar() self.snap_toolbar = QtGui.QToolBar()
self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share:grid32.png'), 'Snap to grid') self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/grid32.png'), 'Snap to grid')
self.grid_gap_x_entry = QtGui.QLineEdit() self.grid_gap_x_entry = QtGui.QLineEdit()
self.grid_gap_x_entry.setMaximumWidth(70) self.grid_gap_x_entry.setMaximumWidth(70)
self.grid_gap_x_entry.setToolTip("Grid X distance") self.grid_gap_x_entry.setToolTip("Grid X distance")
@ -719,7 +719,7 @@ class FlatCAMDraw(QtCore.QObject):
self.grid_gap_y_entry.setToolTip("Grid Y distante") self.grid_gap_y_entry.setToolTip("Grid Y distante")
self.snap_toolbar.addWidget(self.grid_gap_y_entry) self.snap_toolbar.addWidget(self.grid_gap_y_entry)
self.corner_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share:corner32.png'), 'Snap to corner') self.corner_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/corner32.png'), 'Snap to corner')
self.snap_max_dist_entry = QtGui.QLineEdit() self.snap_max_dist_entry = QtGui.QLineEdit()
self.snap_max_dist_entry.setMaximumWidth(70) self.snap_max_dist_entry.setMaximumWidth(70)
self.snap_max_dist_entry.setToolTip("Max. magnet distance") self.snap_max_dist_entry.setToolTip("Max. magnet distance")
@ -731,21 +731,21 @@ class FlatCAMDraw(QtCore.QObject):
### Application menu ### ### Application menu ###
self.menu = QtGui.QMenu("Drawing") self.menu = QtGui.QMenu("Drawing")
self.app.ui.menu.insertMenu(self.app.ui.menutoolaction, self.menu) self.app.ui.menu.insertMenu(self.app.ui.menutoolaction, self.menu)
# self.select_menuitem = self.menu.addAction(QtGui.QIcon('share:pointer16.png'), "Select 'Esc'") # self.select_menuitem = self.menu.addAction(QtGui.QIcon('share/pointer16.png'), "Select 'Esc'")
# self.add_circle_menuitem = self.menu.addAction(QtGui.QIcon('share:circle16.png'), 'Add Circle') # self.add_circle_menuitem = self.menu.addAction(QtGui.QIcon('share/circle16.png'), 'Add Circle')
# self.add_arc_menuitem = self.menu.addAction(QtGui.QIcon('share:arc16.png'), 'Add Arc') # self.add_arc_menuitem = self.menu.addAction(QtGui.QIcon('share/arc16.png'), 'Add Arc')
# self.add_rectangle_menuitem = self.menu.addAction(QtGui.QIcon('share:rectangle16.png'), 'Add Rectangle') # self.add_rectangle_menuitem = self.menu.addAction(QtGui.QIcon('share/rectangle16.png'), 'Add Rectangle')
# self.add_polygon_menuitem = self.menu.addAction(QtGui.QIcon('share:polygon16.png'), 'Add Polygon') # self.add_polygon_menuitem = self.menu.addAction(QtGui.QIcon('share/polygon16.png'), 'Add Polygon')
# self.add_path_menuitem = self.menu.addAction(QtGui.QIcon('share:path16.png'), 'Add Path') # self.add_path_menuitem = self.menu.addAction(QtGui.QIcon('share/path16.png'), 'Add Path')
self.union_menuitem = self.menu.addAction(QtGui.QIcon('share:union16.png'), 'Polygon Union') self.union_menuitem = self.menu.addAction(QtGui.QIcon('share/union16.png'), 'Polygon Union')
self.intersection_menuitem = self.menu.addAction(QtGui.QIcon('share:intersection16.png'), 'Polygon Intersection') self.intersection_menuitem = self.menu.addAction(QtGui.QIcon('share/intersection16.png'), 'Polygon Intersection')
# self.subtract_menuitem = self.menu.addAction(QtGui.QIcon('share:subtract16.png'), 'Polygon Subtraction') # self.subtract_menuitem = self.menu.addAction(QtGui.QIcon('share/subtract16.png'), 'Polygon Subtraction')
self.cutpath_menuitem = self.menu.addAction(QtGui.QIcon('share:cutpath16.png'), 'Cut Path') self.cutpath_menuitem = self.menu.addAction(QtGui.QIcon('share/cutpath16.png'), 'Cut Path')
# self.move_menuitem = self.menu.addAction(QtGui.QIcon('share:move16.png'), "Move Objects 'm'") # self.move_menuitem = self.menu.addAction(QtGui.QIcon('share/move16.png'), "Move Objects 'm'")
# self.copy_menuitem = self.menu.addAction(QtGui.QIcon('share:copy16.png'), "Copy Objects 'c'") # self.copy_menuitem = self.menu.addAction(QtGui.QIcon('share/copy16.png'), "Copy Objects 'c'")
self.delete_menuitem = self.menu.addAction(QtGui.QIcon('share:deleteshape16.png'), "Delete Shape '-'") self.delete_menuitem = self.menu.addAction(QtGui.QIcon('share/deleteshape16.png'), "Delete Shape '-'")
self.buffer_menuitem = self.menu.addAction(QtGui.QIcon('share:buffer16.png'), "Buffer selection 'b'") self.buffer_menuitem = self.menu.addAction(QtGui.QIcon('share/buffer16.png'), "Buffer selection 'b'")
self.paint_menuitem = self.menu.addAction(QtGui.QIcon('share:paint16.png'), "Paint selection") self.paint_menuitem = self.menu.addAction(QtGui.QIcon('share/paint16.png'), "Paint selection")
self.menu.addSeparator() self.menu.addSeparator()
self.paint_menuitem.triggered.connect(self.on_paint_tool) self.paint_menuitem.triggered.connect(self.on_paint_tool)
@ -1473,7 +1473,7 @@ class FlatCAMDraw(QtCore.QObject):
for param in [tooldia, overlap, margin]: for param in [tooldia, overlap, margin]:
if not isinstance(param, float): if not isinstance(param, float):
param_name = [k for k, v in locals().iteritems() if v is param][0] param_name = [k for k, v in list(locals().items()) if v is param][0]
self.app.inform.emit("[warning] Invalid value for {}".format()) self.app.inform.emit("[warning] Invalid value for {}".format())
# Todo: Check for valid method. # Todo: Check for valid method.

View File

@ -28,55 +28,55 @@ class FlatCAMGUI(QtGui.QMainWindow):
self.menufile = self.menu.addMenu('&File') self.menufile = self.menu.addMenu('&File')
# New # New
self.menufilenew = QtGui.QAction(QtGui.QIcon('share:file16.png'), '&New', self) self.menufilenew = QtGui.QAction(QtGui.QIcon('share/file16.png'), '&New', self)
self.menufile.addAction(self.menufilenew) self.menufile.addAction(self.menufilenew)
# Open recent # Open recent
# Recent # Recent
self.recent = self.menufile.addMenu(QtGui.QIcon('share:folder16.png'), "Open recent ...") self.recent = self.menufile.addMenu(QtGui.QIcon('share/folder16.png'), "Open recent ...")
# Open gerber ... # Open gerber ...
self.menufileopengerber = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Open &Gerber ...', self) self.menufileopengerber = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open &Gerber ...', self)
self.menufile.addAction(self.menufileopengerber) self.menufile.addAction(self.menufileopengerber)
# Open Excellon ... # Open Excellon ...
self.menufileopenexcellon = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Open &Excellon ...', self) self.menufileopenexcellon = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open &Excellon ...', self)
self.menufile.addAction(self.menufileopenexcellon) self.menufile.addAction(self.menufileopenexcellon)
# Open G-Code ... # Open G-Code ...
self.menufileopengcode = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Open G-&Code ...', self) self.menufileopengcode = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open G-&Code ...', self)
self.menufile.addAction(self.menufileopengcode) self.menufile.addAction(self.menufileopengcode)
# Open Project ... # Open Project ...
self.menufileopenproject = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Open &Project ...', self) self.menufileopenproject = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Open &Project ...', self)
self.menufile.addAction(self.menufileopenproject) self.menufile.addAction(self.menufileopenproject)
# Import SVG ... # Import SVG ...
self.menufileimportsvg = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Import &SVG ...', self) self.menufileimportsvg = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Import &SVG ...', self)
self.menufile.addAction(self.menufileimportsvg) self.menufile.addAction(self.menufileimportsvg)
# Export SVG ... # Export SVG ...
self.menufileexportsvg = QtGui.QAction(QtGui.QIcon('share:folder16.png'), 'Export &SVG ...', self) self.menufileexportsvg = QtGui.QAction(QtGui.QIcon('share/folder16.png'), 'Export &SVG ...', self)
self.menufile.addAction(self.menufileexportsvg) self.menufile.addAction(self.menufileexportsvg)
# Save Project # Save Project
self.menufilesaveproject = QtGui.QAction(QtGui.QIcon('share:floppy16.png'), '&Save Project', self) self.menufilesaveproject = QtGui.QAction(QtGui.QIcon('share/floppy16.png'), '&Save Project', self)
self.menufile.addAction(self.menufilesaveproject) self.menufile.addAction(self.menufilesaveproject)
# Save Project As ... # Save Project As ...
self.menufilesaveprojectas = QtGui.QAction(QtGui.QIcon('share:floppy16.png'), 'Save Project &As ...', self) self.menufilesaveprojectas = QtGui.QAction(QtGui.QIcon('share/floppy16.png'), 'Save Project &As ...', self)
self.menufile.addAction(self.menufilesaveprojectas) self.menufile.addAction(self.menufilesaveprojectas)
# Save Project Copy ... # Save Project Copy ...
self.menufilesaveprojectcopy = QtGui.QAction(QtGui.QIcon('share:floppy16.png'), 'Save Project C&opy ...', self) self.menufilesaveprojectcopy = QtGui.QAction(QtGui.QIcon('share/floppy16.png'), 'Save Project C&opy ...', self)
self.menufile.addAction(self.menufilesaveprojectcopy) self.menufile.addAction(self.menufilesaveprojectcopy)
# Save Defaults # Save Defaults
self.menufilesavedefaults = QtGui.QAction(QtGui.QIcon('share:floppy16.png'), 'Save &Defaults', self) self.menufilesavedefaults = QtGui.QAction(QtGui.QIcon('share/floppy16.png'), 'Save &Defaults', self)
self.menufile.addAction(self.menufilesavedefaults) self.menufile.addAction(self.menufilesavedefaults)
# Quit # Quit
self.exit_action = QtGui.QAction(QtGui.QIcon('share:power16.png'), '&Exit', self) self.exit_action = QtGui.QAction(QtGui.QIcon('share/power16.png'), '&Exit', self)
# exitAction.setShortcut('Ctrl+Q') # exitAction.setShortcut('Ctrl+Q')
# exitAction.setStatusTip('Exit application') # exitAction.setStatusTip('Exit application')
#self.exit_action.triggered.connect(QtGui.qApp.quit) #self.exit_action.triggered.connect(QtGui.qApp.quit)
@ -85,13 +85,13 @@ class FlatCAMGUI(QtGui.QMainWindow):
### Edit ### ### Edit ###
self.menuedit = self.menu.addMenu('&Edit') self.menuedit = self.menu.addMenu('&Edit')
self.menueditnew = self.menuedit.addAction(QtGui.QIcon('share:new_geo16.png'), 'New Geometry') self.menueditnew = self.menuedit.addAction(QtGui.QIcon('share/new_geo16.png'), 'New Geometry')
self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share:edit16.png'), 'Edit Geometry') self.menueditedit = self.menuedit.addAction(QtGui.QIcon('share/edit16.png'), 'Edit Geometry')
self.menueditok = self.menuedit.addAction(QtGui.QIcon('share:edit_ok16.png'), 'Update Geometry') self.menueditok = self.menuedit.addAction(QtGui.QIcon('share/edit_ok16.png'), 'Update Geometry')
#self.menueditok. #self.menueditok.
#self.menueditcancel = self.menuedit.addAction(QtGui.QIcon('share:cancel_edit16.png'), "Cancel Edit") #self.menueditcancel = self.menuedit.addAction(QtGui.QIcon('share/cancel_edit16.png'), "Cancel Edit")
self.menueditjoin = self.menuedit.addAction(QtGui.QIcon('share:join16.png'), 'Join Geometry') self.menueditjoin = self.menuedit.addAction(QtGui.QIcon('share/join16.png'), 'Join Geometry')
self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share:trash16.png'), 'Delete') self.menueditdelete = self.menuedit.addAction(QtGui.QIcon('share/trash16.png'), 'Delete')
### Options ### ### Options ###
self.menuoptions = self.menu.addMenu('&Options') self.menuoptions = self.menu.addMenu('&Options')
@ -105,22 +105,22 @@ class FlatCAMGUI(QtGui.QMainWindow):
### View ### ### View ###
self.menuview = self.menu.addMenu('&View') self.menuview = self.menu.addMenu('&View')
self.menuviewdisableall = self.menuview.addAction(QtGui.QIcon('share:clear_plot16.png'), 'Disable all plots') self.menuviewdisableall = self.menuview.addAction(QtGui.QIcon('share/clear_plot16.png'), 'Disable all plots')
self.menuviewdisableother = self.menuview.addAction(QtGui.QIcon('share:clear_plot16.png'), self.menuviewdisableother = self.menuview.addAction(QtGui.QIcon('share/clear_plot16.png'),
'Disable all plots but this one') 'Disable all plots but this one')
self.menuviewenable = self.menuview.addAction(QtGui.QIcon('share:replot16.png'), 'Enable all plots') self.menuviewenable = self.menuview.addAction(QtGui.QIcon('share/replot16.png'), 'Enable all plots')
### Tool ### ### Tool ###
#self.menutool = self.menu.addMenu('&Tool') #self.menutool = self.menu.addMenu('&Tool')
self.menutool = QtGui.QMenu('&Tool') self.menutool = QtGui.QMenu('&Tool')
self.menutoolaction = self.menu.addMenu(self.menutool) self.menutoolaction = self.menu.addMenu(self.menutool)
self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share:shell16.png'), '&Command Line') self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share/shell16.png'), '&Command Line')
### Help ### ### Help ###
self.menuhelp = self.menu.addMenu('&Help') self.menuhelp = self.menu.addMenu('&Help')
self.menuhelp_about = self.menuhelp.addAction(QtGui.QIcon('share:tv16.png'), 'About FlatCAM') self.menuhelp_about = self.menuhelp.addAction(QtGui.QIcon('share/tv16.png'), 'About FlatCAM')
self.menuhelp_home = self.menuhelp.addAction(QtGui.QIcon('share:home16.png'), 'Home') self.menuhelp_home = self.menuhelp.addAction(QtGui.QIcon('share/home16.png'), 'Home')
self.menuhelp_manual = self.menuhelp.addAction(QtGui.QIcon('share:globe16.png'), 'Manual') self.menuhelp_manual = self.menuhelp.addAction(QtGui.QIcon('share/globe16.png'), 'Manual')
############### ###############
### Toolbar ### ### Toolbar ###
@ -128,18 +128,18 @@ class FlatCAMGUI(QtGui.QMainWindow):
self.toolbar = QtGui.QToolBar() self.toolbar = QtGui.QToolBar()
self.addToolBar(self.toolbar) self.addToolBar(self.toolbar)
self.zoom_fit_btn = self.toolbar.addAction(QtGui.QIcon('share:zoom_fit32.png'), "&Zoom Fit") self.zoom_fit_btn = self.toolbar.addAction(QtGui.QIcon('share/zoom_fit32.png'), "&Zoom Fit")
self.zoom_out_btn = self.toolbar.addAction(QtGui.QIcon('share:zoom_out32.png'), "&Zoom Out") self.zoom_out_btn = self.toolbar.addAction(QtGui.QIcon('share/zoom_out32.png'), "&Zoom Out")
self.zoom_in_btn = self.toolbar.addAction(QtGui.QIcon('share:zoom_in32.png'), "&Zoom In") self.zoom_in_btn = self.toolbar.addAction(QtGui.QIcon('share/zoom_in32.png'), "&Zoom In")
self.clear_plot_btn = self.toolbar.addAction(QtGui.QIcon('share:clear_plot32.png'), "&Clear Plot") self.clear_plot_btn = self.toolbar.addAction(QtGui.QIcon('share/clear_plot32.png'), "&Clear Plot")
self.replot_btn = self.toolbar.addAction(QtGui.QIcon('share:replot32.png'), "&Replot") self.replot_btn = self.toolbar.addAction(QtGui.QIcon('share/replot32.png'), "&Replot")
self.newgeo_btn = self.toolbar.addAction(QtGui.QIcon('share:new_geo32.png'), "New Blank Geometry") self.newgeo_btn = self.toolbar.addAction(QtGui.QIcon('share/new_geo32.png'), "New Blank Geometry")
self.editgeo_btn = self.toolbar.addAction(QtGui.QIcon('share:edit32.png'), "Edit Geometry") self.editgeo_btn = self.toolbar.addAction(QtGui.QIcon('share/edit32.png'), "Edit Geometry")
self.updategeo_btn = self.toolbar.addAction(QtGui.QIcon('share:edit_ok32.png'), "Update Geometry") self.updategeo_btn = self.toolbar.addAction(QtGui.QIcon('share/edit_ok32.png'), "Update Geometry")
self.updategeo_btn.setEnabled(False) self.updategeo_btn.setEnabled(False)
#self.canceledit_btn = self.toolbar.addAction(QtGui.QIcon('share:cancel_edit32.png'), "Cancel Edit") #self.canceledit_btn = self.toolbar.addAction(QtGui.QIcon('share/cancel_edit32.png'), "Cancel Edit")
self.delete_btn = self.toolbar.addAction(QtGui.QIcon('share:delete32.png'), "&Delete") self.delete_btn = self.toolbar.addAction(QtGui.QIcon('share/delete32.png'), "&Delete")
self.shell_btn = self.toolbar.addAction(QtGui.QIcon('share:shell32.png'), "&Command Line") self.shell_btn = self.toolbar.addAction(QtGui.QIcon('share/shell32.png'), "&Command Line")
################ ################
### Splitter ### ### Splitter ###
@ -179,7 +179,7 @@ class FlatCAMGUI(QtGui.QMainWindow):
self.options_tab_layout.addLayout(hlay1) self.options_tab_layout.addLayout(hlay1)
self.icon = QtGui.QLabel() self.icon = QtGui.QLabel()
self.icon.setPixmap(QtGui.QPixmap('share:gear48.png')) self.icon.setPixmap(QtGui.QPixmap('share/gear48.png'))
hlay1.addWidget(self.icon) hlay1.addWidget(self.icon)
self.options_combo = QtGui.QComboBox() self.options_combo = QtGui.QComboBox()
@ -247,12 +247,12 @@ class FlatCAMGUI(QtGui.QMainWindow):
### Icons ### ### Icons ###
############# #############
self.app_icon = QtGui.QIcon() self.app_icon = QtGui.QIcon()
self.app_icon.addFile('share:flatcam_icon16.png', QtCore.QSize(16, 16)) self.app_icon.addFile('share/flatcam_icon16.png', QtCore.QSize(16, 16))
self.app_icon.addFile('share:flatcam_icon24.png', QtCore.QSize(24, 24)) self.app_icon.addFile('share/flatcam_icon24.png', QtCore.QSize(24, 24))
self.app_icon.addFile('share:flatcam_icon32.png', QtCore.QSize(32, 32)) self.app_icon.addFile('share/flatcam_icon32.png', QtCore.QSize(32, 32))
self.app_icon.addFile('share:flatcam_icon48.png', QtCore.QSize(48, 48)) self.app_icon.addFile('share/flatcam_icon48.png', QtCore.QSize(48, 48))
self.app_icon.addFile('share:flatcam_icon128.png', QtCore.QSize(128, 128)) self.app_icon.addFile('share/flatcam_icon128.png', QtCore.QSize(128, 128))
self.app_icon.addFile('share:flatcam_icon256.png', QtCore.QSize(256, 256)) self.app_icon.addFile('share/flatcam_icon256.png', QtCore.QSize(256, 256))
self.setWindowIcon(self.app_icon) self.setWindowIcon(self.app_icon)
self.setGeometry(100, 100, 1024, 650) self.setGeometry(100, 100, 1024, 650)
@ -278,7 +278,7 @@ class FlatCAMActivityView(QtGui.QWidget):
self.icon = QtGui.QLabel(self) self.icon = QtGui.QLabel(self)
self.icon.setGeometry(0, 0, 12, 12) self.icon.setGeometry(0, 0, 12, 12)
self.movie = QtGui.QMovie("share:active.gif") self.movie = QtGui.QMovie("share/active.gif")
self.icon.setMovie(self.movie) self.icon.setMovie(self.movie)
#self.movie.start() #self.movie.start()
@ -309,7 +309,7 @@ class FlatCAMInfoBar(QtGui.QWidget):
self.icon = QtGui.QLabel(self) self.icon = QtGui.QLabel(self)
self.icon.setGeometry(0, 0, 12, 12) self.icon.setGeometry(0, 0, 12, 12)
self.pmap = QtGui.QPixmap('share:graylight12.png') self.pmap = QtGui.QPixmap('share/graylight12.png')
self.icon.setPixmap(self.pmap) self.icon.setPixmap(self.pmap)
layout = QtGui.QHBoxLayout() layout = QtGui.QHBoxLayout()
@ -334,13 +334,13 @@ class FlatCAMInfoBar(QtGui.QWidget):
level = str(level) level = str(level)
self.pmap.fill() self.pmap.fill()
if level == "error": if level == "error":
self.pmap = QtGui.QPixmap('share:redlight12.png') self.pmap = QtGui.QPixmap('share/redlight12.png')
elif level == "success": elif level == "success":
self.pmap = QtGui.QPixmap('share:greenlight12.png') self.pmap = QtGui.QPixmap('share/greenlight12.png')
elif level == "warning": elif level == "warning":
self.pmap = QtGui.QPixmap('share:yellowlight12.png') self.pmap = QtGui.QPixmap('share/yellowlight12.png')
else: else:
self.pmap = QtGui.QPixmap('share:graylight12.png') self.pmap = QtGui.QPixmap('share/graylight12.png')
self.icon.setPixmap(self.pmap) self.icon.setPixmap(self.pmap)
self.set_text_(text) self.set_text_(text)

View File

@ -6,7 +6,7 @@
# MIT Licence # # MIT Licence #
############################################################ ############################################################
from cStringIO import StringIO from io import StringIO
from PyQt4 import QtCore from PyQt4 import QtCore
from copy import copy from copy import copy
from ObjectUI import * from ObjectUI import *
@ -511,15 +511,16 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
# to cut on the right side of the left over copper i.e on the left side of the features. # to cut on the right side of the left over copper i.e on the left side of the features.
geom = self.isolation_geometry(offset) geom = self.isolation_geometry(offset)
if invert: if invert:
if type(geom) is MultiPolygon: try:
pl = [] if type(geom) is MultiPolygon:
for p in geom: pl = []
pl.append(Polygon(p.exterior.coords[::-1], p.interiors)) for p in geom:
geom = MultiPolygon(pl) pl.append(Polygon(p.exterior.coords[::-1], p.interiors))
elif type(geom) is Polygon: geom = MultiPolygon(pl)
geom = Polygon(geom.exterior.coords[::-1], geom.interiors) elif type(geom) is Polygon:
else: geom = Polygon(geom.exterior.coords[::-1], geom.interiors)
raise "Unexpected Geometry" except Exception as e:
str("Unexpected Geometry")
return geom return geom
if combine: if combine:
@ -728,20 +729,20 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
exc_final.drills.append({"point": point, "tool": drill['tool']}) exc_final.drills.append({"point": point, "tool": drill['tool']})
toolsrework=dict() toolsrework=dict()
max_numeric_tool=0 max_numeric_tool=0
for toolname in exc.tools.iterkeys(): for toolname in list(exc.tools.keys()):
numeric_tool=int(toolname) numeric_tool=int(toolname)
if numeric_tool>max_numeric_tool: if numeric_tool>max_numeric_tool:
max_numeric_tool=numeric_tool max_numeric_tool=numeric_tool
toolsrework[exc.tools[toolname]['C']]=toolname toolsrework[exc.tools[toolname]['C']]=toolname
#exc_final as last because names from final tools will be used #exc_final as last because names from final tools will be used
for toolname in exc_final.tools.iterkeys(): for toolname in list(exc_final.tools.keys()):
numeric_tool=int(toolname) numeric_tool=int(toolname)
if numeric_tool>max_numeric_tool: if numeric_tool>max_numeric_tool:
max_numeric_tool=numeric_tool max_numeric_tool=numeric_tool
toolsrework[exc_final.tools[toolname]['C']]=toolname toolsrework[exc_final.tools[toolname]['C']]=toolname
for toolvalues in toolsrework.iterkeys(): for toolvalues in list(toolsrework.keys()):
if toolsrework[toolvalues] in exc_final.tools: if toolsrework[toolvalues] in exc_final.tools:
if exc_final.tools[toolsrework[toolvalues]]!={"C": toolvalues}: if exc_final.tools[toolsrework[toolvalues]]!={"C": toolvalues}:
exc_final.tools[str(max_numeric_tool+1)]={"C": toolvalues} exc_final.tools[str(max_numeric_tool+1)]={"C": toolvalues}
@ -846,7 +847,7 @@ class FlatCAMExcellon(FlatCAMObj, Excellon):
tooldia = self.options["tooldia"] tooldia = self.options["tooldia"]
# Sort tools by diameter. items() -> [('name', diameter), ...] # Sort tools by diameter. items() -> [('name', diameter), ...]
sorted_tools = sorted(self.tools.items(), key=lambda tl: tl[1]) sorted_tools = sorted(list(self.tools.items()), key=lambda tl: tl[1])
if tools == "all": if tools == "all":
tools = [i[0] for i in sorted_tools] # List if ordered tool names. tools = [i[0] for i in sorted_tools] # List if ordered tool names.
@ -1066,10 +1067,10 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
self.read_form() self.read_form()
try: try:
filename = unicode(QtGui.QFileDialog.getSaveFileName(caption="Export G-Code ...", filename = str(QtGui.QFileDialog.getSaveFileName(caption="Export G-Code ...",
directory=self.app.defaults["last_folder"])) directory=self.app.defaults["last_folder"]))
except TypeError: except TypeError:
filename = unicode(QtGui.QFileDialog.getSaveFileName(caption="Export G-Code ...")) filename = str(QtGui.QFileDialog.getSaveFileName(caption="Export G-Code ..."))
preamble = str(self.ui.prepend_text.get_value()) preamble = str(self.ui.prepend_text.get_value())
postamble = str(self.ui.append_text.get_value()) postamble = str(self.ui.append_text.get_value())
@ -1351,9 +1352,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
geo_obj.options["cnctooldia"] = tooldia geo_obj.options["cnctooldia"] = tooldia
# Experimental... # Experimental...
print "Indexing...", print("Indexing...")
geo_obj.make_index() geo_obj.make_index()
print "Done" print("Done")
self.app.inform.emit("Done.") self.app.inform.emit("Done.")
@ -1437,9 +1438,9 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
geo_obj.options["cnctooldia"] = tooldia geo_obj.options["cnctooldia"] = tooldia
# Experimental... # Experimental...
print "Indexing...", print("Indexing...")
geo_obj.make_index() geo_obj.make_index()
print "Done" print("Done")
self.app.inform.emit("Done.") self.app.inform.emit("Done.")

View File

@ -81,7 +81,7 @@ class LengthEntry(QtGui.QLineEdit):
def returnPressed(self, *args, **kwargs): def returnPressed(self, *args, **kwargs):
val = self.get_value() val = self.get_value()
if val is not None: if val is not None:
self.set_text(QtCore.QString(str(val))) self.set_text(str(val))
else: else:
log.warning("Could not interpret entry: %s" % self.get_text()) log.warning("Could not interpret entry: %s" % self.get_text())
@ -105,7 +105,7 @@ class LengthEntry(QtGui.QLineEdit):
return None return None
def set_value(self, val): def set_value(self, val):
self.setText(QtCore.QString(str(val))) self.setText(str(val))
class FloatEntry(QtGui.QLineEdit): class FloatEntry(QtGui.QLineEdit):
@ -115,7 +115,7 @@ class FloatEntry(QtGui.QLineEdit):
def returnPressed(self, *args, **kwargs): def returnPressed(self, *args, **kwargs):
val = self.get_value() val = self.get_value()
if val is not None: if val is not None:
self.set_text(QtCore.QString(str(val))) self.set_text(str(val))
else: else:
log.warning("Could not interpret entry: %s" % self.text()) log.warning("Could not interpret entry: %s" % self.text())
@ -151,10 +151,10 @@ class IntEntry(QtGui.QLineEdit):
def set_value(self, val): def set_value(self, val):
if val == self.empty_val and self.allow_empty: if val == self.empty_val and self.allow_empty:
self.setText(QtCore.QString("")) self.setText("")
return return
self.setText(QtCore.QString(str(val))) self.setText(str(val))
class FCEntry(QtGui.QLineEdit): class FCEntry(QtGui.QLineEdit):
@ -165,7 +165,7 @@ class FCEntry(QtGui.QLineEdit):
return str(self.text()) return str(self.text())
def set_value(self, val): def set_value(self, val):
self.setText(QtCore.QString(str(val))) self.setText(str(val))
class EvalEntry(QtGui.QLineEdit): class EvalEntry(QtGui.QLineEdit):
@ -175,7 +175,7 @@ class EvalEntry(QtGui.QLineEdit):
def returnPressed(self, *args, **kwargs): def returnPressed(self, *args, **kwargs):
val = self.get_value() val = self.get_value()
if val is not None: if val is not None:
self.setText(QtCore.QString(str(val))) self.setText(str(val))
else: else:
log.warning("Could not interpret entry: %s" % self.get_text()) log.warning("Could not interpret entry: %s" % self.get_text())
@ -188,12 +188,12 @@ class EvalEntry(QtGui.QLineEdit):
return None return None
def set_value(self, val): def set_value(self, val):
self.setText(QtCore.QString(str(val))) self.setText(str(val))
class FCCheckBox(QtGui.QCheckBox): class FCCheckBox(QtGui.QCheckBox):
def __init__(self, label='', parent=None): def __init__(self, label='', parent=None):
super(FCCheckBox, self).__init__(QtCore.QString(label), parent) super(FCCheckBox, self).__init__(str(label), parent)
def get_value(self): def get_value(self):
return self.isChecked() return self.isChecked()

View File

@ -39,10 +39,10 @@ class ObjectCollection():
} }
icon_files = { icon_files = {
"gerber": "share:flatcam_icon16.png", "gerber": "share/flatcam_icon16.png",
"excellon": "share:drill16.png", "excellon": "share/drill16.png",
"cncjob": "share:cnc16.png", "cncjob": "share/cnc16.png",
"geometry": "share:geometry16.png" "geometry": "share/geometry16.png"
} }
def __init__(self, parent=None): def __init__(self, parent=None):
@ -102,7 +102,7 @@ class ObjectCollection():
def print_list(self): def print_list(self):
for obj in self.object_list: for obj in self.object_list:
print obj print(obj)
def on_mouse_down(self, event): def on_mouse_down(self, event):
FlatCAMApp.App.log.debug("Mouse button pressed on list") FlatCAMApp.App.log.debug("Mouse button pressed on list")

View File

@ -11,7 +11,7 @@ class ObjectUI(QtGui.QWidget):
put UI elements in ObjectUI.custom_box (QtGui.QLayout). put UI elements in ObjectUI.custom_box (QtGui.QLayout).
""" """
def __init__(self, icon_file='share:flatcam_icon32.png', title='FlatCAM Object', parent=None): def __init__(self, icon_file='share/flatcam_icon32.png', title='FlatCAM Object', parent=None):
QtGui.QWidget.__init__(self, parent=parent) QtGui.QWidget.__init__(self, parent=parent)
layout = QtGui.QVBoxLayout() layout = QtGui.QVBoxLayout()
@ -117,7 +117,7 @@ class CNCObjectUI(ObjectUI):
be placed in ``self.custom_box`` to preserve the layout. be placed in ``self.custom_box`` to preserve the layout.
""" """
ObjectUI.__init__(self, title='CNC Job Object', icon_file='share:cnc32.png', parent=parent) ObjectUI.__init__(self, title='CNC Job Object', icon_file='share/cnc32.png', parent=parent)
# Scale and offset are not available for CNCJob objects. # Scale and offset are not available for CNCJob objects.
# Hiding from the GUI. # Hiding from the GUI.
@ -231,7 +231,7 @@ class GeometryObjectUI(ObjectUI):
""" """
def __init__(self, parent=None): def __init__(self, parent=None):
super(GeometryObjectUI, self).__init__(title='Geometry Object', icon_file='share:geometry32.png', parent=parent) super(GeometryObjectUI, self).__init__(title='Geometry Object', icon_file='share/geometry32.png', parent=parent)
## Plot options ## Plot options
self.plot_options_label = QtGui.QLabel("<b>Plot Options:</b>") self.plot_options_label = QtGui.QLabel("<b>Plot Options:</b>")
@ -450,7 +450,7 @@ class ExcellonObjectUI(ObjectUI):
def __init__(self, parent=None): def __init__(self, parent=None):
ObjectUI.__init__(self, title='Excellon Object', ObjectUI.__init__(self, title='Excellon Object',
icon_file='share:drill32.png', icon_file='share/drill32.png',
parent=parent) parent=parent)
#### Plot options #### #### Plot options ####

View File

@ -43,8 +43,8 @@ source_suffix = '.rst'
master_doc = 'index' master_doc = 'index'
# General information about the project. # General information about the project.
project = u'FlatCAM Bugs' project = 'FlatCAM Bugs'
copyright = u'2014, Juan Pablo Caram' copyright = '2014, Juan Pablo Caram'
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the
@ -196,8 +196,8 @@ latex_elements = {
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
('index', 'FlatCAMBugs.tex', u'FlatCAM Bugs Documentation', ('index', 'FlatCAMBugs.tex', 'FlatCAM Bugs Documentation',
u'Juan Pablo Caram', 'manual'), 'Juan Pablo Caram', 'manual'),
] ]
# The name of an image file (relative to this directory) to place at the top of # The name of an image file (relative to this directory) to place at the top of
@ -226,8 +226,8 @@ latex_documents = [
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [
('index', 'flatcambugs', u'FlatCAM Bugs Documentation', ('index', 'flatcambugs', 'FlatCAM Bugs Documentation',
[u'Juan Pablo Caram'], 1) ['Juan Pablo Caram'], 1)
] ]
# If true, show URL addresses after external links. # If true, show URL addresses after external links.
@ -240,8 +240,8 @@ man_pages = [
# (source start file, target name, title, author, # (source start file, target name, title, author,
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
('index', 'FlatCAMBugs', u'FlatCAM Bugs Documentation', ('index', 'FlatCAMBugs', 'FlatCAM Bugs Documentation',
u'Juan Pablo Caram', 'FlatCAMBugs', 'One line description of project.', 'Juan Pablo Caram', 'FlatCAMBugs', 'One line description of project.',
'Miscellaneous'), 'Miscellaneous'),
] ]

View File

@ -9,7 +9,7 @@
#from scipy import optimize #from scipy import optimize
#import traceback #import traceback
from cStringIO import StringIO from io import StringIO
from numpy import arctan2, Inf, array, sqrt, pi, ceil, sin, cos, dot, float32, \ from numpy import arctan2, Inf, array, sqrt, pi, ceil, sin, cos, dot, float32, \
transpose transpose
from numpy.linalg import solve, norm from numpy.linalg import solve, norm
@ -2360,7 +2360,7 @@ class Gerber (Geometry):
else: else:
self.solid_geometry = self.solid_geometry.difference(new_poly) self.solid_geometry = self.solid_geometry.difference(new_poly)
except Exception, err: except Exception as err:
ex_type, ex, tb = sys.exc_info() ex_type, ex, tb = sys.exc_info()
traceback.print_tb(tb) traceback.print_tb(tb)
#print traceback.format_exc() #print traceback.format_exc()
@ -2972,14 +2972,18 @@ class CNCjob(Geometry):
# Tools # Tools
# Sort tools by diameter. items() -> [('name', diameter), ...] # Sort tools by diameter. items() -> [('name', diameter), ...]
sorted_tools = sorted(exobj.tools.items(), key=lambda tl: tl[1]) #sorted_tools = sorted(list(exobj.tools.items()), key=lambda tl: tl[1])
sort = []
for k, v in exobj.tools.items():
sort.append((k, v.get('C')))
sorted_tools = sorted(sort, key=lambda t1: t1[1])
if tools == "all": if tools == "all":
tools = [i[0] for i in sorted_tools] # List if ordered tool names. tools = [i[0] for i in sorted_tools] # List if ordered tool names.
log.debug("Tools 'all' and sorted are: %s" % str(tools)) log.debug("Tools 'all' and sorted are: %s" % str(tools))
else: else:
selected_tools = [x.strip() for x in tools.split(",")] selected_tools = [x.strip() for x in tools.split(",")]
selected_tools = filter(lambda tl: tl in selected_tools, selected_tools) selected_tools = [tl for tl in selected_tools if tl in selected_tools]
# Create a sorted list of selected tools from the sorted_tools list # Create a sorted list of selected tools from the sorted_tools list
tools = [i for i, j in sorted_tools for k in selected_tools if i == k] tools = [i for i, j in sorted_tools for k in selected_tools if i == k]
@ -4103,7 +4107,7 @@ class FlatCAMRTree(object):
:param pt: :param pt:
:return: :return:
""" """
return self.rti.nearest(pt, objects=True).next() return next(self.rti.nearest(pt, objects=True))
class FlatCAMRTreeStorage(FlatCAMRTree): class FlatCAMRTreeStorage(FlatCAMRTree):

View File

@ -8,10 +8,10 @@ class PolygonTestCase(unittest.TestCase):
MultiPoint([(-5, 0), (5, 0)]).buffer(3.0)) MultiPoint([(-5, 0), (5, 0)]).buffer(3.0))
def test_patch(self): def test_patch(self):
patch = PolygonPatch(self.polygon) patch = PolygonPatch(self.polygon)
self.failUnlessEqual(str(type(patch)), self.assertEqual(str(type(patch)),
"<class 'matplotlib.patches.PathPatch'>") "<class 'matplotlib.patches.PathPatch'>")
path = patch.get_path() path = patch.get_path()
self.failUnless(len(path.vertices) == len(path.codes) == 198) self.assertTrue(len(path.vertices) == len(path.codes) == 198)
class JSONPolygonTestCase(unittest.TestCase): class JSONPolygonTestCase(unittest.TestCase):
polygon = Point(0, 0).buffer(10.0).difference( polygon = Point(0, 0).buffer(10.0).difference(
@ -19,10 +19,10 @@ class JSONPolygonTestCase(unittest.TestCase):
def test_patch(self): def test_patch(self):
geo = self.polygon.__geo_interface__ geo = self.polygon.__geo_interface__
patch = PolygonPatch(geo) patch = PolygonPatch(geo)
self.failUnlessEqual(str(type(patch)), self.assertEqual(str(type(patch)),
"<class 'matplotlib.patches.PathPatch'>") "<class 'matplotlib.patches.PathPatch'>")
path = patch.get_path() path = patch.get_path()
self.failUnless(len(path.vertices) == len(path.codes) == 198) self.assertTrue(len(path.vertices) == len(path.codes) == 198)
class GeoInterfacePolygonTestCase(unittest.TestCase): class GeoInterfacePolygonTestCase(unittest.TestCase):
class GeoThing: class GeoThing:
@ -32,7 +32,7 @@ class GeoInterfacePolygonTestCase(unittest.TestCase):
MultiPoint([(-5, 0), (5, 0)]).buffer(3.0)).__geo_interface__ MultiPoint([(-5, 0), (5, 0)]).buffer(3.0)).__geo_interface__
def test_patch(self): def test_patch(self):
patch = PolygonPatch(self.thing) patch = PolygonPatch(self.thing)
self.failUnlessEqual(str(type(patch)), self.assertEqual(str(type(patch)),
"<class 'matplotlib.patches.PathPatch'>") "<class 'matplotlib.patches.PathPatch'>")
path = patch.get_path() path = patch.get_path()
self.failUnless(len(path.vertices) == len(path.codes) == 198) self.assertTrue(len(path.vertices) == len(path.codes) == 198)

View File

@ -45,8 +45,8 @@ source_suffix = '.rst'
master_doc = 'index' master_doc = 'index'
# General information about the project. # General information about the project.
project = u'Cirkuix' project = 'Cirkuix'
copyright = u'2014, Juan Pablo Caram' copyright = '2014, Juan Pablo Caram'
# The version info for the project you're documenting, acts as replacement for # The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the # |version| and |release|, also used in various other places throughout the
@ -203,8 +203,8 @@ latex_elements = {
# (source start file, target name, title, # (source start file, target name, title,
# author, documentclass [howto, manual, or own class]). # author, documentclass [howto, manual, or own class]).
latex_documents = [ latex_documents = [
('index', 'Cirkuix.tex', u'Cirkuix Documentation', ('index', 'Cirkuix.tex', 'Cirkuix Documentation',
u'Juan Pablo Caram', 'manual'), 'Juan Pablo Caram', 'manual'),
] ]
# The name of an image file (relative to this directory) to place at the top of # The name of an image file (relative to this directory) to place at the top of
@ -233,8 +233,8 @@ latex_documents = [
# One entry per manual page. List of tuples # One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section). # (source start file, name, description, authors, manual section).
man_pages = [ man_pages = [
('index', 'cirkuix', u'Cirkuix Documentation', ('index', 'cirkuix', 'Cirkuix Documentation',
[u'Juan Pablo Caram'], 1) ['Juan Pablo Caram'], 1)
] ]
# If true, show URL addresses after external links. # If true, show URL addresses after external links.
@ -247,8 +247,8 @@ man_pages = [
# (source start file, target name, title, author, # (source start file, target name, title, author,
# dir menu entry, description, category) # dir menu entry, description, category)
texinfo_documents = [ texinfo_documents = [
('index', 'Cirkuix', u'Cirkuix Documentation', ('index', 'Cirkuix', 'Cirkuix Documentation',
u'Juan Pablo Caram', 'Cirkuix', 'One line description of project.', 'Juan Pablo Caram', 'Cirkuix', 'One line description of project.',
'Miscellaneous'), 'Miscellaneous'),
] ]

View File

@ -30,6 +30,6 @@ debug_trace()
# NOTE: Never talk to the GUI from threads! This is why I commented the above. # NOTE: Never talk to the GUI from threads! This is why I commented the above.
app = QtGui.QApplication(sys.argv) app = QtGui.QApplication(sys.argv)
QtCore.QDir.setSearchPaths("share", QtCore.QStringList(("share", "share/flatcam", "/usr/share/flatcam"))); QtCore.QDir.setSearchPaths("share", str(("share", "share/flatcam", "/usr/share/flatcam")));
fc = App() fc = App()
sys.exit(app.exec_()) sys.exit(app.exec_())

View File

@ -43,16 +43,16 @@ if sys.platform == "win32":
buildOptions = dict( buildOptions = dict(
compressed=False, compressed=False,
include_files=include_files, include_files=include_files,
icon='share:flatcam_icon48.ico', icon='share/flatcam_icon48.ico',
# excludes=['PyQt4', 'tk', 'tcl'] # excludes=['PyQt4', 'tk', 'tcl']
excludes=['scipy.lib.lapack.flapack.pyd', excludes=['scipy.lib.lapack.flapack.pyd',
'scipy.lib.blas.fblas.pyd', 'scipy.lib.blas.fblas.pyd',
'QtOpenGL4.dll'] 'QtOpenGL4.dll']
) )
print "INCLUDE_FILES", include_files print(("INCLUDE_FILES", include_files))
execfile('clean.py') exec(compile(open('clean.py').read(), 'clean.py', 'exec'))
setup( setup(
name="FlatCAM", name="FlatCAM",

View File

@ -1,34 +1,34 @@
#import sys #import sys
import platform import platform
print "Platform", platform.system(), platform.release() print(("Platform", platform.system(), platform.release()))
print "Distro", platform.dist() print(("Distro", platform.dist()))
print "Python", platform.python_version() print(("Python", platform.python_version()))
import rtree import rtree
print "rtree", rtree.__version__ print(("rtree", rtree.__version__))
import shapely import shapely
import shapely.geos import shapely.geos
print "shapely", shapely.__version__ print(("shapely", shapely.__version__))
print "GEOS library", shapely.geos.geos_version print(("GEOS library", shapely.geos.geos_version))
from PyQt4 import Qt from PyQt4 import Qt
print "Qt", Qt.qVersion() print(("Qt", Qt.qVersion()))
import numpy import numpy
print "Numpy", numpy.__version__ print(("Numpy", numpy.__version__))
import matplotlib import matplotlib
print "MatPlotLib", matplotlib.__version__ print(("MatPlotLib", matplotlib.__version__))
print "MPL Numpy", matplotlib.__version__numpy__ print(("MPL Numpy", matplotlib.__version__numpy__))

View File

@ -19,10 +19,10 @@ def gerber_find(filename, coords, frac_digits=5, tol=0.1):
current_y = parse_gerber_number(match.group(3), frac_digits) current_y = parse_gerber_number(match.group(3), frac_digits)
if distance(coords, (current_x, current_y)) <= tol: if distance(coords, (current_x, current_y)) <= tol:
print line_num, ":", line.strip('\n\r') print((line_num, ":", line.strip('\n\r')))
except Exception as e: except Exception as e:
print str(e) print((str(e)))
print line_num, ":", line.strip('\n\r') print((line_num, ":", line.strip('\n\r')))
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -521,6 +521,6 @@ if __name__ == "__main__":
tree = ET.parse('tests/svg/drawing.svg') tree = ET.parse('tests/svg/drawing.svg')
root = tree.getroot() root = tree.getroot()
ns = re.search(r'\{(.*)\}', root.tag).group(1) ns = re.search(r'\{(.*)\}', root.tag).group(1)
print ns print(ns)
for geo in getsvggeo(root): for geo in getsvggeo(root):
print geo print(geo)

View File

@ -97,7 +97,7 @@ class TclCommand(object):
command_string = [] command_string = []
for arg_key, arg_type in self.help['args'].items(): for arg_key, arg_type in list(self.help['args'].items()):
command_string.append(get_decorated_argument(arg_key, arg_type, True)) command_string.append(get_decorated_argument(arg_key, arg_type, True))
return "> " + alias_name + " " + " ".join(command_string) return "> " + alias_name + " " + " ".join(command_string)
@ -147,7 +147,7 @@ class TclCommand(object):
for alias in self.aliases: for alias in self.aliases:
help_string.append(get_decorated_command(alias)) help_string.append(get_decorated_command(alias))
for key, value in self.help['args'].items(): for key, value in list(self.help['args'].items()):
help_string.append(get_decorated_argument(key, value)) help_string.append(get_decorated_argument(key, value))
# timeout is unique for signaled commands (this is not best oop practice, but much easier for now) # timeout is unique for signaled commands (this is not best oop practice, but much easier for now)
@ -206,13 +206,13 @@ class TclCommand(object):
# check arguments # check arguments
idx = 0 idx = 0
arg_names_items = self.arg_names.items() arg_names_items = list(self.arg_names.items())
for argument in arguments: for argument in arguments:
if len(self.arg_names) > idx: if len(self.arg_names) > idx:
key, arg_type = arg_names_items[idx] key, arg_type = arg_names_items[idx]
try: try:
named_args[key] = arg_type(argument) named_args[key] = arg_type(argument)
except Exception, e: except Exception as e:
self.raise_tcl_error("Cannot cast named argument '%s' to type %s with exception '%s'." self.raise_tcl_error("Cannot cast named argument '%s' to type %s with exception '%s'."
% (key, arg_type, str(e))) % (key, arg_type, str(e)))
else: else:
@ -228,7 +228,7 @@ class TclCommand(object):
named_args[key] = self.option_types[key](options[key]) named_args[key] = self.option_types[key](options[key])
else: else:
named_args[key] = int(options[key]) named_args[key] = int(options[key])
except Exception, e: except Exception as e:
self.raise_tcl_error("Cannot cast argument '-%s' to type '%s' with exception '%s'." self.raise_tcl_error("Cannot cast argument '-%s' to type '%s' with exception '%s'."
% (key, self.option_types[key], str(e))) % (key, self.option_types[key], str(e)))
@ -292,7 +292,7 @@ class TclCommandSignaled(TclCommand):
""" """
!!! I left it here only for demonstration !!! !!! I left it here only for demonstration !!!
Go to TclCommandCncjob and into class definition put Go to TclCommandCncjob and into class definition put
class TclCommandCncjob(TclCommand.TclCommandSignaled): class TclCommandCncjob(TclCommandSignaled):
also change also change
obj.generatecncjob(use_thread = False, **args) obj.generatecncjob(use_thread = False, **args)
to to

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandAddCircle(TclCommand.TclCommand): class TclCommandAddCircle(TclCommand):
""" """
Tcl shell command to creates a circle in the given Geometry object. Tcl shell command to creates a circle in the given Geometry object.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandAddPolygon(TclCommand.TclCommandSignaled): class TclCommandAddPolygon(TclCommandSignaled):
""" """
Tcl shell command to create a polygon in the given Geometry object Tcl shell command to create a polygon in the given Geometry object
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandAddPolyline(TclCommand.TclCommandSignaled): class TclCommandAddPolyline(TclCommandSignaled):
""" """
Tcl shell command to create a polyline in the given Geometry object Tcl shell command to create a polyline in the given Geometry object
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandAddRectangle(TclCommand.TclCommandSignaled): class TclCommandAddRectangle(TclCommandSignaled):
""" """
Tcl shell command to add a rectange to the given Geometry object. Tcl shell command to add a rectange to the given Geometry object.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandAlignDrill(TclCommand.TclCommandSignaled): class TclCommandAlignDrill(TclCommandSignaled):
""" """
Tcl shell command to create excellon with drills for aligment. Tcl shell command to create excellon with drills for aligment.
""" """
@ -180,7 +180,7 @@ class TclCommandAlignDrill(TclCommand.TclCommandSignaled):
name + "_aligndrill", name + "_aligndrill",
alligndrill_init_me) alligndrill_init_me)
except Exception, e: except Exception as e:
return "Operation failed: %s" % str(e) return "Operation failed: %s" % str(e)
else: else:
@ -195,7 +195,7 @@ class TclCommandAlignDrill(TclCommand.TclCommandSignaled):
px = dist px = dist
py = dist py = dist
obj.app.new_object("excellon", name + "_alligndrill", alligndrill_init_me) obj.app.new_object("excellon", name + "_alligndrill", alligndrill_init_me)
except Exception, e: except Exception as e:
return "Operation failed: %s" % str(e) return "Operation failed: %s" % str(e)
return 'Ok' return 'Ok'

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandAlignDrillGrid(TclCommand.TclCommandSignaled): class TclCommandAlignDrillGrid(TclCommandSignaled):
""" """
Tcl shell command to create an Excellon object Tcl shell command to create an Excellon object
with drills for aligment grid. with drills for aligment grid.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandCncjob(TclCommand.TclCommandSignaled): class TclCommandCncjob(TclCommandSignaled):
""" """
Tcl shell command to Generates a CNC Job from a Geometry Object. Tcl shell command to Generates a CNC Job from a Geometry Object.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandCutout(TclCommand.TclCommand): class TclCommandCutout(TclCommand):
""" """
Tcl shell command to create a board cutout geometry. Tcl shell command to create a board cutout geometry.
@ -95,5 +95,5 @@ class TclCommandCutout(TclCommand.TclCommand):
try: try:
obj.app.new_object("geometry", name + "_cutout", geo_init_me) obj.app.new_object("geometry", name + "_cutout", geo_init_me)
except Exception, e: except Exception as e:
return "Operation failed: %s" % str(e) return "Operation failed: %s" % str(e)

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandDelete(TclCommand.TclCommand): class TclCommandDelete(TclCommand):
""" """
Tcl shell command to delete an object. Tcl shell command to delete an object.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandDrillcncjob(TclCommand.TclCommandSignaled): class TclCommandDrillcncjob(TclCommandSignaled):
""" """
Tcl shell command to Generates a Drill CNC Job from a Excellon Object. Tcl shell command to Generates a Drill CNC Job from a Excellon Object.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandExportGcode(TclCommand.TclCommandSignaled): class TclCommandExportGcode(TclCommandSignaled):
""" """
Tcl shell command to export gcode as tcl output for "set X [export_gcode ...]" Tcl shell command to export gcode as tcl output for "set X [export_gcode ...]"

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandExportSVG(TclCommand.TclCommand): class TclCommandExportSVG(TclCommand):
""" """
Tcl shell command to export a Geometry Object as an SVG File. Tcl shell command to export a Geometry Object as an SVG File.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandExteriors(TclCommand.TclCommandSignaled): class TclCommandExteriors(TclCommandSignaled):
""" """
Tcl shell command to get exteriors of polygons Tcl shell command to get exteriors of polygons
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandGeoCutout(TclCommand.TclCommandSignaled): class TclCommandGeoCutout(TclCommandSignaled):
""" """
Tcl shell command to cut holding gaps from geometry. Tcl shell command to cut holding gaps from geometry.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandGeoUnion(TclCommand.TclCommand): class TclCommandGeoUnion(TclCommand):
""" """
Tcl shell command to run a union (addition) operation on the Tcl shell command to run a union (addition) operation on the
components of a geometry object. components of a geometry object.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandGetNames(TclCommand.TclCommand): class TclCommandGetNames(TclCommand):
""" """
Tcl shell command to set an object as active in the GUI. Tcl shell command to set an object as active in the GUI.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandGetSys(TclCommand.TclCommand): class TclCommandGetSys(TclCommand):
""" """
Tcl shell command to get the value of a system variable Tcl shell command to get the value of a system variable

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandImportSvg(TclCommand.TclCommandSignaled): class TclCommandImportSvg(TclCommandSignaled):
""" """
Tcl shell command to import an SVG file as a Geometry Object. Tcl shell command to import an SVG file as a Geometry Object.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandInteriors(TclCommand.TclCommandSignaled): class TclCommandInteriors(TclCommandSignaled):
""" """
Tcl shell command to get interiors of polygons Tcl shell command to get interiors of polygons
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandIsolate(TclCommand.TclCommandSignaled): class TclCommandIsolate(TclCommandSignaled):
""" """
Tcl shell command to Creates isolation routing geometry for the given Gerber. Tcl shell command to Creates isolation routing geometry for the given Gerber.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandJoinExcellon(TclCommand.TclCommand): class TclCommandJoinExcellon(TclCommand):
""" """
Tcl shell command to merge Excellon objects. Tcl shell command to merge Excellon objects.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandJoinGeometry(TclCommand.TclCommand): class TclCommandJoinGeometry(TclCommand):
""" """
Tcl shell command to merge Excellon objects. Tcl shell command to merge Excellon objects.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandMillHoles(TclCommand.TclCommandSignaled): class TclCommandMillHoles(TclCommandSignaled):
""" """
Tcl shell command to Create Geometry Object for milling holes from Excellon. Tcl shell command to Create Geometry Object for milling holes from Excellon.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandMirror(TclCommand.TclCommandSignaled): class TclCommandMirror(TclCommandSignaled):
""" """
Tcl shell command to mirror an object. Tcl shell command to mirror an object.
""" """
@ -90,7 +90,7 @@ class TclCommandMirror(TclCommand.TclCommandSignaled):
obj.mirror(axis, [px, py]) obj.mirror(axis, [px, py])
obj.plot() obj.plot()
except Exception, e: except Exception as e:
return "Operation failed: %s" % str(e) return "Operation failed: %s" % str(e)
else: else:
@ -104,5 +104,5 @@ class TclCommandMirror(TclCommand.TclCommandSignaled):
try: try:
obj.mirror(axis, [dist, dist]) obj.mirror(axis, [dist, dist])
obj.plot() obj.plot()
except Exception, e: except Exception as e:
return "Operation failed: %s" % str(e) return "Operation failed: %s" % str(e)

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandNew(TclCommand.TclCommand): class TclCommandNew(TclCommand):
""" """
Tcl shell command to starts a new project. Clears objects from memory Tcl shell command to starts a new project. Clears objects from memory
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandNewGeometry(TclCommand.TclCommandSignaled): class TclCommandNewGeometry(TclCommandSignaled):
""" """
Tcl shell command to subtract polygon from the given Geometry object. Tcl shell command to subtract polygon from the given Geometry object.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandOffset(TclCommand.TclCommand): class TclCommandOffset(TclCommand):
""" """
Tcl shell command to change the position of the object. Tcl shell command to change the position of the object.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandOpenExcellon(TclCommand.TclCommandSignaled): class TclCommandOpenExcellon(TclCommandSignaled):
""" """
Tcl shell command to open an Excellon file. Tcl shell command to open an Excellon file.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandOpenGCode(TclCommand.TclCommandSignaled): class TclCommandOpenGCode(TclCommandSignaled):
""" """
Tcl shell command to open a G-Code file. Tcl shell command to open a G-Code file.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandOpenGerber(TclCommand.TclCommandSignaled): class TclCommandOpenGerber(TclCommandSignaled):
""" """
Tcl shell command to opens a Gerber file Tcl shell command to opens a Gerber file
""" """
@ -61,7 +61,7 @@ class TclCommandOpenGerber(TclCommand.TclCommandSignaled):
app_obj.progress.emit(0) app_obj.progress.emit(0)
self.raise_tcl_error('Failed to open file: %s' % filename) self.raise_tcl_error('Failed to open file: %s' % filename)
except ParseError, e: except ParseError as e:
app_obj.inform.emit("[error] Failed to parse file: %s, %s " % (filename, str(e))) app_obj.inform.emit("[error] Failed to parse file: %s, %s " % (filename, str(e)))
app_obj.progress.emit(0) app_obj.progress.emit(0)
self.log.error(str(e)) self.log.error(str(e))

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandOpenProject(TclCommand.TclCommandSignaled): class TclCommandOpenProject(TclCommandSignaled):
""" """
Tcl shell command to open a FlatCAM project. Tcl shell command to open a FlatCAM project.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandOptions(TclCommand.TclCommandSignaled): class TclCommandOptions(TclCommandSignaled):
""" """
Tcl shell command to open an Excellon file. Tcl shell command to open an Excellon file.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandPaint(TclCommand.TclCommandSignaled): class TclCommandPaint(TclCommandSignaled):
""" """
Paint the interior of polygons Paint the interior of polygons
""" """

View File

@ -1,10 +1,10 @@
from ObjectCollection import * from ObjectCollection import *
from copy import copy,deepcopy from copy import copy,deepcopy
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandPanelize(TclCommand.TclCommand): class TclCommandPanelize(TclCommand):
""" """
Tcl shell command to pannelize an object. Tcl shell command to pannelize an object.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandPlot(TclCommand.TclCommand): class TclCommandPlot(TclCommand):
""" """
Tcl shell command to update the plot on the user interface. Tcl shell command to update the plot on the user interface.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandSaveProject(TclCommand.TclCommandSignaled): class TclCommandSaveProject(TclCommandSignaled):
""" """
Tcl shell command to save the FlatCAM project to file. Tcl shell command to save the FlatCAM project to file.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandScale(TclCommand.TclCommand): class TclCommandScale(TclCommand):
""" """
Tcl shell command to resizes the object by a factor. Tcl shell command to resizes the object by a factor.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandSetActive(TclCommand.TclCommand): class TclCommandSetActive(TclCommand):
""" """
Tcl shell command to set an object as active in the GUI. Tcl shell command to set an object as active in the GUI.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandSetSys(TclCommand.TclCommand): class TclCommandSetSys(TclCommand):
""" """
Tcl shell command to set the value of a system variable Tcl shell command to set the value of a system variable

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandSubtractPoly(TclCommand.TclCommandSignaled): class TclCommandSubtractPoly(TclCommandSignaled):
""" """
Tcl shell command to create a new empty Geometry object. Tcl shell command to create a new empty Geometry object.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandSubtractRectangle(TclCommand.TclCommandSignaled): class TclCommandSubtractRectangle(TclCommandSignaled):
""" """
Tcl shell command to subtract a rectange from the given Geometry object. Tcl shell command to subtract a rectange from the given Geometry object.
""" """

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommand
class TclCommandVersion(TclCommand.TclCommand): class TclCommandVersion(TclCommand):
""" """
Tcl shell command to check the program version. Tcl shell command to check the program version.

View File

@ -1,8 +1,8 @@
from ObjectCollection import * from ObjectCollection import *
import TclCommand from tclCommands.TclCommand import TclCommandSignaled
class TclCommandWriteGCode(TclCommand.TclCommandSignaled): class TclCommandWriteGCode(TclCommandSignaled):
""" """
Tcl shell command to save the G-code of a CNC Job object to file. Tcl shell command to save the G-code of a CNC Job object to file.
""" """

View File

@ -72,9 +72,9 @@ def register_all_commands(app, commands):
:return: None :return: None
""" """
tcl_modules = {k: v for k, v in sys.modules.items() if k.startswith('tclCommands.TclCommand')} tcl_modules = {k: v for k, v in list(sys.modules.items()) if k.startswith('tclCommands.TclCommand')}
for key, mod in tcl_modules.items(): for key, mod in list(tcl_modules.items()):
if key != 'tclCommands.TclCommand': if key != 'tclCommands.TclCommand':
class_name = key.split('.')[1] class_name = key.split('.')[1]
class_type = getattr(mod, class_name) class_type = getattr(mod, class_name)

View File

@ -1,9 +1,9 @@
from __future__ import division
import matplotlib import matplotlib
matplotlib.use('Agg') matplotlib.use('Agg')
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import numpy as np import numpy as np
import cStringIO import io
from matplotlib.backends.backend_agg import FigureCanvasAgg from matplotlib.backends.backend_agg import FigureCanvasAgg
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg
from matplotlib.figure import Figure from matplotlib.figure import Figure

View File

@ -8,7 +8,7 @@ class MyObj():
pass pass
def __del__(self): def __del__(self):
print "##### Destroyed ######" print("##### Destroyed ######")
def parse(): def parse():

View File

@ -26,12 +26,12 @@ for geo in geoms:
current_pt = (0, 0) current_pt = (0, 0)
pt, geo = s.nearest(current_pt) pt, geo = s.nearest(current_pt)
while geo is not None: while geo is not None:
print pt, geo print((pt, geo))
print "OBJECTS BEFORE:", s.objects print(("OBJECTS BEFORE:", s.objects))
#geo.coords = list(geo.coords[::-1]) #geo.coords = list(geo.coords[::-1])
s.remove(geo) s.remove(geo)
print "OBJECTS AFTER:", s.objects print(("OBJECTS AFTER:", s.objects))
current_pt = geo.coords[-1] current_pt = geo.coords[-1]
pt, geo = s.nearest(current_pt) pt, geo = s.nearest(current_pt)

View File

@ -13,12 +13,12 @@ rt = rtindex.Index(properties=p)
# If interleaved is True, the coordinates must be in # If interleaved is True, the coordinates must be in
# the form [xmin, ymin, ..., kmin, xmax, ymax, ..., kmax]. # the form [xmin, ymin, ..., kmin, xmax, ymax, ..., kmax].
print rt.interleaved print((rt.interleaved))
[rt.add(0, pt2rect(pt)) for pt in pts] [rt.add(0, pt2rect(pt)) for pt in pts]
print [r.bbox for r in list(rt.nearest((0, 0), 10, True))] print([r.bbox for r in list(rt.nearest((0, 0), 10, True))])
for pt in pts: for pt in pts:
rt.delete(0, pt2rect(pt)) rt.delete(0, pt2rect(pt))
print pt2rect(pt), [r.bbox for r in list(rt.nearest((0, 0), 10, True))] print((pt2rect(pt), [r.bbox for r in list(rt.nearest((0, 0), 10, True))]))

View File

@ -36,18 +36,18 @@ class ExcellonFlowTestCase(unittest.TestCase):
def test_flow(self): def test_flow(self):
# Names of available objects. # Names of available objects.
names = self.fc.collection.get_names() names = self.fc.collection.get_names()
print names print(names)
#-------------------------------------- #--------------------------------------
# Total of 1 objects. # Total of 1 objects.
#-------------------------------------- #--------------------------------------
self.assertEquals(len(names), 1, self.assertEqual(len(names), 1,
"Expected 1 object, found %d" % len(names)) "Expected 1 object, found %d" % len(names))
#-------------------------------------- #--------------------------------------
# Object's name matches the file name. # Object's name matches the file name.
#-------------------------------------- #--------------------------------------
self.assertEquals(names[0], self.filename, self.assertEqual(names[0], self.filename,
"Expected name == %s, got %s" % (self.filename, names[0])) "Expected name == %s, got %s" % (self.filename, names[0]))
#--------------------------------------- #---------------------------------------
@ -65,14 +65,14 @@ class ExcellonFlowTestCase(unittest.TestCase):
# TODO: Open GUI with double-click on object. # TODO: Open GUI with double-click on object.
# Opens the Object's GUI, populates it. # Opens the Object's GUI, populates it.
excellon_obj.build_ui() excellon_obj.build_ui()
for option, value in excellon_obj.options.iteritems(): for option, value in list(excellon_obj.options.items()):
try: try:
form_field = excellon_obj.form_fields[option] form_field = excellon_obj.form_fields[option]
except KeyError: except KeyError:
print ("**********************************************************\n" print(("**********************************************************\n"
"* WARNING: Option '{}' has no form field\n" "* WARNING: Option '{}' has no form field\n"
"**********************************************************" "**********************************************************"
"".format(option)) "".format(option)))
continue continue
self.assertEqual(value, form_field.get_value(), self.assertEqual(value, form_field.get_value(),
"Option '{}' == {} but form has {}".format( "Option '{}' == {} but form has {}".format(
@ -87,7 +87,7 @@ class ExcellonFlowTestCase(unittest.TestCase):
form_field = excellon_obj.form_fields['feedrate'] form_field = excellon_obj.form_fields['feedrate']
value = form_field.get_value() value = form_field.get_value()
form_field.set_value(value * 1.1) # Increase by 10% form_field.set_value(value * 1.1) # Increase by 10%
print "'feedrate' == {}".format(value) print(("'feedrate' == {}".format(value)))
#-------------------------------------------------- #--------------------------------------------------
# Create GCode using all tools. # Create GCode using all tools.
@ -119,7 +119,7 @@ class ExcellonFlowTestCase(unittest.TestCase):
self.assertEqual(value, form_value, self.assertEqual(value, form_value,
"Form value for '{}' == {} was not read into options" "Form value for '{}' == {} was not read into options"
"which has {}".format('feedrate', form_value, value)) "which has {}".format('feedrate', form_value, value))
print "'feedrate' == {}".format(value) print(("'feedrate' == {}".format(value)))
#--------------------------------------------- #---------------------------------------------
# Check that only 1 object has been created. # Check that only 1 object has been created.
@ -160,4 +160,4 @@ class ExcellonFlowTestCase(unittest.TestCase):
self.assertTrue(os.path.isfile(output_filename)) self.assertTrue(os.path.isfile(output_filename))
os.remove(output_filename) os.remove(output_filename)
print names print(names)

View File

@ -36,18 +36,18 @@ class GerberFlowTestCase(unittest.TestCase):
def test_flow(self): def test_flow(self):
# Names of available objects. # Names of available objects.
names = self.fc.collection.get_names() names = self.fc.collection.get_names()
print names print(names)
#-------------------------------------- #--------------------------------------
# Total of 1 objects. # Total of 1 objects.
#-------------------------------------- #--------------------------------------
self.assertEquals(len(names), 1, self.assertEqual(len(names), 1,
"Expected 1 object, found %d" % len(names)) "Expected 1 object, found %d" % len(names))
#-------------------------------------- #--------------------------------------
# Object's name matches the file name. # Object's name matches the file name.
#-------------------------------------- #--------------------------------------
self.assertEquals(names[0], self.filename, self.assertEqual(names[0], self.filename,
"Expected name == %s, got %s" % (self.filename, names[0])) "Expected name == %s, got %s" % (self.filename, names[0]))
#--------------------------------------- #---------------------------------------
@ -65,14 +65,14 @@ class GerberFlowTestCase(unittest.TestCase):
# TODO: Open GUI with double-click on object. # TODO: Open GUI with double-click on object.
# Opens the Object's GUI, populates it. # Opens the Object's GUI, populates it.
gerber_obj.build_ui() gerber_obj.build_ui()
for option, value in gerber_obj.options.iteritems(): for option, value in list(gerber_obj.options.items()):
try: try:
form_field = gerber_obj.form_fields[option] form_field = gerber_obj.form_fields[option]
except KeyError: except KeyError:
print ("**********************************************************\n" print(("**********************************************************\n"
"* WARNING: Option '{}' has no form field\n" "* WARNING: Option '{}' has no form field\n"
"**********************************************************" "**********************************************************"
"".format(option)) "".format(option)))
continue continue
self.assertEqual(value, form_field.get_value(), self.assertEqual(value, form_field.get_value(),
"Option '{}' == {} but form has {}".format( "Option '{}' == {} but form has {}".format(
@ -87,7 +87,7 @@ class GerberFlowTestCase(unittest.TestCase):
form_field = gerber_obj.form_fields['isotooldia'] form_field = gerber_obj.form_fields['isotooldia']
value = form_field.get_value() value = form_field.get_value()
form_field.set_value(value * 1.1) # Increase by 10% form_field.set_value(value * 1.1) # Increase by 10%
print "'isotooldia' == {}".format(value) print(("'isotooldia' == {}".format(value)))
#-------------------------------------------------- #--------------------------------------------------
# Create isolation routing using default values # Create isolation routing using default values
@ -110,7 +110,7 @@ class GerberFlowTestCase(unittest.TestCase):
self.assertEqual(value, form_value, self.assertEqual(value, form_value,
"Form value for '{}' == {} was not read into options" "Form value for '{}' == {} was not read into options"
"which has {}".format('isotooldia', form_value, value)) "which has {}".format('isotooldia', form_value, value))
print "'isotooldia' == {}".format(value) print(("'isotooldia' == {}".format(value)))
#--------------------------------------------- #---------------------------------------------
# Check that only 1 object has been created. # Check that only 1 object has been created.
@ -187,4 +187,4 @@ class GerberFlowTestCase(unittest.TestCase):
self.assertTrue(os.path.isfile(output_filename)) self.assertTrue(os.path.isfile(output_filename))
os.remove(output_filename) os.remove(output_filename)
print names print(names)

View File

@ -75,66 +75,66 @@ class PaintConnectTest(PaintTestCase):
self.boundary = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]]) self.boundary = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]])
def test_jump(self): def test_jump(self):
print "Test: WALK Expected" print("Test: WALK Expected")
paths = [ paths = [
LineString([[0.5, 2], [2, 4.5]]), LineString([[0.5, 2], [2, 4.5]]),
LineString([[2, 0.5], [4.5, 2]]) LineString([[2, 0.5], [4.5, 2]])
] ]
for p in paths: for p in paths:
print p print(p)
tooldia = 1.0 tooldia = 1.0
print "--" print("--")
result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia)
result = list(result.get_objects()) result = list(result.get_objects())
for r in result: for r in result:
print r print(r)
self.assertEqual(len(result), 1) self.assertEqual(len(result), 1)
# self.plot_summary_A(paths, tooldia, result, "WALK expected.") # self.plot_summary_A(paths, tooldia, result, "WALK expected.")
def test_no_jump1(self): def test_no_jump1(self):
print "Test: FLY Expected" print("Test: FLY Expected")
paths = [ paths = [
LineString([[0, 2], [2, 5]]), LineString([[0, 2], [2, 5]]),
LineString([[2, 0], [5, 2]]) LineString([[2, 0], [5, 2]])
] ]
for p in paths: for p in paths:
print p print(p)
tooldia = 1.0 tooldia = 1.0
print "--" print("--")
result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia)
result = list(result.get_objects()) result = list(result.get_objects())
for r in result: for r in result:
print r print(r)
self.assertEqual(len(result), len(paths)) self.assertEqual(len(result), len(paths))
# self.plot_summary_A(paths, tooldia, result, "FLY Expected") # self.plot_summary_A(paths, tooldia, result, "FLY Expected")
def test_no_jump2(self): def test_no_jump2(self):
print "Test: FLY Expected" print("Test: FLY Expected")
paths = [ paths = [
LineString([[0.5, 2], [2, 4.5]]), LineString([[0.5, 2], [2, 4.5]]),
LineString([[2, 0.5], [4.5, 2]]) LineString([[2, 0.5], [4.5, 2]])
] ]
for p in paths: for p in paths:
print p print(p)
tooldia = 1.1 tooldia = 1.1
print "--" print("--")
result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia)
result = list(result.get_objects()) result = list(result.get_objects())
for r in result: for r in result:
print r print(r)
self.assertEqual(len(result), len(paths)) self.assertEqual(len(result), len(paths))
@ -153,22 +153,22 @@ class PaintConnectTest2(PaintTestCase):
) )
def test_no_jump3(self): def test_no_jump3(self):
print "TEST: No jump expected" print("TEST: No jump expected")
paths = [ paths = [
LineString([[0.5, 1], [1.5, 3]]), LineString([[0.5, 1], [1.5, 3]]),
LineString([[4, 1], [4, 4]]) LineString([[4, 1], [4, 4]])
] ]
for p in paths: for p in paths:
print p print(p)
tooldia = 1.0 tooldia = 1.0
print "--" print("--")
result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia)
result = list(result.get_objects()) result = list(result.get_objects())
for r in result: for r in result:
print r print(r)
self.assertEqual(len(result), len(paths)) self.assertEqual(len(result), len(paths))
@ -182,26 +182,26 @@ class PaintConnectTest3(PaintTestCase):
def setUp(self): def setUp(self):
self.boundary = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]]) self.boundary = Polygon([[0, 0], [0, 5], [5, 5], [5, 0]])
print "TEST w/ LinearRings" print("TEST w/ LinearRings")
def test_jump2(self): def test_jump2(self):
print "Test: WALK Expected" print("Test: WALK Expected")
paths = [ paths = [
LineString([[0.5, 2], [2, 4.5]]), LineString([[0.5, 2], [2, 4.5]]),
LineString([[2, 0.5], [4.5, 2]]), LineString([[2, 0.5], [4.5, 2]]),
self.boundary.buffer(-0.5).exterior self.boundary.buffer(-0.5).exterior
] ]
for p in paths: for p in paths:
print p print(p)
tooldia = 1.0 tooldia = 1.0
print "--" print("--")
result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia) result = Geometry.paint_connect(mkstorage(deepcopy(paths)), self.boundary, tooldia)
result = list(result.get_objects()) result = list(result.get_objects())
for r in result: for r in result:
print r print(r)
self.assertEqual(len(result), 1) self.assertEqual(len(result), 1)

View File

@ -20,7 +20,7 @@ def mkstorage(paths):
class PathConnectTest1(unittest.TestCase): class PathConnectTest1(unittest.TestCase):
def setUp(self): def setUp(self):
print "PathConnectTest1.setUp()" print("PathConnectTest1.setUp()")
pass pass
def test_simple_connect(self): def test_simple_connect(self):
@ -68,8 +68,8 @@ class PathConnectTest1(unittest.TestCase):
[2 + offset_x, 1 + offset_y]]))) [2 + offset_x, 1 + offset_y]])))
def test_ring_interfere_connect(self): def test_ring_interfere_connect(self):
print print()
print "TEST STARTING ..." print("TEST STARTING ...")
paths = [ paths = [
LineString([[0, 0], [1, 1]]), LineString([[0, 0], [1, 1]]),

View File

@ -30,9 +30,9 @@ class PolyPaintTestCase(unittest.TestCase):
def test_poly_paint_svg_all(self): def test_poly_paint_svg_all(self):
print "*********************************" print("*********************************")
print "* svg_all *" print("* svg_all *")
print "*********************************" print("*********************************")
# Clear workspace # Clear workspace
self.fc.on_file_new() self.fc.on_file_new()
@ -69,9 +69,9 @@ class PolyPaintTestCase(unittest.TestCase):
def test_poly_paint_svg_click(self): def test_poly_paint_svg_click(self):
print "*********************************" print("*********************************")
print "* svg_click *" print("* svg_click *")
print "*********************************" print("*********************************")
# Clear workspace # Clear workspace
self.fc.on_file_new() self.fc.on_file_new()
@ -109,9 +109,9 @@ class PolyPaintTestCase(unittest.TestCase):
def test_poly_paint_noncopper_all(self): def test_poly_paint_noncopper_all(self):
print "*********************************" print("*********************************")
print "* noncopper_all *" print("* noncopper_all *")
print "*********************************" print("*********************************")
# Clear workspace # Clear workspace
self.fc.on_file_new() self.fc.on_file_new()
@ -165,9 +165,9 @@ class PolyPaintTestCase(unittest.TestCase):
def test_poly_paint_noncopper_click(self): def test_poly_paint_noncopper_click(self):
print "*********************************" print("*********************************")
print "* noncopper_click *" print("* noncopper_click *")
print "*********************************" print("*********************************")
# Clear workspace # Clear workspace
self.fc.on_file_new() self.fc.on_file_new()

View File

@ -29,18 +29,18 @@ class SVGFlowTestCase(unittest.TestCase):
self.fc.import_svg('tests/svg/' + self.filename) self.fc.import_svg('tests/svg/' + self.filename)
names = self.fc.collection.get_names() names = self.fc.collection.get_names()
print names print(names)
#-------------------------------------- #--------------------------------------
# Total of 1 objects. # Total of 1 objects.
#-------------------------------------- #--------------------------------------
self.assertEquals(len(names), 1, self.assertEqual(len(names), 1,
"Expected 1 object, found %d" % len(names)) "Expected 1 object, found %d" % len(names))
#-------------------------------------- #--------------------------------------
# Object's name matches the file name. # Object's name matches the file name.
#-------------------------------------- #--------------------------------------
self.assertEquals(names[0], self.filename, self.assertEqual(names[0], self.filename,
"Expected name == %s, got %s" % (self.filename, names[0])) "Expected name == %s, got %s" % (self.filename, names[0]))
#--------------------------------------- #---------------------------------------
@ -58,14 +58,14 @@ class SVGFlowTestCase(unittest.TestCase):
# TODO: Open GUI with double-click on object. # TODO: Open GUI with double-click on object.
# Opens the Object's GUI, populates it. # Opens the Object's GUI, populates it.
geo_obj.build_ui() geo_obj.build_ui()
for option, value in geo_obj.options.iteritems(): for option, value in list(geo_obj.options.items()):
try: try:
form_field = geo_obj.form_fields[option] form_field = geo_obj.form_fields[option]
except KeyError: except KeyError:
print ("**********************************************************\n" print(("**********************************************************\n"
"* WARNING: Option '{}' has no form field\n" "* WARNING: Option '{}' has no form field\n"
"**********************************************************" "**********************************************************"
"".format(option)) "".format(option)))
continue continue
self.assertEqual(value, form_field.get_value(), self.assertEqual(value, form_field.get_value(),
"Option '{}' == {} but form has {}".format( "Option '{}' == {} but form has {}".format(
@ -126,4 +126,4 @@ class SVGFlowTestCase(unittest.TestCase):
self.assertTrue(os.path.isfile(output_filename)) self.assertTrue(os.path.isfile(output_filename))
os.remove(output_filename) os.remove(output_filename)
print names print(names)

View File

@ -2,17 +2,17 @@ import pkgutil
import sys import sys
# allowed command tests (please append them alphabetically ordered) # allowed command tests (please append them alphabetically ordered)
from test_TclCommandAddPolygon import * from .test_TclCommandAddPolygon import *
from test_TclCommandAddPolyline import * from .test_TclCommandAddPolyline import *
from test_TclCommandCncjob import * from .test_TclCommandCncjob import *
from test_TclCommandDrillcncjob import * from .test_TclCommandDrillcncjob import *
from test_TclCommandExportGcode import * from .test_TclCommandExportGcode import *
from test_TclCommandExteriors import * from .test_TclCommandExteriors import *
from test_TclCommandImportSvg import * from .test_TclCommandImportSvg import *
from test_TclCommandInteriors import * from .test_TclCommandInteriors import *
from test_TclCommandIsolate import * from .test_TclCommandIsolate import *
from test_TclCommandNew import * from .test_TclCommandNew import *
from test_TclCommandNewGeometry import * from .test_TclCommandNewGeometry import *
from test_TclCommandOpenExcellon import * from .test_TclCommandOpenExcellon import *
from test_TclCommandOpenGerber import * from .test_TclCommandOpenGerber import *
from test_TclCommandPaintPolygon import * from .test_TclCommandPaintPolygon import *

View File

@ -1,5 +1,5 @@
from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMObj from FlatCAMObj import FlatCAMGerber, FlatCAMGeometry, FlatCAMObj
from test_TclCommandIsolate import * from .test_TclCommandIsolate import *
def test_cncjob(self): def test_cncjob(self):
""" """

View File

@ -1,5 +1,5 @@
from FlatCAMObj import FlatCAMObj from FlatCAMObj import FlatCAMObj
from test_TclCommandOpenExcellon import * from .test_TclCommandOpenExcellon import *
def test_drillcncjob(self): def test_drillcncjob(self):

View File

@ -1,8 +1,8 @@
import os import os
import tempfile import tempfile
from test_TclCommandCncjob import * from .test_TclCommandCncjob import *
from test_TclCommandDrillcncjob import * from .test_TclCommandDrillcncjob import *
def test_export_gcodecncjob(self): def test_export_gcodecncjob(self):

View File

@ -82,7 +82,7 @@ class TclShellTest(unittest.TestCase):
# Units must be IN # Units must be IN
#---------------------------------------- #----------------------------------------
units = self.fc.exec_command_test('get_sys units') units = self.fc.exec_command_test('get_sys units')
self.assertEquals(units, "IN") self.assertEqual(units, "IN")
# MM # MM
self.fc.exec_command_test('set_sys units MM') self.fc.exec_command_test('set_sys units MM')
@ -92,7 +92,7 @@ class TclShellTest(unittest.TestCase):
# Units must be MM # Units must be MM
#---------------------------------------- #----------------------------------------
units = self.fc.exec_command_test('get_sys units') units = self.fc.exec_command_test('get_sys units')
self.assertEquals(units, "MM") self.assertEqual(units, "MM")
def test_gerber_flow(self): def test_gerber_flow(self):
""" """